Core/Spells: Implemented evoker empower spell mechanic

Port From (https://github.com/TrinityCore/TrinityCore/commit/a39d0db9ec64f6bf38716abaade5b7835f2db338)
This commit is contained in:
Hondacrx
2024-08-19 18:48:32 -04:00
parent 2405543be4
commit d231c06b8e
18 changed files with 616 additions and 89 deletions
+122 -1
View File
@@ -2,7 +2,6 @@
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
using Framework.Constants;
using Framework.Dynamic;
using Game.Entities;
using Game.Spells;
using System;
@@ -834,6 +833,128 @@ namespace Game.Networking.Packets
public int TimeRemaining;
}
class SpellEmpowerStart : ServerPacket
{
public ObjectGuid CastID;
public ObjectGuid CasterGUID;
public int SpellID;
public SpellCastVisual Visual;
public TimeSpan EmpowerDuration;
public TimeSpan MinHoldTime;
public TimeSpan HoldAtMaxTime;
public List<ObjectGuid> Targets = new();
public List<TimeSpan> StageDurations = new();
public SpellChannelStartInterruptImmunities? InterruptImmunities;
public SpellTargetedHealPrediction? HealPrediction;
public SpellEmpowerStart() : base(ServerOpcodes.SpellEmpowerStart) { }
public override void Write()
{
_worldPacket.WritePackedGuid(CastID);
_worldPacket.WritePackedGuid(CasterGUID);
_worldPacket.WriteInt32(Targets.Count);
_worldPacket.WriteInt32(SpellID);
Visual.Write(_worldPacket);
_worldPacket.WriteUInt32((uint)EmpowerDuration.TotalMilliseconds);
_worldPacket.WriteUInt32((uint)MinHoldTime.TotalMilliseconds);
_worldPacket.WriteUInt32((uint)HoldAtMaxTime.TotalMilliseconds);
_worldPacket.WriteInt32(StageDurations.Count);
foreach (var target in Targets)
_worldPacket.WritePackedGuid(target);
foreach (var stageDuration in StageDurations)
_worldPacket.WriteUInt32((uint)stageDuration.TotalMilliseconds);
_worldPacket.WriteBit(InterruptImmunities.HasValue);
_worldPacket.WriteBit(HealPrediction.HasValue);
_worldPacket.FlushBits();
if (InterruptImmunities.HasValue)
InterruptImmunities.Value.Write(_worldPacket);
if (HealPrediction.HasValue)
HealPrediction.Value.Write(_worldPacket);
}
}
class SpellEmpowerUpdate : ServerPacket
{
public ObjectGuid CastID;
public ObjectGuid CasterGUID;
public TimeSpan TimeRemaining;
public List<TimeSpan> StageDurations = new();
public byte Status;
public SpellEmpowerUpdate() : base(ServerOpcodes.SpellEmpowerUpdate) { }
public override void Write()
{
_worldPacket.WritePackedGuid(CastID);
_worldPacket.WritePackedGuid(CasterGUID);
_worldPacket.WriteUInt32((uint)TimeRemaining.TotalMilliseconds);
_worldPacket.WriteInt32(StageDurations.Count);
_worldPacket.WriteUInt8(Status);
_worldPacket.FlushBits();
foreach (var stageDuration in StageDurations)
_worldPacket.WriteUInt32((uint)stageDuration.TotalMilliseconds);
}
}
class SetEmpowerMinHoldStagePercent : ClientPacket
{
public float MinHoldStagePercent = 1.0f;
public SetEmpowerMinHoldStagePercent(WorldPacket packet) : base(packet) { }
public override void Read()
{
MinHoldStagePercent = _worldPacket.ReadFloat();
}
}
class SpellEmpowerRelease : ClientPacket
{
public int SpellID;
public SpellEmpowerRelease(WorldPacket packet) : base(packet) { }
public override void Read()
{
SpellID = _worldPacket.ReadInt32();
}
}
class SpellEmpowerRestart : ClientPacket
{
public int SpellID;
public SpellEmpowerRestart(WorldPacket packet) : base(packet) { }
public override void Read()
{
SpellID = _worldPacket.ReadInt32();
}
}
class SpellEmpowerSetStage : ServerPacket
{
public ObjectGuid CastID;
public ObjectGuid CasterGUID;
public int Stage;
public SpellEmpowerSetStage() : base(ServerOpcodes.SpellEmpowerSetStage) { }
public override void Write()
{
_worldPacket.WritePackedGuid(CastID);
_worldPacket.WritePackedGuid(CasterGUID);
_worldPacket.WriteInt32(Stage);
}
}
class ResurrectRequest : ServerPacket
{
public ResurrectRequest() : base(ServerOpcodes.ResurrectRequest) { }