Dynamic Creature/Go spawning
Port From (https://github.com/TrinityCore/TrinityCore/commit/03b125e6d1947258316c931499746696a95aded2)
This commit is contained in:
@@ -129,39 +129,39 @@ namespace Game.AI
|
||||
continue;
|
||||
}
|
||||
|
||||
CreatureTemplate creatureInfo = Global.ObjectMgr.GetCreatureTemplate(creature.id);
|
||||
CreatureTemplate creatureInfo = Global.ObjectMgr.GetCreatureTemplate(creature.Id);
|
||||
if (creatureInfo == null)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: Creature entry ({creature.id}) guid ({-temp.entryOrGuid}) does not exist, skipped loading.");
|
||||
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: Creature entry ({creature.Id}) guid ({-temp.entryOrGuid}) does not exist, skipped loading.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (creatureInfo.AIName != "SmartAI")
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: Creature entry ({creature.id}) guid ({-temp.entryOrGuid}) is not using SmartAI, skipped loading.");
|
||||
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: Creature entry ({creature.Id}) guid ({-temp.entryOrGuid}) is not using SmartAI, skipped loading.");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SmartScriptType.GameObject:
|
||||
{
|
||||
GameObjectData gameObject = Global.ObjectMgr.GetGOData((ulong)-temp.entryOrGuid);
|
||||
GameObjectData gameObject = Global.ObjectMgr.GetGameObjectData((ulong)-temp.entryOrGuid);
|
||||
if (gameObject == null)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: GameObject guid ({-temp.entryOrGuid}) does not exist, skipped loading.");
|
||||
continue;
|
||||
}
|
||||
|
||||
GameObjectTemplate gameObjectInfo = Global.ObjectMgr.GetGameObjectTemplate(gameObject.id);
|
||||
GameObjectTemplate gameObjectInfo = Global.ObjectMgr.GetGameObjectTemplate(gameObject.Id);
|
||||
if (gameObjectInfo == null)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: GameObject entry ({gameObject.id}) guid ({-temp.entryOrGuid}) does not exist, skipped loading.");
|
||||
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: GameObject entry ({gameObject.Id}) guid ({-temp.entryOrGuid}) does not exist, skipped loading.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (gameObjectInfo.AIName != "SmartGameObjectAI")
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: GameObject entry ({gameObject.id}) guid ({-temp.entryOrGuid}) is not using SmartGameObjectAI, skipped loading.");
|
||||
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: GameObject entry ({gameObject.Id}) guid ({-temp.entryOrGuid}) is not using SmartGameObjectAI, skipped loading.");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
@@ -758,7 +758,7 @@ namespace Game.AI
|
||||
return false;
|
||||
}
|
||||
|
||||
if (e.Event.distance.guid != 0 && Global.ObjectMgr.GetGOData(e.Event.distance.guid) == null)
|
||||
if (e.Event.distance.guid != 0 && Global.ObjectMgr.GetGameObjectData(e.Event.distance.guid) == null)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "SmartAIMgr: Event SMART_EVENT_DISTANCE_GAMEOBJECT using invalid gameobject guid {0}, skipped.", e.Event.distance.guid);
|
||||
return false;
|
||||
@@ -1376,6 +1376,8 @@ namespace Game.AI
|
||||
case SmartActions.TriggerRandomTimedEvent:
|
||||
case SmartActions.SetCounter:
|
||||
case SmartActions.RemoveAllGameobjects:
|
||||
case SmartActions.SpawnSpawngroup:
|
||||
case SmartActions.DespawnSpawngroup:
|
||||
break;
|
||||
default:
|
||||
Log.outError(LogFilter.ScriptsAi, "SmartAIMgr: Not handled action_type({0}), event_type({1}), Entry {2} SourceType {3} Event {4}, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id);
|
||||
@@ -1423,7 +1425,7 @@ namespace Game.AI
|
||||
return false;
|
||||
}
|
||||
else
|
||||
entry = data.id;
|
||||
entry = data.Id;
|
||||
}
|
||||
else
|
||||
entry = (uint)e.entryOrGuid;
|
||||
@@ -2368,6 +2370,9 @@ namespace Game.AI
|
||||
[FieldOffset(4)]
|
||||
public DisableEvade disableEvade;
|
||||
|
||||
[FieldOffset(4)]
|
||||
public GroupSpawn groupSpawn;
|
||||
|
||||
[FieldOffset(4)]
|
||||
public AuraType auraType;
|
||||
|
||||
@@ -2854,6 +2859,13 @@ namespace Game.AI
|
||||
{
|
||||
public uint disable;
|
||||
}
|
||||
public struct GroupSpawn
|
||||
{
|
||||
public uint groupId;
|
||||
public uint minDelay;
|
||||
public uint maxDelay;
|
||||
public uint spawnflags;
|
||||
}
|
||||
public struct AuraType
|
||||
{
|
||||
public uint type;
|
||||
|
||||
@@ -2051,6 +2051,91 @@ namespace Game.AI
|
||||
target.ToCreature().SetCorpseDelay(e.Action.corpseDelay.timer);
|
||||
break;
|
||||
}
|
||||
case SmartActions.SpawnSpawngroup:
|
||||
{
|
||||
if (e.Action.groupSpawn.minDelay == 0 && e.Action.groupSpawn.maxDelay == 0)
|
||||
{
|
||||
bool ignoreRespawn = ((e.Action.groupSpawn.spawnflags & (uint)SmartAiSpawnFlags.IgnoreRespawn) != 0);
|
||||
bool force = ((e.Action.groupSpawn.spawnflags & (uint)SmartAiSpawnFlags.ForceSpawn) != 0);
|
||||
|
||||
// Instant spawn
|
||||
Global.ObjectMgr.SpawnGroupSpawn(e.Action.groupSpawn.groupId, GetBaseObject().GetMap(), ignoreRespawn, force);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Delayed spawn (use values from parameter to schedule event to call us back
|
||||
SmartEvent ne = new SmartEvent();
|
||||
ne.type = SmartEvents.Update;
|
||||
ne.event_chance = 100;
|
||||
|
||||
ne.minMaxRepeat.min = e.Action.groupSpawn.minDelay;
|
||||
ne.minMaxRepeat.max = e.Action.groupSpawn.maxDelay;
|
||||
ne.minMaxRepeat.repeatMin = 0;
|
||||
ne.minMaxRepeat.repeatMax = 0;
|
||||
|
||||
ne.event_flags = 0;
|
||||
ne.event_flags |= SmartEventFlags.NotRepeatable;
|
||||
|
||||
SmartAction ac = new SmartAction();
|
||||
ac.type = SmartActions.SpawnSpawngroup;
|
||||
ac.groupSpawn.groupId = e.Action.groupSpawn.groupId;
|
||||
ac.groupSpawn.minDelay = 0;
|
||||
ac.groupSpawn.maxDelay = 0;
|
||||
ac.groupSpawn.spawnflags = e.Action.groupSpawn.spawnflags;
|
||||
ac.timeEvent.id = e.Action.timeEvent.id;
|
||||
|
||||
SmartScriptHolder ev = new SmartScriptHolder();
|
||||
ev.Event = ne;
|
||||
ev.event_id = e.event_id;
|
||||
ev.Target = e.Target;
|
||||
ev.Action = ac;
|
||||
InitTimer(ev);
|
||||
mStoredEvents.Add(ev);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SmartActions.DespawnSpawngroup:
|
||||
{
|
||||
if (e.Action.groupSpawn.minDelay == 0 && e.Action.groupSpawn.maxDelay == 0)
|
||||
{
|
||||
bool deleteRespawnTimes = ((e.Action.groupSpawn.spawnflags & (uint)SmartAiSpawnFlags.NosaveRespawn) != 0);
|
||||
|
||||
// Instant spawn
|
||||
Global.ObjectMgr.SpawnGroupDespawn(e.Action.groupSpawn.groupId, GetBaseObject().GetMap(), deleteRespawnTimes);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Delayed spawn (use values from parameter to schedule event to call us back
|
||||
SmartEvent ne = new SmartEvent();
|
||||
ne.type = SmartEvents.Update;
|
||||
ne.event_chance = 100;
|
||||
|
||||
ne.minMaxRepeat.min = e.Action.groupSpawn.minDelay;
|
||||
ne.minMaxRepeat.max = e.Action.groupSpawn.maxDelay;
|
||||
ne.minMaxRepeat.repeatMin = 0;
|
||||
ne.minMaxRepeat.repeatMax = 0;
|
||||
|
||||
ne.event_flags = 0;
|
||||
ne.event_flags |= SmartEventFlags.NotRepeatable;
|
||||
|
||||
SmartAction ac = new SmartAction();
|
||||
ac.type = SmartActions.DespawnSpawngroup;
|
||||
ac.groupSpawn.groupId = e.Action.groupSpawn.groupId;
|
||||
ac.groupSpawn.minDelay = 0;
|
||||
ac.groupSpawn.maxDelay = 0;
|
||||
ac.groupSpawn.spawnflags = e.Action.groupSpawn.spawnflags;
|
||||
ac.timeEvent.id = e.Action.timeEvent.id;
|
||||
|
||||
SmartScriptHolder ev = new SmartScriptHolder();
|
||||
ev.Event = ne;
|
||||
ev.event_id = e.event_id;
|
||||
ev.Target = e.Target;
|
||||
ev.Action = ac;
|
||||
InitTimer(ev);
|
||||
mStoredEvents.Add(ev);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SmartActions.DisableEvade:
|
||||
{
|
||||
if (!IsSmart())
|
||||
|
||||
Reference in New Issue
Block a user