From 8edc4401811e9ef8fbffa26ee27bbf37db1070b3 Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Sun, 1 Sep 2024 15:49:10 -0400 Subject: [PATCH] Core/Creatures: Create a CreatureGroup for every SummonCreatureGroup Port From (https://github.com/TrinityCore/TrinityCore/commit/9a7a83ef3074faaad037cfb4c098784695f49d30) --- Source/Game/Entities/Object/WorldObject.cs | 18 +++------- Source/Game/Maps/Map.cs | 38 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 38ecbdcc9..529b9b338 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -1685,21 +1685,13 @@ namespace Game.Entities public void SummonCreatureGroup(byte group, out List list) { - Cypher.Assert((IsTypeId(TypeId.GameObject) || IsTypeId(TypeId.Unit)), "Only GOs and creatures can summon npc groups!"); - list = new List(); - var data = Global.ObjectMgr.GetSummonGroup(GetEntry(), IsTypeId(TypeId.GameObject) ? SummonerType.GameObject : SummonerType.Creature, group); - if (data.Empty()) - { - Log.outWarn(LogFilter.Scripts, "{0} ({1}) tried to summon non-existing summon group {2}.", GetName(), GetGUID().ToString(), group); - return; - } + list = new(); - foreach (var tempSummonData in data) + Cypher.Assert(IsTypeId(TypeId.GameObject) || IsTypeId(TypeId.Unit), "Only GOs and creatures can summon npc groups!"); + Map.SummonCreatureGroup(GetEntry(), GetTypeId() == TypeId.GameObject ? SummonerType.GameObject : SummonerType.Creature, group, list, tempSummonData => { - TempSummon summon = SummonCreature(tempSummonData.entry, tempSummonData.pos, tempSummonData.type, tempSummonData.time); - if (summon != null) - list.Add(summon); - } + return SummonCreature(tempSummonData.entry, tempSummonData.pos, tempSummonData.type, tempSummonData.time); + }); } public Creature FindNearestCreature(uint entry, float range, bool alive = true) diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 9ced2f4a5..2fa2cd6d7 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -3823,6 +3823,44 @@ namespace Game.Maps return summon; } + public static void SummonCreatureGroup(uint summonerId, SummonerType summonerType, byte group, List summoned, Func summonCreature) + { + var data = Global.ObjectMgr.GetSummonGroup(summonerId, summonerType, group); + if (data == null) + { + Log.outWarn(LogFilter.Scripts, $"Summoner {summonerId} type {summonerType} tried to summon non-existing summon group {group}."); + return; + } + + List summons = new(); + + foreach (TempSummonData tempSummonData in data) + { + TempSummon summon = summonCreature(tempSummonData); + if (summon != null) + summons.Add(summon); + } + + CreatureGroup creatureGroup = new CreatureGroup(0); + foreach (TempSummon summon in summons) + { + if (!summon.IsInWorld) // evil script might despawn a summon + continue; + + creatureGroup.AddMember(summon); + if (summoned != null) + summoned.Add(summon); + } + } + + public void SummonCreatureGroup(byte group, List list = null) + { + SummonCreatureGroup(GetId(), SummonerType.Map, group, list, tempSummonData => + { + return SummonCreature(tempSummonData.entry, tempSummonData.pos, null, tempSummonData.time); + }); + } + public ulong GenerateLowGuid(HighGuid high) { return GetGuidSequenceGenerator(high).Generate();