diff --git a/server/gameserver/global.h b/server/gameserver/global.h index b692dd6..0a72459 100644 --- a/server/gameserver/global.h +++ b/server/gameserver/global.h @@ -12,6 +12,7 @@ class Global : public a8::Singleton static int g_nowtime; static ColliderComponent* last_collider; + int traversing_cell_creature_count = 0; }; bool IsValidSlotId(int slot_id); diff --git a/server/gameserver/gridcell.cc b/server/gameserver/gridcell.cc index 58edb8b..de1b5c2 100644 --- a/server/gameserver/gridcell.cc +++ b/server/gameserver/gridcell.cc @@ -8,6 +8,7 @@ #include "hero.h" #include "creature.h" #include "bullet.h" +#include "global.h" GridCell::GridCell() { @@ -32,6 +33,7 @@ void GridCell::TraverseHumanList(std::function func, int room_idx, bool& stop) { + ++Global::Instance()->traversing_cell_creature_count; for (Creature* c : creatures_[room_idx]) { if (!c->IsHuman()) { continue; @@ -39,21 +41,26 @@ void GridCell::TraverseHumanList(std::function func, Human* hum = (Human*)c; func(hum, stop); if (stop) { + --Global::Instance()->traversing_cell_creature_count; return; } } + --Global::Instance()->traversing_cell_creature_count; } void GridCell::TraverseCreatures(std::function& func, int room_idx, bool& stop) { + ++Global::Instance()->traversing_cell_creature_count; for (Creature* c : creatures_[room_idx]) { func(c, stop); if (stop) { + --Global::Instance()->traversing_cell_creature_count; return; } } + --Global::Instance()->traversing_cell_creature_count; } void GridCell::AddPermanentEntity(Entity* entity) @@ -115,11 +122,21 @@ void GridCell::TraverseAllLayerEntityList(std::function& void GridCell::AddCreature(Creature* c) { +#ifdef DEBUG + if (Global::Instance()->traversing_cell_creature_count > 0) { + abort(); + } +#endif creatures_[c->room->GetRoomIdx()].insert(c); } void GridCell::RemoveCreature(Creature* c) { +#ifdef DEBUG + if (Global::Instance()->traversing_cell_creature_count > 0) { + abort(); + } +#endif creatures_[c->room->GetRoomIdx()].erase(c); }