Core/Spells: Implement priest holy words + modify cooldown for a charge

Port From (https://github.com/TrinityCore/TrinityCore/commit/81eac826562f8e75de1842c59c8d35cf050b0f21)
This commit is contained in:
hondacrx
2021-04-20 13:13:49 -04:00
parent 5223c73fe1
commit e75b5f9c6b
6 changed files with 147 additions and 25 deletions
+60 -19
View File
@@ -498,13 +498,7 @@ namespace Game.Spells
_categoryCooldowns[categoryId] = cooldownEntry;
}
public void ModifyCooldown(uint spellId, int cooldownModMs)
{
TimeSpan offset = TimeSpan.FromMilliseconds(cooldownModMs);
ModifyCooldown(spellId, offset);
}
public void ModifyCooldown(uint spellId, TimeSpan offset)
public void ModifySpellCooldown(uint spellId, TimeSpan offset)
{
var cooldownEntry = _spellCooldowns.LookupByKey(spellId);
if (offset.TotalMilliseconds == 0 || cooldownEntry == null)
@@ -531,6 +525,24 @@ namespace Game.Spells
}
}
public void ModifyCooldown(uint spellId, TimeSpan cooldownMod)
{
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellId, _owner.GetMap().GetDifficultyID());
if (spellInfo != null)
ModifyCooldown(spellInfo, cooldownMod);
}
public void ModifyCooldown(SpellInfo spellInfo, TimeSpan cooldownMod)
{
if (cooldownMod == TimeSpan.Zero)
return;
if (GetChargeRecoveryTime(spellInfo.ChargeCategoryId) > 0 && GetMaxCharges(spellInfo.ChargeCategoryId) > 0)
ModifyChargeRecoveryTime(spellInfo.ChargeCategoryId, cooldownMod);
else
ModifySpellCooldown(spellInfo.Id, cooldownMod);
}
public void ResetCooldown(uint spellId, bool update = false)
{
var entry = _spellCooldowns.LookupByKey(spellId);
@@ -723,6 +735,31 @@ namespace Game.Spells
return false;
}
void ModifyChargeRecoveryTime(uint chargeCategoryId, TimeSpan cooldownMod)
{
var chargeCategoryEntry = CliDB.SpellCategoryStorage.LookupByKey(chargeCategoryId);
if (chargeCategoryEntry == null)
return;
var chargeList = _categoryCharges.LookupByKey(chargeCategoryId);
if (chargeList == null || chargeList.Empty())
return;
var now = GameTime.GetGameTimeSystemPoint();
for (var i = 0; i < chargeList.Count; ++i)
{
var entry = chargeList[i];
entry.RechargeStart += cooldownMod;
entry.RechargeEnd += cooldownMod;
}
while (!chargeList.Empty() && chargeList[0].RechargeEnd < now)
chargeList.RemoveAt(0);
SendSetSpellCharges(chargeCategoryId, chargeList);
}
public void RestoreCharge(uint chargeCategoryId)
{
var chargeList = _categoryCharges.LookupByKey(chargeCategoryId);
@@ -730,18 +767,7 @@ namespace Game.Spells
{
chargeList.RemoveAt(chargeList.Count - 1);
Player player = GetPlayerOwner();
if (player)
{
SetSpellCharges setSpellCharges = new();
setSpellCharges.Category = chargeCategoryId;
if (!chargeList.Empty())
setSpellCharges.NextRecoveryTime = (uint)(chargeList.FirstOrDefault().RechargeEnd - GameTime.GetGameTimeSystemPoint()).TotalMilliseconds;
setSpellCharges.ConsumedCharges = (byte)chargeList.Count;
setSpellCharges.IsPet = player != _owner;
player.SendPacket(setSpellCharges);
}
SendSetSpellCharges(chargeCategoryId, chargeList);
if (chargeList.Empty())
_categoryCharges.Remove(chargeCategoryId);
@@ -857,6 +883,21 @@ namespace Game.Spells
}
}
void SendSetSpellCharges(uint chargeCategoryId, List<ChargeEntry> chargeCollection)
{
Player player = GetPlayerOwner();
if (player != null)
{
SetSpellCharges setSpellCharges = new();
setSpellCharges.Category = chargeCategoryId;
if (!chargeCollection.Empty())
setSpellCharges.NextRecoveryTime = (uint)(chargeCollection[0].RechargeEnd - DateTime.Now).TotalMilliseconds;
setSpellCharges.ConsumedCharges = (byte)chargeCollection.Count;
setSpellCharges.IsPet = player != _owner;
player.SendPacket(setSpellCharges);
}
}
void GetCooldownDurations(SpellInfo spellInfo, uint itemId, ref uint categoryId)
{
int notUsed = 0;
+4 -4
View File
@@ -188,7 +188,7 @@ namespace Scripts.Spells.Paladin
void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
{
GetTarget().GetSpellHistory().ModifyCooldown(SpellIds.HolyShockR1, aurEff.GetAmount());
GetTarget().GetSpellHistory().ModifyCooldown(SpellIds.HolyShockR1, TimeSpan.FromSeconds(aurEff.GetAmount()));
}
public override void Register()
@@ -313,7 +313,7 @@ namespace Scripts.Spells.Paladin
{
int value = aurEff.GetAmount() / 10;
GetTarget().GetSpellHistory().ModifyCooldown(SpellIds.HammerOfJustice, -value);
GetTarget().GetSpellHistory().ModifyCooldown(SpellIds.HammerOfJustice, TimeSpan.FromSeconds(-value));
}
public override void Register()
@@ -682,8 +682,8 @@ namespace Scripts.Spells.Paladin
{
int value = aurEff.GetAmount() * 100 * _baseHolyPowerCost.Amount;
GetTarget().GetSpellHistory().ModifyCooldown(SpellIds.AvengingWrath, -value);
GetTarget().GetSpellHistory().ModifyCooldown(SpellIds.GuardianOfAcientKings, -value);
GetTarget().GetSpellHistory().ModifyCooldown(SpellIds.AvengingWrath, TimeSpan.FromSeconds(-value));
GetTarget().GetSpellHistory().ModifyCooldown(SpellIds.GuardianOfAcientKings, TimeSpan.FromSeconds(-value));
}
public override void Register()
+64
View File
@@ -41,7 +41,12 @@ namespace Scripts.Spells.Priest
public const uint BodyAndSoulSpeed = 65081;
public const uint DivineBlessing = 40440;
public const uint DivineWrath = 40441;
public const uint FlashHeal = 2061;
public const uint GuardianSpiritHeal = 48153;
public const uint Heal = 2060;
public const uint HolyWordChastise = 88625;
public const uint HolyWordSanctify = 34861;
public const uint HolyWordSerenity = 2050;
public const uint ItemEfficiency = 37595;
public const uint LeapOfFaithEffect = 92832;
public const uint LevitateEffect = 111759;
@@ -52,10 +57,13 @@ namespace Scripts.Spells.Priest
public const uint PrayerOfMendingAura = 41635;
public const uint PrayerOfMendingHeal = 33110;
public const uint PrayerOfMendingJump = 155793;
public const uint PrayerOfHealing = 596;
public const uint Renew = 139;
public const uint RenewedHope = 197469;
public const uint RenewedHopeEffect = 197470;
public const uint ShieldDisciplineEnergize = 47755;
public const uint ShieldDisciplinePassive = 197045;
public const uint Smite = 585;
public const uint SpiritOfRedemption = 27827;
public const uint StrengthOfSoul = 197535;
public const uint StrengthOfSoulEffect = 197548;
@@ -269,6 +277,62 @@ namespace Scripts.Spells.Priest
}
}
[Script] // 63733 - Holy Words
class spell_pri_holy_words : AuraScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.Heal, SpellIds.FlashHeal, SpellIds.PrayerOfHealing, SpellIds.Renew, SpellIds.Smite, SpellIds.HolyWordChastise, SpellIds.HolyWordSanctify, SpellIds.HolyWordSerenity)
&& Global.SpellMgr.GetSpellInfo(SpellIds.HolyWordSerenity, Difficulty.None).GetEffect(1) != null
&& Global.SpellMgr.GetSpellInfo(SpellIds.HolyWordSanctify, Difficulty.None).GetEffect(2) != null
&& Global.SpellMgr.GetSpellInfo(SpellIds.HolyWordSanctify, Difficulty.None).GetEffect(3) != null
&& Global.SpellMgr.GetSpellInfo(SpellIds.HolyWordChastise, Difficulty.None).GetEffect(1) != null;
}
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
{
SpellInfo spellInfo = eventInfo.GetSpellInfo();
if (spellInfo == null)
return;
uint targetSpellId;
uint cdReductionEffIndex;
switch (spellInfo.Id)
{
case SpellIds.Heal:
case SpellIds.FlashHeal: // reduce Holy Word: Serenity cd by 6 seconds
targetSpellId = SpellIds.HolyWordSerenity;
cdReductionEffIndex = 1;
// cdReduction = sSpellMgr.GetSpellInfo(SPELL_PRIEST_HOLY_WORD_SERENITY, GetCastDifficulty()).GetEffect(EFFECT_1).CalcValue(player);
break;
case SpellIds.PrayerOfHealing: // reduce Holy Word: Sanctify cd by 6 seconds
targetSpellId = SpellIds.HolyWordSanctify;
cdReductionEffIndex = 2;
break;
case SpellIds.Renew: // reuce Holy Word: Sanctify cd by 2 seconds
targetSpellId = SpellIds.HolyWordSanctify;
cdReductionEffIndex = 3;
break;
case SpellIds.Smite: // reduce Holy Word: Chastise cd by 4 seconds
targetSpellId = SpellIds.HolyWordChastise;
cdReductionEffIndex = 1;
break;
default:
Log.outWarn(LogFilter.Spells, $"HolyWords aura has been proced by an unknown spell: {GetSpellInfo().Id}");
return;
}
SpellInfo targetSpellInfo = Global.SpellMgr.GetSpellInfo(targetSpellId, GetCastDifficulty());
int cdReduction = targetSpellInfo.GetEffect(cdReductionEffIndex).CalcValue(GetTarget());
GetTarget().GetSpellHistory().ModifyCooldown(targetSpellInfo, TimeSpan.FromSeconds(-cdReduction));
}
public override void Register()
{
OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy));
}
}
[Script] // 40438 - Priest Tier 6 Trinket
class spell_pri_item_t6_trinket : AuraScript
{
+1 -1
View File
@@ -626,7 +626,7 @@ namespace Scripts.Spells.Shaman
PreventDefaultAction();
Player target = GetTarget().ToPlayer();
if (target)
target.GetSpellHistory().ModifyCooldown(SpellIds.ElementalMastery, -aurEff.GetAmount());
target.GetSpellHistory().ModifyCooldown(SpellIds.ElementalMastery, TimeSpan.FromMilliseconds(-aurEff.GetAmount()));
}
public override void Register()
+1 -1
View File
@@ -396,7 +396,7 @@ namespace Scripts.Spells.Warrior
void HandleAfterCast()
{
if (_targetCount >= (uint)GetSpellInfo().GetEffect(0).CalcValue())
GetCaster().ToPlayer().GetSpellHistory().ModifyCooldown(GetSpellInfo().Id, -(GetSpellInfo().GetEffect(3).CalcValue() * Time.InMilliseconds));
GetCaster().ToPlayer().GetSpellHistory().ModifyCooldown(GetSpellInfo().Id, TimeSpan.FromSeconds(-GetSpellInfo().GetEffect(3).CalcValue()));
}
public override void Register()
@@ -0,0 +1,17 @@
-- Spell Proc
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_pri_holy_words');
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(63733, 'spell_pri_holy_words');
-- Spell Procs
-- Make holy words Proc on the following spells:
-- 2060 Heal 0x1000
-- 2061 Flash Heal 0x0800
-- 596 Prayer of Healing 0x0200
-- 139 Renew 0x0040
-- 585 Smite 0x0080
-- 0x1AC0
DELETE FROM `spell_proc` WHERE `SpellId` IN (63733); -- Holy Words
INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES
(63733, 0, 6, 0x1AC0, 0x0, 0x0, 0x0, 0, 7, 2, 0x403, 0x0, 0, 0, 0, 0, 0);