From f91828045e5903d77dd6c176d0e1fd6078d660f8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 3 Oct 2022 10:43:01 +0800 Subject: [PATCH] 1 --- server/gameserver/trigger.cc | 36 +++++++++++++++++++++++++++++++----- server/gameserver/trigger.h | 10 ++++++++-- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index 18596536..92ea196a 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -17,7 +17,16 @@ void Trigger::Init() void Trigger::UnInit() { - + for (auto& pair : listeners_hash_) { + while (!list_empty(&pair.second)) { + EventHandler* e = list_first_entry(&pair.second, + EventHandler, + entry); + e->ptr->data = nullptr; + list_del_init(&e->entry); + delete e; + } + } } void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon) @@ -371,14 +380,31 @@ void Trigger::RemoveBuffs(int cond, std::vector& buffids) } } -std::weak_ptr Trigger::AddListener(int event_id, std::function cb) +std::weak_ptr Trigger::AddListener(int event_id, std::function cb) { - + auto itr = listeners_hash_.find(event_id); + if (itr != listeners_hash_.end()) { + listeners_hash_[event_id] = list_head(); + itr = listeners_hash_.find(event_id); + INIT_LIST_HEAD(&itr->second); + } + EventHandler* p = new EventHandler(); + p->cb = cb; + p->ptr = std::make_shared(); + p->ptr->data = p; + list_add_tail(&p->entry, &itr->second); + return p->ptr; } -void Trigger::RemoveEventHandler(std::weak_ptr handler) +void Trigger::RemoveEventHandler(std::weak_ptr handler) { - + if (!handler.expired()) { + auto p = handler.lock()->data; + EventHandler* e = list_entry(&p->entry, EventHandler, entry); + e->ptr->data = nullptr; + list_del_init(&e->entry); + delete e; + } } void Trigger::DispatchEvent(int event_id, const a8::XParams& param) diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h index 409d0a8e..def4ac82 100644 --- a/server/gameserver/trigger.h +++ b/server/gameserver/trigger.h @@ -6,10 +6,16 @@ namespace MetaData struct Equip; }; +struct EventHandlerPtr +{ + struct EventHandler* data = nullptr; +}; + struct EventHandler { std::function cb; list_head entry; + std::shared_ptr ptr; }; class Weapon; @@ -34,8 +40,8 @@ public: void Die(); void ActiveBuff(MetaData::Buff* buff_meta); void DeactiveBuff(MetaData::Buff* buff_meta); - std::weak_ptr AddListener(int event_id, std::function cb); - void RemoveEventHandler(std::weak_ptr handler); + std::weak_ptr AddListener(int event_id, std::function cb); + void RemoveEventHandler(std::weak_ptr handler_ptr); private: void TraverseCondBuffs(int cond, std::function func);