155 lines
5.2 KiB
C++
155 lines
5.2 KiB
C++
#include "precompile.h"
|
|
|
|
#include "buff/hold_shield.h"
|
|
|
|
#include "skill.h"
|
|
#include "creature.h"
|
|
#include "human.h"
|
|
#include "room.h"
|
|
#include "skillhelper.h"
|
|
#include "trigger.h"
|
|
#include "entityfactory.h"
|
|
#include "explosion.h"
|
|
|
|
#include "mt/Skill.h"
|
|
#include "mt/Buff.h"
|
|
#include "mt/SkillNumber.h"
|
|
|
|
void HoldShieldBuff::Activate()
|
|
{
|
|
owner->shield_max_hp_ = SkillHelper::GetLdfyHp(owner, skill_meta);
|
|
owner->shield_hp_ = owner->shield_max_hp_;
|
|
owner->room->frame_event.AddPropChg(owner->GetWeakPtrRef(),
|
|
kPropShieldHp,
|
|
owner->shield_max_hp_,
|
|
owner->shield_hp_);
|
|
if (skill_meta) {
|
|
switch (skill_meta->GetMagicId()) {
|
|
case MAGIC_21001_NIU:
|
|
{
|
|
owner->room->xtimer.ModifyTime
|
|
(remover_timer,
|
|
SkillHelper::GetLdfyBuffTime(owner, skill_meta) * 1000 / FRAME_RATE_MS);
|
|
if (owner->CurrentSkill() && owner->CurrentSkill()->meta == skill_meta) {
|
|
Creature* c = owner;
|
|
owner->CurrentSkill()->AddMinorMode
|
|
(
|
|
SMT_BLINK,
|
|
SkillHelper::GetLdfyBuffTime(owner, skill_meta) * 1000,
|
|
[this, c]
|
|
{
|
|
c->RemoveBuffByEffectId(kBET_HoldShield);
|
|
c->TryAddBuff(c, meta->_int_buff_param2);
|
|
}
|
|
);
|
|
}
|
|
#ifdef DEBUG
|
|
{
|
|
std::string dbg_msg = a8::Format
|
|
(
|
|
"skill_id:%d 立盾防御 hp:%f ratio:%f ratio:%f human.max_hp:%f time:%f",
|
|
{
|
|
skill_meta->skill_id(),
|
|
owner->shield_max_hp_,
|
|
skill_meta->_number_meta->_float_ratio,
|
|
skill_meta->_number_meta->_float_ratio2,
|
|
owner->GetMaxHP(),
|
|
skill_meta->_number_meta->_float_time,
|
|
});
|
|
owner->SendDebugMsg(dbg_msg);
|
|
a8::XPrintf("%s\n", {dbg_msg});
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
owner->GetTrigger()->AddListener
|
|
(
|
|
kShieldDestoryEvent,
|
|
[this] (const a8::Args& params)
|
|
{
|
|
OnShieldDestory(params);
|
|
});
|
|
}
|
|
|
|
void HoldShieldBuff::Deactivate()
|
|
{
|
|
}
|
|
|
|
void HoldShieldBuff::OnShieldDestory(const a8::Args& params)
|
|
{
|
|
if (!skill_meta || skill_meta->GetMagicId() != MAGIC_21001_NIU) {
|
|
return;
|
|
}
|
|
|
|
CreatureWeakPtr sender = owner->GetWeakPtrRef();
|
|
|
|
std::shared_ptr<Explosion> e = EntityFactory::Instance()->MakeExplosion();
|
|
e->SetThrough(true);
|
|
e->SetCustomCheckCb
|
|
(
|
|
[this, sender]
|
|
(const a8::Args& args) mutable
|
|
{
|
|
bool* is_hit = args.Get<bool*>(0);
|
|
Entity* e = args.Get<Entity*>(1);
|
|
if (sender.Get() && e->IsCreature(sender.Get()->room)) {
|
|
Creature* c = (Creature*)e;
|
|
float distance = c->GetPos().Distance2D2(sender.Get()->GetPos());
|
|
if (distance <= skill_meta->_number_meta->_float_range2) {
|
|
*is_hit = true;
|
|
}
|
|
}
|
|
}
|
|
);
|
|
e->SetHitCb
|
|
(
|
|
[this, sender] (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(),
|
|
skill_meta->_number_meta->_float_range2,
|
|
SkillHelper::GetCmxdExplosion(skill_meta),
|
|
0
|
|
);
|
|
}
|