game2006/server/gameserver/buff/hold_shield.cc
aozhiwei ecf5d6042f 1
2023-02-28 17:41:23 +08:00

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