aozhiwei 83a35e8cfd 1
2023-03-05 12:00:48 +08:00

138 lines
3.4 KiB
C++

#include "precompile.h"
#include "buff/callfunc.h"
#include "creature.h"
#include "ability.h"
#include "room.h"
#include "skill.h"
#include "mt/Buff.h"
#include "mt/Skill.h"
void CallFuncBuff::Activate()
{
switch ((BuffCallFunc_e)meta->_int_buff_param1) {
case BuffCallFunc_e::kAddMinorMode:
{
ProcAddMinorMode();
}
break;
case BuffCallFunc_e::kSpeedReduce:
{
hold_param2_ = meta->GetBuffParam2(owner, skill_meta);
owner->GetAbility()->AddSpeedRuduce(hold_param2_);
}
break;
case BuffCallFunc_e::kInternalRangeAddBuff:
{
ProcIntervalRangeAddBuffFunc();
}
break;
case BuffCallFunc_e::kDecHp:
{
}
break;
case BuffCallFunc_e::kMarkTag:
{
ProcMarkTag();
}
break;
default:
{
}
break;
}
}
void CallFuncBuff::Deactivate()
{
switch ((BuffCallFunc_e)meta->_int_buff_param1) {
case BuffCallFunc_e::kAddMinorMode:
{
}
break;
case BuffCallFunc_e::kSpeedReduce:
{
owner->GetAbility()->DelSpeedRuduce(hold_param2_);
}
break;
default:
{
}
break;
}
}
void CallFuncBuff::ProcIntervalRangeAddBuffFunc()
{
owner->room->xtimer.SetIntervalEx
(
meta->_buff_param4 / FRAME_RATE_MS,
[this] (int event, const a8::Args* args)
{
if (a8::TIMER_EXEC_EVENT == event) {
owner->TraverseCreatures
(
[this] (Creature* c, bool& stop)
{
if (c->dead) {
return;
}
if (owner->GetUniId() == c->GetUniId()) {
return;
}
if (!GetCaster().Get()) {
return;
}
if (GetCaster().Get()->team_id != c->team_id) {
if (owner->GetPos().Distance2D2(c->GetPos()) < meta->_buff_param2) {
c->TryAddBuff(GetCaster().Get(), meta->_int_buff_param3, skill_meta);
}
}
});
}
},
&xtimer_attacher
);
}
void CallFuncBuff::ProcAddMinorMode()
{
if (skill_meta) {
float dur_time = meta->GetBuffParam3(owner, skill_meta);
Skill* skill = owner->GetSkill(skill_meta->skill_id());
if (skill) {
skill->AddMinorMode
(
meta->_int_buff_param2,
dur_time,
[this] (int action)
{
if (action == 0) {
owner->TryAddBuff(owner, meta->_int_buff_param4, skill_meta);
} else if (action) {
owner->TryAddBuff(owner, meta->_int_buff_param5, skill_meta);
}
});
}
}
}
void CallFuncBuff::ProcMarkTag()
{
switch (meta->_int_buff_param2) {
case 1:
{
owner->SetBuffTag(meta->_int_buff_param3, meta->_int_buff_param4);
}
break;
case 2:
{
owner->IncBuffTag(meta->_int_buff_param3, meta->_int_buff_param4);
}
break;
}
}