This commit is contained in:
aozhiwei 2023-03-20 18:26:29 +08:00
parent 9f1def6671
commit d2f261dc5d
2 changed files with 0 additions and 292 deletions

View File

@ -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) {

View File

@ -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);