void PoolGroup<T>::DespawnObject(MapPersistentState& mapState, uint32 guid) { for (size_t i = 0; i < EqualChanced.size(); ++i) { // if spawned if (mapState.GetSpawnedPoolData().IsSpawnedObject<T>(EqualChanced[i].guid)) { // any or specially requested if (!guid || EqualChanced[i].guid == guid) { Despawn1Object(mapState, EqualChanced[i].guid); mapState.GetSpawnedPoolData().RemoveSpawn<T>(EqualChanced[i].guid, poolId); } } } for (size_t i = 0; i < ExplicitlyChanced.size(); ++i) { // spawned if (mapState.GetSpawnedPoolData().IsSpawnedObject<T>(ExplicitlyChanced[i].guid)) { // any or specially requested if (!guid || ExplicitlyChanced[i].guid == guid) { Despawn1Object(mapState, ExplicitlyChanced[i].guid); mapState.GetSpawnedPoolData().RemoveSpawn<T>(ExplicitlyChanced[i].guid, poolId); } } } }
void PoolGroup<T>::SpawnObject(MapPersistentState& mapState, uint32 limit, uint32 triggerFrom, bool instantly) { SpawnedPoolData& spawns = mapState.GetSpawnedPoolData(); uint32 lastDespawned = 0; int count = limit - spawns.GetSpawnedObjects(poolId); // If triggered from some object respawn this object is still marked as spawned // and also counted into m_SpawnedPoolAmount so we need increase count to be // spawned by 1 if (triggerFrom) { if (spawns.IsSpawnedObject<T>(triggerFrom)) ++count; else triggerFrom = 0; } // This will try to spawn the rest of pool, not guaranteed for (int i = 0; i < count; ++i) { PoolObject* obj = RollOne(spawns, triggerFrom); if (!obj) continue; if (obj->guid == lastDespawned) continue; if (obj->guid == triggerFrom) { MANGOS_ASSERT(spawns.IsSpawnedObject<T>(obj->guid)); MANGOS_ASSERT(spawns.GetSpawnedObjects(poolId) > 0); ReSpawn1Object(mapState, obj); triggerFrom = 0; continue; } spawns.AddSpawn<T>(obj->guid, poolId); Spawn1Object(mapState, obj, instantly); if (triggerFrom) { // One spawn one despawn no count increase DespawnObject(mapState, triggerFrom); lastDespawned = triggerFrom; triggerFrom = 0; } } }