void WorldSession::HandleBlackMarketHelloOpcode(WorldPacket& recvData) { ObjectGuid guid; guid[4] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[2] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[5]); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[2]); uint64 npcGuid = uint64(guid); Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(npcGuid, UNIT_NPC_FLAG_BLACKMARKET); if (!unit) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_BLACKMARKET_HELLO - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(npcGuid))); return; } if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); SendBlackMarketHello(npcGuid); }
void WorldSession::HandleSpiritHealerActivateOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: CMSG_SPIRIT_HEALER_ACTIVATE"); ObjectGuid UnitGUID; UnitGUID[2] = recvData.ReadBit(); UnitGUID[7] = recvData.ReadBit(); UnitGUID[6] = recvData.ReadBit(); UnitGUID[0] = recvData.ReadBit(); UnitGUID[5] = recvData.ReadBit(); UnitGUID[4] = recvData.ReadBit(); UnitGUID[1] = recvData.ReadBit(); UnitGUID[3] = recvData.ReadBit(); recvData.ReadByteSeq(UnitGUID[1]); recvData.ReadByteSeq(UnitGUID[5]); recvData.ReadByteSeq(UnitGUID[6]); recvData.ReadByteSeq(UnitGUID[3]); recvData.ReadByteSeq(UnitGUID[2]); recvData.ReadByteSeq(UnitGUID[0]); recvData.ReadByteSeq(UnitGUID[7]); recvData.ReadByteSeq(UnitGUID[4]); Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(UnitGUID, UNIT_NPC_FLAG_SPIRITHEALER); if (!unit) { TC_LOG_DEBUG("network", "WORLD: HandleSpiritHealerActivateOpcode - Unit (GUID: %u) not found or you can not interact with him.", uint32(GUID_LOPART(UnitGUID))); return; } // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); SendSpiritResurrect(); }
void WorldSession::HandleLfgLeaveOpcode(WorldPacket& recvData) { ObjectGuid leaveGuid; Group* group = GetPlayer()->GetGroup(); uint64 guid = GetPlayer()->GetGUID(); uint64 gguid = group ? group->GetGUID() : guid; recvData.read_skip<uint32>(); // Always 8 recvData.read_skip<uint32>(); // Join date recvData.read_skip<uint32>(); // Always 3 recvData.read_skip<uint32>(); // Queue Id leaveGuid[4] = recvData.ReadBit(); leaveGuid[5] = recvData.ReadBit(); leaveGuid[0] = recvData.ReadBit(); leaveGuid[6] = recvData.ReadBit(); leaveGuid[2] = recvData.ReadBit(); leaveGuid[7] = recvData.ReadBit(); leaveGuid[1] = recvData.ReadBit(); leaveGuid[3] = recvData.ReadBit(); recvData.ReadByteSeq(leaveGuid[7]); recvData.ReadByteSeq(leaveGuid[4]); recvData.ReadByteSeq(leaveGuid[3]); recvData.ReadByteSeq(leaveGuid[2]); recvData.ReadByteSeq(leaveGuid[6]); recvData.ReadByteSeq(leaveGuid[0]); recvData.ReadByteSeq(leaveGuid[1]); recvData.ReadByteSeq(leaveGuid[5]); TC_LOG_DEBUG("lfg", "CMSG_LFG_LEAVE %s in group: %u sent guid " UI64FMTD ".", GetPlayerInfo().c_str(), group ? 1 : 0, uint64(leaveGuid)); // Check cheating - only leader can leave the queue if (!group || group->GetLeaderGUID() == guid) sLFGMgr->LeaveLfg(gguid); }
void WorldSession::HandleBankerActivateOpcode(WorldPacket& recvData) { ObjectGuid guid; TC_LOG_DEBUG("network", "WORLD: Received CMSG_BANKER_ACTIVATE"); guid[4] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[2] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[5]); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[4]); Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_BANKER); if (!unit) { TC_LOG_DEBUG("network", "WORLD: HandleBankerActivateOpcode - Unit (GUID: %u) not found or you can not interact with him.", uint32(GUID_LOPART(guid))); return; } // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); SendShowBank(guid); }
void WorldSession::HandleRepairItemOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: CMSG_REPAIR_ITEM"); ObjectGuid npcGuid, itemGuid; bool guildBank; // new in 2.3.2, bool that means from guild bank money recvData.ReadGuidMask(itemGuid, 2, 5); npcGuid[3] = recvData.ReadBit(); guildBank = recvData.ReadBit(); npcGuid[7] = recvData.ReadBit(); itemGuid[4] = recvData.ReadBit(); npcGuid[2] = recvData.ReadBit(); recvData.ReadGuidMask(itemGuid, 0, 3); recvData.ReadGuidMask(npcGuid, 6, 1, 4); itemGuid[6] = recvData.ReadBit(); recvData.ReadGuidMask(npcGuid, 5, 0); recvData.ReadGuidMask(itemGuid, 7, 1); recvData.ReadByteSeq(itemGuid[2]); recvData.ReadByteSeq(npcGuid[1]); recvData.ReadByteSeq(itemGuid[1]); recvData.ReadGuidBytes(npcGuid, 4, 7, 3, 2); recvData.ReadByteSeq(itemGuid[7]); recvData.ReadGuidBytes(npcGuid, 5, 0); recvData.ReadGuidBytes(itemGuid, 5, 3, 4, 6); recvData.ReadByteSeq(npcGuid[6]); recvData.ReadByteSeq(itemGuid[0]); Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(npcGuid, UNIT_NPC_FLAG_REPAIR); if (!unit) { TC_LOG_DEBUG("network", "WORLD: HandleRepairItemOpcode - Unit (GUID: %u) not found or you can not interact with him.", uint32(GUID_LOPART(npcGuid))); return; } // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); // reputation discount float discountMod = _player->GetReputationPriceDiscount(unit); if (itemGuid) { TC_LOG_DEBUG("network", "ITEM: Repair item, itemGUID = %u, npcGUID = %u", GUID_LOPART(itemGuid), GUID_LOPART(npcGuid)); Item* item = _player->GetItemByGuid(itemGuid); if (item) _player->DurabilityRepair(item->GetPos(), true, discountMod, guildBank); } else { TC_LOG_DEBUG("network", "ITEM: Repair all items, npcGUID = %u", GUID_LOPART(npcGuid)); _player->DurabilityRepairAll(true, discountMod, guildBank); } }
//void called when player click on black market npc void WorldSession::HandleBlackMarketHello(WorldPacket& recvData) { ObjectGuid guid; guid[4] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[2] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[5]); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[1]); uint64 npcGuid = uint64(guid); Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(npcGuid, UNIT_NPC_FLAG_BLACK_MARKET); if (!unit) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleBlackMarketHello - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(npcGuid))); return; } // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); SendBlackMarketHello(npcGuid); }
void WorldSession::HandleGuildSetNoteOpcode(WorldPacket& recvPacket) { DEBUG_LOG("WORLD: Received opcode CMSG_GUILD_SET_NOTE"); bool officer; uint32 noteLen; std::string name, note; ObjectGuid targetGuid; recvPacket.ReadGuidMask<1, 4, 5, 3, 0, 7>(targetGuid); officer = !recvPacket.ReadBit(); recvPacket.ReadGuidMask<6>(targetGuid); noteLen = recvPacket.ReadBits(8); recvPacket.ReadGuidMask<2>(targetGuid); recvPacket.ReadGuidBytes<4, 5, 0, 3, 1, 6, 7>(targetGuid); note = recvPacket.ReadString(noteLen); recvPacket.ReadGuidBytes<2>(targetGuid); Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId()); if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } if (!guild->HasRankRight(GetPlayer()->GetRank(), officer ? GR_RIGHT_EOFFNOTE : GR_RIGHT_EPNOTE)) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } if (!sObjectMgr.GetPlayerNameByGUID(targetGuid, name)) return; MemberSlot* slot = guild->GetMemberSlot(targetGuid); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, name, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } if (officer) slot->SetOFFNOTE(note); else slot->SetPNOTE(note); guild->Roster(this); }
void WorldSession::HandleTrainerListOpcode(WorldPacket& recvData) { ObjectGuid guid; guid[0] = recvData.ReadBit(); guid[2] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[4] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[5]); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[4]); SendTrainerList(guid); }
//Send by client on clicking in accept or refuse of invitation windows for join game void WorldSession::HandleBfEntryInviteResponse(WorldPacket& recvData) { uint8 accepted; ObjectGuid guid; guid[6] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); accepted = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[2] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[4] = recvData.ReadBit(); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[5]); TC_LOG_ERROR(LOG_FILTER_GENERAL, "HandleBattlefieldInviteResponse: GUID:"UI64FMTD" Accepted:%u", (uint64)guid, accepted); Battlefield* bf = sBattlefieldMgr->GetBattlefieldByGUID(guid); if (!bf) return; if (accepted) bf->PlayerAcceptInviteToWar(_player); else if (_player->GetZoneId() == bf->GetZoneId()) bf->KickPlayerFromBattlefield(_player->GetGUID()); }
void WorldSession::HandleBlackMarketRequestItemOpcode(WorldPacket& recvData) { ObjectGuid guid; uint32 Timestamp; recvData >> Timestamp; guid[2] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[4] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[3]); recvData.ReadByteSeq(guid[5]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[0]); uint64 NpcGuid = uint64(guid); Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(NpcGuid, UNIT_NPC_FLAG_BLACKMARKET); if (!unit) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_BLACKMARKET_REQUEST_ITEMS - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(NpcGuid))); return; } SendBlackMarketRequestItemsResult(); }
void WorldSession::HandleGuildSwitchRank(WorldPacket& recvPacket) { uint32 rank; bool direction; // if its true, then the rank rises, if no, it goes down recvPacket >> rank; direction = recvPacket.ReadBit(); Guild* pGuild = GetPlayer()->GetGuild(); // if(pGuild) // { // pGuild->MoveRank(rank,direction); // } }
void WorldSession::HandleDuelResponseOpcode(WorldPacket& recvPacket) { bool accepted; ObjectGuid guid; Player* player; Player* plTarget; recvPacket >> guid; accepted = recvPacket.ReadBit(); if (!GetPlayer()->duel) // ignore accept from duel-sender return; if (accepted) { player = GetPlayer(); plTarget = player->duel->opponent; if (player == player->duel->initiator || !plTarget || player == plTarget || player->duel->startTime != 0 || plTarget->duel->startTime != 0) return; //TC_LOG_DEBUG("network", "WORLD: Received CMSG_DUEL_ACCEPTED"); TC_LOG_DEBUG("network", "Player 1 is: %u (%s)", player->GetGUIDLow(), player->GetName().c_str()); TC_LOG_DEBUG("network", "Player 2 is: %u (%s)", plTarget->GetGUIDLow(), plTarget->GetName().c_str()); time_t now = time(NULL); player->duel->startTimer = now; plTarget->duel->startTimer = now; player->SendDuelCountdown(3000); plTarget->SendDuelCountdown(3000); } else { // player surrendered in a duel using /forfeit if (GetPlayer()->duel->startTime != 0) { GetPlayer()->CombatStopWithPets(true); if (GetPlayer()->duel->opponent) GetPlayer()->duel->opponent->CombatStopWithPets(true); GetPlayer()->CastSpell(GetPlayer(), 7267, true); // beg GetPlayer()->DuelComplete(DUEL_WON); return; } GetPlayer()->DuelComplete(DUEL_INTERRUPTED); } }
void WorldSession::HandleGroupEveryoneIsAssistantOpcode(WorldPacket& recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_SET_EVERYONE_IS_ASSISTANT"); Group* group = GetPlayer()->GetGroup(); if (!group) return; if (!group->IsLeader(GetPlayer()->GetGUID())) return; recvData.read_skip<uint8>(); bool apply = recvData.ReadBit(); recvData.FlushBits(); group->ChangeFlagEveryoneAssistant(apply); }
void WorldSession::HandlePartyAssignmentOpcode(WorldPacket& recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GROUP_ASSIGNMENT"); Group* group = GetPlayer()->GetGroup(); if (!group) return; uint64 senderGuid = GetPlayer()->GetGUID(); if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid) && !(group->GetGroupType() & GROUPTYPE_EVERYONE_IS_ASSISTANT)) return; uint8 assignment; bool apply; ObjectGuid guid; recvData >> assignment; recvData.read_skip<uint8>(); // Unknown. guid[0] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[2] = recvData.ReadBit(); apply = recvData.ReadBit(); guid[4] = recvData.ReadBit(); recvData.FlushBits(); uint8 byteOrder[8] = { 4, 3, 1, 5, 2, 6, 7, 0 }; recvData.ReadBytesSeq(guid, byteOrder); switch (assignment) { case GROUP_ASSIGN_MAINASSIST: group->RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINASSIST); group->SetGroupMemberFlag(guid, apply, MEMBER_FLAG_MAINASSIST); break; case GROUP_ASSIGN_MAINTANK: group->RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINTANK); // Remove main assist flag from current if any. group->SetGroupMemberFlag(guid, apply, MEMBER_FLAG_MAINTANK); break; default: break; } group->SendUpdate(); }
void WorldSession::HandleLfgJoinOpcode(WorldPacket& recvData) { if (!sLFGMgr->isOptionEnabled(lfg::LFG_OPTION_ENABLE_DUNGEON_FINDER | lfg::LFG_OPTION_ENABLE_RAID_BROWSER) || (GetPlayer()->GetGroup() && GetPlayer()->GetGroup()->GetLeaderGUID() != GetPlayer()->GetGUID() && (GetPlayer()->GetGroup()->GetMembersCount() == MAXGROUPSIZE || !GetPlayer()->GetGroup()->isLFGGroup()))) { recvData.rfinish(); return; } uint32 roles; uint32 numDungeons; bool QueueAsGroup; uint8 PartyIndex; QueueAsGroup = recvData.ReadBit(); uint32 commentLen = recvData.ReadBits(8); recvData >> PartyIndex; recvData >> roles; for (int32 i = 0; i < 3; ++i) recvData.read_skip<uint32>(); // Needs recvData >> numDungeons; std::string comment = recvData.ReadString(commentLen); if (!numDungeons) { TC_LOG_DEBUG("lfg", "CMSG_LFG_JOIN %s no dungeons selected", GetPlayerInfo().c_str()); recvData.rfinish(); return; } lfg::LfgDungeonSet newDungeons; for (uint32 i = 0; i < numDungeons; ++i) { uint32 dungeon; recvData >> dungeon; newDungeons.insert((dungeon & 0x00FFFFFF)); // remove the type from the dungeon entry } TC_LOG_DEBUG("lfg", "CMSG_LFG_JOIN %s roles: %u, Dungeons: %u, Comment: %s", GetPlayerInfo().c_str(), roles, uint8(newDungeons.size()), comment.c_str()); sLFGMgr->JoinLfg(GetPlayer(), uint8(roles), newDungeons, comment); }
void WorldSession::HandleOptOutOfLootOpcode(WorldPacket& recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_OPT_OUT_OF_LOOT"); bool passOnLoot = recvData.ReadBit(); recvData.FlushBits(); // ignore if player not loaded if (!GetPlayer()) // needed because STATUS_AUTHED { if (passOnLoot) sLog->outError(LOG_FILTER_NETWORKIO, "CMSG_OPT_OUT_OF_LOOT value<>0 for not-loaded character!"); return; } GetPlayer()->SetPassOnGroupLoot(passOnLoot); }
void WorldSession::HandleEveryoneAssistantOpcode(WorldPacket& recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_SET_EVERYONE_IS_ASSISTANT "); Group* group = GetPlayer()->GetGroup(); if (!group) return; uint64 senderGuid = GetPlayer()->GetGUID(); if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid)) return; bool active = recvData.ReadBit(); group->SetEveryoneAssistant(group, active); group->SendUpdate(); }
void WorldSession::HandleSetSheathedOpcode(WorldPacket& recvData) { uint32 sheathed; bool unk; recvData >> sheathed; unk = recvData.ReadBit(); //sLog->outDebug(LOG_FILTER_PACKETIO, "WORLD: Recvd CMSG_SETSHEATHED Message guidlow:%u value1:%u", GetPlayer()->GetGUIDLow(), sheathed); if (sheathed >= MAX_SHEATH_STATE) { sLog->outError(LOG_FILTER_NETWORKIO, "Unknown sheath state %u ??", sheathed); return; } GetPlayer()->SetSheath(SheathState(sheathed)); }
//Send by client when he click on accept for queue void WorldSession::HandleBfQueueInviteResponse(WorldPacket & recvData) { uint8 accepted; ObjectGuid guid; recvData.ReadBitSeq<4, 7, 6, 1, 2, 5, 0, 3>(guid); accepted = recvData.ReadBit(); recvData.ReadByteSeq<6, 4, 0, 1, 5, 7, 3, 2>(guid); TC_LOG_ERROR("misc", "HandleQueueInviteResponse: GUID:" UI64FMTD " Accepted:%u", (uint64)guid, accepted); if (!accepted) return; Battlefield* bf = sBattlefieldMgr->GetBattlefieldByGUID(guid); if (!bf) return; bf->PlayerAcceptInviteToQueue(_player); }
void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) { uint32 channelId; uint32 channelLength, passLength; std::string channelName, password; recvPacket >> channelId; uint8 unknown1 = recvPacket.ReadBit(); // unknowns uint8 unknown2 = recvPacket.ReadBit(); channelLength = recvPacket.ReadBits(8); passLength = recvPacket.ReadBits(8); channelName = recvPacket.ReadString(channelLength); password = recvPacket.ReadString(passLength); TC_LOG_DEBUG("chat.system", "CMSG_JOIN_CHANNEL %s Channel: %u, unk1: %u, unk2: %u, channel: %s, password: %s", GetPlayerInfo().c_str(), channelId, unknown1, unknown2, channelName.c_str(), password.c_str()); if (channelId) { ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(channelId); if (!channel) return; AreaTableEntry const* zone = GetAreaEntryByAreaID(GetPlayer()->GetZoneId()); if (!zone || !GetPlayer()->CanJoinConstantChannelInZone(channel, zone)) return; } if (channelName.empty()) return; if (isdigit(channelName[0])) return; if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) { cMgr->setTeam(GetPlayer()->GetTeam()); if (Channel* channel = cMgr->GetJoinChannel(channelName, channelId)) channel->JoinChannel(GetPlayer(), password); } }
void WorldSession::HandeSetEveryoneIsAssistant(WorldPacket& recv_data) { bool apply = recv_data.ReadBit(); DEBUG_LOG("WORLD: Received CMSG_SET_EVERYONE_IS_ASSISTANT from %s (%u) apply: %u", GetPlayerName(), GetAccountId(), apply ? 1 : 0); Group* group = _player->GetGroup(); if (!group || !group->isRaidGroup()) // Only raid groups may have assistant return; /** error handling **/ if (!group->IsLeader(_player->GetObjectGuid())) return; /********************/ for (Group::member_citerator itr = group->GetMemberSlots().begin(); itr != group->GetMemberSlots().end(); ++itr) group->SetGroupUniqueFlag(itr->guid, GROUP_ASSIGN_ASSISTANT, apply, false); group->SendUpdate(); }
void WorldSession::HandleSetSheathedOpcode(WorldPacket& recvData) { uint32 sheathed; bool hasData = false; recvData >> sheathed; hasData = recvData.ReadBit(); //TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_SET_SHEATHED Message guidlow:%u value1:%u", GetPlayer()->GetGUIDLow(), sheathed); if (hasData) { if (sheathed >= MAX_SHEATH_STATE) { TC_LOG_ERROR("network", "Unknown sheath state %u ??", sheathed); return; } GetPlayer()->SetSheath(SheathState(sheathed)); } }
void WorldSession::HandleLfgProposalResultOpcode(WorldPacket& recvData) { uint32 proposalID; // Proposal ID uint32 Id, Type, joinTime; uint64 InstanceID; bool accept; ObjectGuid RequesterGuid; ObjectGuid guid2; sLFGMgr->ReadRideTicket(recvData, RequesterGuid, Id, Type, joinTime); // UserClientDFProposalResponse recvData >> InstanceID; recvData >> proposalID; accept = recvData.ReadBit(); TC_LOG_DEBUG("lfg", "CMSG_LFG_PROPOSAL_RESULT %s proposal: %u accept: %u", GetPlayerInfo().c_str(), proposalID, accept ? 1 : 0); sLFGMgr->UpdateProposal(proposalID, GetPlayer()->GetGUID128(), accept); }
// Sent any time a guild master sets an option in the interface and when listing / unlisting his guild void WorldSession::HandleGuildFinderSetGuildPost(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_LF_GUILD_SET_GUILD_POST"); uint32 classRoles = 0; uint32 availability = 0; uint32 guildInterests = 0; uint32 level = 0; recvPacket >> guildInterests >> availability >> level >> classRoles; bool listed = recvPacket.ReadBit(); // Level sent is zero if untouched, force to any (from interface). Idk why if (!level) level = ANY_FINDER_LEVEL; uint16 length = recvPacket.ReadBits(11); std::string comment = recvPacket.ReadString(length); if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) return; if (!(availability & ALL_WEEK) || availability > ALL_WEEK) return; if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) return; if (!(level & ALL_GUILDFINDER_LEVELS) || level > ALL_GUILDFINDER_LEVELS) return; Player* player = GetPlayer(); if (!player->GetGuildId()) // Player must be in guild return; if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) // Player must be guild master if (guild->GetLeaderGUID() != player->GetGUID()) return; LFGuildSettings settings(listed, player->GetTeamId(), player->GetGuildId(), classRoles, availability, guildInterests, level, comment); sGuildFinderMgr->SetGuildSettings(player->GetGuildId(), settings); }
void WorldSession::HandleSetActiveMoverOpcode(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_SET_ACTIVE_MOVER"); ObjectGuid guid; recvPacket.ReadBit(); //unk uint8 bitsOrder[8] = { 1, 3, 2, 6, 7, 5, 4, 0 }; recvPacket.ReadBitInOrder(guid, bitsOrder); recvPacket.FlushBits(); uint8 bytesOrder[8] = { 5, 1, 7, 2, 6, 3, 4, 0 }; recvPacket.ReadBytesSeq(guid, bytesOrder); /*if (GetPlayer()->IsInWorld()) { if (_player->m_mover->GetGUID() != guid) sLog->outError(LOG_FILTER_NETWORKIO, "HandleSetActiveMoverOpcode: incorrect mover guid: mover is " UI64FMTD " (%s - Entry: %u) and should be " UI64FMTD, uint64(guid), GetLogNameForGuid(guid), GUID_ENPART(guid), _player->m_mover->GetGUID()); }*/ }
void WorldSession::HandleDuelAcceptedOpcode(WorldPacket& recvPacket) { ObjectGuid guid; uint8 response; Player* player; Player* plTarget; guid[5] = recvPacket.ReadBit(); guid[0] = recvPacket.ReadBit(); guid[1] = recvPacket.ReadBit(); guid[7] = recvPacket.ReadBit(); guid[6] = recvPacket.ReadBit(); response = recvPacket.ReadBit(); guid[3] = recvPacket.ReadBit(); guid[2] = recvPacket.ReadBit(); guid[4] = recvPacket.ReadBit(); recvPacket.ReadByteSeq(guid[4]); recvPacket.ReadByteSeq(guid[6]); recvPacket.ReadByteSeq(guid[0]); recvPacket.ReadByteSeq(guid[3]); recvPacket.ReadByteSeq(guid[5]); recvPacket.ReadByteSeq(guid[1]); recvPacket.ReadByteSeq(guid[2]); recvPacket.ReadByteSeq(guid[7]); if (!GetPlayer()->duel) // ignore accept from duel-sender return; player = GetPlayer(); plTarget = player->duel->opponent; if (player == player->duel->initiator || !plTarget || player == plTarget || player->duel->startTime != 0 || plTarget->duel->startTime != 0) return; //sLog->outDebug(LOG_FILTER_PACKETIO, "WORLD: Received CMSG_DUEL_ACCEPTED"); sLog->outDebug(LOG_FILTER_NETWORKIO, "Player 1 is: %u (%s)", player->GetGUIDLow(), player->GetName().c_str()); sLog->outDebug(LOG_FILTER_NETWORKIO, "Player 2 is: %u (%s)", plTarget->GetGUIDLow(), plTarget->GetName().c_str()); time_t now = time(NULL); player->duel->startTimer = now; plTarget->duel->startTimer = now; player->SendDuelCountdown(3000); plTarget->SendDuelCountdown(3000); // Maybe combine HandleDuelCancelledOpcode and HandleDuelAcceptedOpcode with }else{ statement?? }
//called when mail is read void WorldSession::HandleMailMarkAsRead(WorldPacket& recvData) { ObjectGuid mailbox; uint32 mailId; recvData >> mailId; recvData >> mailbox; recvData.ReadBit(); if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX)) return; if (Mail* mail = _player->GetMail(mailId)) { if (_player->unReadMails) --_player->unReadMails; mail->checked |= MAIL_CHECK_MASK_READ; mail->state = MAIL_STATE_CHANGED; _player->m_mailsUpdated = true; } }
//Send by client on clicking in accept or refuse of invitation windows for join game void WorldSession::HandleBfEntryInviteResponse(WorldPacket & recvData) { uint8 accepted; ObjectGuid guid; recvData.ReadBitSeq<1, 3, 7, 6, 4, 2>(guid); accepted = recvData.ReadBit(); recvData.ReadBitSeq<5, 0>(guid); recvData.ReadByteSeq<3, 2, 4, 0, 5, 7, 6, 1>(guid); TC_LOG_ERROR("misc", "HandleBattlefieldInviteResponse: GUID:" UI64FMTD " Accepted:%u", uint64(guid), accepted); Battlefield* bf = sBattlefieldMgr->GetBattlefieldByGUID(guid); if (!bf) return; if (accepted) bf->PlayerAcceptInviteToWar(_player); else if (_player->GetZoneId() == bf->GetZoneId()) bf->KickPlayerFromBattlefield(_player->GetGUID()); }
void WorldSession::HandleJoinChannelOpcode(WorldPacket& recvPacket) { DEBUG_LOG("WORLD: Received opcode %s (%u, 0x%X)", recvPacket.GetOpcodeName(), recvPacket.GetOpcode(), recvPacket.GetOpcode()); uint32 channel_id; std::string channelname, pass; recvPacket >> channel_id; recvPacket.ReadBit(); // has voice recvPacket.ReadBit(); // zone update uint8 channelLength = recvPacket.ReadBits(8); uint8 passwordLength = recvPacket.ReadBits(8); channelname = recvPacket.ReadString(channelLength); pass = recvPacket.ReadString(passwordLength); if (channelname.empty()) return; if (ChannelMgr* cMgr = channelMgr(_player->GetTeam())) if (Channel* chn = cMgr->GetJoinChannel(channelname, channel_id)) // channel id seems to be useless but must be checked for LFG chn->Join(_player->GetObjectGuid(), pass.c_str()); }
void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket) { time_t now = time(NULL); if (now - timeLastGuildInviteCommand < 5) return; else timeLastGuildInviteCommand = now; sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_INVITE"); uint32 nameLength = recvPacket.ReadBits(8); bool pair = recvPacket.ReadBit(); if (pair) nameLength++; recvPacket.FlushBits(); std::string invitedName = recvPacket.ReadString(nameLength); if (normalizePlayerName(invitedName)) if (Guild* guild = _GetPlayerGuild(this, true)) guild->HandleInviteMember(this, invitedName); }