diff options
| author | Intel <chemicstry@gmail.com> | 2014-12-05 00:33:21 +0200 |
|---|---|---|
| committer | Intel <chemicstry@gmail.com> | 2014-12-05 00:33:21 +0200 |
| commit | 0d21ed3f8682b697f088fa44bd25b53a623f1c3a (patch) | |
| tree | cb2cec2d7bda2fa7ef821d188aed5b3e2f96681f /src/server/game/Spells/Spell.cpp | |
| parent | 60a6a8ba441709a11d548cdc101f86f96ae70915 (diff) | |
Core/Packets: Implemented SMSG_CAST_FAILED and updated SpellCastResult enum
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 72 |
1 files changed, 37 insertions, 35 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a056ca958fd..304852b3176 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3764,17 +3764,18 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas if (result == SPELL_CAST_OK) return; - WorldPacket data(opcode, (4+1+1)); - data << uint8(cast_count); - data << uint32(spellInfo->Id); - data << uint8(result); // problem + WorldPackets::Spells::CastFailed packet(opcode); + packet.CastID = cast_count; + packet.SpellID = spellInfo->Id; + packet.Reason = result; + switch (result) { case SPELL_FAILED_NOT_READY: - data << uint32(0); // unknown (value 1 update cooldowns on client flag) + packet.FailedArg1 = 0; // unknown (value 1 update cooldowns on client flag) break; case SPELL_FAILED_REQUIRES_SPELL_FOCUS: - data << uint32(spellInfo->RequiresSpellFocus); // SpellFocusObject.dbc id + packet.FailedArg1 = spellInfo->RequiresSpellFocus; // SpellFocusObject.dbc id break; case SPELL_FAILED_REQUIRES_AREA: // AreaTable.dbc id // hardcode areas limitation case @@ -3782,71 +3783,71 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas { case 41617: // Cenarion Mana Salve case 41619: // Cenarion Healing Salve - data << uint32(3905); + packet.FailedArg1 = 3905; break; case 41618: // Bottled Nethergon Energy case 41620: // Bottled Nethergon Vapor - data << uint32(3842); + packet.FailedArg1 = 3842; break; case 45373: // Bloodberry Elixir - data << uint32(4075); + packet.FailedArg1 = 4075; break; default: // default case (don't must be) - data << uint32(0); + packet.FailedArg1 = 0; break; } break; case SPELL_FAILED_TOTEMS: if (spellInfo->Totem[0]) - data << uint32(spellInfo->Totem[0]); + packet.FailedArg1 = spellInfo->Totem[0]; if (spellInfo->Totem[1]) - data << uint32(spellInfo->Totem[1]); + packet.FailedArg2 = spellInfo->Totem[1]; break; case SPELL_FAILED_TOTEM_CATEGORY: if (spellInfo->TotemCategory[0]) - data << uint32(spellInfo->TotemCategory[0]); + packet.FailedArg1 = spellInfo->TotemCategory[0]; if (spellInfo->TotemCategory[1]) - data << uint32(spellInfo->TotemCategory[1]); + packet.FailedArg2 = spellInfo->TotemCategory[1]; break; case SPELL_FAILED_EQUIPPED_ITEM_CLASS: case SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND: case SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND: - data << uint32(spellInfo->EquippedItemClass); - data << uint32(spellInfo->EquippedItemSubClassMask); + packet.FailedArg1 = spellInfo->EquippedItemClass; + packet.FailedArg2 = spellInfo->EquippedItemSubClassMask; break; case SPELL_FAILED_TOO_MANY_OF_ITEM: { - uint32 item = 0; - for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(caster->GetMap()->GetDifficulty())) - if (effect->ItemType) - item = effect->ItemType; - ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item); - if (proto && proto->ItemLimitCategory) - data << uint32(proto->ItemLimitCategory); - break; + uint32 item = 0; + for (SpellEffectInfo const* effect : spellInfo->GetEffectsForDifficulty(caster->GetMap()->GetDifficulty())) + if (effect->ItemType) + item = effect->ItemType; + ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item); + if (proto && proto->ItemLimitCategory) + packet.FailedArg1 = proto->ItemLimitCategory; + break; } case SPELL_FAILED_PREVENTED_BY_MECHANIC: - data << uint32(spellInfo->GetAllEffectsMechanicMask()); // SpellMechanic.dbc id + packet.FailedArg1 = spellInfo->GetAllEffectsMechanicMask(); // SpellMechanic.dbc id break; case SPELL_FAILED_NEED_EXOTIC_AMMO: - data << uint32(spellInfo->EquippedItemSubClassMask); // seems correct... + packet.FailedArg1 = spellInfo->EquippedItemSubClassMask; // seems correct... break; case SPELL_FAILED_NEED_MORE_ITEMS: - data << uint32(0); // Item id - data << uint32(0); // Item count? + packet.FailedArg1 = 0; // Item id + packet.FailedArg2 = 0; // Item count? break; case SPELL_FAILED_MIN_SKILL: - data << uint32(0); // SkillLine.dbc id - data << uint32(0); // required skill value + packet.FailedArg1 = 0; // SkillLine.dbc id + packet.FailedArg2 = 0; // required skill value break; case SPELL_FAILED_FISHING_TOO_LOW: - data << uint32(0); // required fishing skill + packet.FailedArg1 = 0; // required fishing skill break; case SPELL_FAILED_CUSTOM_ERROR: - data << uint32(customError); + packet.FailedArg1 = customError; break; case SPELL_FAILED_SILENCED: - data << uint32(0); // Unknown + packet.FailedArg1 = 0; // Unknown break; case SPELL_FAILED_REAGENTS: { @@ -3866,14 +3867,15 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas } } - data << uint32(missingItem); // first missing item + packet.FailedArg1 = missingItem; // first missing item break; } // TODO: SPELL_FAILED_NOT_STANDING default: break; } - caster->GetSession()->SendPacket(&data); + + caster->GetSession()->SendPacket(packet.Write()); } void Spell::SendSpellStart() |
