diff --git a/server/gameserver/GGListener.cc b/server/gameserver/GGListener.cc index 63113b3d..18d8ecaa 100644 --- a/server/gameserver/GGListener.cc +++ b/server/gameserver/GGListener.cc @@ -102,7 +102,7 @@ static void GSListeneron_error(a8::TcpListener*, int type, int errorid) void GGListener::Init() { - tcp_listener_ = new a8::TcpListener(); + tcp_listener_ = std::make_shared(); tcp_listener_->on_create_client_socket = CreateGameClientSocket; tcp_listener_->on_error = GSListeneron_error; @@ -121,7 +121,6 @@ void GGListener::Init() void GGListener::UnInit() { - delete tcp_listener_; tcp_listener_ = nullptr; } diff --git a/server/gameserver/GGListener.h b/server/gameserver/GGListener.h index 5a45b396..0fe8fd9b 100644 --- a/server/gameserver/GGListener.h +++ b/server/gameserver/GGListener.h @@ -31,14 +31,14 @@ public: void SendProxyMsg(int sockhandle, T& msg) { static int msgid = f8::Net_GetMessageId(msg); - f8::Net_SendProxyMsg(tcp_listener_, sockhandle, 0, 0, msgid, msg); + f8::Net_SendProxyMsg(tcp_listener_.get(), sockhandle, 0, 0, msgid, msg); } template void SendToClient(int sockhandle, unsigned int seqid, T& msg) { static int msgid = f8::Net_GetMessageId(msg); - int packet_size = f8::Net_SendProxyMsg(tcp_listener_, sockhandle, seqid, 0, msgid, msg); + int packet_size = f8::Net_SendProxyMsg(tcp_listener_.get(), sockhandle, seqid, 0, msgid, msg); if (packet_size > max_packet_size) { max_packet_size = packet_size; } @@ -60,5 +60,5 @@ private: void OnListenError(int errorid); private: - a8::TcpListener *tcp_listener_ = nullptr; + std::shared_ptr tcp_listener_; }; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 0c7b42c7..ca802a49 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -66,9 +66,6 @@ Creature::~Creature() { xtimer_attacher.ClearTimerList(); ClearBuffList(); - for (auto& pair : skill_hash_) { - delete pair.second; - } skill_hash_.clear(); ClearPassiveSkill(); trigger_->UnInit(); @@ -664,7 +661,7 @@ void Creature::AddPassiveSkill(int skill_id) { const mt::Skill* skill_meta = mt::Skill::GetById(skill_id); if (skill_meta && !GetPassiveSkill(skill_meta->skill_id())) { - Skill* skill = new Skill; + auto skill = std::make_shared(); skill->owner = this; skill->meta = skill_meta; skill->xtimer_attacher.SetOwner(&room->xtimer); @@ -689,7 +686,6 @@ void Creature::RemovePassiveSkill(int skill_id) { auto itr = passive_skill_hash_.find(skill_id); if (itr != passive_skill_hash_.end()) { - delete itr->second; passive_skill_hash_.erase(itr); } } @@ -709,7 +705,7 @@ void Creature::ClearPassiveSkill() Skill* Creature::GetPassiveSkill(int skill_id) { auto itr = passive_skill_hash_.find(skill_id); - return itr != passive_skill_hash_.end() ? itr->second : nullptr; + return itr != passive_skill_hash_.end() ? itr->second.get() : nullptr; } void Creature::TriggerBuff(Skill* skill, std::set& target_list, BuffTriggerType_e trigger_type) @@ -775,7 +771,7 @@ void Creature::TriggerOneObjectBuff(Skill* skill, Creature* target, BuffTriggerT Skill* Creature::GetSkill(int skill_id) { auto itr = skill_hash_.find(skill_id); - return itr != skill_hash_.end() ? itr->second : nullptr; + return itr != skill_hash_.end() ? itr->second.get() : nullptr; } bool Creature::CanUseSkill(int skill_id) @@ -1601,7 +1597,7 @@ void Creature::AddSkill(int skill_id) const mt::Skill* skill_meta = mt::Skill::GetById(skill_id); if (skill_meta && !GetSkill(skill_id)) { if (skill_meta->skill_type() == 1) { - Skill* skill = new Skill; + auto skill = std::make_shared(); skill->owner = this; skill->meta = skill_meta; skill->xtimer_attacher.SetOwner(&room->xtimer); @@ -1617,12 +1613,10 @@ void Creature::AddSkill(int skill_id) void Creature::ClearSkill() { - Skill* reserve_skill = nullptr; + std::shared_ptr reserve_skill = nullptr; for (auto& pair : skill_hash_) { if (pair.second->meta->IsTurnOverSkill()) { reserve_skill = pair.second; - } else { - delete pair.second; } } skill_hash_.clear(); @@ -2781,7 +2775,7 @@ void Creature::TraverseSkill(std::function func) { bool stop = false; for (auto& pair : skill_hash_) { - func(pair.second, stop); + func(pair.second.get(), stop); if (stop) { return; } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 6a51ae6b..b3520bee 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -368,8 +368,8 @@ private: int skill_target_id_ = 0; Position skill_target_pos_; float skill_distance_ = 0.0f; - std::map skill_hash_; - std::map passive_skill_hash_; + std::map> skill_hash_; + std::map> passive_skill_hash_; std::map buff_interval_hash_; std::array inventory_ = {}; diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 580bfc8c..41c372d2 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -230,7 +230,7 @@ void MapInstance::AttachRoom(Room* room, RoomInitInfo& init_info) init_info.map_meta = map_meta_; init_info.grid_service = grid_service_; init_info.map_service = map_service_; - init_info.map_instance = this; + init_info.map_instance = shared_from_this(); } void MapInstance::CreateThings() diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 96d83cb8..03305ec0 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -11,7 +11,7 @@ class MapService; class GridService; class Room; struct RoomInitInfo; -class MapInstance +class MapInstance : public std::enable_shared_from_this { public: int map_id = 0; diff --git a/server/gameserver/mapmgr.cc b/server/gameserver/mapmgr.cc index 9132256c..e50f66c1 100644 --- a/server/gameserver/mapmgr.cc +++ b/server/gameserver/mapmgr.cc @@ -16,18 +16,19 @@ void MapMgr::Init() ( [this] (const mt::Map* map_meta, bool& stop) { - MapInstance* map_instance = new MapInstance(); - map_instance->map_id = map_meta->map_id(); - map_instance->Init(); - instance_hash_[map_instance->map_id] = map_instance; - { - auto itr = mode_hash_.find(map_meta->map_mode()); - if (itr != mode_hash_.end()) { - itr->second.push_back(map_instance); - } else { - mode_hash_[map_meta->map_mode()] = std::vector({map_instance}); - } - } + auto map_instance = std::make_shared(); + map_instance->map_id = map_meta->map_id(); + map_instance->Init(); + instance_hash_[map_instance->map_id] = map_instance; + { + auto itr = mode_hash_.find(map_meta->map_mode()); + if (itr != mode_hash_.end()) { + itr->second.push_back(map_instance); + } else { + mode_hash_[map_meta->map_mode()] = + std::vector>({map_instance}); + } + } }); #if 0 if (mode_hash_.find(kZombieMode) == mode_hash_.end()) { @@ -46,7 +47,6 @@ void MapMgr::UnInit() { for (auto& pair : instance_hash_) { pair.second->UnInit(); - delete pair.second; } instance_hash_.clear(); } @@ -82,7 +82,7 @@ void MapMgr::AttachRoom(Room* room, RoomInitInfo& init_info) } #ifdef MAP3D init_info.init_map_id = 2001; - MapInstance* map_instance = GetMapInstance(init_info.init_map_id); + auto map_instance = GetMapInstance(init_info.init_map_id); #else MapInstance* map_instance = init_info.init_map_id == 0 ? RandMapInstance(init_info.room_mode) : GetMapInstance(init_info.init_map_id); @@ -103,13 +103,13 @@ void MapMgr::AttachRoom(Room* room, RoomInitInfo& init_info) map_instance->AttachRoom(room, init_info); } -MapInstance* MapMgr::GetMapInstance(int map_id) +std::shared_ptr MapMgr::GetMapInstance(int map_id) { auto itr = instance_hash_.find(map_id); return itr != instance_hash_.end() ? itr->second : nullptr; } -MapInstance* MapMgr::RandMapInstance(int map_mode) +std::shared_ptr MapMgr::RandMapInstance(int map_mode) { auto itr = mode_hash_.find(map_mode); return itr != mode_hash_.end() ? itr->second[rand() % itr->second.size()] : nullptr; diff --git a/server/gameserver/mapmgr.h b/server/gameserver/mapmgr.h index 47505c8d..dbdcd12a 100644 --- a/server/gameserver/mapmgr.h +++ b/server/gameserver/mapmgr.h @@ -16,12 +16,12 @@ public: void UnInit(); void AttachRoom(Room* room, RoomInitInfo& init_info); - MapInstance* GetMapInstance(int map_id); + std::shared_ptr GetMapInstance(int map_id); private: - MapInstance* RandMapInstance(int map_mode); + std::shared_ptr RandMapInstance(int map_mode); private: - std::map instance_hash_; - std::map> mode_hash_; + std::map> instance_hash_; + std::map>> mode_hash_; }; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 2e83d7db..8250e5af 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -987,7 +987,7 @@ bool Room::CanJoin(const std::string& accountid, #endif } if (init_map_id != 0) { - MapInstance* map_instance = MapMgr::Instance()->GetMapInstance(init_map_id); + auto map_instance = MapMgr::Instance()->GetMapInstance(init_map_id); if (map_instance && map_instance->GetMapMeta()->map_mode() == room_mode_ && map_instance->map_id != map_meta_->map_id()) { return false; diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 140be221..57d20667 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -62,7 +62,7 @@ public: a8::Attacher xtimer_attacher_; GridService* grid_service = nullptr; MapService* map_service = nullptr; - MapInstance* map_instance = nullptr; + std::shared_ptr map_instance; bool debug_trace = false; bool added_to_over_room = false; glm::vec3 last_player_jump_pos; diff --git a/server/gameserver/roommgr.h b/server/gameserver/roommgr.h index 6847a425..d9eaf662 100644 --- a/server/gameserver/roommgr.h +++ b/server/gameserver/roommgr.h @@ -43,7 +43,7 @@ struct RoomInitInfo std::string map_tpl_name; GridService* grid_service = nullptr; MapService* map_service = nullptr; - MapInstance* map_instance = nullptr; + std::shared_ptr map_instance; std::vector* mini_room_spawn_points = nullptr; std::vector* normal_room_spawn_points = nullptr; std::vector* room_monster_spawn_points = nullptr;