aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/SpellHandler.cpp
diff options
context:
space:
mode:
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);
}