Scripts/Spells: Improve druid travel form script
Port From (https://github.com/TrinityCore/TrinityCore/commit/898f97781c7f3cc5d40b4f9947571058b7ff7a75)
This commit is contained in:
+96
-101
@@ -129,9 +129,9 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
OnEffectLaunchTarget .Add(new EffectHandler(HandleLaunchTarget, 1, SpellEffectName.PowerBurn));
|
OnEffectLaunchTarget.Add(new EffectHandler(HandleLaunchTarget, 1, SpellEffectName.PowerBurn));
|
||||||
OnEffectHitTarget .Add(new EffectHandler(HandleHitTargetBurn, 1, SpellEffectName.PowerBurn));
|
OnEffectHitTarget.Add(new EffectHandler(HandleHitTargetBurn, 1, SpellEffectName.PowerBurn));
|
||||||
OnEffectHitTarget .Add(new EffectHandler(HandleHitTargetDmg, 0, SpellEffectName.SchoolDamage));
|
OnEffectHitTarget.Add(new EffectHandler(HandleHitTargetDmg, 0, SpellEffectName.SchoolDamage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,12 +241,12 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
DoCheckEffectProc .Add(new CheckEffectProcHandler(CheckEffectProc, 0, AuraType.Dummy));
|
DoCheckEffectProc.Add(new CheckEffectProcHandler(CheckEffectProc, 0, AuraType.Dummy));
|
||||||
OnEffectProc .Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy));
|
OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 34246 - Idol of the Emerald Queen
|
// 34246 - Idol of the Emerald Queen
|
||||||
[Script] // 60779 - Idol of Lush Moss
|
[Script] // 60779 - Idol of Lush Moss
|
||||||
class spell_dru_idol_lifebloom : AuraScript
|
class spell_dru_idol_lifebloom : AuraScript
|
||||||
{
|
{
|
||||||
@@ -332,7 +332,7 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
OnEffectProc .Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy));
|
OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,7 +487,7 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
OnEffectProc .Add(new EffectProcHandler(HandleProc, 0, AuraType.ProcTriggerSpell));
|
OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.ProcTriggerSpell));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -525,7 +525,7 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
BeforeCast .Add(new CastHandler(HandleOnCast));
|
BeforeCast.Add(new CastHandler(HandleOnCast));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -626,7 +626,7 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
OnEffectHitTarget .Add(new EffectHandler(HandleDummy, 0, SpellEffectName.Dummy));
|
OnEffectHitTarget.Add(new EffectHandler(HandleDummy, 0, SpellEffectName.Dummy));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -823,7 +823,7 @@ namespace Scripts.Spells.Druid
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 37288 - Mana Restore
|
// 37288 - Mana Restore
|
||||||
[Script] // 37295 - Mana Restore
|
[Script] // 37295 - Mana Restore
|
||||||
class spell_dru_t4_2p_bonus : AuraScript
|
class spell_dru_t4_2p_bonus : AuraScript
|
||||||
{
|
{
|
||||||
@@ -874,7 +874,7 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
OnEffectProc .Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy));
|
OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -916,7 +916,7 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
OnObjectAreaTargetSelect .Add(new ObjectAreaTargetSelectHandler(FilterTargets, 0, Targets.UnitDestAreaAlly));
|
OnObjectAreaTargetSelect.Add(new ObjectAreaTargetSelectHandler(FilterTargets, 0, Targets.UnitDestAreaAlly));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -955,85 +955,13 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
DoCheckProc .Add(new CheckProcHandler(CheckProc));
|
DoCheckProc.Add(new CheckProcHandler(CheckProc));
|
||||||
OnEffectProc .Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy));
|
OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy));
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1066 - Aquatic Form
|
|
||||||
// 33943 - Flight Form
|
|
||||||
// 40120 - Swift Flight Form
|
|
||||||
[Script] // 165961 - Stag Form
|
|
||||||
class spell_dru_travel_form_AuraScript : AuraScript
|
|
||||||
{
|
|
||||||
uint triggeredSpellId;
|
|
||||||
|
|
||||||
public override bool Validate(SpellInfo spellInfo)
|
|
||||||
{
|
|
||||||
return ValidateSpellInfo(SpellIds.FormStag, SpellIds.FormAquatic, SpellIds.FormFlight, SpellIds.FormSwiftFlight);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Load()
|
|
||||||
{
|
|
||||||
return GetCaster().GetTypeId() == TypeId.Player;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
|
|
||||||
{
|
|
||||||
// If it stays 0, it Removes Travel Form dummy in AfterRemove.
|
|
||||||
triggeredSpellId = 0;
|
|
||||||
|
|
||||||
// We should only handle aura interrupts.
|
|
||||||
if (GetTargetApplication().GetRemoveMode() != AuraRemoveMode.Interrupt)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Check what form is appropriate
|
|
||||||
Player player = GetTarget().ToPlayer();
|
|
||||||
if (player.IsInWater()) // Aquatic form
|
|
||||||
triggeredSpellId = SpellIds.FormAquatic;
|
|
||||||
else if (player.GetSkillValue(SkillType.Riding) >= 225 && CheckLocationForForm(SpellIds.FormFlight) == SpellCastResult.SpellCastOk) // Flight form
|
|
||||||
triggeredSpellId = player.GetSkillValue(SkillType.Riding) >= 300 ? SpellIds.FormSwiftFlight : SpellIds.FormFlight;
|
|
||||||
else if (CheckLocationForForm(SpellIds.FormStag) == SpellCastResult.SpellCastOk) // Stag form
|
|
||||||
triggeredSpellId = SpellIds.FormStag;
|
|
||||||
|
|
||||||
// If chosen form is current aura, just don't Remove it.
|
|
||||||
if (triggeredSpellId == m_scriptSpellId)
|
|
||||||
PreventDefaultAction();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AfterRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
|
|
||||||
{
|
|
||||||
if (triggeredSpellId == m_scriptSpellId)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Player player = GetTarget().ToPlayer();
|
|
||||||
|
|
||||||
if (triggeredSpellId != 0) // Apply new form
|
|
||||||
player.AddAura(triggeredSpellId, player);
|
|
||||||
else // If not set, simply Remove Travel Form dummy
|
|
||||||
player.RemoveAura(SpellIds.TravelForm);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Register()
|
|
||||||
{
|
|
||||||
OnEffectRemove.Add(new EffectApplyHandler(OnRemove, 0, AuraType.ModShapeshift, AuraEffectHandleModes.Real));
|
|
||||||
AfterEffectRemove.Add(new EffectApplyHandler(AfterRemove, 0, AuraType.ModShapeshift, AuraEffectHandleModes.Real));
|
|
||||||
}
|
|
||||||
|
|
||||||
SpellCastResult CheckLocationForForm(uint spellId)
|
|
||||||
{
|
|
||||||
Player player = GetTarget().ToPlayer();
|
|
||||||
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellId, GetCastDifficulty());
|
|
||||||
|
|
||||||
if (!player.GetMap().IsOutdoors(player.GetPhaseShift(), player.GetPositionX(), player.GetPositionY(), player.GetPositionZ()))
|
|
||||||
return SpellCastResult.OnlyOutdoors;
|
|
||||||
|
|
||||||
return spellInfo.CheckLocation(player.GetMapId(), player.GetZoneId(), player.GetAreaId(), player);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Script] // 783 - Travel Form (dummy)
|
[Script] // 783 - Travel Form (dummy)
|
||||||
class spell_dru_travel_form_dummy_SpellScript : SpellScript
|
class spell_dru_travel_form_dummy : SpellScript
|
||||||
{
|
{
|
||||||
SpellCastResult CheckCast()
|
SpellCastResult CheckCast()
|
||||||
{
|
{
|
||||||
@@ -1069,15 +997,10 @@ namespace Scripts.Spells.Druid
|
|||||||
|
|
||||||
void OnApply(AuraEffect aurEff, AuraEffectHandleModes mode)
|
void OnApply(AuraEffect aurEff, AuraEffectHandleModes mode)
|
||||||
{
|
{
|
||||||
uint triggeredSpellId;
|
|
||||||
|
|
||||||
Player player = GetTarget().ToPlayer();
|
Player player = GetTarget().ToPlayer();
|
||||||
if (player.IsInWater()) // Aquatic form
|
|
||||||
triggeredSpellId = SpellIds.FormAquatic;
|
// Outdoor check already passed - Travel Form (dummy) has SPELL_ATTR0_OUTDOORS_ONLY attribute.
|
||||||
else if (player.GetSkillValue(SkillType.Riding) >= 225 && CheckLocationForForm(SpellIds.FormFlight) == SpellCastResult.SpellCastOk) // Flight form
|
uint triggeredSpellId = GetFormSpellId(player, GetCastDifficulty(), false);
|
||||||
triggeredSpellId = player.GetLevel() >= 71 ? SpellIds.FormSwiftFlight : SpellIds.FormFlight;
|
|
||||||
else // Stag form (riding skill already checked in CheckCast)
|
|
||||||
triggeredSpellId = SpellIds.FormStag;
|
|
||||||
|
|
||||||
player.AddAura(triggeredSpellId, player);
|
player.AddAura(triggeredSpellId, player);
|
||||||
}
|
}
|
||||||
@@ -1097,12 +1020,84 @@ namespace Scripts.Spells.Druid
|
|||||||
AfterEffectRemove.Add(new EffectApplyHandler(AfterRemove, 0, AuraType.Dummy, AuraEffectHandleModes.Real));
|
AfterEffectRemove.Add(new EffectApplyHandler(AfterRemove, 0, AuraType.Dummy, AuraEffectHandleModes.Real));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Outdoor check already passed - Travel Form (dummy) has SPELL_ATTR0_OUTDOORS_ONLY attribute.
|
static SpellCastResult CheckLocationForForm(Player targetPlayer, Difficulty difficulty, bool requireOutdoors, uint spellId)
|
||||||
SpellCastResult CheckLocationForForm(uint spell)
|
|
||||||
{
|
{
|
||||||
|
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellId, difficulty);
|
||||||
|
|
||||||
|
if (requireOutdoors && !targetPlayer.GetMap().IsOutdoors(targetPlayer.GetPhaseShift(), targetPlayer.GetPositionX(), targetPlayer.GetPositionY(), targetPlayer.GetPositionZ()))
|
||||||
|
return SpellCastResult.OnlyOutdoors;
|
||||||
|
|
||||||
|
return spellInfo.CheckLocation(targetPlayer.GetMapId(), targetPlayer.GetZoneId(), targetPlayer.GetAreaId(), targetPlayer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static uint GetFormSpellId(Player player, Difficulty difficulty, bool requiresOutdoor)
|
||||||
|
{
|
||||||
|
// Check what form is appropriate
|
||||||
|
if (player.IsInWater()) // Aquatic form
|
||||||
|
return SpellIds.FormAquatic;
|
||||||
|
|
||||||
|
if (player.GetSkillValue(SkillType.Riding) >= 225 && CheckLocationForForm(player, difficulty, requiresOutdoor, SpellIds.FormFlight) == SpellCastResult.SpellCastOk) // Flight form
|
||||||
|
return player.GetSkillValue(SkillType.Riding) >= 300 ? SpellIds.FormSwiftFlight : SpellIds.FormFlight;
|
||||||
|
|
||||||
|
if (CheckLocationForForm(player, difficulty, requiresOutdoor, SpellIds.FormStag) == SpellCastResult.SpellCastOk) // Stag form
|
||||||
|
return SpellIds.FormStag;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1066 - Aquatic Form
|
||||||
|
// 33943 - Flight Form
|
||||||
|
// 40120 - Swift Flight Form
|
||||||
|
[Script] // 165961 - Stag Form
|
||||||
|
class spell_dru_travel_form_AuraScript : AuraScript
|
||||||
|
{
|
||||||
|
uint triggeredSpellId;
|
||||||
|
|
||||||
|
public override bool Validate(SpellInfo spellInfo)
|
||||||
|
{
|
||||||
|
return ValidateSpellInfo(SpellIds.FormStag, SpellIds.FormAquatic, SpellIds.FormFlight, SpellIds.FormSwiftFlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Load()
|
||||||
|
{
|
||||||
|
return GetCaster().GetTypeId() == TypeId.Player;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
|
||||||
|
{
|
||||||
|
// If it stays 0, it Removes Travel Form dummy in AfterRemove.
|
||||||
|
triggeredSpellId = 0;
|
||||||
|
|
||||||
|
// We should only handle aura interrupts.
|
||||||
|
if (GetTargetApplication().GetRemoveMode() != AuraRemoveMode.Interrupt)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Check what form is appropriate
|
||||||
|
triggeredSpellId = spell_dru_travel_form_dummy_AuraScript.GetFormSpellId(GetTarget().ToPlayer(), GetCastDifficulty(), true);
|
||||||
|
|
||||||
|
// If chosen form is current aura, just don't Remove it.
|
||||||
|
if (triggeredSpellId == m_scriptSpellId)
|
||||||
|
PreventDefaultAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AfterRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
|
||||||
|
{
|
||||||
|
if (triggeredSpellId == m_scriptSpellId)
|
||||||
|
return;
|
||||||
|
|
||||||
Player player = GetTarget().ToPlayer();
|
Player player = GetTarget().ToPlayer();
|
||||||
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spell, GetCastDifficulty());
|
|
||||||
return spellInfo.CheckLocation(player.GetMapId(), player.GetZoneId(), player.GetAreaId(), player);
|
if (triggeredSpellId != 0) // Apply new form
|
||||||
|
player.AddAura(triggeredSpellId, player);
|
||||||
|
else // If not set, simply Remove Travel Form dummy
|
||||||
|
player.RemoveAura(SpellIds.TravelForm);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Register()
|
||||||
|
{
|
||||||
|
OnEffectRemove.Add(new EffectApplyHandler(OnRemove, 0, AuraType.ModShapeshift, AuraEffectHandleModes.Real));
|
||||||
|
AfterEffectRemove.Add(new EffectApplyHandler(AfterRemove, 0, AuraType.ModShapeshift, AuraEffectHandleModes.Real));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1187,4 +1182,4 @@ namespace Scripts.Spells.Druid
|
|||||||
OnEffectUpdatePeriodic.Add(new EffectUpdatePeriodicHandler(HandleTickUpdate, 0, AuraType.PeriodicHeal));
|
OnEffectUpdatePeriodic.Add(new EffectUpdatePeriodicHandler(HandleTickUpdate, 0, AuraType.PeriodicHeal));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user