This commit is contained in:
aozhiwei 2023-02-16 16:09:09 +08:00
parent 813846b8f7
commit e24c380fb5

View File

@ -547,110 +547,37 @@ void Skill::Proc30401MAO()
void Skill::Proc30501TZ() void Skill::Proc30501TZ()
{ {
#if 0
owner->GetTrigger()->AddListener owner->GetTrigger()->AddListener
( (
kShieldDestoryEvent, kYsRemoveEvent,
[this] (const a8::Args& params) [this] (const a8::Args& args)
{ {
Buff* hold_shield_buff = owner->GetBuffByEffectId(kBET_HoldShield); Buff* buff = args.Get<Buff*>(0);
if (hold_shield_buff) { if (!buff->remover_timer.expired() && !buff->owner->dead) {
const mt::Skill* skill_meta = hold_shield_buff->skill_meta; int buff_time = owner->room->xtimer.GetRemainTime(buff->remover_timer) * FRAME_RATE_MS;
const mt::Skill* this_skill_meta = meta; int remain_time = buff_time - meta->_number_meta->_float_time * 1000;
const mt::Buff* shield_buff_meta = hold_shield_buff->meta; if (remain_time > 100) {
CreatureWeakPtr sender = owner->GetWeakPtrRef(); int buff_id = buff->meta->buff_id();
auto skill_meta = buff->skill_meta;
std::shared_ptr<Explosion> e = EntityFactory::Instance()->MakeExplosion(); owner->room->xtimer.SetTimeoutEx
e->SetThrough(true); (
e->SetCustomCheckCb meta->_number_meta->_float_time * 1000 / FRAME_RATE_MS,
( [this, buff_id, remain_time, skill_meta]
[sender, skill_meta, this_skill_meta, shield_buff_meta] (int event, const a8::Args* args)
(const a8::Args& args) mutable {
{ if (a8::TIMER_EXEC_EVENT == event) {
bool* is_hit = args.Get<bool*>(0); if (!owner->HasBuffEffect(kBET_Hide)) {
Entity* e = args.Get<Entity*>(1); owner->TryAddBuffAndSetTime(owner, buff_id, remain_time, skill_meta);
if (sender.Get() && e->IsCreature(sender.Get()->room)) { }
Creature* c = (Creature*)e;
glm::vec3 target_pos = sender.Get()->GetPos().ToGlmVec3();
target_pos = target_pos + (sender.Get()->GetAttackDir() * (float)SkillHelper::GetCmxdRange(this_skill_meta) / 2.0f);
bool ret = Collision::Check2dRotationRectangle
(c->GetPos().GetX(),
c->GetPos().GetY(),
20,
target_pos.x,
target_pos.y,
shield_buff_meta->_buff_param4,
SkillHelper::GetCmxdRange(this_skill_meta),
sender.Get()->GetAttackDirRotate() * 180.0f
);
if (ret) {
*is_hit = true;
} }
} },
} &owner->xtimer_attacher);
); }
e->SetHitCb
(
[sender, skill_meta] (const a8::Args& args) mutable
{
if (sender.Get()) {
Entity* e = args.Get<Entity*>(0);
if (e->IsCreature(sender.Get()->room)) {
Creature* c = (Creature*)e;
if (c->IsInvincible()) {
return;
}
if (c->dead) {
return;
}
float dmg = SkillHelper::GetCmxdDmg(sender.Get(), skill_meta);
float dmg_out = 0.0f;
c->DecHP(dmg,
VP_Explosion,
"",
SkillHelper::GetCmxdExplosion(skill_meta),
sender.Get()->GetUniId(),
sender.Get()->GetName(),
dmg_out);
glm::vec3 dir = sender.Get()->GetAttackDir();
if (!GlmHelper::IsZero(dir)) {
glm::vec3 target_pos = c->GetPos().ToGlmVec3() +
dir * (float)SkillHelper::GetCmxdDistance(skill_meta);
c->PullTarget(target_pos);
}
c->TryAddBuffAndSetTime(sender.Get(),
kVertigoEffectBuffId,
SkillHelper::GetCmxdVertigoTime(skill_meta) * 1000);
}
}
}
);
e->EnemyAndObstacleAttack
(
owner->GetWeakPtrRef(),
owner->GetPos(),
SkillHelper::GetCmxdRange(meta),
SkillHelper::GetCmxdExplosion(meta),
0
);
#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::Proc30601DJS() void Skill::Proc30601DJS()
@ -1023,30 +950,105 @@ void Skill::Proc31001NIU()
#else #else
owner->GetTrigger()->AddListener owner->GetTrigger()->AddListener
( (
kYsRemoveEvent, kShieldDestoryEvent,
[this] (const a8::Args& args) [this] (const a8::Args& params)
{ {
Buff* buff = args.Get<Buff*>(0); Buff* hold_shield_buff = owner->GetBuffByEffectId(kBET_HoldShield);
if (!buff->remover_timer.expired() && !buff->owner->dead) { if (hold_shield_buff) {
int buff_time = owner->room->xtimer.GetRemainTime(buff->remover_timer) * FRAME_RATE_MS; const mt::Skill* skill_meta = hold_shield_buff->skill_meta;
int remain_time = buff_time - meta->_number_meta->_float_time * 1000; const mt::Skill* this_skill_meta = meta;
if (remain_time > 100) { const mt::Buff* shield_buff_meta = hold_shield_buff->meta;
int buff_id = buff->meta->buff_id(); CreatureWeakPtr sender = owner->GetWeakPtrRef();
auto skill_meta = buff->skill_meta;
owner->room->xtimer.SetTimeoutEx std::shared_ptr<Explosion> e = EntityFactory::Instance()->MakeExplosion();
( e->SetThrough(true);
meta->_number_meta->_float_time * 1000 / FRAME_RATE_MS, e->SetCustomCheckCb
[this, buff_id, remain_time, skill_meta] (
(int event, const a8::Args* args) [sender, skill_meta, this_skill_meta, shield_buff_meta]
{ (const a8::Args& args) mutable
if (a8::TIMER_EXEC_EVENT == event) { {
if (!owner->HasBuffEffect(kBET_Hide)) { bool* is_hit = args.Get<bool*>(0);
owner->TryAddBuffAndSetTime(owner, buff_id, remain_time, skill_meta); Entity* e = args.Get<Entity*>(1);
} if (sender.Get() && e->IsCreature(sender.Get()->room)) {
Creature* c = (Creature*)e;
glm::vec3 target_pos = sender.Get()->GetPos().ToGlmVec3();
target_pos = target_pos + (sender.Get()->GetAttackDir() * (float)SkillHelper::GetCmxdRange(this_skill_meta) / 2.0f);
bool ret = Collision::Check2dRotationRectangle
(c->GetPos().GetX(),
c->GetPos().GetY(),
20,
target_pos.x,
target_pos.y,
shield_buff_meta->_buff_param4,
SkillHelper::GetCmxdRange(this_skill_meta),
sender.Get()->GetAttackDirRotate() * 180.0f
);
if (ret) {
*is_hit = true;
} }
}, }
&owner->xtimer_attacher); }
} );
e->SetHitCb
(
[sender, skill_meta] (const a8::Args& args) mutable
{
if (sender.Get()) {
Entity* e = args.Get<Entity*>(0);
if (e->IsCreature(sender.Get()->room)) {
Creature* c = (Creature*)e;
if (c->IsInvincible()) {
return;
}
if (c->dead) {
return;
}
float dmg = SkillHelper::GetCmxdDmg(sender.Get(), skill_meta);
float dmg_out = 0.0f;
c->DecHP(dmg,
VP_Explosion,
"",
SkillHelper::GetCmxdExplosion(skill_meta),
sender.Get()->GetUniId(),
sender.Get()->GetName(),
dmg_out);
glm::vec3 dir = sender.Get()->GetAttackDir();
if (!GlmHelper::IsZero(dir)) {
glm::vec3 target_pos = c->GetPos().ToGlmVec3() +
dir * (float)SkillHelper::GetCmxdDistance(skill_meta);
c->PullTarget(target_pos);
}
c->TryAddBuffAndSetTime(sender.Get(),
kVertigoEffectBuffId,
SkillHelper::GetCmxdVertigoTime(skill_meta) * 1000);
}
}
}
);
e->EnemyAndObstacleAttack
(
owner->GetWeakPtrRef(),
owner->GetPos(),
SkillHelper::GetCmxdRange(meta),
SkillHelper::GetCmxdExplosion(meta),
0
);
#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
} }
} }
); );