Core/Spawn: Move spawn group state management from sObjectMgr to the Map object, which makes it actually function as intended with instances.

Port From (https://github.com/TrinityCore/TrinityCore/commit/27806eeac9d2588d2f7a3b8a0852d45b15a6a241)
This commit is contained in:
hondacrx
2020-08-24 21:21:27 -04:00
parent 15f0aebb23
commit 18d7144ca6
9 changed files with 190 additions and 173 deletions
+21 -12
View File
@@ -17,6 +17,7 @@
using Framework.Constants;
using Game.Entities;
using System;
using System.Collections.Generic;
namespace Game.Maps
@@ -91,13 +92,20 @@ namespace Game.Maps
SpawnGroupTemplateData group = cdata.spawnGroupData;
// If creature in manual spawn group, don't spawn here, unless group is already active.
if (group.flags.HasFlag(SpawnGroupFlags.ManualSpawn) && !group.isActive)
continue;
if (!group.flags.HasAnyFlag(SpawnGroupFlags.System))
{
if (!map.IsSpawnGroupActive(group.groupId))
{
obj.Dispose();
continue;
}
}
// If script is blocking spawn, don't spawn but queue for a re-check in a little bit
if (!group.flags.HasFlag(SpawnGroupFlags.CompatibilityMode) && !Global.ScriptMgr.CanSpawn(guid, cdata.Id, cdata, map))
{
map.SaveRespawnTime(SpawnObjectType.Creature, guid, cdata.Id, Time.UnixTime + RandomHelper.URand(4, 7), map.GetZoneId(PhasingHandler.EmptyPhaseShift, cdata.spawnPoint), GridDefines.ComputeGridCoord(cdata.spawnPoint.GetPositionX(), cdata.spawnPoint.GetPositionY()).GetId(), false);
obj.Dispose();
continue;
}
}
@@ -107,8 +115,14 @@ namespace Game.Maps
GameObjectData godata = Global.ObjectMgr.GetGameObjectData(guid);
Cypher.Assert(godata != null, $"Tried to load gameobject with spawnId {guid}, but no such object exists.");
if (godata.spawnGroupData.flags.HasFlag(SpawnGroupFlags.ManualSpawn) && !godata.spawnGroupData.isActive)
continue;
if (!godata.spawnGroupData.flags.HasAnyFlag(SpawnGroupFlags.System))
{
if (!map.IsSpawnGroupActive(godata.spawnGroupData.groupId))
{
obj.Dispose();
continue;
}
}
}
if (!obj.LoadFromDB(guid, map, false, false))
@@ -128,15 +142,10 @@ namespace Game.Maps
var cell = new Cell(cellCoord);
map.AddToGrid(obj, cell);
obj.AddToWorld();
++count;
}
void AddObjectHelper(CellCoord cellCoord, ref uint count, Map map, Creature obj)
{
map.AddToGrid(obj, new Cell(cellCoord));
obj.AddToWorld();
if (obj.IsActiveObject())
map.AddToActive(obj);
if (obj.IsCreature())
if (obj.IsActiveObject())
map.AddToActive(obj);
++count;
}