diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 203 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 20 |
2 files changed, 112 insertions, 111 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 874391f0f3a..1f3f2883d09 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -200,82 +200,72 @@ bool SpellCastTargets::read (WorldPacket * data, Unit *caster) if (m_targetMask == TARGET_FLAG_SELF) return true; - // TARGET_FLAG_UNK2 is used for non-combat pets, maybe other? - if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNK2)) + for (uint8 i = 0; i < MAX_TARGET_FLAGS;++i) { - if (!data->readPackGUID(m_unitTargetGUID)) - return false; - if (m_targetMask & TARGET_FLAG_UNIT) - m_intTargetFlags |= FLAG_INT_UNIT; - } - - if (m_targetMask & (TARGET_FLAG_OBJECT)) - { - if (!data->readPackGUID(m_GOTargetGUID)) - return false; - m_intTargetFlags |= FLAG_INT_OBJECT; - } - - if ((m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) && caster->GetTypeId() == TYPEID_PLAYER) - if (!data->readPackGUID(m_itemTargetGUID)) - return false; - - if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE)) - if (!data->readPackGUID(m_CorpseTargetGUID)) - return false; - - if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) - { - if (data->rpos() + 1 + 4 + 4 + 4 > data->size()) - return false; - - if (!data->readPackGUID(m_unitTargetGUID)) - return false; - - *data >> m_srcPos.m_positionX >> m_srcPos.m_positionY >> m_srcPos.m_positionZ; - if (!m_srcPos.IsPositionValid()) - return false; - m_intTargetFlags |= FLAG_INT_SRC_LOC; - } - else - m_srcPos.Relocate(caster); - - if (m_targetMask & TARGET_FLAG_DEST_LOCATION) - { - if (data->rpos() + 1 + 4 + 4 + 4 > data->size()) - return false; - - if (!data->readPackGUID(m_unitTargetGUID)) - return false; - - *data >> m_dstPos.m_positionX >> m_dstPos.m_positionY >> m_dstPos.m_positionZ; - if (!m_dstPos.IsPositionValid()) - return false; - - m_intTargetFlags |= FLAG_INT_DST_LOC; - - if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) + if (!(m_targetMask & (1<<i))) + continue; + switch (1<<i) { - if (data->rpos() + 4 + 4 <= data->size()) + case TARGET_FLAG_UNIT: + case TARGET_FLAG_UNK17: // used for non-combat pets, maybe other? + if (!data->readPackGUID(m_unitTargetGUID)) + return false; + if (m_targetMask & TARGET_FLAG_UNIT) + m_intTargetFlags |= FLAG_INT_UNIT; + break; + case TARGET_FLAG_OBJECT: + if (!data->readPackGUID(m_GOTargetGUID)) + return false; + m_intTargetFlags |= FLAG_INT_OBJECT; + break; + case TARGET_FLAG_CORPSE: + case TARGET_FLAG_PVP_CORPSE: + if (!data->readPackGUID(m_CorpseTargetGUID)) + return false; + break; + case TARGET_FLAG_ITEM: + case TARGET_FLAG_TRADE_ITEM: + if (caster->GetTypeId() != TYPEID_PLAYER) + return false; + if (!data->readPackGUID(m_itemTargetGUID)) + return false; + break; + case TARGET_FLAG_SOURCE_LOCATION: { - *data >> m_elevation >> m_speed; - // TODO: should also read + uint64 relativePositionObjGUID; + if (!data->readPackGUID(relativePositionObjGUID)) + return false; + *data >> m_srcPos.m_positionX >> m_srcPos.m_positionY >> m_srcPos.m_positionZ; m_srcPos.m_orientation = caster->GetOrientation(); - //*data >> uint16 >> uint8 >> uint32 >> uint32; - //*data >> float >> float >> float >> float... + if (!m_srcPos.IsPositionValid()) + return false; + m_intTargetFlags |= FLAG_INT_SRC_LOC; + break; } + case TARGET_FLAG_DEST_LOCATION: + { + uint64 relativePositionObjGUID; + if (!data->readPackGUID(relativePositionObjGUID)) + return false; + *data >> m_dstPos.m_positionX >> m_dstPos.m_positionY >> m_dstPos.m_positionZ; + if (!m_dstPos.IsPositionValid()) + return false; + m_intTargetFlags |= FLAG_INT_DST_LOC; + break; + } + case TARGET_FLAG_STRING: + if (data->rpos() + 1 > data->size()) + return false; + *data >> m_strTarget; + break; } } - else - m_dstPos.Relocate(caster); - if (m_targetMask & TARGET_FLAG_STRING) - { - if (data->rpos() + 1 > data->size()) - return false; + if (!(m_targetMask & TARGET_FLAG_SOURCE_LOCATION)) + m_srcPos.Relocate(caster); - *data >> m_strTarget; - } + if (!(m_targetMask & TARGET_FLAG_DEST_LOCATION) + m_dstPos.Relocate(caster); // find real units/GOs Update(caster); @@ -287,50 +277,51 @@ void SpellCastTargets::write (WorldPacket * data) *data << uint32(m_targetMask); //sLog.outDebug("Spell write, target mask = %u", m_targetMask); - if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK2)) + for (uint8 i = 0; i < MAX_TARGET_FLAGS;++i) { - if (m_targetMask & TARGET_FLAG_UNIT) - { - if (m_unitTarget) - data->append(m_unitTarget->GetPackGUID()); - else - *data << uint8(0); - } - else if (m_targetMask & TARGET_FLAG_OBJECT) + if (!(m_targetMask & (1<<i))) + continue; + switch (1<<i) { - if (m_GOTarget) - data->append(m_GOTarget->GetPackGUID()); - else + case TARGET_FLAG_UNIT: + if (m_unitTarget) + data->append(m_unitTarget->GetPackGUID()); + else + *data << uint8(0); + break; + case TARGET_FLAG_OBJECT: + if (m_GOTarget) + data->append(m_GOTarget->GetPackGUID()); + else + *data << uint8(0); + break; + case TARGET_FLAG_CORPSE: + case TARGET_FLAG_PVP_CORPSE: + data->appendPackGUID(m_CorpseTargetGUID); + break; + case TARGET_FLAG_UNK17: *data << uint8(0); + break; + case TARGET_FLAG_ITEM: + case TARGET_FLAG_TRADE_ITEM: + if (m_itemTarget) + data->append(m_itemTarget->GetPackGUID()); + else + *data << uint8(0); + break; + case TARGET_FLAG_SOURCE_LOCATION: + *data << uint8(0); // relative position guid here - transport for example + *data << m_srcPos.m_positionX << m_srcPos.m_positionY << m_srcPos.m_positionZ; + break; + case TARGET_FLAG_DEST_LOCATION: + *data << uint8(0); // relative position guid here - transport for example + *data << m_dstPos.m_positionX << m_dstPos.m_positionY << m_dstPos.m_positionZ; + break; + case TARGET_FLAG_STRING: + *data << m_strTarget; + break; } - else if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE)) - data->appendPackGUID(m_CorpseTargetGUID); - else - *data << uint8(0); } - - if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) - { - if (m_itemTarget) - data->append(m_itemTarget->GetPackGUID()); - else - *data << uint8(0); - } - - if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) - { - *data << uint8(0); // It seems the client doesn't like unit target GUID being sent here, we must send 0 - *data << m_srcPos.m_positionX << m_srcPos.m_positionY << m_srcPos.m_positionZ; - } - - if (m_targetMask & TARGET_FLAG_DEST_LOCATION) - { - *data << uint8(0); // It seems the client doesn't like unit target GUID being sent here, we must send 0 - *data << m_dstPos.m_positionX << m_dstPos.m_positionY << m_dstPos.m_positionZ; - } - - if (m_targetMask & TARGET_FLAG_STRING) - *data << m_strTarget; } Spell::Spell(Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID, Spell** triggeringContainer, bool skipCheck) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index e9e6fe626a2..53123d49288 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -60,13 +60,14 @@ enum SpellCastTargetFlags TARGET_FLAG_OBJECT = 0x00000800, // pguid, 2 spells TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid, 0 spells TARGET_FLAG_STRING = 0x00002000, // string, 0 spells - TARGET_FLAG_UNK1 = 0x00004000, // 199 spells, opening object/lock + TARGET_FLAG_UNK15 = 0x00004000, // 199 spells, opening object/lock TARGET_FLAG_CORPSE = 0x00008000, // pguid, resurrection spells - TARGET_FLAG_UNK2 = 0x00010000, // pguid, not used in any spells as of 3.2.2a (can be set dynamically) + TARGET_FLAG_UNK17 = 0x00010000, // pguid, not used in any spells as of 3.2.2a (can be set dynamically) TARGET_FLAG_GLYPH = 0x00020000, // used in glyph spells - TARGET_FLAG_UNK3 = 0x00040000, // - TARGET_FLAG_UNK4 = 0x00080000 // uint32, loop { vec3, guid -> if guid == 0 break } + TARGET_FLAG_UNK19 = 0x00040000, // + TARGET_FLAG_UNK20 = 0x00080000 // uint32, loop { vec3, guid -> if guid == 0 break } }; +#define MAX_TARGET_FLAGS 21 enum SpellCastFlags { @@ -93,7 +94,16 @@ enum SpellCastFlags CAST_FLAG_UNKNOWN_20 = 0x00080000, CAST_FLAG_UNKNOWN_21 = 0x00100000, CAST_FLAG_RUNE_LIST = 0x00200000, - CAST_FLAG_UNKNOWN_23 = 0x04000000 + CAST_FLAG_UNKNOWN_23 = 0x00400000, + CAST_FLAG_UNKNOWN_24 = 0x00800000, + CAST_FLAG_UNKNOWN_25 = 0x01000000, + CAST_FLAG_UNKNOWN_26 = 0x02000000, + CAST_FLAG_UNKNOWN_27 = 0x04000000, + CAST_FLAG_UNKNOWN_28 = 0x08000000, + CAST_FLAG_UNKNOWN_29 = 0x10000000, + CAST_FLAG_UNKNOWN_30 = 0x20000000, + CAST_FLAG_UNKNOWN_31 = 0x40000000, + CAST_FLAG_UNKNOWN_32 = 0x80000000, }; enum SpellRangeFlag |