diff options
author | lachtanek <xhrabec@gmail.com> | 2018-01-11 12:22:56 +0100 |
---|---|---|
committer | funjoker <funjoker109@gmail.com> | 2021-05-29 21:27:11 +0200 |
commit | 5e774fc7f1941484ec86c1c5abe5bbb14f4e4090 (patch) | |
tree | 9969ccba31a56817d0697bd057771c5ac16c614b /src/server/game/Pools/PoolMgr.cpp | |
parent | 713dc725623e2c32e734e3041cd87daca8ecef46 (diff) |
Core/Pools: Fixed spawning in pools with both explicitly and equally chanced entries (#21170)
(cherry picked from commit c50aefac963aca5daeacf409deca9692c6ca3924)
Diffstat (limited to 'src/server/game/Pools/PoolMgr.cpp')
-rw-r--r-- | src/server/game/Pools/PoolMgr.cpp | 40 |
1 files changed, 14 insertions, 26 deletions
diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp index 37fac27db46..6940c7b5b6a 100644 --- a/src/server/game/Pools/PoolMgr.cpp +++ b/src/server/game/Pools/PoolMgr.cpp @@ -334,36 +334,27 @@ void PoolGroup<T>::SpawnObject(ActivePoolData& spawns, uint32 limit, uint64 trig // roll objects to be spawned if (!ExplicitlyChanced.empty()) { - while (count && ExplicitlyChanced.size() > rolledObjects.size()) - { - --count; - float roll = (float)rand_chance(); + float roll = (float)rand_chance(); - for (PoolObject& obj : ExplicitlyChanced) + for (PoolObject& obj : ExplicitlyChanced) + { + roll -= obj.chance; + // Triggering object is marked as spawned at this time and can be also rolled (respawn case) + // so this need explicit check for this case + if (roll < 0 && (obj.guid == triggerFrom || !spawns.IsActiveObject<T>(obj.guid))) { - roll -= obj.chance; - // Triggering object is marked as spawned at this time and can be also rolled (respawn case) - // so this need explicit check for this case - if (roll < 0 && (obj.guid == triggerFrom || !spawns.IsActiveObject<T>(obj.guid))) - { - rolledObjects.push_back(obj); - break; - } + rolledObjects.push_back(obj); + break; } } } - else if (!EqualChanced.empty()) - { - rolledObjects = EqualChanced; - for (auto itr = rolledObjects.begin(); itr != rolledObjects.end();) + if (!EqualChanced.empty() && rolledObjects.empty()) + { + std::copy_if(EqualChanced.begin(), EqualChanced.end(), std::back_inserter(rolledObjects), [triggerFrom, &spawns](PoolObject const& object) { - // remove most of the active objects so there is higher chance inactive ones are spawned - if (spawns.IsActiveObject<T>(itr->guid) && urand(1, 4) != 1) - itr = rolledObjects.erase(itr); - else - ++itr; - } + return object.guid == triggerFrom || !spawns.IsActiveObject<T>(object.guid); + }); Trinity::Containers::RandomResize(rolledObjects, count); } @@ -371,9 +362,6 @@ void PoolGroup<T>::SpawnObject(ActivePoolData& spawns, uint32 limit, uint64 trig // try to spawn rolled objects for (PoolObject& obj : rolledObjects) { - if (spawns.IsActiveObject<T>(obj.guid)) - continue; - if (obj.guid == triggerFrom) { ReSpawn1Object(&obj); |