This commit is contained in:
aozhiwei 2021-05-10 13:31:25 +08:00
parent e1ba955bb4
commit 2ea7fabcdf
4 changed files with 33 additions and 1 deletions

View File

@ -1573,11 +1573,22 @@ void Creature::SlaveOnRemove(Entity* slave)
switch (slave->GetEntityType()) { switch (slave->GetEntityType()) {
case ET_Hero: 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; break;
case ET_Obstacle: 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; break;
default: default:

View File

@ -18,6 +18,7 @@ Hero::Hero():Creature()
Hero::~Hero() Hero::~Hero()
{ {
DetachFromMaster();
if (ai) { if (ai) {
A8_SAFE_DELETE(ai); A8_SAFE_DELETE(ai);
} }
@ -231,3 +232,13 @@ void Hero::SetAiLevel(int ai_level)
ai->SetAiLevel(ai_level); ai->SetAiLevel(ai_level);
} }
} }
void Hero::DetachFromMaster()
{
if (!detached_) {
if (master.Get()) {
master.Get()->SlaveOnRemove(this);
}
detached_ = true;
}
}

View File

@ -35,6 +35,7 @@ public:
virtual void GetAabbBox(AabbCollider& aabb_box) override; virtual void GetAabbBox(AabbCollider& aabb_box) override;
virtual void GetHitAabbBox(AabbCollider& aabb_box) override; virtual void GetHitAabbBox(AabbCollider& aabb_box) override;
void SetAiLevel(int ai_level); void SetAiLevel(int ai_level);
void DetachFromMaster();
protected: protected:
virtual void _UpdateMove(int speed) override; virtual void _UpdateMove(int speed) override;
@ -46,6 +47,7 @@ private:
bool later_removed_ = false; bool later_removed_ = false;
CircleCollider* self_collider_ = nullptr; CircleCollider* self_collider_ = nullptr;
Entity* last_collision_door_ = nullptr; Entity* last_collision_door_ = nullptr;
bool detached_ = false;
friend class HeroAI; friend class HeroAI;
}; };

View File

@ -659,6 +659,14 @@ void Room::RemoveObjectLater(RoomEntity* entity)
entity->room->RemoveFromMoveableHash((Car*)entity); entity->room->RemoveFromMoveableHash((Car*)entity);
} }
break; 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: default:
{ {
abort(); abort();