aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/SpellHandler.cpp
diff options
context:
space:
mode:
authorJozef DĂșc <D0d0@users.noreply.github.com>2019-05-02 21:53:12 +0200
committerGiacomo Pozzoni <giacomopoz@gmail.com>2019-05-02 21:53:12 +0200
commit78070163dc6b9bb34ab2d006e9cc218548e861b7 (patch)
tree2337ac06ee7736948db16cb0b4fbb8339168f4a1 /src/server/game/Handlers/SpellHandler.cpp
parentfe3bf57aba9a5009e7e17922391a0d9374915ab5 (diff)
Core/Object: Range check vol. 2 (#23226)
* Core/Object: Fix all missing parts for #23062 * Update GameObject.cpp
Diffstat (limited to 'src/server/game/Handlers/SpellHandler.cpp')
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp39
1 files changed, 27 insertions, 12 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index c0d115e755f..b05c972faf9 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -330,6 +330,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
uint32 spellId;
uint8 castCount, castFlags;
recvPacket >> castCount >> spellId >> castFlags;
+ TriggerCastFlags triggerFlag = TRIGGERED_NONE;
TC_LOG_DEBUG("network", "WORLD: got cast spell packet, castCount: %u, spellId: %u, castFlags: %u, data length = %u", castCount, spellId, castFlags, (uint32)recvPacket.size());
@@ -369,24 +370,38 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
caster = _player;
}
+ // client provided targets
+ SpellCastTargets targets;
+ targets.Read(recvPacket, caster);
+ HandleClientCastFlags(recvPacket, castFlags, targets);
+
+ // not have spell in spellbook
if (caster->GetTypeId() == TYPEID_PLAYER && !caster->ToPlayer()->HasActiveSpell(spellId))
{
- // not have spell in spellbook
- recvPacket.rfinish(); // prevent spam at ignore packet
- return;
+ bool allow = false;
+
+ // allow casting of unknown spells for special lock cases
+ if (GameObject *go = targets.GetGOTarget())
+ if (go->GetSpellForLock(caster->ToPlayer()) == spellInfo)
+ allow = true;
+
+ // TODO: Preparation for #23204
+ // allow casting of spells triggered by clientside periodic trigger auras
+ /*
+ if (caster->HasAuraTypeWithTriggerSpell(SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT, spellId))
+ {
+ allow = true;
+ triggerFlag = TRIGGERED_FULL_MASK;
+ }
+ */
+
+ if (!allow)
+ return;
}
// can't use our own spells when we're in possession of another unit,
if (_player->isPossessing())
- {
- recvPacket.rfinish(); // prevent spam at ignore packet
return;
- }
-
- // client provided targets
- SpellCastTargets targets;
- targets.Read(recvPacket, caster);
- HandleClientCastFlags(recvPacket, castFlags, targets);
// Client is resending autoshot cast opcode when other spell is cast during shoot rotation
// Skip it to prevent "interrupt" message
@@ -415,7 +430,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
spellInfo = actualSpellInfo;
}
- Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE);
+ Spell* spell = new Spell(caster, spellInfo, triggerFlag);
spell->m_cast_count = castCount; // set count of casts
spell->prepare(targets);
}