Scripts/Spells: Divine Star (Priest) fixed

Port From (https://github.com/TrinityCore/TrinityCore/commit/6b944b9e56969fb465449ecda7c8561696c06833)
This commit is contained in:
hondacrx
2022-08-04 23:01:43 -04:00
parent cde3843afd
commit 8cd4dda8e3
3 changed files with 120 additions and 2 deletions
+118 -1
View File
@@ -16,14 +16,17 @@
*/
using Framework.Constants;
using Framework.Dynamic;
using Game.AI;
using Game.Entities;
using Game.Maps;
using Game.Movement;
using Game.Scripting;
using Game.Spells;
using System;
using System.Collections.Generic;
using System.Linq;
using Game.Maps;
using System.Numerics;
namespace Scripts.Spells.Priest
{
@@ -40,6 +43,8 @@ namespace Scripts.Spells.Priest
public const uint BodyAndSoul = 64129;
public const uint BodyAndSoulSpeed = 65081;
public const uint DivineBlessing = 40440;
public const uint DivineStarDamage = 122128;
public const uint DivineStarHeal = 110745;
public const uint DivineWrath = 40441;
public const uint FlashHeal = 2061;
public const uint GuardianSpiritHeal = 48153;
@@ -332,6 +337,118 @@ namespace Scripts.Spells.Priest
}
}
[Script] // 110744 - Divine Star
class areatrigger_pri_divine_star : AreaTriggerAI
{
TaskScheduler _scheduler = new();
Position _casterCurrentPosition = new();
List<ObjectGuid> _affectedUnits = new();
public areatrigger_pri_divine_star(AreaTrigger areatrigger) : base(areatrigger) { }
public override void OnInitialize()
{
Unit caster = at.GetCaster();
if (caster != null)
{
_casterCurrentPosition = caster.GetPosition();
// Note: max. distance at which the Divine Star can travel to is 24 yards.
float divineStarXOffSet = 24.0f;
Position destPos = _casterCurrentPosition;
at.MovePositionToFirstCollision(destPos, divineStarXOffSet, 0.0f);
PathGenerator firstPath = new(at);
firstPath.CalculatePath(destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), false);
Vector3 endPoint = firstPath.GetPath().Last();
// Note: it takes 1000ms to reach 24 yards, so it takes 41.67ms to run 1 yard.
at.InitSplines(firstPath.GetPath().ToList(), (uint)(at.GetDistance(endPoint.X, endPoint.Y, endPoint.Z) * 41.67f));
}
}
public override void OnUpdate(uint diff)
{
_scheduler.Update(diff);
}
public override void OnUnitEnter(Unit unit)
{
Unit caster = at.GetCaster();
if (caster != null)
{
if (!_affectedUnits.Contains(unit.GetGUID()))
{
if (caster.IsValidAttackTarget(unit))
caster.CastSpell(unit, SpellIds.DivineStarDamage, new CastSpellExtraArgs(TriggerCastFlags.IgnoreGCD | TriggerCastFlags.IgnoreCastInProgress));
else if (caster.IsValidAssistTarget(unit))
caster.CastSpell(unit, SpellIds.DivineStarHeal, new CastSpellExtraArgs(TriggerCastFlags.IgnoreGCD | TriggerCastFlags.IgnoreCastInProgress));
_affectedUnits.Add(unit.GetGUID());
}
}
}
public override void OnUnitExit(Unit unit)
{
// Note: this ensures any unit receives a second hit if they happen to be inside the AT when Divine Star starts its return path.
Unit caster = at.GetCaster();
if (caster != null)
{
if (!_affectedUnits.Contains(unit.GetGUID()))
{
if (caster.IsValidAttackTarget(unit))
caster.CastSpell(unit, SpellIds.DivineStarDamage, new CastSpellExtraArgs(TriggerCastFlags.IgnoreGCD | TriggerCastFlags.IgnoreCastInProgress));
else if (caster.IsValidAssistTarget(unit))
caster.CastSpell(unit, SpellIds.DivineStarHeal, new CastSpellExtraArgs(TriggerCastFlags.IgnoreGCD | TriggerCastFlags.IgnoreCastInProgress));
_affectedUnits.Add(unit.GetGUID());
}
}
}
public override void OnDestinationReached()
{
Unit caster = at.GetCaster();
if (caster == null)
return;
if (at.GetDistance(_casterCurrentPosition) > 0.05f)
{
_affectedUnits.Clear();
ReturnToCaster();
}
else
at.Remove();
}
void ReturnToCaster()
{
_scheduler.Schedule(TimeSpan.FromMilliseconds(0), task =>
{
Unit caster = at.GetCaster();
if (caster != null)
{
_casterCurrentPosition = caster.GetPosition();
List<Vector3> returnSplinePoints = new();
returnSplinePoints.Add(at.GetPosition());
returnSplinePoints.Add(at.GetPosition());
returnSplinePoints.Add(caster.GetPosition());
returnSplinePoints.Add(caster.GetPosition());
at.InitSplines(returnSplinePoints, (uint)at.GetDistance(caster) / 24 * 1000);
task.Repeat(TimeSpan.FromMilliseconds(250));
}
});
}
}
[Script] // 47788 - Guardian Spirit
class spell_pri_guardian_spirit : AuraScript
{