aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp11
-rw-r--r--src/server/game/Scripting/ScriptMgr.h5
-rw-r--r--src/server/scripts/World/item_scripts.cpp25
4 files changed, 42 insertions, 1 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 9ad8eddf790..971e365a6bf 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7970,7 +7970,7 @@ void Player::CastItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemT
else if (chance > 100.0f)
chance = GetWeaponProcChance();
- if (roll_chance_f(chance))
+ if (roll_chance_f(chance) && sScriptMgr->OnCastItemCombatSpell(this, damageInfo.GetVictim(), spellInfo, item))
CastSpell(damageInfo.GetVictim(), spellInfo->Id, true, item);
}
}
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index f04f288a828..3e19033ef1d 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -1559,6 +1559,17 @@ bool ScriptMgr::OnItemRemove(Player* player, Item* item)
return tmpscript->OnRemove(player, item);
}
+bool ScriptMgr::OnCastItemCombatSpell(Player* player, Unit* victim, SpellInfo const* spellInfo, Item* item)
+{
+ ASSERT(player);
+ ASSERT(victim);
+ ASSERT(spellInfo);
+ ASSERT(item);
+
+ GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, true);
+ return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item);
+}
+
bool ScriptMgr::OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex, Creature* target)
{
ASSERT(caster);
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index c47c75f3a9a..10df2ecf970 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -53,6 +53,7 @@ class Player;
class Quest;
class ScriptMgr;
class Spell;
+class SpellInfo;
class SpellScript;
class SpellCastTargets;
class Transport;
@@ -378,6 +379,9 @@ class TC_GAME_API ItemScript : public ScriptObject
// Called when the item is destroyed.
virtual bool OnRemove(Player* /*player*/, Item* /*item*/) { return false; }
+
+ // Called before casting a combat spell from this item (chance on hit spells of item template, can be used to prevent cast if returning false)
+ virtual bool OnCastItemCombatSpell(Player* /*player*/, Unit* /*victim*/, SpellInfo const* /*spellInfo*/, Item* /*item*/) { return true; }
};
class TC_GAME_API UnitScript : public ScriptObject
@@ -955,6 +959,7 @@ class TC_GAME_API ScriptMgr
bool OnItemUse(Player* player, Item* item, SpellCastTargets const& targets);
bool OnItemExpire(Player* player, ItemTemplate const* proto);
bool OnItemRemove(Player* player, Item* item);
+ bool OnCastItemCombatSpell(Player* player, Unit* victim, SpellInfo const* spellInfo, Item* item);
public: /* CreatureScript */
diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp
index 7f9a22e07a9..5ce6a8301dd 100644
--- a/src/server/scripts/World/item_scripts.cpp
+++ b/src/server/scripts/World/item_scripts.cpp
@@ -412,6 +412,30 @@ public:
}
};
+// Only used currently for
+// 19169: Nightfall
+class item_generic_limit_chance_above_60 : public ItemScript
+{
+ public:
+ item_generic_limit_chance_above_60() : ItemScript("item_generic_limit_chance_above_60") { }
+
+ bool OnCastItemCombatSpell(Player* /*player*/, Unit* victim, SpellInfo const* /*spellInfo*/, Item* /*item*/) override
+ {
+ // spell proc chance gets severely reduced on victims > 60 (formula unknown)
+ if (victim->getLevel() > 60)
+ {
+ // gives ~0.1% proc chance at lvl 70
+ float const lvlPenaltyFactor = 9.93f;
+ float const failureChance = (victim->getLevel() - 60) * lvlPenaltyFactor;
+
+ // base ppm chance was already rolled, only roll success chance
+ return !roll_chance_f(failureChance);
+ }
+
+ return true;
+ }
+};
+
void AddSC_item_scripts()
{
new item_only_for_flight();
@@ -425,4 +449,5 @@ void AddSC_item_scripts()
new item_dehta_trap_smasher();
new item_trident_of_nazjan();
new item_captured_frog();
+ new item_generic_limit_chance_above_60();
}