void WorldSession::HandleLfgGetStatus(WorldPacket& /*recvData*/) { TC_LOG_DEBUG("lfg", "CMSG_LFG_GET_STATUS %s", GetPlayerInfo().c_str()); uint64 guid = GetPlayer()->GetGUID(); lfg::LfgUpdateData updateData = sLFGMgr->GetLfgStatus(guid); if (GetPlayer()->GetGroup()) { SendLfgUpdateParty(updateData); updateData.dungeons.clear(); SendLfgUpdatePlayer(updateData); } else { SendLfgUpdatePlayer(updateData); updateData.dungeons.clear(); SendLfgUpdateParty(updateData); } }
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); } }
int CPlayer::GetLifeState() { if (lifestate_offset == -1) { if (!g_pGameConf->GetOffset("m_lifeState", &lifestate_offset)) { lifestate_offset = -2; } } if (lifestate_offset < 0) { IPlayerInfo *info = GetPlayerInfo(); if (info == NULL) { return PLAYER_LIFE_UNKNOWN; } return info->IsDead() ? PLAYER_LIFE_DEAD : PLAYER_LIFE_ALIVE; } if (m_pEdict == NULL) { return PLAYER_LIFE_UNKNOWN; } CBaseEntity *pEntity; IServerUnknown *pUnknown = m_pEdict->GetUnknown(); if (pUnknown == NULL || (pEntity = pUnknown->GetBaseEntity()) == NULL) { return PLAYER_LIFE_UNKNOWN; } if (*((uint8_t *)pEntity + lifestate_offset) == LIFE_ALIVE) { return PLAYER_LIFE_ALIVE; } else { return PLAYER_LIFE_DEAD; } }
void WorldSession::SendLfgQueueStatus(lfg::LfgQueueStatusData const& queueData) { TC_LOG_DEBUG("lfg", "SMSG_LFG_QUEUE_STATUS %s dungeon: %u, waitTime: %d, " "avgWaitTime: %d, waitTimeTanks: %d, waitTimeHealer: %d, waitTimeDps: %d, " "queuedTime: %u, tanks: %u, healers: %u, dps: %u", GetPlayerInfo().c_str(), queueData.dungeonId, queueData.waitTime, queueData.waitTimeAvg, queueData.waitTimeTank, queueData.waitTimeHealer, queueData.waitTimeDps, queueData.queuedTime, queueData.tanks, queueData.healers, queueData.dps); ObjectGuid RequesterGuid = _player->GetGUID128(); WorldPacket data(SMSG_LFG_QUEUE_STATUS, 500); // We guess size sLFGMgr->BuildRideTicket(data, RequesterGuid, 0, 0, 0); data << uint32(queueData.subType); data << uint32(queueData.reason); for (auto i = 0; i < QUEUE_NEEDS; i++) data << uint32(queueData.needs); data << uint32(queueData.slotsCount); data << uint32(queueData.requestedRoles); data << uint32(queueData.SuspendedPlayersCount); for (uint32 i = 0; i < queueData.slotsCount; i++) data << uint32(queueData.slots); for (uint32 i = 0; i < queueData.SuspendedPlayersCount; i++) data << ObjectGuid(queueData.suspendedPlayers); data.WriteBit(queueData.IsParty); data.WriteBit(queueData.Notify); data.WriteBit(queueData.Joined); data.WriteBit(queueData.LfgJoined); data.WriteBit(queueData.Queued); data.WriteBits(0, 8); data.WriteString(queueData.Comment); SendPacket(&data); }
void WorldSession::HandleChannelBan(WorldPacket& recvPacket) { uint32 channelLength, nameLength; std::string channelName, targetName; channelLength = recvPacket.ReadBits(8); nameLength = recvPacket.ReadBits(7); targetName = recvPacket.ReadString(nameLength); channelName = recvPacket.ReadString(channelLength); sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_BAN %s Channel: %s, Target: %s", GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); if (!normalizePlayerName(targetName)) return; if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Ban(GetPlayer(), targetName); }
void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket) { uint32 unk; std::string channelName; recvPacket >> unk; // channel id? uint32 length = recvPacket.ReadBits(8); channelName = recvPacket.ReadString(length); sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_LEAVE_CHANNEL %s Channel: %s, unk1: %u", GetPlayerInfo().c_str(), channelName.c_str(), unk); if (channelName.empty()) return; if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) { if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->LeaveChannel(GetPlayer(), true); cMgr->LeftChannel(channelName); } }
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); }
// Called when clicking on Guild bank gameobject void WorldSession::HandleGuildBankerActivate(WorldPacket& recvPacket) { ObjectGuid guid; bool sendAllSlots; recvPacket >> guid >> sendAllSlots; TC_LOG_DEBUG("guild", "CMSG_GUILD_BANKER_ACTIVATE [%s]: [%s] AllSlots: %u" , GetPlayerInfo().c_str(), guid.ToString().c_str(), sendAllSlots); GameObject const* const go = GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK); if (!go) return; Guild* const guild = GetPlayer()->GetGuild(); if (!guild) { Guild::SendCommandResult(this, GUILD_COMMAND_VIEW_TAB, ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } guild->SendBankList(this, 0, true, true); }
void WorldSession::HandleLfgGetStatus(WorldPacket& /*recvData*/) { #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outDebug(LOG_FILTER_LFG, "CMSG_LFG_GET_STATUS %s", GetPlayerInfo().c_str()); #endif uint64 guid = GetPlayer()->GetGUID(); lfg::LfgUpdateData updateData = sLFGMgr->GetLfgStatus(guid); if (GetPlayer()->GetGroup()) { SendLfgUpdateParty(updateData); updateData.dungeons.clear(); SendLfgUpdatePlayer(updateData); } else { SendLfgUpdatePlayer(updateData); updateData.dungeons.clear(); SendLfgUpdateParty(updateData); } }
void WorldSession::SendLfgBootProposalUpdate(lfg::LfgPlayerBoot const& boot) { ObjectGuid guid = GetPlayer()->GetGUID(); lfg::LfgAnswer playerVote = boot.votes.find(guid)->second; uint8 votesNum = 0; uint8 agreeNum = 0; uint32 secsleft = uint8((boot.cancelTime - time(NULL)) / 1000); for (auto it : boot.votes) { if (it.second != lfg::LFG_ANSWER_PENDING) { ++votesNum; if (it.second == lfg::LFG_ANSWER_AGREE) ++agreeNum; } } TC_LOG_DEBUG("lfg", "SMSG_LFG_BOOT_PROPOSAL_UPDATE %s inProgress: %u - " "didVote: %u - agree: %u - victim: %u votes: %u - agrees: %u - left: %u - " "needed: %u - reason %s", GetPlayerInfo().c_str(), uint8(boot.inProgress), uint8(playerVote != lfg::LFG_ANSWER_PENDING), uint8(playerVote == lfg::LFG_ANSWER_AGREE), GUID_LOPART(boot.victim), votesNum, agreeNum, secsleft, lfg::LFG_GROUP_KICK_VOTES_NEEDED, boot.reason.c_str()); WorldPacket data(SMSG_LFG_BOOT_PROPOSAL_UPDATE, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + boot.reason.length()); data.WriteBit(boot.inProgress); // VoteInProgress data.WriteBit(boot.VotePassed); // VotePassed data.WriteBit(boot.MyVoteComplete); // MyVoteComplete data.WriteBit(boot.MyVote); // MyVote data.WriteBits(0, 8); // ReasonLen data << ObjectGuid(boot.victim); // VictimGUID data << uint32(boot.TotalVotes); // TotalVotes data << uint32(boot.BootVotes); // BootVotes data << uint32(boot.TimeLeft); // TimeLeft data << uint32(lfg::LFG_GROUP_KICK_VOTES_NEEDED); // NeededVotes data << boot.reason.c_str(); // Reason SendPacket(&data); }
void WorldSession::HandleLfgGetStatus(WorldPacket& /*recvData*/) { TC_LOG_DEBUG("lfg", "CMSG_LFG_GET_STATUS %s", GetPlayerInfo().c_str()); if (!GetPlayer()->isUsingLfg()) return; ObjectGuid guid = GetPlayer()->GetGUID(); lfg::LfgUpdateData updateData = sLFGMgr->GetLfgStatus(guid); if (GetPlayer()->GetGroup()) { SendLfgUpdateStatus(updateData, true); updateData.dungeons.clear(); SendLfgUpdateStatus(updateData, false); } else { SendLfgUpdateStatus(updateData, false); updateData.dungeons.clear(); SendLfgUpdateStatus(updateData, true); } }
void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recvData) { uint8 roles; uint32 roldesDesired; recvData >> roldesDesired; recvData >> roles; ObjectGuid guid = GetPlayer()->GetGUID128(); Group* group = GetPlayer()->GetGroup(); if (!group) { TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_ROLES %s Not in group", GetPlayerInfo().c_str()); return; } ObjectGuid gguid = group->GetGUID(); TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_ROLES: Group %u, Player %s, Roles: %u", GUID_LOPART(gguid), GetPlayerInfo().c_str(), roles); sLFGMgr->UpdateRoleCheck(gguid, guid, roles); }
void WorldSession::SendLfgQueueStatus(lfg::LfgQueueStatusData const& queueData) { TC_LOG_DEBUG("lfg", "SMSG_LFG_QUEUE_STATUS %s dungeon: %u, waitTime: %d, " "avgWaitTime: %d, waitTimeTanks: %d, waitTimeHealer: %d, waitTimeDps: %d, " "queuedTime: %u, tanks: %u, healers: %u, dps: %u", GetPlayerInfo().c_str(), queueData.dungeonId, queueData.waitTime, queueData.waitTimeAvg, queueData.waitTimeTank, queueData.waitTimeHealer, queueData.waitTimeDps, queueData.queuedTime, queueData.tanks, queueData.healers, queueData.dps); WorldPacket data(SMSG_LFG_QUEUE_STATUS, 4 + 4 + 4 + 4 + 4 +4 + 1 + 1 + 1 + 4); data << uint32(queueData.dungeonId); // Dungeon data << int32(queueData.waitTimeAvg); // Average Wait time data << int32(queueData.waitTime); // Wait Time data << int32(queueData.waitTimeTank); // Wait Tanks data << int32(queueData.waitTimeHealer); // Wait Healers data << int32(queueData.waitTimeDps); // Wait Dps data << uint8(queueData.tanks); // Tanks needed data << uint8(queueData.healers); // Healers needed data << uint8(queueData.dps); // Dps needed data << uint32(queueData.queuedTime); // Player wait time in queue SendPacket(&data); }
void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket) { uint32 unk; std::string channelName; recvPacket >> unk >> channelName; if (!ChatHandler(this).isValidChatMessage(channelName.c_str())) return; TC_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s Channel: %s, unk1: %u", GetPlayerInfo().c_str(), channelName.c_str(), unk); if (channelName.empty()) return; if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) { if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->LeaveChannel(GetPlayer(), true); cMgr->LeftChannel(channelName); } }
// Called when clicking on Guild bank gameobject void WorldSession::HandleGuildBankerActivate(WorldPacket& recvPacket) { uint64 guid; bool sendAllSlots; recvPacket >> guid >> sendAllSlots; sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANKER_ACTIVATE [%s]: Go: [" UI64FMTD "] AllSlots: %u" , GetPlayerInfo().c_str(), guid, sendAllSlots); GameObject const* const go = GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK); if (!go) return; Guild* const guild = GetPlayer()->GetGuild(); if (!guild) { Guild::SendCommandResult(this, GUILD_COMMAND_VIEW_TAB, ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } guild->SendBankList(this, 0, true, true); }
void WorldSession::SendLfgUpdatePlayer(lfg::LfgUpdateData const& updateData) { bool queued = false; uint8 size = uint8(updateData.dungeons.size()); switch (updateData.updateType) { case lfg::LFG_UPDATETYPE_JOIN_QUEUE: case lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE: queued = true; break; case lfg::LFG_UPDATETYPE_UPDATE_STATUS: queued = updateData.state == lfg::LFG_STATE_QUEUED; break; default: break; } #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outDebug(LOG_FILTER_LFG, "SMSG_LFG_UPDATE_PLAYER %s updatetype: %u", GetPlayerInfo().c_str(), updateData.updateType); #endif WorldPacket data(SMSG_LFG_UPDATE_PLAYER, 1 + 1 + (size > 0 ? 1 : 0) * (1 + 1 + 1 + 1 + size * 4 + updateData.comment.length())); data << uint8(updateData.updateType); // Lfg Update type data << uint8(size > 0); // Extra info if (size) { data << uint8(queued); // Join the queue data << uint8(0); // unk - Always 0 data << uint8(0); // unk - Always 0 data << uint8(size); for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it) data << uint32(*it); data << updateData.comment; } SendPacket(&data); }
void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket) { uint32 rankId; recvPacket >> rankId; uint32 rights; recvPacket >> rights; std::string rankName; recvPacket >> rankName; uint32 money; recvPacket >> money; TC_LOG_DEBUG(LOG_FILTER_GUILD, "CMSG_GUILD_RANK [%s]: Rank: %s (%u)", GetPlayerInfo().c_str(), rankName.c_str(), rankId); Guild* guild = GetPlayer()->GetGuild(); if (!guild) { recvPacket.rpos(recvPacket.wpos()); return; } GuildBankRightsAndSlotsVec rightsAndSlots(GUILD_BANK_MAX_TABS); for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId) { uint32 bankRights; uint32 slots; recvPacket >> bankRights; recvPacket >> slots; rightsAndSlots[tabId] = GuildBankRightsAndSlots(tabId, bankRights, slots); } guild->HandleSetRankInfo(this, rankId, rankName, rights, money, rightsAndSlots); }
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 recvData.ReadGuidMask(leaveGuid, 0, 1, 6, 7, 3, 5, 2, 4); recvData.ReadGuidBytes(leaveGuid, 1, 5, 6, 7, 4, 2, 3, 0); 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::HandleLfgLeaveOpcode(WorldPacket& recvData) { ObjectGuid leaveGuid; Group* group = GetPlayer()->GetGroup(); ObjectGuid guid = GetPlayer()->GetGUID(); ObjectGuid 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 World::CollisionCheck() { auto p = GetPlayerInfo(); auto b = GetBallInfo(); for (size_t i = 0; i < b.size(); i++) { for (size_t j = i; j < b.size(); j++) { } for (size_t j = 0; j < p.size(); j++) { } if (v2fMagnitude(b[i].Position) > 200) { balls[i].pos[1] = -balls[i].pos[1]; } } //for (size_t i = 0; i < balls.size(); i++) //{ // for (size_t j = i + 1; j < balls.size(); j++) // { // Collision(balls[i], balls[j]); // } // for (size_t j = 0; j < players.size(); j++) // { // Collision(balls[i], players[j]); // } // Collision(balls[i]); //} }
static bool HandleLfgGroupInfoCommand(ChatHandler* handler, char const* args) { Player* target = NULL; std::string playerName; if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName)) return false; Group* grp = target->GetGroup(); if (!grp) { handler->PSendSysMessage(LANG_LFG_NOT_IN_GROUP, playerName.c_str()); return true; } uint64 guid = grp->GetGUID(); std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid)); handler->PSendSysMessage(LANG_LFG_GROUP_INFO, grp->isLFGGroup(), state.c_str(), sLFGMgr->GetDungeon(guid)); for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) GetPlayerInfo(handler, itr->GetSource()); return true; }
void WorldSession::HandleSaveGuildEmblem(WorldPackets::Guild::SaveGuildEmblem& packet) { EmblemInfo emblemInfo; emblemInfo.ReadPacket(packet); TC_LOG_DEBUG("guild", "CMSG_SAVE_GUILD_EMBLEM [%s]: Guid: [%s] Style: %d, Color: %d, BorderStyle: %d, BorderColor: %d, BackgroundColor: %d" , GetPlayerInfo().c_str(), packet.Vendor.ToString().c_str(), emblemInfo.GetStyle() , emblemInfo.GetColor(), emblemInfo.GetBorderStyle() , emblemInfo.GetBorderColor(), emblemInfo.GetBackgroundColor()); if (GetPlayer()->GetNPCIfCanInteractWith(packet.Vendor, UNIT_NPC_FLAG_TABARDDESIGNER)) { // Remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (Guild* guild = GetPlayer()->GetGuild()) guild->HandleSetEmblem(this, emblemInfo); else Guild::SendSaveEmblemResult(this, ERR_GUILDEMBLEM_NOGUILD); // "You are not part of a guild!"; } else Guild::SendSaveEmblemResult(this, ERR_GUILDEMBLEM_INVALIDVENDOR); // "That's not an emblem vendor!" }
void CHudStatusBar :: ParseStatusString( int line_num ) { // localise string first char szBuffer[MAX_STATUSTEXT_LENGTH]; memset( szBuffer, 0, sizeof szBuffer ); gHUD.m_TextMessage.LocaliseTextString( m_szStatusText[line_num], szBuffer, MAX_STATUSTEXT_LENGTH ); // parse m_szStatusText & m_iStatusValues into m_szStatusBar memset( m_szStatusBar[line_num], 0, MAX_STATUSTEXT_LENGTH ); char *src = szBuffer; char *dst = m_szStatusBar[line_num]; char *src_start = src, *dst_start = dst; while ( *src != 0 ) { while ( *src == '\n' ) src++; // skip over any newlines if ( ((src - src_start) >= MAX_STATUSTEXT_LENGTH) || ((dst - dst_start) >= MAX_STATUSTEXT_LENGTH) ) break; int index = atoi( src ); // should we draw this line? if ( (index >= 0 && index < MAX_STATUSBAR_VALUES) && (m_iStatusValues[index] != -1)) { // parse this line and append result to the status bar while ( *src >= '0' && *src <= '9' ) src++; if ( *src == '\n' || *src == 0 ) continue; // no more left in this text line // copy the text, char by char, until we hit a % or a \n while ( *src != '\n' && *src != 0 ) { if ( *src != '%' ) { // just copy the character *dst = *src; dst++, src++; } else { // get the descriptor char valtype = *(++src); // move over % // if it's a %, draw a % sign if ( valtype == '%' ) { *dst = valtype; dst++, src++; continue; } // move over descriptor, then get and move over the index index = atoi( ++src ); while ( *src >= '0' && *src <= '9' ) src++; if ( index >= 0 && index < MAX_STATUSBAR_VALUES ) { int indexval = m_iStatusValues[index]; // get the string to substitute in place of the %XX char szRepString[MAX_PLAYER_NAME_LENGTH]; switch ( valtype ) { case 'p': // player name GetPlayerInfo( indexval, &g_PlayerInfoList[indexval] ); if ( g_PlayerInfoList[indexval].name != NULL ) { strncpy( szRepString, g_PlayerInfoList[indexval].name, MAX_PLAYER_NAME_LENGTH ); m_pflNameColors[line_num] = GetClientColor( indexval ); } else { strcpy( szRepString, "******" ); } break; case 'i': // number sprintf( szRepString, "%d", indexval ); break; default: szRepString[0] = 0; } for ( char *cp = szRepString; *cp != 0 && ((dst - dst_start) < MAX_STATUSTEXT_LENGTH); cp++, dst++ ) *dst = *cp; } } } } else { // skip to next line of text while ( *src != 0 && *src != '\n' ) src++; } } }
void WorldSession::SendLfgDisabled() { TC_LOG_DEBUG("lfg", "SMSG_LFG_DISABLED %s", GetPlayerInfo().c_str()); WorldPacket data(SMSG_LFG_DISABLED, 0); SendPacket(&data); }
void WorldSession::SendLfgUpdateProposal(lfg::LfgProposal const& proposal) { ObjectGuid guid = GetPlayer()->GetGUID(); ObjectGuid gguid = proposal.players.find(guid)->second.group; bool silent = !proposal.isNew && gguid == proposal.group; uint32 dungeonEntry = proposal.dungeonId; uint32 queueId = sLFGMgr->GetQueueId(_player->GetGUID()); time_t joinTime = sLFGMgr->GetQueueJoinTime(_player->GetGUID()); TC_LOG_DEBUG("lfg", "SMSG_LFG_PROPOSAL_UPDATE %s state: %u", GetPlayerInfo().c_str(), proposal.state); // show random dungeon if player selected random dungeon and it's not lfg group if (!silent) { lfg::LfgDungeonSet const& playerDungeons = sLFGMgr->GetSelectedDungeons(guid); if (playerDungeons.find(proposal.dungeonId) == playerDungeons.end()) dungeonEntry = (*playerDungeons.begin()); } dungeonEntry = sLFGMgr->GetLFGDungeonEntry(dungeonEntry); WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + proposal.players.size() * (4 + 1 + 1 + 1 + 1 +1)); data << uint32(joinTime); data << uint32(proposal.encounters); // Encounters done data << uint32(queueId); // Queue Id data << uint32(3); // Always 3 data << uint32(dungeonEntry); // Dungeon data << uint32(proposal.id); // Proposal Id data << uint8(proposal.state); // State ObjectGuid guid1 = guid; ObjectGuid guid2 = gguid; data.WriteBit(guid2[4]); data.WriteBit(guid1[3]); data.WriteBit(guid1[7]); data.WriteBit(guid1[0]); data.WriteBit(guid2[1]); data.WriteBit(silent); data.WriteBit(guid1[4]); data.WriteBit(guid1[5]); data.WriteBit(guid2[3]); data.WriteBits(proposal.players.size(), 23); data.WriteBit(guid2[7]); for (lfg::LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it) { lfg::LfgProposalPlayer const& player = it->second; if (!player.group) { data.WriteBit(0); data.WriteBit(0); } else { data.WriteBit(player.group == proposal.group); // Is group in dungeon data.WriteBit(player.group == gguid); // Same group as the player } data.WriteBit(player.accept == lfg::LFG_ANSWER_AGREE); data.WriteBit(player.accept != lfg::LFG_ANSWER_PENDING); data.WriteBit(it->first == guid); } data.WriteBit(guid2[5]); data.WriteBit(guid1[6]); data.WriteBit(guid2[2]); data.WriteBit(guid2[6]); data.WriteBit(guid1[2]); data.WriteBit(guid1[1]); data.WriteBit(guid2[0]); data.WriteByteSeq(guid1[5]); data.WriteByteSeq(guid2[3]); data.WriteByteSeq(guid2[6]); data.WriteByteSeq(guid1[6]); data.WriteByteSeq(guid1[0]); data.WriteByteSeq(guid2[5]); data.WriteByteSeq(guid1[1]); for (lfg::LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it) { lfg::LfgProposalPlayer const& player = it->second; data << uint32(player.role); } data.WriteByteSeq(guid2[7]); data.WriteByteSeq(guid1[4]); data.WriteByteSeq(guid2[0]); data.WriteByteSeq(guid2[1]); data.WriteByteSeq(guid1[2]); data.WriteByteSeq(guid1[7]); data.WriteByteSeq(guid2[2]); data.WriteByteSeq(guid1[3]); data.WriteByteSeq(guid2[4]); SendPacket(&data); }
void WorldSession::SendLfgJoinResult(lfg::LfgJoinResultData const& joinData) { uint32 size = 0; ObjectGuid guid = GetPlayer()->GetGUID(); uint32 queueId = sLFGMgr->GetQueueId(_player->GetGUID()); for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it) size += 8 + 4 + uint32(it->second.size()) * (4 + 4 + 4 + 4); TC_LOG_DEBUG("lfg", "SMSG_LFG_JOIN_RESULT %s checkResult: %u checkValue: %u", GetPlayerInfo().c_str(), joinData.result, joinData.state); WorldPacket data(SMSG_LFG_JOIN_RESULT, 4 + 4 + size); data << uint32(3); data << uint8(joinData.result); // Check Result data << uint32(queueId); // Queue Id data << uint8(joinData.state); // Check Value data << uint32(time(NULL)); // Join date data.WriteBit(guid[2]); data.WriteBit(guid[7]); data.WriteBit(guid[3]); data.WriteBit(guid[0]); data.WriteBits(joinData.lockmap.size(), 24); for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it) { ObjectGuid playerGuid = it->first; data.WriteBit(playerGuid[7]); data.WriteBit(playerGuid[5]); data.WriteBit(playerGuid[3]); data.WriteBit(playerGuid[6]); data.WriteBit(playerGuid[0]); data.WriteBit(playerGuid[2]); data.WriteBit(playerGuid[4]); data.WriteBit(playerGuid[1]); data.WriteBits(it->second.size(), 22); } data.WriteBit(guid[4]); data.WriteBit(guid[5]); data.WriteBit(guid[1]); data.WriteBit(guid[6]); for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it) { ObjectGuid playerGuid = it->first; for (lfg::LfgLockMap::const_iterator itr = it->second.begin(); itr != it->second.end(); ++itr) { TC_LOG_TRACE("lfg", "SendLfgJoinResult:: PlayerGUID: " UI64FMTD " DungeonID: %u Lock status: %u Required itemLevel: %u Current itemLevel: %f", uint64(playerGuid), (itr->first & 0x00FFFFFF), itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel); data << uint32(itr->second.lockStatus); // Lock status data << uint32(itr->second.currentItemLevel); // Current itemLevel data << uint32(itr->second.requiredItemLevel); // Required itemLevel data << uint32(itr->first); // Dungeon entry (id + type) } data.WriteByteSeq(playerGuid[2]); data.WriteByteSeq(playerGuid[5]); data.WriteByteSeq(playerGuid[1]); data.WriteByteSeq(playerGuid[0]); data.WriteByteSeq(playerGuid[4]); data.WriteByteSeq(playerGuid[3]); data.WriteByteSeq(playerGuid[6]); data.WriteByteSeq(playerGuid[7]); } data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[5]); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[6]); SendPacket(&data); }
void WorldSession::SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, bool party) { bool join = false; bool queued = false; uint8 size = uint8(updateData.dungeons.size()); ObjectGuid guid = _player->GetGUID(); time_t joinTime = sLFGMgr->GetQueueJoinTime(_player->GetGUID()); uint32 queueId = sLFGMgr->GetQueueId(_player->GetGUID()); switch (updateData.updateType) { case lfg::LFG_UPDATETYPE_JOIN_QUEUE_INITIAL: // Joined queue outside the dungeon join = true; break; case lfg::LFG_UPDATETYPE_JOIN_QUEUE: case lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE: // Rolecheck Success join = true; queued = true; break; case lfg::LFG_UPDATETYPE_PROPOSAL_BEGIN: join = true; break; case lfg::LFG_UPDATETYPE_UPDATE_STATUS: join = updateData.state != lfg::LFG_STATE_ROLECHECK && updateData.state != lfg::LFG_STATE_NONE; queued = updateData.state == lfg::LFG_STATE_QUEUED; break; default: break; } TC_LOG_DEBUG("lfg", "SMSG_LFG_UPDATE_STATUS %s updatetype: %u, party %s", GetPlayerInfo().c_str(), updateData.updateType, party ? "true" : "false"); WorldPacket data(SMSG_LFG_UPDATE_STATUS, 1 + 8 + 3 + 2 + 1 + updateData.comment.length() + 4 + 4 + 1 + 1 + 1 + 4 + size); data.WriteBit(guid[1]); data.WriteBit(party); data.WriteBits(size, 24); data.WriteBit(guid[6]); data.WriteBit(size > 0); // Extra info data.WriteBits(updateData.comment.length(), 9); data.WriteBit(guid[4]); data.WriteBit(guid[7]); data.WriteBit(guid[2]); data.WriteBit(join); // LFG Join data.WriteBit(guid[0]); data.WriteBit(guid[3]); data.WriteBit(guid[5]); data.WriteBit(queued); // Join the queue data << uint8(updateData.updateType); // Lfg Update type data.WriteString(updateData.comment); data << uint32(queueId); // Queue Id data << uint32(joinTime); // Join date data.WriteByteSeq(guid[6]); for (uint8 i = 0; i < 3; ++i) data << uint8(0); // unk - Always 0 data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[5]); data.WriteByteSeq(guid[0]); data << uint32(3); data.WriteByteSeq(guid[7]); for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it) data << uint32(*it); SendPacket(&data); }
void WorldSession::SendLfgPlayerLockInfo() { ObjectGuid guid = GetPlayer()->GetGUID(); // Get Random dungeons that can be done at a certain level and expansion uint8 level = GetPlayer()->getLevel(); lfg::LfgDungeonSet const& randomDungeons = sLFGMgr->GetRandomAndSeasonalDungeons(level, GetPlayer()->GetSession()->Expansion()); // Get player locked Dungeons lfg::LfgLockMap const& lock = sLFGMgr->GetLockedDungeons(guid); uint32 rsize = uint32(randomDungeons.size()); uint32 lsize = uint32(lock.size()); TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_INFO %s", GetPlayerInfo().c_str()); WorldPacket data(SMSG_LFG_PLAYER_INFO, 1 + rsize * (4 + 1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4) + 4 + lsize * (1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4)); data << uint8(randomDungeons.size()); // Random Dungeon count for (lfg::LfgDungeonSet::const_iterator it = randomDungeons.begin(); it != randomDungeons.end(); ++it) { data << uint32(*it); // Dungeon Entry (id + type) lfg::LfgReward const* reward = sLFGMgr->GetRandomDungeonReward(*it, level); Quest const* quest = NULL; bool done = false; if (reward) { quest = sObjectMgr->GetQuestTemplate(reward->firstQuest); if (quest) { done = !GetPlayer()->CanRewardQuest(quest, false); if (done) quest = sObjectMgr->GetQuestTemplate(reward->otherQuest); } } data << uint8(done); data << uint32(0); // currencyQuantity data << uint32(0); // some sort of overall cap/weekly cap data << uint32(0); // currencyID data << uint32(0); // tier1Quantity data << uint32(0); // tier1Limit data << uint32(0); // overallQuantity data << uint32(0); // overallLimit data << uint32(0); // periodPurseQuantity data << uint32(0); // periodPurseLimit data << uint32(0); // purseQuantity data << uint32(0); // purseLimit data << uint32(0); // some sort of reward for completion data << uint32(0); // completedEncounters data << uint8(0); // Call to Arms eligible for (uint32 i = 0; i < 3; ++i) { data << uint32(0); // Call to Arms Role //if (role) // BuildQuestReward(data, ctaRoleQuest, GetPlayer()); } if (quest) BuildQuestReward(data, quest, GetPlayer()); else { data << uint32(0); // Money data << uint32(0); // XP data << uint8(0); // Reward count } } BuildPlayerLockDungeonBlock(data, lock); SendPacket(&data); }
void CHudSayText :: SayTextPrint( const char *pszBuf, int iBufSize, int clientIndex ) { if ( gViewPort && gViewPort->AllowedToPrintText() == FALSE ) return; // find an empty string slot for ( int i = 0; i < MAX_LINES; i++ ) { if ( ! *g_szLineBuffer[i] ) break; } if ( i == MAX_LINES ) { // force scroll buffer up ScrollTextUp(); i = MAX_LINES - 1; } g_iNameLengths[i] = 0; g_pflNameColors[i] = NULL; // if it's a say message, search for the players name in the string if ( *pszBuf == 2 && clientIndex > 0 ) { GetPlayerInfo( clientIndex, &g_PlayerInfoList[clientIndex] ); const char *pName = g_PlayerInfoList[clientIndex].name; if ( pName ) { const char *nameInString = strstr( pszBuf, pName ); if ( nameInString ) { g_iNameLengths[i] = strlen( pName ) + (nameInString - pszBuf); g_pflNameColors[i] = GetClientColor( clientIndex ); } } } strncpy( g_szLineBuffer[i], pszBuf, max(iBufSize -1, MAX_CHARS_PER_LINE-1) ); // make sure the text fits in one line EnsureTextFitsInOneLineAndWrapIfHaveTo( i ); // Set scroll time if ( i == 0 ) { SCROLL_SPEED = CVAR_GET_FLOAT( "hud_saytext_time" ); flScrollTime = gHUD.m_flTime + SCROLL_SPEED; } m_iFlags |= HUD_ACTIVE; PlaySound( "misc/talk.wav", 1 ); if ( ScreenHeight >= 480 ) Y_START = ScreenHeight - 60; else Y_START = ScreenHeight - 45; Y_START -= (line_height * (MAX_LINES+1)); }
void WorldSession::Handle_Deprecated(WorldPacket& recvPacket) { sLog->outError(LOG_FILTER_OPCODES, "Received deprecated opcode %s from %s" , GetOpcodeNameForLogging(recvPacket.GetOpcode()).c_str(), GetPlayerInfo().c_str()); }