aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-09-11 14:13:10 +0200
committerShauren <shauren.trinity@gmail.com>2022-09-11 14:13:10 +0200
commit78698463ff6b20255148fb647e9ad33a487bb09d (patch)
tree3140019ebcee5c7d9e4e80f40c5689ff5d4c791c
parent2556d6d705c519fd461b9d9f10a4387d9beb199e (diff)
Core/Spells: Remove all hardcoded restrictions for pick pocket spell effect and rely only on presence of pickpocket loot in db
-rw-r--r--sql/updates/world/master/2022_09_11_00_world.sql3
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp8
-rw-r--r--src/server/game/Spells/SpellInfo.cpp11
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp19
5 files changed, 31 insertions, 12 deletions
diff --git a/sql/updates/world/master/2022_09_11_00_world.sql b/sql/updates/world/master/2022_09_11_00_world.sql
new file mode 100644
index 00000000000..4f16b84e393
--- /dev/null
+++ b/sql/updates/world/master/2022_09_11_00_world.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_rog_pickpocket';
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(921,'spell_rog_pickpocket');
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 2f2adf81c90..138fe450158 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -9018,7 +9018,7 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type, bool aeLooting/* = fa
if (loot_type == LOOT_PICKPOCKETING)
{
- if (loot->loot_type != LOOT_PICKPOCKETING)
+ if (!loot || loot->loot_type != LOOT_PICKPOCKETING)
{
if (creature->CanGeneratePickPocketLoot())
{
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 4c6474c2d38..c75041d30d0 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2223,13 +2223,7 @@ void Spell::EffectPickPocket()
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return;
- // victim must be creature and attackable
- if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT || m_caster->IsFriendlyTo(unitTarget))
- return;
-
- // victim have to be alive and humanoid or undead
- if (unitTarget->IsAlive() && (unitTarget->GetCreatureTypeMask() &CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD) != 0)
- m_caster->ToPlayer()->SendLoot(unitTarget->GetGUID(), LOOT_PICKPOCKETING);
+ m_caster->ToPlayer()->SendLoot(unitTarget->GetGUID(), LOOT_PICKPOCKETING);
}
void Spell::EffectAddFarsight()
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index b8802af30ab..a1c84545a6a 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -25,6 +25,7 @@
#include "Item.h"
#include "ItemTemplate.h"
#include "Log.h"
+#include "LootMgr.h"
#include "Map.h"
#include "ObjectAccessor.h"
#include "Pet.h"
@@ -2132,10 +2133,12 @@ SpellCastResult SpellInfo::CheckTarget(WorldObject const* caster, WorldObject co
if (HasAttribute(SPELL_ATTR0_CU_PICKPOCKET))
{
- if (unitTarget->GetTypeId() == TYPEID_PLAYER)
- return SPELL_FAILED_BAD_TARGETS;
- else if ((unitTarget->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD) == 0)
- return SPELL_FAILED_TARGET_NO_POCKETS;
+ Creature const* targetCreature = unitTarget->ToCreature();
+ if (!targetCreature)
+ return SPELL_FAILED_BAD_TARGETS;
+
+ if (!LootTemplates_Pickpocketing.HaveLootFor(targetCreature->GetCreatureTemplate()->pickpocketLootId))
+ return SPELL_FAILED_TARGET_NO_POCKETS;
}
// Not allow disarm unarmed player
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index 540724747f0..4372d3bbf24 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -402,6 +402,24 @@ class spell_rog_mastery_main_gauche : public AuraScript
}
};
+class spell_rog_pickpocket : public SpellScript
+{
+ PrepareSpellScript(spell_rog_pickpocket);
+
+ SpellCastResult CheckCast()
+ {
+ if (!GetExplTargetUnit() || !GetCaster()->IsValidAttackTarget(GetExplTargetUnit(), GetSpellInfo()))
+ return SPELL_FAILED_BAD_TARGETS;
+
+ return SPELL_CAST_OK;
+ }
+
+ void Register() override
+ {
+ OnCheckCast += SpellCheckCastFn(spell_rog_pickpocket::CheckCast);
+ }
+};
+
// 79096 - Restless Blades
class spell_rog_restless_blades : public AuraScript
{
@@ -976,6 +994,7 @@ void AddSC_rogue_spell_scripts()
RegisterSpellScript(spell_rog_grand_melee);
RegisterSpellAndAuraScriptPair(spell_rog_killing_spree, spell_rog_killing_spree_aura);
RegisterSpellScript(spell_rog_mastery_main_gauche);
+ RegisterSpellScript(spell_rog_pickpocket);
RegisterSpellScript(spell_rog_restless_blades);
RegisterSpellScript(spell_rog_roll_the_bones);
RegisterSpellScript(spell_rog_rupture);