mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[8507] Check amount of spawned pools before decrement to avoid unexpected result.
Also rename variable to more meaningful name. Signed-off-by: NoFantasy <nofantasy@nf.no>
This commit is contained in:
parent
00cfea3b46
commit
9b9873a074
3 changed files with 10 additions and 7 deletions
|
|
@ -31,7 +31,7 @@ INSTANTIATE_SINGLETON_1(PoolHandler);
|
||||||
template <class T>
|
template <class T>
|
||||||
PoolGroup<T>::PoolGroup()
|
PoolGroup<T>::PoolGroup()
|
||||||
{
|
{
|
||||||
Spawned = 0;
|
m_SpawnedPoolAmount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method to add a gameobject/creature guid to the proper list depending on pool type and chance value
|
// Method to add a gameobject/creature guid to the proper list depending on pool type and chance value
|
||||||
|
|
@ -112,7 +112,9 @@ void PoolGroup<T>::DespawnObject(uint32 guid)
|
||||||
Despawn1Object(EqualChanced[i].guid);
|
Despawn1Object(EqualChanced[i].guid);
|
||||||
|
|
||||||
EqualChanced[i].spawned = false;
|
EqualChanced[i].spawned = false;
|
||||||
Spawned--;
|
|
||||||
|
if (m_SpawnedPoolAmount > 0)
|
||||||
|
--m_SpawnedPoolAmount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -186,14 +188,14 @@ void PoolGroup<T>::SpawnObject(uint32 limit, bool cache)
|
||||||
Despawn1Object(CacheValue);
|
Despawn1Object(CacheValue);
|
||||||
CacheValue = Spawn1Object(roll);
|
CacheValue = Spawn1Object(roll);
|
||||||
}
|
}
|
||||||
else if (limit < EqualChanced.size() && Spawned < limit)
|
else if (limit < EqualChanced.size() && m_SpawnedPoolAmount < limit)
|
||||||
{
|
{
|
||||||
std::vector<uint32> IndexList;
|
std::vector<uint32> IndexList;
|
||||||
for (size_t i = 0; i < EqualChanced.size(); ++i)
|
for (size_t i = 0; i < EqualChanced.size(); ++i)
|
||||||
if (!EqualChanced[i].spawned)
|
if (!EqualChanced[i].spawned)
|
||||||
IndexList.push_back(i);
|
IndexList.push_back(i);
|
||||||
|
|
||||||
while (Spawned < limit && IndexList.size() > 0)
|
while (m_SpawnedPoolAmount < limit && IndexList.size() > 0)
|
||||||
{
|
{
|
||||||
uint32 roll = urand(1, IndexList.size()) - 1;
|
uint32 roll = urand(1, IndexList.size()) - 1;
|
||||||
uint32 index = IndexList[roll];
|
uint32 index = IndexList[roll];
|
||||||
|
|
@ -207,7 +209,8 @@ void PoolGroup<T>::SpawnObject(uint32 limit, bool cache)
|
||||||
EqualChanced[index].spawned = ReSpawn1Object(EqualChanced[index].guid);
|
EqualChanced[index].spawned = ReSpawn1Object(EqualChanced[index].guid);
|
||||||
|
|
||||||
if (EqualChanced[index].spawned)
|
if (EqualChanced[index].spawned)
|
||||||
++Spawned; // limited group use the Spawned variable to store the number of actualy spawned creatures
|
++m_SpawnedPoolAmount; // limited group use the Spawned variable to store the number of actualy spawned creatures
|
||||||
|
|
||||||
std::vector<uint32>::iterator itr = IndexList.begin()+roll;
|
std::vector<uint32>::iterator itr = IndexList.begin()+roll;
|
||||||
IndexList.erase(itr);
|
IndexList.erase(itr);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ class PoolGroup
|
||||||
uint32 CacheValue; // Store the guid of the removed creature/gameobject during a pool update
|
uint32 CacheValue; // Store the guid of the removed creature/gameobject during a pool update
|
||||||
PoolObjectList ExplicitlyChanced;
|
PoolObjectList ExplicitlyChanced;
|
||||||
PoolObjectList EqualChanced;
|
PoolObjectList EqualChanced;
|
||||||
uint32 Spawned; // Used to know the number of spawned objects
|
uint32 m_SpawnedPoolAmount; // Used to know the number of spawned objects
|
||||||
};
|
};
|
||||||
|
|
||||||
class Pool // for Pool of Pool case
|
class Pool // for Pool of Pool case
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8506"
|
#define REVISION_NR "8507"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue