Core/Pools: Fixed spawning in pools with both explicitly and equally chanced entries
Port From (https://github.com/TrinityCore/TrinityCore/commit/5e774fc7f1941484ec86c1c5abe5bbb14f4e4090)
This commit is contained in:
@@ -765,45 +765,30 @@ namespace Game
|
|||||||
// roll objects to be spawned
|
// roll objects to be spawned
|
||||||
if (!ExplicitlyChanced.Empty())
|
if (!ExplicitlyChanced.Empty())
|
||||||
{
|
{
|
||||||
while (count != 0 && ExplicitlyChanced.Count > rolledObjects.Count)
|
float roll = (float)RandomHelper.randChance();
|
||||||
{
|
|
||||||
--count;
|
|
||||||
float roll = (float)RandomHelper.randChance();
|
|
||||||
|
|
||||||
foreach (PoolObject obj in ExplicitlyChanced)
|
foreach (PoolObject obj in 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;
|
rolledObjects.Add(obj);
|
||||||
// Triggering object is marked as spawned at this time and can be also rolled (respawn case)
|
break;
|
||||||
// so this need explicit check for this case
|
|
||||||
if (roll < 0 && (obj.guid == triggerFrom || !spawns.IsActiveObject<T>(obj.guid)))
|
|
||||||
{
|
|
||||||
rolledObjects.Add(obj);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!EqualChanced.Empty())
|
|
||||||
|
if (!EqualChanced.Empty() && rolledObjects.Empty())
|
||||||
{
|
{
|
||||||
rolledObjects = EqualChanced;
|
rolledObjects.AddRange(EqualChanced.Where(obj => obj.guid == triggerFrom || !spawns.IsActiveObject<T>(obj.guid)));
|
||||||
|
|
||||||
for (var i =0; i < rolledObjects.Count; ++i)
|
|
||||||
{
|
|
||||||
var obj = rolledObjects[i];
|
|
||||||
// remove most of the active objects so there is higher chance inactive ones are spawned
|
|
||||||
if (spawns.IsActiveObject<T>(obj.guid) && RandomHelper.URand(1, 4) != 1)
|
|
||||||
rolledObjects.Remove(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
rolledObjects.RandomResize((uint)count);
|
rolledObjects.RandomResize((uint)count);
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to spawn rolled objects
|
// try to spawn rolled objects
|
||||||
foreach (PoolObject obj in rolledObjects)
|
foreach (PoolObject obj in rolledObjects)
|
||||||
{
|
{
|
||||||
if (spawns.IsActiveObject<T>(obj.guid))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (obj.guid == triggerFrom)
|
if (obj.guid == triggerFrom)
|
||||||
{
|
{
|
||||||
ReSpawn1Object(obj);
|
ReSpawn1Object(obj);
|
||||||
|
|||||||
Reference in New Issue
Block a user