From 2ea7fabcdfb812d66df33b9281675ba353a794e1 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 May 2021 13:31:25 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 13 ++++++++++++- server/gameserver/hero.cc | 11 +++++++++++ server/gameserver/hero.h | 2 ++ server/gameserver/room.cc | 8 ++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 52df476..d87956e 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1573,11 +1573,22 @@ void Creature::SlaveOnRemove(Entity* slave) switch (slave->GetEntityType()) { case ET_Hero: { - + for (auto itr = slave_heros_.begin(); itr != slave_heros_.end(); ++itr) { + if ((Entity*)std::get<1>(*itr) == slave) { + slave_heros_.erase(itr); + break; + } + } } break; case ET_Obstacle: { + for (auto itr = slave_things_.begin(); itr != slave_things_.end(); ++itr) { + if ((Entity*)std::get<1>(*itr) == slave) { + slave_things_.erase(itr); + break; + } + } } break; default: diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index aa2c48c..c9fece9 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -18,6 +18,7 @@ Hero::Hero():Creature() Hero::~Hero() { + DetachFromMaster(); if (ai) { A8_SAFE_DELETE(ai); } @@ -231,3 +232,13 @@ void Hero::SetAiLevel(int ai_level) ai->SetAiLevel(ai_level); } } + +void Hero::DetachFromMaster() +{ + if (!detached_) { + if (master.Get()) { + master.Get()->SlaveOnRemove(this); + } + detached_ = true; + } +} diff --git a/server/gameserver/hero.h b/server/gameserver/hero.h index a41af2d..5b09f18 100644 --- a/server/gameserver/hero.h +++ b/server/gameserver/hero.h @@ -35,6 +35,7 @@ public: virtual void GetAabbBox(AabbCollider& aabb_box) override; virtual void GetHitAabbBox(AabbCollider& aabb_box) override; void SetAiLevel(int ai_level); + void DetachFromMaster(); protected: virtual void _UpdateMove(int speed) override; @@ -46,6 +47,7 @@ private: bool later_removed_ = false; CircleCollider* self_collider_ = nullptr; Entity* last_collision_door_ = nullptr; + bool detached_ = false; friend class HeroAI; }; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 057fac3..647290d 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -659,6 +659,14 @@ void Room::RemoveObjectLater(RoomEntity* entity) entity->room->RemoveFromMoveableHash((Car*)entity); } break; + case ET_Hero: + { + entity->RemoveFromAroundPlayers(entity->room); + entity->BroadcastDeleteState(entity->room); + entity->room->grid_service->RemoveCreature((Hero*)entity); + entity->room->RemoveFromMoveableHash((Hero*)entity); + } + break; default: { abort();