1
This commit is contained in:
parent
813846b8f7
commit
e24c380fb5
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user