Core/Spells Handle auras 328 & 396 (SPELL_AURA_TRIGGER_SPELL_ON_POWER_*)

Port From (https://github.com/TrinityCore/TrinityCore/commit/56e9560661adca81fc1e9a297cb6823cf7a6cb22)
This commit is contained in:
hondacrx
2021-03-08 13:50:15 -05:00
parent cb25ddc507
commit ee97dc7b32
4 changed files with 115 additions and 1 deletions
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
*/
namespace Framework.Constants
{
@@ -576,4 +576,10 @@ namespace Framework.Constants
Level4 = 3,
TauntImmune = 4
}
public enum AuraTriggerOnPowerChangeDirection
{
Gain = 0,
Loss = 1
}
}
+5
View File
@@ -171,6 +171,11 @@ public static class MathFunctions
return (ulong)(value * pct / 100.0f);
}
public static float GetPctOf(float value, float max)
{
return value / max * 100.0f;
}
public static int RoundToInterval(ref int num, dynamic floor, dynamic ceil)
{
return num = (int)Math.Min(Math.Max(num, floor), ceil);
+45
View File
@@ -603,6 +603,7 @@ namespace Game.Entities
if (maxPower < val)
val = maxPower;
int oldPower = m_unitData.Power[(int)powerIndex];
SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Power, (int)powerIndex), val);
if (IsInWorld)
@@ -613,6 +614,8 @@ namespace Game.Entities
SendMessageToSet(packet, IsTypeId(TypeId.Player));
}
TriggerOnPowerChangeAuras(powerType, oldPower, val);
// group update
if (IsTypeId(TypeId.Player))
{
@@ -658,6 +661,48 @@ namespace Game.Entities
public virtual uint GetPowerIndex(PowerType powerType) { return 0; }
public float GetPowerPct(PowerType powerType) { return GetMaxPower(powerType) != 0 ? 100.0f* GetPower(powerType) / GetMaxPower(powerType) : 0.0f; }
void TriggerOnPowerChangeAuras(PowerType power, int oldVal, int newVal)
{
var effects = GetAuraEffectsByType(AuraType.TriggerSpellOnPowerPct);
var effectsAmount = GetAuraEffectsByType(AuraType.TriggerSpellOnPowerAmount);
effects.AddRange(effectsAmount);
foreach (AuraEffect effect in effects)
{
if (effect.GetMiscValue() == (int)power)
{
uint effectAmount = (uint)effect.GetAmount();
uint triggerSpell = effect.GetSpellEffectInfo().TriggerSpell;
float oldValueCheck = oldVal;
float newValueCheck = newVal;
if (effect.GetAuraType() == AuraType.TriggerSpellOnPowerPct)
{
int maxPower = GetMaxPower(power);
oldValueCheck = MathFunctions.GetPctOf(oldVal, maxPower);
newValueCheck = MathFunctions.GetPctOf(newVal, maxPower);
}
switch ((AuraTriggerOnPowerChangeDirection)effect.GetMiscValueB())
{
case AuraTriggerOnPowerChangeDirection.Gain:
if (oldValueCheck >= effect.GetAmount() || newValueCheck < effectAmount)
continue;
break;
case AuraTriggerOnPowerChangeDirection.Loss:
if (oldValueCheck <= effect.GetAmount() || newValueCheck > effectAmount)
continue;
break;
default:
break;
}
CastSpell(this, triggerSpell, true, null, effect);
}
}
}
public void ApplyResilience(Unit victim, ref uint damage)
{
// player mounted on multi-passenger mount is also classified as vehicle
+58
View File
@@ -4698,6 +4698,64 @@ namespace Game.Spells
}
}
[AuraEffectHandler(AuraType.TriggerSpellOnPowerPct)]
void HandleTriggerSpellOnPowerPercent(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply)
{
if (!mode.HasAnyFlag(AuraEffectHandleModes.Real) || !apply)
return;
Unit target = aurApp.GetTarget();
int effectAmount = GetAmount();
uint triggerSpell = GetSpellEffectInfo().TriggerSpell;
float powerAmountPct = MathFunctions.GetPctOf(target.GetPower((PowerType)GetMiscValue()), target.GetMaxPower((PowerType)GetMiscValue()));
switch ((AuraTriggerOnPowerChangeDirection)GetMiscValueB())
{
case AuraTriggerOnPowerChangeDirection.Gain:
if (powerAmountPct < effectAmount)
return;
break;
case AuraTriggerOnPowerChangeDirection.Loss:
if (powerAmountPct > effectAmount)
return;
break;
default:
break;
}
target.CastSpell(target, triggerSpell, true);
}
[AuraEffectHandler(AuraType.TriggerSpellOnPowerAmount)]
void HandleTriggerSpellOnPowerAmount(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply)
{
if (!mode.HasAnyFlag(AuraEffectHandleModes.Real) || !apply)
return;
Unit target = aurApp.GetTarget();
int effectAmount = GetAmount();
uint triggerSpell = GetSpellEffectInfo().TriggerSpell;
float powerAmount = target.GetPower((PowerType)GetMiscValue());
switch ((AuraTriggerOnPowerChangeDirection)GetMiscValueB())
{
case AuraTriggerOnPowerChangeDirection.Gain:
if (powerAmount < effectAmount)
return;
break;
case AuraTriggerOnPowerChangeDirection.Loss:
if (powerAmount > effectAmount)
return;
break;
default:
break;
}
target.CastSpell(target, triggerSpell, true);
}
[AuraEffectHandler(AuraType.OpenStable)]
void HandleAuraOpenStable(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply)
{