From 838d9eca3fb51ddf2ed337482fd3364685f168bb Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 9 Apr 2021 13:39:22 +0800 Subject: [PATCH] 1 --- server/gameserver/buff.cc | 136 ++++++++++++++++---------------------- server/gameserver/buff.h | 3 + 2 files changed, 59 insertions(+), 80 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index ca77676..899bdcf 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -27,93 +27,69 @@ void Buff::FillMFBuff(cs::MFBuff* buff_pb) void Buff::ProcDelayAddBuff(Creature* caster) { - if (caster) { - SkillCasterState* caster_state = new SkillCasterState; - caster->FillSkillCasterState(caster_state); - owner->room->xtimer.AddDeadLineTimerAndAttach - ( - SERVER_FRAME_RATE * meta->param1, - a8::XParams() - .SetSender(owner) - .SetParam1(caster_state) - .SetParam2(meta->param2) - .SetParam3(((Creature*)caster)->CurrentSkill()->meta), - [] (const a8::XParams& param) - { - Creature* receiver = (Creature*)param.sender.GetUserData(); - SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); - if (caster_state->caster.Get()) { - int buff_id = param.param2; - MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); - MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); - if (buff_meta && - caster_state->caster.Get()->CurrentSkill() && - skill == caster_state->caster.Get()->CurrentSkill()->meta) { - SkillCasterState old_caster_state; - caster_state->caster.Get()->FillSkillCasterState(&old_caster_state); - caster_state->caster.Get()->RecoverSkillCasterState(caster_state); - receiver->AddBuff(caster_state->caster.Get(), buff_meta, 1, skill); - caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state); - } - } - }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); - delete caster_state; - }); - } + InternalTimerAddBuff(caster); } void Buff::ProcIntervalAddBuff(Creature* caster) { - #if 0 - if (caster) { - SkillCasterState* caster_state = new SkillCasterState; - caster->FillSkillCasterState(caster_state); - room->xtimer.AddRepeatTimerAndAttach - ( - buff->meta->param1 / FRAME_RATE_MS, - a8::XParams() - .SetSender(this) - .SetParam1(caster_state) - .SetParam2(buff->meta) - .SetParam3(caster->CurrentSkill() ? caster->CurrentSkill()->meta : nullptr), - [] (const a8::XParams& param) - { - Creature* receiver = (Creature*)param.sender.GetUserData(); - SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); - if (caster_state->caster.Get()) { - int buff_id = param.param2; - MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); - MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); - if (buff_meta && - (!skill || - ( - caster_state->caster.Get()->CurrentSkill() && - skill == caster_state->caster.Get()->CurrentSkill()->meta) - ) - ) { - SkillCasterState old_caster_state; - caster_state->caster.Get()->FillSkillCasterState(&old_caster_state); - caster_state->caster.Get()->RecoverSkillCasterState(caster_state); - receiver->AddBuff(caster_state->caster.Get(), buff_meta, 1, skill); - caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state); - } - } - }, - &buff->xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); - delete caster_state; - }); - } - #endif + InternalTimerAddBuff(caster); } void Buff::ProcBatchAddBuff(Creature* caster) { } + +void Buff::InternalTimerAddBuff(Creature* caster) +{ + if (!caster) { + return; + } + auto timer_func = + [] (const a8::XParams& param) + { + Creature* receiver = (Creature*)param.sender.GetUserData(); + SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); + if (caster_state->caster.Get()) { + int buff_id = param.param2; + MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (buff_meta && + (!skill || + ( + caster_state->caster.Get()->CurrentSkill() && + skill == caster_state->caster.Get()->CurrentSkill()->meta) + ) + ) { + SkillCasterState old_caster_state; + caster_state->caster.Get()->FillSkillCasterState(&old_caster_state); + caster_state->caster.Get()->RecoverSkillCasterState(caster_state); + receiver->AddBuff(caster_state->caster.Get(), buff_meta, 1, skill); + caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state); + } + } + }; + auto timer_after_func = + [] (const a8::XParams& param) + { + SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); + delete caster_state; + }; + + SkillCasterState* caster_state = new SkillCasterState; + caster->FillSkillCasterState(caster_state); + + a8::XParams param; + param.SetSender(this); + param.SetParam1(caster_state); + param.SetParam2(meta); + param.SetParam3(caster->CurrentSkill() ? caster->CurrentSkill()->meta : nullptr); + + owner->room->xtimer.AddRepeatTimerAndAttach + ( + meta->param1 / FRAME_RATE_MS, + param, + timer_func, + &xtimer_attacher.timer_list_, + timer_after_func); +} diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index 10b3321..1e04c9d 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -33,4 +33,7 @@ class Buff void ProcDelayAddBuff(Creature* caster); void ProcIntervalAddBuff(Creature* caster); void ProcBatchAddBuff(Creature* caster); + +private: + void InternalTimerAddBuff(Creature* caster); };