diff --git a/src/game/LFGHandler.cpp b/src/game/LFGHandler.cpp index c44f17c75..1e246fcde 100644 --- a/src/game/LFGHandler.cpp +++ b/src/game/LFGHandler.cpp @@ -335,3 +335,15 @@ void WorldSession::HandleSetLfgOpcode( WorldPacket & recv_data ) SendLfgResult(type, entry, 0); } + +void WorldSession::HandleLfgSetRoles(WorldPacket &recv_data) +{ + CHECK_PACKET_SIZE(recv_data, 1); + + sLog.outDebug("CMSG_LFG_SET_ROLES"); + + uint8 roles; + recv_data >> roles; + + _player->m_lookingForGroup.roles = roles; +} diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp index e6ee585fe..04f87b058 100644 --- a/src/game/Opcodes.cpp +++ b/src/game/Opcodes.cpp @@ -1228,13 +1228,13 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x4AF*/ { "UMSG_UNKNOWN_1199", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4B0*/ { "UMSG_UNKNOWN_1200", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4B1*/ { "UMSG_UNKNOWN_1201", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4B2*/ { "SMSG_UNKNOWN_1202", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4B2*/ { "SMSG_UNKNOWN_1202", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4B3*/ { "UMSG_UNKNOWN_1203", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4B4*/ { "UMSG_UNKNOWN_1204", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4B5*/ { "SMSG_UNKNOWN_1205", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4B5*/ { "SMSG_UNKNOWN_1205", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4B6*/ { "CMSG_UNKNOWN_1206", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4B7*/ { "SMSG_UNKNOWN_1207", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4B8*/ { "CMSG_LFG_SET_ROLES", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4B8*/ { "CMSG_LFG_SET_ROLES", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetRoles }, /*0x4B9*/ { "UMSG_UNKNOWN_1209", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4BA*/ { "CMSG_UNKNOWN_1210", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4BB*/ { "SMSG_UNKNOWN_1211", STATUS_NEVER, &WorldSession::Handle_ServerSide }, @@ -1243,7 +1243,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x4BE*/ { "CMSG_UNKNOWN_1214", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4BF*/ { "SMSG_UNKNOWN_1215", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4C0*/ { "SMSG_UNKNOWN_1216", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4C1*/ { "CMSG_UNKNOWN_1217", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4C1*/ { "CMSG_UNKNOWN_1217", STATUS_LOGGEDIN, &WorldSession::HandleLearnPreviewTalents }, /*0x4C2*/ { "CMSG_UNKNOWN_1218", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4C3*/ { "UMSG_UNKNOWN_1219", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4C4*/ { "UMSG_UNKNOWN_1220", STATUS_NEVER, &WorldSession::Handle_NULL }, diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h index e3da9da80..7b13c358d 100644 --- a/src/game/Opcodes.h +++ b/src/game/Opcodes.h @@ -1215,13 +1215,13 @@ enum Opcodes SMSG_PET_REMOVED_SPELL = 0x49A, CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0x49B, CMSG_HEARTH_AND_RESURRECT = 0x49C, // not changed in 3.1 - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, // ? - SMSG_CRITERIA_DELETED = 0x49E, // ? - SMSG_ACHIEVEMENT_DELETED = 0x49F, // ? - CMSG_SERVER_INFO_QUERY = 0x4A0, // ? - SMSG_SERVER_INFO_RESPONSE = 0x4A1, // ? - CMSG_CHECK_LOGIN_CRITERIA = 0x4A2, // ? - SMSG_SERVER_BUCK_DATA_START = 0x4A3, // ? + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, // not changed 9626 + SMSG_CRITERIA_DELETED = 0x49E, // not changed 9626 + SMSG_ACHIEVEMENT_DELETED = 0x49F, // not changed 9626 + CMSG_SERVER_INFO_QUERY = 0x4A0, // not found + SMSG_SERVER_INFO_RESPONSE = 0x4A1, // not found + CMSG_CHECK_LOGIN_CRITERIA = 0x4A2, // not found + SMSG_SERVER_BUCK_DATA_START = 0x4A3, // not found CMSG_QUERY_VEHICLE_STATUS = 0x4A4, // not found UMSG_UNKNOWN_1189 = 0x4A5, // not found, old SMSG_PET_GUIDS SMSG_UNKNOWN_1190 = 0x4A6, // smsg unk, old SMSG_CLIENTCACHE_VERSION @@ -1248,11 +1248,11 @@ enum Opcodes SMSG_UNKNOWN_1211 = 0x4BB, // SMSG, calendar related SMSG_UNKNOWN_1212 = 0x4BC, // SMSG, equipment manager list? CMSG_UNKNOWN_1213 = 0x4BD, // CMSG, lua: SaveEquipmentSet - CMSG_UNKNOWN_1214 = 0x4BE, // CMSG + CMSG_UNKNOWN_1214 = 0x4BE, // CMSG, missle? SMSG_UNKNOWN_1215 = 0x4BF, // SMSG, uint64, uint8, 3 x float SMSG_UNKNOWN_1216 = 0x4C0, // SMSG, talents related - CMSG_UNKNOWN_1217 = 0x4C1, // CMSG, lua: LearnPreviewTalents - CMSG_UNKNOWN_1218 = 0x4C2, // CMSG, lua: LearnPreviewTalents + CMSG_UNKNOWN_1217 = 0x4C1, // CMSG, lua: LearnPreviewTalents (for player?) + CMSG_UNKNOWN_1218 = 0x4C2, // CMSG, lua: LearnPreviewTalents (for pet?) UMSG_UNKNOWN_1219 = 0x4C3, // not found UMSG_UNKNOWN_1220 = 0x4C4, // not found UMSG_UNKNOWN_1221 = 0x4C5, // not found diff --git a/src/game/Player.h b/src/game/Player.h index e140a93ab..7404fb61c 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -356,6 +356,7 @@ struct LookingForGroup LookingForGroupSlot slots[MAX_LOOKING_FOR_GROUP_SLOT]; LookingForGroupSlot more; std::string comment; + uint8 roles; }; enum PlayerMovementType diff --git a/src/game/SkillHandler.cpp b/src/game/SkillHandler.cpp index 91526c736..f66ac1a47 100644 --- a/src/game/SkillHandler.cpp +++ b/src/game/SkillHandler.cpp @@ -36,6 +36,30 @@ void WorldSession::HandleLearnTalentOpcode( WorldPacket & recv_data ) recv_data >> talent_id >> requested_rank; _player->LearnTalent(talent_id, requested_rank); + _player->SendTalentInfoData(false); +} + +void WorldSession::HandleLearnPreviewTalents(WorldPacket& recvPacket) +{ + sLog.outDebug("CMSG_UNKNOWN_1217"); + + CHECK_PACKET_SIZE(recvPacket, 4); + + uint32 talentsCount; + recvPacket >> talentsCount; + + uint32 talentId, talentRank; + + for(uint32 i = 0; i < talentsCount; ++i) + { + CHECK_PACKET_SIZE(recvPacket, recvPacket.rpos()+4+4); + + recvPacket >> talentId >> talentRank; + + _player->LearnTalent(talentId, talentRank); + } + + _player->SendTalentInfoData(false); } void WorldSession::HandleTalentWipeOpcode( WorldPacket & recv_data ) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 26d649f33..d2aeb433f 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -5373,12 +5373,13 @@ void Spell::EffectApplyGlyph(uint32 i) if(gp->TypeFlags != gs->TypeFlags) { SendCastResult(SPELL_FAILED_INVALID_GLYPH); - return; // glyph slot missmatch + return; // glyph slot mismatch } } player->CastSpell(m_caster, gp->SpellId, true); player->SetGlyph(m_glyphIndex, glyph); + player->SendTalentInfoData(false); } } } diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 59ee0d9cf..4bed0cf74 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -492,6 +492,7 @@ class MANGOS_DLL_SPEC WorldSession void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket); void HandleLearnTalentOpcode(WorldPacket& recvPacket); + void HandleLearnPreviewTalents(WorldPacket& recvPacket); void HandleTalentWipeOpcode(WorldPacket& recvPacket); void HandleUnlearnSkillOpcode(WorldPacket& recvPacket); @@ -598,6 +599,7 @@ class MANGOS_DLL_SPEC WorldSession void HandleLfmSetNoneOpcode(WorldPacket& recv_data); void HandleLfmSetOpcode(WorldPacket& recv_data); void HandleLfgSetCommentOpcode(WorldPacket& recv_data); + void HandleLfgSetRoles(WorldPacket& recv_data); void HandleChooseTitleOpcode(WorldPacket& recv_data); void HandleRealmStateRequestOpcode(WorldPacket& recv_data); void HandleTimeSyncResp(WorldPacket& recv_data);