From 0dae85dd30d8fcf3dfb179674ff9922a64e758b7 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 9 Apr 2021 13:28:35 +0800 Subject: [PATCH] 1 --- server/gameserver/buff.cc | 94 +++++++++++++++++++++++++++++++++++ server/gameserver/buff.h | 4 ++ server/gameserver/constant.h | 1 + server/gameserver/creature.cc | 85 +++---------------------------- 4 files changed, 106 insertions(+), 78 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 08594b8..ca77676 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -5,6 +5,7 @@ #include "human.h" #include "room.h" #include "collider.h" +#include "skill.h" int Buff::GetLeftTime() { @@ -23,3 +24,96 @@ void Buff::FillMFBuff(cs::MFBuff* buff_pb) buff_pb->set_left_time(GetLeftTime()); buff_pb->set_lasting_time(GetLastingTime()); } + +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; + }); + } +} + +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 +} + +void Buff::ProcBatchAddBuff(Creature* caster) +{ + +} diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index 512fb96..10b3321 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -29,4 +29,8 @@ class Buff int GetLeftTime(); int GetLastingTime(); void FillMFBuff(cs::MFBuff* buff_pb); + + void ProcDelayAddBuff(Creature* caster); + void ProcIntervalAddBuff(Creature* caster); + void ProcBatchAddBuff(Creature* caster); }; diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 58fadbc..c66521c 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -168,6 +168,7 @@ enum BuffEffectType_e kBET_InGrass = 56, //在草丛 kBET_InWater = 57, //在水里 kBET_InIce = 58, //在冰里 + kBET_BatchAddBuff = 60, //批量添加buff kBET_End }; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 7263880..a278846 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -817,88 +817,12 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) break; case kBET_DelayAddBuff: { - if (caster) { - SkillCasterState* caster_state = new SkillCasterState; - caster->FillSkillCasterState(caster_state); - room->xtimer.AddDeadLineTimerAndAttach - ( - SERVER_FRAME_RATE * buff->meta->param1, - a8::XParams() - .SetSender(this) - .SetParam1(caster_state) - .SetParam2(buff->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); - } - } - }, - &buff->xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); - delete caster_state; - }); - } + buff->ProcDelayAddBuff(caster); } break; case kBET_IntervalAddBuff: { - 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; - }); - } + buff->ProcIntervalAddBuff(caster); } break; case kBET_SummonHero: @@ -939,6 +863,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) } } break; + case kBET_BatchAddBuff: + { + buff->ProcBatchAddBuff(caster); + } + break; default: { }