From ff06c88be03f59dc534c919d0f5db16509c29b73 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Dec 2022 10:25:15 +0800 Subject: [PATCH] 1 --- server/gameserver/android_agent.cc | 9 +- server/gameserver/buff.cc | 153 +++++++++++++---------------- 2 files changed, 71 insertions(+), 91 deletions(-) diff --git a/server/gameserver/android_agent.cc b/server/gameserver/android_agent.cc index 4ae73e3d..703e4b50 100644 --- a/server/gameserver/android_agent.cc +++ b/server/gameserver/android_agent.cc @@ -30,15 +30,14 @@ behaviac::EBTStatus AndroidAgent::DoIdle(int min_time, int max_time) } int idle_time = a8::RandEx(min_time, max_time); - xtimer_list* timer = GetOwner()->room->xtimer.AddDeadLineTimerAndAttach + std::weak_ptr timer_ptr = GetOwner()->room->xtimer.AddDeadLineTimerEx ( idle_time / FRAME_RATE_MS, - a8::XParams(), - [] (const a8::XParams& param) + a8::Args({}), + [] (int event, const a8::Args& args, const a8::Args* user_args) { }, - &GetOwner()->xtimer_attacher.timer_list_); - std::weak_ptr timer_ptr = GetOwner()->room->xtimer.GetTimerPtr(timer); + &GetOwner()->xtimer_attacher); std::shared_ptr last_attacker = std::make_shared(); std::shared_ptr last_attacked_frameno = std::make_shared(0); diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 3ace3f25..65037b0d 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -129,73 +129,63 @@ void Buff::InternalTimerAddBuff() if (!caster_.Get()) { return; } + + std::shared_ptr caster_state = std::make_shared(); + caster_.Get()->FillSkillCasterState(caster_state.get()); + + MetaData::Skill* skill = caster_.Get()->CurrentSkill() ? caster_.Get()->CurrentSkill()->meta : nullptr; auto timer_func = - [] (const a8::XParams& param) + [this, caster_state, skill] (int event, const a8::Args& args, const a8::Args* user_args) { - Creature* receiver = (Creature*)param.sender.GetUserData(); - SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); - if (caster_state->caster.Get()) { - CreatureWeakPtr caster = caster_state->caster; - std::shared_ptr old_context_ability = receiver->context_ability; - a8::Vec2 old_context_dir = receiver->context_dir; - Position old_context_pos = receiver->context_pos; - receiver->context_dir = receiver->GetAttackDir(); - receiver->context_pos = receiver->GetPos(); + if (a8::TIMER_EXEC_EVENT == event) { + Creature* receiver = owner; + if (caster_state->caster.Get()) { + CreatureWeakPtr caster = caster_state->caster; + std::shared_ptr old_context_ability = receiver->context_ability; + a8::Vec2 old_context_dir = receiver->context_dir; + Position old_context_pos = receiver->context_pos; + receiver->context_dir = receiver->GetAttackDir(); + receiver->context_pos = receiver->GetPos(); - 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) { - SkillCasterState old_caster_state; - caster.Get()->FillSkillCasterState(&old_caster_state); - caster.Get()->RecoverSkillCasterState(caster_state); - //!!!在AddBuff的过程可能删除buff导致caster_state野指针 - receiver->AddBuff(caster.Get(), buff_meta, skill); - caster.Get()->RecoverSkillCasterState(&old_caster_state); + int buff_id = meta->int_param2; + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (buff_meta) { + SkillCasterState old_caster_state; + caster.Get()->FillSkillCasterState(&old_caster_state); + caster.Get()->RecoverSkillCasterState(caster_state.get()); + //!!!在AddBuff的过程可能删除buff导致caster_state野指针 + receiver->AddBuff(caster.Get(), buff_meta, skill); + caster.Get()->RecoverSkillCasterState(&old_caster_state); + } + + receiver->context_dir = old_context_dir; + receiver->context_pos = old_context_pos; + receiver->context_ability = old_context_ability; } - - receiver->context_dir = old_context_dir; - receiver->context_pos = old_context_pos; - receiver->context_ability = old_context_ability; } }; - auto timer_after_func = - [] (const a8::XParams& param, bool is_destory) - { - SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); - delete caster_state; - }; - - SkillCasterState* caster_state = new SkillCasterState; - caster_.Get()->FillSkillCasterState(caster_state); - - a8::XParams param; - param.SetSender(owner); - param.SetParam1(caster_state); - param.SetParam2(meta->i->buff_param2()); - param.SetParam3(caster_.Get()->CurrentSkill() ? caster_.Get()->CurrentSkill()->meta : nullptr); switch (meta->i->buff_effect() ) { case kBET_DelayAddBuff: { - owner->room->xtimer.AddDeadLineTimerAndAttach + owner->room->xtimer.AddDeadLineTimer ( meta->param1 * SERVER_FRAME_RATE, - param, + a8::Args({}), timer_func, - &xtimer_attacher.timer_list_, - timer_after_func); + &xtimer_attacher + ); } break; case kBET_IntervalAddBuff: { - owner->room->xtimer.AddRepeatTimerAndAttach + owner->room->xtimer.AddRepeatTimer ( meta->param1 / FRAME_RATE_MS, - param, + a8::Args({}), timer_func, - &xtimer_attacher.timer_list_, - timer_after_func); + &xtimer_attacher + ); } break; default: @@ -214,19 +204,19 @@ void Buff::ProcSummonHero() void Buff::ProcBeRecycle() { - owner->room->xtimer.AddRepeatTimerAndAttach + owner->room->xtimer.AddRepeatTimer ( SERVER_FRAME_RATE * 2, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) + a8::Args({}), + [this] (int event, const a8::Args& args, const a8::Args* user_args) { - Buff* buff = (Buff*)param.sender.GetUserData(); - if (buff->owner->IsHuman()) { - buff->owner->room->GetIncubator()->RecycleAndroid((Human*)buff->owner); + if (a8::TIMER_EXEC_EVENT == event) { + if (owner->IsHuman()) { + owner->room->GetIncubator()->RecycleAndroid(owner->AsHuman()); + } } }, - &xtimer_attacher.timer_list_ + &xtimer_attacher ); } @@ -388,40 +378,39 @@ void Buff::ProcSprint() owner->GetAttackDir().y, owner->GetSpeed() })); - owner->room->xtimer.AddRepeatTimerAndAttach + owner->room->xtimer.AddRepeatTimer ( 2, - a8::XParams() - .SetSender(owner), - [] (const a8::XParams& param) + a8::Args({}), + [this] (int event, const a8::Args& args, const a8::Args* user_args) { - Human* hum = (Human*)param.sender.GetUserData(); - hum->SendDebugMsg(a8::Format("xxxxxxxx move_dir:%d,%d attack_dir:%d,%d speed:%d", - { - hum->GetMoveDir().x, - hum->GetMoveDir().y, - hum->GetAttackDir().x, - hum->GetAttackDir().y, - hum->GetSpeed() - })); + if (a8::TIMER_EXEC_EVENT == event) { + Human* hum = owner->AsHuman(); + hum->SendDebugMsg(a8::Format("xxxxxxxx move_dir:%d,%d attack_dir:%d,%d speed:%d", + { + hum->GetMoveDir().x, + hum->GetMoveDir().y, + hum->GetAttackDir().x, + hum->GetAttackDir().y, + hum->GetSpeed() + })); + } }, - &xtimer_attacher.timer_list_ + &xtimer_attacher ); } #endif } Player* hum = (Player*)caster_.Get(); - std::map* hited_objects = new std::map; - Position* pre_pos = new Position; + auto hited_objects = std::make_shared>(); + auto pre_pos = std::make_shared(); *pre_pos = owner->GetPos(); - owner->room->xtimer.AddRepeatTimerAndAttach + owner->room->xtimer.AddRepeatTimer ( 1, - a8::XParams() - .SetSender(this) - .SetParam1(hited_objects) - .SetParam2(pre_pos), - [] (const a8::XParams& param) + a8::Args({}), + [this, hited_objects, pre_pos] + (int event, const a8::Args& args, const a8::Args* user_args) { Buff* buff = (Buff*)param.sender.GetUserData(); if (!buff->meta->param3_int_list.empty() || buff->skill_meta) { @@ -490,15 +479,7 @@ void Buff::ProcSprint() *pre_pos = buff->owner->GetPos(); } }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param, bool is_destory) - { - std::map* hited_objects = (std::map*) - param.param1.GetUserData(); - a8::Vec2* pre_pos = (a8::Vec2*)param.param2.GetUserData(); - delete pre_pos; - delete hited_objects; - }); + &xtimer_attacher); } if (skill_meta) { switch (skill_meta->GetMagicId()) {