1
This commit is contained in:
parent
9f1def6671
commit
d2f261dc5d
@ -257,12 +257,10 @@ void Skill::InitPassiveSkill()
|
||||
switch (meta->GetMagicId()) {
|
||||
case MAGIC_30101_HL:
|
||||
{
|
||||
Proc30101HL();
|
||||
}
|
||||
break;
|
||||
case MAGIC_30201_HX:
|
||||
{
|
||||
Proc30201HX();
|
||||
}
|
||||
break;
|
||||
case MAGIC_30301_XL:
|
||||
@ -271,7 +269,6 @@ void Skill::InitPassiveSkill()
|
||||
break;
|
||||
case MAGIC_30401_MAO:
|
||||
{
|
||||
Proc30401MAO();
|
||||
}
|
||||
break;
|
||||
case MAGIC_30501_TZ:
|
||||
@ -289,7 +286,6 @@ void Skill::InitPassiveSkill()
|
||||
break;
|
||||
case MAGIC_30801_LONG:
|
||||
{
|
||||
Proc30801LONG();
|
||||
}
|
||||
break;
|
||||
case MAGIC_30901_XIONG:
|
||||
@ -310,237 +306,6 @@ void Skill::InitPassiveSkill()
|
||||
}
|
||||
}
|
||||
|
||||
void Skill::Proc30101HL()
|
||||
{
|
||||
}
|
||||
|
||||
void Skill::Proc30201HX()
|
||||
{
|
||||
#if 1
|
||||
auto context = std::make_shared<std::tuple<int, std::vector<int>>>();
|
||||
std::get<0>(*context.get()) = 0;
|
||||
a8::XTimerWp timer = owner->room->xtimer.SetIntervalWpEx
|
||||
(
|
||||
meta->_number_meta->number() * SERVER_FRAME_RATE,
|
||||
[this, context] (int event, const a8::Args* args)
|
||||
{
|
||||
if (a8::TIMER_EXEC_EVENT == event) {
|
||||
if (!owner->dead) {
|
||||
if (std::get<0>(*context.get()) == 0) {
|
||||
std::get<0>(*context.get()) = 1;
|
||||
owner->GetAbility()->AddSpeedAddition(meta->_number_meta->_float_speed);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
&xtimer_attacher);
|
||||
|
||||
auto cb =
|
||||
[this, timer, context] (const a8::Args& args) mutable
|
||||
{
|
||||
if (timer.expired()) {
|
||||
return;
|
||||
}
|
||||
owner->room->xtimer.ResetTimer(timer);
|
||||
if (std::get<0>(*context.get()) == 1) {
|
||||
for (int buff_uniid : std::get<1>(*context.get())) {
|
||||
owner->RemoveBuffByUniId(buff_uniid);
|
||||
}
|
||||
std::get<0>(*context.get()) = 0;
|
||||
std::get<1>(*context.get()).clear();
|
||||
owner->GetAbility()->DelSpeedAddition(meta->_number_meta->_float_speed);
|
||||
}
|
||||
};
|
||||
|
||||
owner->GetTrigger()->AddListener
|
||||
(
|
||||
kDieEvent,
|
||||
cb
|
||||
);
|
||||
owner->GetTrigger()->AddListener
|
||||
(
|
||||
kReceiveDmgEvent,
|
||||
cb
|
||||
);
|
||||
|
||||
#else
|
||||
a8::XTimerWp add_speed_timer;
|
||||
owner->GetTrigger()->AddListener
|
||||
(
|
||||
kReceiveDmgEvent,
|
||||
[this, add_speed_timer] (const a8::Args& args) mutable
|
||||
{
|
||||
int rnd = rand();
|
||||
const mt::Skill* skill_meta = meta;
|
||||
float speed_rate = SkillHelper::GetSsjsSpeedRate(skill_meta);
|
||||
bool is_hit = false;
|
||||
#if 1
|
||||
{
|
||||
#else
|
||||
if (GetLeftTime() <= 0) {
|
||||
#endif
|
||||
if (owner->GetHPRate() <= SkillHelper::GetSsjsHpRate(skill_meta) &&
|
||||
rnd % 100 < SkillHelper::GetSsjsProb(skill_meta) * 100 &&
|
||||
add_speed_timer.expired()) {
|
||||
owner->GetAbility()->AddSpeedAddition(speed_rate);
|
||||
add_speed_timer = owner->room->xtimer.SetTimeoutWpEx
|
||||
(
|
||||
SkillHelper::GetSsjsTime(meta) * 1000 / FRAME_RATE_MS,
|
||||
[this, skill_meta, speed_rate]
|
||||
(int event, const a8::Args* args)
|
||||
{
|
||||
if (a8::TIMER_EXEC_EVENT == event) {
|
||||
owner->GetAbility()->DelSpeedAddition(speed_rate);
|
||||
}
|
||||
},
|
||||
&xtimer_attacher);
|
||||
is_hit = true;
|
||||
}
|
||||
}
|
||||
#ifdef DEBUG
|
||||
{
|
||||
std::string dbg_msg = a8::Format
|
||||
(
|
||||
"skill_id:%d 受伤加速 hp_rate:%f rnd:%d ratio2:%f probability:%f speed:%f time:%f 是否加速:%d",
|
||||
{
|
||||
meta->skill_id(),
|
||||
owner->GetHPRate(),
|
||||
rnd % 100,
|
||||
meta->_number_meta->_float_ratio2,
|
||||
meta->_number_meta->_float_probability,
|
||||
meta->_number_meta->_float_speed,
|
||||
meta->_number_meta->_float_time,
|
||||
is_hit ? 1 : 0
|
||||
});
|
||||
owner->SendDebugMsg(dbg_msg);
|
||||
a8::XPrintf("%s\n", {dbg_msg});
|
||||
}
|
||||
#endif
|
||||
}
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Skill::Proc30401MAO()
|
||||
{
|
||||
#if 1
|
||||
a8::XTimerWp shield_timer;
|
||||
owner->GetTrigger()->AddListener
|
||||
(
|
||||
kHpChgEvent,
|
||||
[this, shield_timer] (const a8::Args& args) mutable
|
||||
{
|
||||
if (!owner->dead &&
|
||||
!owner->room->IsGameOver() &&
|
||||
owner->GetHP() < meta->_number_meta->number() * owner->GetMaxHP()
|
||||
) {
|
||||
if (shield_timer.expired()) {
|
||||
owner->AddEnergyShield
|
||||
(meta->_number_meta->shield() +
|
||||
meta->_number_meta->shield_addition() * owner->GetBattleContext()->GetHeroTotalAtk());
|
||||
shield_timer = owner->room->xtimer.SetTimeoutWpEx
|
||||
(
|
||||
meta->_number_meta->_float_time * SERVER_FRAME_RATE,
|
||||
[this] (int event, const a8::Args* args)
|
||||
{
|
||||
owner->ClearEnergyShield();
|
||||
},
|
||||
&xtimer_attacher);
|
||||
}
|
||||
}
|
||||
});
|
||||
#else
|
||||
struct _Nested
|
||||
{
|
||||
static void cb(CreatureWeakPtr sender, Entity* e, const mt::Skill* skill_meta)
|
||||
{
|
||||
if (sender.Get()) {
|
||||
if (e->IsCreature(sender.Get()->room)) {
|
||||
Creature* c = (Creature*)e;
|
||||
if (c->IsInvincible()) {
|
||||
return;
|
||||
}
|
||||
if (c->dead) {
|
||||
return;
|
||||
}
|
||||
float dmg = SkillHelper::GetSwzbDmg(sender.Get(), skill_meta);
|
||||
float dmg_out = 0.0f;
|
||||
c->DecHP(dmg,
|
||||
VP_Explosion,
|
||||
"",
|
||||
SkillHelper::GetSwzbEffect(skill_meta),
|
||||
sender.Get()->GetUniId(),
|
||||
sender.Get()->GetName(),
|
||||
dmg_out);
|
||||
glm::vec3 dir = sender.Get()->GetAttackDir();
|
||||
if (!GlmHelper::IsZero(dir)) {
|
||||
// 999
|
||||
glm::vec3 target_pos = c->GetPos().ToGlmVec3() +
|
||||
dir * (float)(SkillHelper::GetSwzbPullDistance(skill_meta));
|
||||
c->PullTarget(target_pos);
|
||||
}
|
||||
int buff_id = SkillHelper::GetSwzbBuffId(skill_meta);
|
||||
float buff_time = SkillHelper::GetSwzbBuffTime(skill_meta);
|
||||
c->TryAddBuffAndSetTime(sender.Get(), buff_id, buff_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
owner->GetTrigger()->AddListener
|
||||
(
|
||||
kPreDieEvent,
|
||||
[this] (const a8::Args& args)
|
||||
{
|
||||
int killer_id = args.Get<int>(0);
|
||||
CreatureWeakPtr sender = owner->GetWeakPtrRef();
|
||||
const mt::Skill* skill_meta = meta;
|
||||
Position center = owner->GetPos();
|
||||
std::shared_ptr<Explosion> e = EntityFactory::Instance()->MakeExplosion();
|
||||
e->SetThrough(true);
|
||||
e->SetNoSync();
|
||||
e->SetHitCb
|
||||
(
|
||||
[sender, center, skill_meta] (const a8::Args& args) mutable
|
||||
{
|
||||
Entity* e = args.Get<Entity*>(0);
|
||||
_Nested::cb(sender, e, skill_meta);
|
||||
}
|
||||
);
|
||||
e->EnemyAndObstacleAttack
|
||||
(
|
||||
owner->GetWeakPtrRef(),
|
||||
owner->GetPos(),
|
||||
SkillHelper::GetSwzbRadius(meta),
|
||||
SkillHelper::GetSwzbEffect(meta),
|
||||
0
|
||||
);
|
||||
Entity* killer = owner->room->GetEntityByUniId(killer_id);
|
||||
if (killer && killer != owner && !meta->_raw_phases.empty()) {
|
||||
owner->over_delay_time = meta->_raw_phases.at(0).phase_param1;
|
||||
owner->TryAddBuff(owner, 209016);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
{
|
||||
std::string dbg_msg = a8::Format
|
||||
(
|
||||
"skill_id:%d 死亡自爆 range:%f range2:%f ratio:%f time:%f",
|
||||
{
|
||||
meta->skill_id(),
|
||||
meta->_number_meta->_float_range,
|
||||
meta->_number_meta->_float_range2,
|
||||
meta->_number_meta->_float_ratio,
|
||||
meta->_number_meta->_float_time
|
||||
});
|
||||
owner->SendDebugMsg(dbg_msg);
|
||||
a8::XPrintf("%s\n", {dbg_msg});
|
||||
}
|
||||
#endif
|
||||
}
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Skill::Proc30701BAO()
|
||||
{
|
||||
float dmg_ruduce_rate = meta->_number_meta->_float_ratio2;
|
||||
@ -622,59 +387,6 @@ void Skill::Proc30701BAO()
|
||||
);
|
||||
}
|
||||
|
||||
void Skill::Proc30801LONG()
|
||||
{
|
||||
#if 1
|
||||
owner->GetTrigger()->AddListener
|
||||
(
|
||||
kDmgOutEvent,
|
||||
[this] (const a8::Args& args)
|
||||
{
|
||||
if (!owner->dead) {
|
||||
owner->AddHp(meta->_number_meta->resume_addition() * args.Get<float>(1));
|
||||
}
|
||||
}
|
||||
);
|
||||
#else
|
||||
int buff_id = SkillHelper::GetJyfhBuffId(meta);
|
||||
float buff_time = SkillHelper::GetJyfhBuffTime(meta);
|
||||
|
||||
owner->GetTrigger()->AddListener
|
||||
(
|
||||
kStartRescueEvent,
|
||||
[this, buff_id, buff_time] (const a8::Args& args)
|
||||
{
|
||||
Human* target = args.Get<Human*>(0);
|
||||
owner->TryAddBuffAndSetTime(owner, buff_id, buff_time * 1000, meta);
|
||||
target->TryAddBuffAndSetTime(owner, buff_id, buff_time * 1000, meta);
|
||||
}
|
||||
);
|
||||
owner->GetTrigger()->AddListener
|
||||
(
|
||||
kEndRescueEvent,
|
||||
[this, buff_id] (const a8::Args& args)
|
||||
{
|
||||
Human* target = args.Get<Human*>(0);
|
||||
owner->RemoveBuffById(buff_id);
|
||||
target->RemoveBuffById(buff_id);
|
||||
}
|
||||
);
|
||||
#ifdef DEBUG
|
||||
{
|
||||
std::string dbg_msg = a8::Format
|
||||
(
|
||||
"skill_id:%d 救援防护 time:%f",
|
||||
{
|
||||
meta->skill_id(),
|
||||
buff_time
|
||||
});
|
||||
owner->SendDebugMsg(dbg_msg);
|
||||
a8::XPrintf("%s\n", {dbg_msg});
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void Skill::ProcSkillPhase(const mt::SkillPhase* phase)
|
||||
{
|
||||
switch (phase->func_id) {
|
||||
|
@ -51,11 +51,7 @@ private:
|
||||
|
||||
void NotifySkillState();
|
||||
|
||||
void Proc30101HL();
|
||||
void Proc30201HX();
|
||||
void Proc30401MAO();
|
||||
void Proc30701BAO();
|
||||
void Proc30801LONG();
|
||||
|
||||
void ProcShotPhase(const mt::SkillPhase* phase);
|
||||
void ProcSpecDirShotPhase(const mt::SkillPhase* phase);
|
||||
|
Loading…
x
Reference in New Issue
Block a user