From fc0ae8f6c59e9db9355209ff097fbbcc2c26e9c3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 18 May 2021 15:52:13 +0800 Subject: [PATCH] 1 --- server/gameserver/frameevent.cc | 76 +++++++++++++------------ server/gameserver/frameevent.h | 4 +- server/gameserver/hero.cc | 19 +++++-- server/gameserver/human.cc | 6 +- server/tools/protobuild/metatable.proto | 2 + 5 files changed, 62 insertions(+), 45 deletions(-) diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index a0aa5de..b138ff2 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -290,47 +290,51 @@ void FrameEvent::AddZombieIdChg(Human* sender) } -void FrameEvent::AddDead(Human* sender, int revive_time) +void FrameEvent::AddDead(CreatureWeakPtr& sender, int revive_time) { - { - dead_alive_objs_.push_back( - std::make_tuple( - sender->GetEntityUniId(), - revive_time, - 0 - ) - ); - } - { - int dead_idx = dead_alive_objs_.size() - 1; - sender->TouchAllLayerHumanList - ( - [dead_idx] (Human* hum, bool& stop) - { - hum->dead_alive_objs_.push_back(dead_idx); - }); + if (sender.Get()) { + { + dead_alive_objs_.push_back( + std::make_tuple( + sender.Get()->GetEntityUniId(), + revive_time, + 0 + ) + ); + } + { + int dead_idx = dead_alive_objs_.size() - 1; + sender.Get()->TouchAllLayerHumanList + ( + [dead_idx] (Human* hum, bool& stop) + { + hum->dead_alive_objs_.push_back(dead_idx); + }); + } } } -void FrameEvent::AddRevive(Human* sender) +void FrameEvent::AddRevive(CreatureWeakPtr& sender) { - { - dead_alive_objs_.push_back( - std::make_tuple( - sender->GetEntityUniId(), - 0, - 1 - ) - ); - } - { - int revive_idx = dead_alive_objs_.size() - 1; - sender->TouchAllLayerHumanList - ( - [revive_idx] (Human* hum, bool& stop) - { - hum->dead_alive_objs_.push_back(revive_idx); - }); + if (sender.Get()) { + { + dead_alive_objs_.push_back( + std::make_tuple( + sender.Get()->GetEntityUniId(), + 0, + 1 + ) + ); + } + { + int revive_idx = dead_alive_objs_.size() - 1; + sender.Get()->TouchAllLayerHumanList + ( + [revive_idx] (Human* hum, bool& stop) + { + hum->dead_alive_objs_.push_back(revive_idx); + }); + } } } diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index 1cc3e31..31d5c64 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -33,8 +33,8 @@ public: void AddSkillCurrTimesChg(CreatureWeakPtr sender, int skill_id, int curr_times); void AddItemChg(Human* hum, int item_id, int item_num); void AddZombieIdChg(Human* hum); - void AddDead(Human* sender, int revive_time); - void AddRevive(Human* sender); + void AddDead(CreatureWeakPtr& sender, int revive_time); + void AddRevive(CreatureWeakPtr& sender); void AddCarChg(Human* sender); void Clear(); diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 58229b9..67b4737 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -290,8 +290,19 @@ void Hero::DecHP(float dec_hp, int killer_id, const std::string& killer_name, in void Hero::BeKill(int killer_id, const std::string& killer_name, int weapon_id) { dead = true; - BroadcastDeleteState(room); - RemoveFromAroundPlayers(room); - room->grid_service->RemoveCreature(this); - room->RemoveObjectLater(this); + room->frame_event.AddDead(GetWeakPtrRef(), 0); + room->xtimer.AddDeadLineTimerAndAttach + ( + meta->i->delay_delete() / FRAME_RATE_MS, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Hero* hero = (Hero*)param.sender.GetUserData(); + hero->BroadcastDeleteState(hero->room); + hero->RemoveFromAroundPlayers(hero->room); + hero->room->grid_service->RemoveCreature(hero); + hero->room->RemoveObjectLater(hero); + }, + &xtimer_attacher.timer_list_); } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 324a517..7cf2cf5 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -815,7 +815,7 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) } ClearLordMode(); ClearBuffList(); - room->frame_event.AddDead(this, + room->frame_event.AddDead(GetWeakPtrRef(), meta->i->revive_time() * 1000); SyncAroundPlayers(__FILE__, __LINE__, __func__); room->xtimer.AddDeadLineTimerAndAttach @@ -840,7 +840,7 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) RemoveBuffByEffectId(kBET_Camouflage); } ClearLordMode(); - room->frame_event.AddDead(this, + room->frame_event.AddDead(GetWeakPtrRef(), 0); #ifdef DEBUG room->CheckPartObjects(); @@ -2703,7 +2703,7 @@ void Human::Revive() AddBuff(this, buff_meta, 1); } } - room->frame_event.AddRevive(this); + room->frame_event.AddRevive(GetWeakPtrRef()); room->OnHumanRevive(this); ResetSkill(); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 0e4f79b..74d6d07 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -162,6 +162,8 @@ message Player optional string ai_script = 26; optional string init_buffs = 27; optional int32 default_weapon = 28; + optional int32 dead_drop = 29; + optional int32 delay_delete = 39; } message Robot