Core/Spells: Implement aura 428 (SPELL_AURA_LINKED_SUMMON)
This commit is contained in:
@@ -449,7 +449,7 @@ namespace Framework.Constants
|
|||||||
Unk425 = 425,
|
Unk425 = 425,
|
||||||
Unk426 = 426,
|
Unk426 = 426,
|
||||||
ScalePlayerLevel = 427, // NYI
|
ScalePlayerLevel = 427, // NYI
|
||||||
Unk428 = 428,
|
LinkedSummon = 428,
|
||||||
Unk429 = 429,
|
Unk429 = 429,
|
||||||
PlayScene = 430,
|
PlayScene = 430,
|
||||||
ModOverrideZonePvpType = 431, // NYI
|
ModOverrideZonePvpType = 431, // NYI
|
||||||
|
|||||||
@@ -6024,6 +6024,67 @@ namespace Game.Spells
|
|||||||
target.TogglePvpTalents(false);
|
target.TogglePvpTalents(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[AuraEffectHandler(AuraType.LinkedSummon)]
|
||||||
|
void HandleLinkedSummon(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply)
|
||||||
|
{
|
||||||
|
if (!mode.HasAnyFlag(AuraEffectHandleModes.Real))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Unit target = aurApp.GetTarget();
|
||||||
|
SpellInfo triggerSpellInfo = Global.SpellMgr.GetSpellInfo(GetSpellEffectInfo().TriggerSpell);
|
||||||
|
if (triggerSpellInfo == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// on apply cast summon spell
|
||||||
|
if (apply)
|
||||||
|
target.CastSpell(target, triggerSpellInfo, true, null, this);
|
||||||
|
// on unapply we need to search for and remove the summoned creature
|
||||||
|
else
|
||||||
|
{
|
||||||
|
List<uint> summonedEntries = new List<uint>();
|
||||||
|
foreach (var spellEffect in triggerSpellInfo.GetEffectsForDifficulty(target.GetMap().GetDifficultyID()))
|
||||||
|
{
|
||||||
|
if (spellEffect != null && spellEffect.Effect == SpellEffectName.Summon)
|
||||||
|
{
|
||||||
|
uint summonEntry = (uint)spellEffect.MiscValue;
|
||||||
|
if (summonEntry != 0)
|
||||||
|
{
|
||||||
|
if (!summonedEntries.Contains(summonEntry))
|
||||||
|
summonedEntries.Add(summonEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// we don't know if there can be multiple summons for the same effect, so consider only 1 summon for each effect
|
||||||
|
// most of the spells have multiple effects with the same summon spell id for multiple spawns, so right now it's safe to assume there's only 1 spawn per effect
|
||||||
|
foreach (uint summonEntry in summonedEntries)
|
||||||
|
{
|
||||||
|
List<Creature> nearbyEntries = new List<Creature>();
|
||||||
|
target.GetCreatureListWithEntryInGrid(nearbyEntries, summonEntry);
|
||||||
|
foreach (var creature in nearbyEntries)
|
||||||
|
{
|
||||||
|
if (creature.GetOwner() == target)
|
||||||
|
{
|
||||||
|
creature.DespawnOrUnsummon();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TempSummon tempSummon = creature.ToTempSummon();
|
||||||
|
if (tempSummon)
|
||||||
|
{
|
||||||
|
if (tempSummon.GetSummoner() == target)
|
||||||
|
{
|
||||||
|
tempSummon.DespawnOrUnsummon();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user