void HonorHandler::OnPlayerKilledUnit( Player *pPlayer, Unit* pVictim ) { if( pVictim == NULL || pPlayer == NULL ) return; if( pPlayer->GetTypeId() != TYPEID_PLAYER || !pVictim->IsUnit() ) return; if( !pVictim->IsPlayer() || static_cast< Player* >( pVictim )->m_honorless ) return; if( pVictim->IsPlayer() ) { if( pPlayer->m_bg ) { if( static_cast< Player* >( pVictim )->m_bgTeam == pPlayer->m_bgTeam ) return; // patch 2.4, players killed >50 times in battlegrounds won't be worth honor for the rest of that bg if( static_cast<Player*>(pVictim)->m_bgScore.Deaths >= 50 ) return; } else { if( pPlayer->GetTeam() == static_cast< Player* >( pVictim )->GetTeam() ) return; } } // Calculate points int32 Points = CalculateHonorPointsForKill(pPlayer, pVictim); if( Points > 0 ) { if( pPlayer->m_bg ) { // hackfix for battlegrounds (since the gorups there are disabled, we need to do this manually) vector<Player*> toadd; uint32 t = pPlayer->m_bgTeam; toadd.reserve(15); // shouldnt have more than this pPlayer->m_bg->Lock(); set<Player*> * s = &pPlayer->m_bg->m_players[t]; for(set<Player*>::iterator itr = s->begin(); itr != s->end(); ++itr) { if((*itr) == pPlayer || (*itr)->isInRange(pPlayer,100.0f)) toadd.push_back(*itr); } if( toadd.size() > 0 ) { uint32 pts = Points / (uint32)toadd.size(); for(vector<Player*>::iterator vtr = toadd.begin(); vtr != toadd.end(); ++vtr) { AddHonorPointsToPlayer(*vtr, pts); (*vtr)->m_killsToday++; (*vtr)->m_killsLifetime++; pPlayer->m_bg->HookOnHK(*vtr); if(pVictim) { // Send PVP credit WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = pts * 10; data << pvppoints << pVictim->GetGUID() << uint32(static_cast< Player* >(pVictim)->GetPVPRank()); (*vtr)->GetSession()->SendPacket(&data); } } } pPlayer->m_bg->Unlock(); } else { set<Player*> contributors; // First loop: Get all the people in the attackermap. pVictim->UpdateOppFactionSet(); for(std::set<Object*>::iterator itr = pVictim->GetInRangeOppFactsSetBegin(); itr != pVictim->GetInRangeOppFactsSetEnd(); itr++) { if(!(*itr)->IsPlayer()) continue; bool added = false; Player * plr = (Player*)(*itr); if(pVictim->CombatStatus.m_attackers.find(plr->GetGUID()) != pVictim->CombatStatus.m_attackers.end()) { added = true; contributors.insert(plr); } if(added && plr->GetGroup()) { Group * pGroup = plr->GetGroup(); uint32 groups = pGroup->GetSubGroupCount(); for(uint32 i = 0; i < groups; i++) { SubGroup * sg = pGroup->GetSubGroup(i); if(!sg) continue; for(GroupMembersSet::iterator itr2 = sg->GetGroupMembersBegin(); itr2 != sg->GetGroupMembersEnd(); itr2++) { PlayerInfo * pi = (*itr2); Player * gm = objmgr.GetPlayer(pi->guid); if(!gm) continue; if(gm->isInRange(pVictim, 100.0f)) contributors.insert(gm); } } } } for(set<Player*>::iterator itr = contributors.begin(); itr != contributors.end(); itr++) { Player * pAffectedPlayer = (*itr); if(!pAffectedPlayer) continue; pAffectedPlayer->m_killsToday++; pAffectedPlayer->m_killsLifetime++; if(pAffectedPlayer->m_bg) pAffectedPlayer->m_bg->HookOnHK(pAffectedPlayer); int32 contributorpts = Points / (int32)contributors.size(); AddHonorPointsToPlayer(pAffectedPlayer, contributorpts); if(pVictim->IsPlayer()) { sHookInterface.OnHonorableKill(pAffectedPlayer, (Player*)pVictim); WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = contributorpts * 10; // Why *10? data << pvppoints << pVictim->GetGUID() << uint32(static_cast< Player* >(pVictim)->GetPVPRank()); pAffectedPlayer->GetSession()->SendPacket(&data); } if(pAffectedPlayer->GetZoneId() == 3518) { // Add Halaa Battle Token SpellEntry * pvp_token_spell = dbcSpell.LookupEntry(pAffectedPlayer->GetTeam()? 33004 : 33005); pAffectedPlayer->CastSpell(pAffectedPlayer, pvp_token_spell, true); } // If we are in Hellfire Peninsula if(pAffectedPlayer->GetZoneId() == 3483) { // Add Mark of Thrallmar/Honor Hold SpellEntry * pvp_token_spell = dbcSpell.LookupEntry(pAffectedPlayer->GetTeam()? 32158 : 32155); pAffectedPlayer->CastSpell(pAffectedPlayer, pvp_token_spell, true); } } } } }
void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_MOVE_TELEPORT_ACK"); ObjectGuid guid; uint32 ackCount = recvPacket.read<uint32>(); recvPacket.read_skip<uint32>(); // should be new position in kind of struction guid[5] = recvPacket.ReadBit(); guid[0] = recvPacket.ReadBit(); guid[1] = recvPacket.ReadBit(); guid[6] = recvPacket.ReadBit(); guid[3] = recvPacket.ReadBit(); guid[7] = recvPacket.ReadBit(); guid[2] = recvPacket.ReadBit(); guid[4] = recvPacket.ReadBit(); recvPacket.ReadByteSeq(guid[4]); recvPacket.ReadByteSeq(guid[2]); recvPacket.ReadByteSeq(guid[7]); recvPacket.ReadByteSeq(guid[6]); recvPacket.ReadByteSeq(guid[5]); recvPacket.ReadByteSeq(guid[1]); recvPacket.ReadByteSeq(guid[3]); recvPacket.ReadByteSeq(guid[0]); // Skip old result if (_player->m_movement_ack[ACK_TELEPORT] != ackCount) return; Player* plMover = _player->m_mover->ToPlayer(); if (!plMover || !plMover->IsBeingTeleportedNear() || guid != plMover->GetGUID()) return; plMover->SetSemaphoreTeleportNear(false); uint32 old_zone = plMover->GetZoneId(); WorldLocation const& dest = plMover->GetTeleportDest(); plMover->UpdatePosition(dest, true); WorldPacket data(SMSG_MOVE_UPDATE_TELEPORT); MovementInfo info = MovementInfo(plMover->m_movementInfo); info.pos.Relocate(dest.m_positionX, dest.m_positionY, dest.m_positionZ, dest.m_orientation); info.guid = plMover->GetGUID(); info.time = getMSTime(); info.WriteToPacket(data); _player->SendMessageToSet(&data, _player); uint32 newzone, newarea; plMover->GetZoneAndAreaId(newzone, newarea); plMover->UpdateZone(newzone, newarea); if (old_zone != newzone) { if (plMover->pvpInfo.inHostileArea) plMover->CastSpell(plMover, 2479, true); // honorless target else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) plMover->UpdatePvP(false, false); } GetPlayer()->ResummonPetTemporaryUnSummonedIfAny(); GetPlayer()->ProcessDelayedOperations(); }
/*this procedure handles clients CMSG_REQUEST_PARTY_MEMBER_STATS request*/ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data ) { CHECK_PACKET_SIZE(recv_data, 8); sLog.outDebug("WORLD: Received CMSG_REQUEST_PARTY_MEMBER_STATS"); uint64 Guid; recv_data >> Guid; Player *player = objmgr.GetPlayer(Guid); if(!player) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.appendPackGUID(Guid); data << (uint32) GROUP_UPDATE_FLAG_STATUS; data << (uint16) MEMBER_STATUS_OFFLINE; SendPacket(&data); return; } Pet *pet = player->GetPet(); WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.append(player->GetPackGUID()); uint32 mask1 = 0x00040BFF; // common mask, real flags used 0x000040BFF if(pet) mask1 = 0x7FFFFFFF; // for hunters and other classes with pets Powers powerType = player->getPowerType(); data << (uint32) mask1; // group update mask data << (uint16) MEMBER_STATUS_ONLINE; // member's online status data << (uint32) player->GetHealth(); // GROUP_UPDATE_FLAG_CUR_HP data << (uint32) player->GetMaxHealth(); // GROUP_UPDATE_FLAG_MAX_HP data << (uint8) powerType; // GROUP_UPDATE_FLAG_POWER_TYPE data << (uint16) player->GetPower(powerType); // GROUP_UPDATE_FLAG_CUR_POWER data << (uint16) player->GetMaxPower(powerType); // GROUP_UPDATE_FLAG_MAX_POWER data << (uint16) player->getLevel(); // GROUP_UPDATE_FLAG_LEVEL data << (uint16) player->GetZoneId(); // GROUP_UPDATE_FLAG_ZONE data << (uint16) player->GetPositionX(); // GROUP_UPDATE_FLAG_POSITION data << (uint16) player->GetPositionY(); // GROUP_UPDATE_FLAG_POSITION uint64 auramask = 0; size_t maskPos = data.wpos(); data << (uint64) auramask; // placeholder for(uint8 i = 0; i < MAX_AURAS; ++i) { if(uint32 aura = player->GetVisibleAura(i)) { auramask |= (uint64(1) << i); data << (uint32) aura; data << (uint8) 1; } } data.put<uint64>(maskPos,auramask); // GROUP_UPDATE_FLAG_AURAS if(pet) { Powers petpowertype = pet->getPowerType(); data << (uint64) pet->GetGUID(); // GROUP_UPDATE_FLAG_PET_GUID data << pet->GetName(); // GROUP_UPDATE_FLAG_PET_NAME data << (uint16) pet->GetDisplayId(); // GROUP_UPDATE_FLAG_PET_MODEL_ID data << (uint32) pet->GetHealth(); // GROUP_UPDATE_FLAG_PET_CUR_HP data << (uint32) pet->GetMaxHealth(); // GROUP_UPDATE_FLAG_PET_MAX_HP data << (uint8) petpowertype; // GROUP_UPDATE_FLAG_PET_POWER_TYPE data << (uint16) pet->GetPower(petpowertype); // GROUP_UPDATE_FLAG_PET_CUR_POWER data << (uint16) pet->GetMaxPower(petpowertype); // GROUP_UPDATE_FLAG_PET_MAX_POWER uint64 petauramask = 0; size_t petMaskPos = data.wpos(); data << (uint64) petauramask; // placeholder for(uint8 i = 0; i < MAX_AURAS; ++i) { if(uint32 petaura = pet->GetVisibleAura(i)) { petauramask |= (uint64(1) << i); data << (uint32) petaura; data << (uint8) 1; } } data.put<uint64>(petMaskPos,petauramask); // GROUP_UPDATE_FLAG_PET_AURAS } else { data << (uint8) 0; // GROUP_UPDATE_FLAG_PET_NAME data << (uint64) 0; // GROUP_UPDATE_FLAG_PET_AURAS } SendPacket(&data); }
void HonorHandler::OnPlayerKilled(Player* pPlayer, Player* pVictim) { if(pVictim->m_honorless) return; if(pPlayer->m_bg) { if(pVictim->m_bgTeam == pPlayer->m_bgTeam) return; // patch 2.4, players killed >50 times in battlegrounds won't be worth honor for the rest of that bg if(pVictim->m_bgScore.Deaths >= 50) return; } else { if(pPlayer->GetTeam() == pVictim->GetTeam()) return; } // Calculate points int32 Points = 0; if(pPlayer != pVictim) Points = CalculateHonorPointsForKill(pPlayer->getLevel(), pVictim->getLevel()); if(Points > 0) { if(pPlayer->m_bg) { // hackfix for battlegrounds (since the groups there are disabled, we need to do this manually) vector<Player*> toadd; uint32 t = pPlayer->m_bgTeam; toadd.reserve(15); // shouldn't have more than this pPlayer->m_bg->Lock(); set<Player*> * s = &pPlayer->m_bg->m_players[t]; for(set<Player*>::iterator itr = s->begin(); itr != s->end(); ++itr) { // Also check that the player is in range, and the player is alive. if((*itr) == pPlayer || ((*itr)->isAlive() && (*itr)->isInRange(pPlayer, 100.0f))) toadd.push_back(*itr); } if(toadd.size() > 0) { uint32 pts = Points / (uint32)toadd.size(); for(vector<Player*>::iterator vtr = toadd.begin(); vtr != toadd.end(); ++vtr) { AddHonorPointsToPlayer(*vtr, pts); (*vtr)->m_killsToday++; (*vtr)->m_killsLifetime++; pPlayer->m_bg->HookOnHK(*vtr); if(pVictim) { // Send PVP credit WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = pts * 10; data << pvppoints << pVictim->GetGUID() << uint32(pVictim->GetPVPRank()); (*vtr)->GetSession()->SendPacket(&data); } } } pPlayer->m_bg->Unlock(); } else { set<Player*> contributors; // First loop: Get all the people in the attackermap. pVictim->UpdateOppFactionSet(); for(std::set<Object*>::iterator itr = pVictim->GetInRangeOppFactsSetBegin(); itr != pVictim->GetInRangeOppFactsSetEnd(); itr++) { if(!(*itr)->IsPlayer()) continue; bool added = false; Player* plr = TO_PLAYER(*itr); if(pVictim->CombatStatus.m_attackers.find(plr->GetGUID()) != pVictim->CombatStatus.m_attackers.end()) { added = true; contributors.insert(plr); } if(added && plr->GetGroup()) { Group* pGroup = plr->GetGroup(); uint32 groups = pGroup->GetSubGroupCount(); for(uint32 i = 0; i < groups; i++) { SubGroup* sg = pGroup->GetSubGroup(i); if(!sg) continue; for(GroupMembersSet::iterator itr2 = sg->GetGroupMembersBegin(); itr2 != sg->GetGroupMembersEnd(); itr2++) { PlayerInfo* pi = (*itr2); Player* gm = objmgr.GetPlayer(pi->guid); if(!gm) continue; if(gm->isInRange(pVictim, 100.0f)) contributors.insert(gm); } } } } for(set<Player*>::iterator itr = contributors.begin(); itr != contributors.end(); itr++) { Player* pAffectedPlayer = (*itr); if(!pAffectedPlayer) continue; pAffectedPlayer->m_killsToday++; pAffectedPlayer->m_killsLifetime++; if(pAffectedPlayer->m_bg) pAffectedPlayer->m_bg->HookOnHK(pAffectedPlayer); int32 contributorpts = Points / (int32)contributors.size(); AddHonorPointsToPlayer(pAffectedPlayer, contributorpts); sHookInterface.OnHonorableKill(pAffectedPlayer, pVictim); WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = contributorpts * 10; // Why *10? data << pvppoints << pVictim->GetGUID() << uint32(pVictim->GetPVPRank()); pAffectedPlayer->GetSession()->SendPacket(&data); int PvPToken = 0; Config.OptionalConfig.GetInt("Extra", "PvPToken", &PvPToken); if(PvPToken > 0) { int PvPTokenID = 0; Config.OptionalConfig.GetInt("Extra", "PvPTokenID", &PvPTokenID); if(PvPTokenID > 0) { Item* PvPTokenItem = objmgr.CreateItem(PvPTokenID, pAffectedPlayer); if(PvPTokenItem) { PvPTokenItem->SoulBind(); pAffectedPlayer->GetItemInterface()->AddItemToFreeSlot(PvPTokenItem); } } } if(pAffectedPlayer->GetZoneId() == 3518) { // Add Halaa Battle Token SpellEntry* pvp_token_spell = dbcSpellEntry.LookupEntry(pAffectedPlayer->IsTeamHorde() ? 33004 : 33005); pAffectedPlayer->CastSpell(pAffectedPlayer, pvp_token_spell, true); } // If we are in Hellfire Peninsula <http://www.wowwiki.com/Hellfire_Peninsula#World_PvP_-_Hellfire_Fortifications> if(pAffectedPlayer->GetZoneId() == 3483) { // Hellfire Horde Controlled Towers /*if(pAffectedPlayer->GetMapMgr()->GetWorldState(2478) != 3 && pAffectedPlayer->GetTeam() == 1) return; // Hellfire Alliance Controlled Towers if(pAffectedPlayer->GetMapMgr()->GetWorldState(2476) != 3 && pAffectedPlayer->GetTeam() == 0) return; */ // Add Mark of Thrallmar/Honor Hold SpellEntry* pvp_token_spell = dbcSpellEntry.LookupEntry(pAffectedPlayer->IsTeamHorde() ? 32158 : 32155); pAffectedPlayer->CastSpell(pAffectedPlayer, pvp_token_spell, true); } } } } }
bool Guild::AddMember(ObjectGuid plGuid, uint32 plRank) { Player* pl = sObjectMgr.GetPlayer(plGuid); if (pl) { if (pl->GetGuildId() != 0) { return false; } } else { if (Player::GetGuildIdFromDB(plGuid) != 0) // player already in guild { return false; } } // remove all player signs from another petitions // this will be prevent attempt joining player to many guilds and corrupt guild data integrity Player::RemovePetitionsAndSigns(plGuid); uint32 lowguid = plGuid.GetCounter(); // fill player data MemberSlot newmember; newmember.guid = plGuid; if (pl) { newmember.accountId = pl->GetSession()->GetAccountId(); newmember.Name = pl->GetName(); newmember.Level = pl->getLevel(); newmember.Class = pl->getClass(); newmember.ZoneId = pl->GetZoneId(); } else { // 0 1 2 3 4 QueryResult* result = CharacterDatabase.PQuery("SELECT name,level,class,zone,account FROM characters WHERE guid = '%u'", lowguid); if (!result) { return false; } // player doesn't exist Field* fields = result->Fetch(); newmember.Name = fields[0].GetCppString(); newmember.Level = fields[1].GetUInt8(); newmember.Class = fields[2].GetUInt8(); newmember.ZoneId = fields[3].GetUInt32(); newmember.accountId = fields[4].GetInt32(); delete result; if (newmember.Level < 1 || newmember.Level > STRONG_MAX_LEVEL || !((1 << (newmember.Class - 1)) & CLASSMASK_ALL_PLAYABLE)) { sLog.outError("%s has a broken data in field `characters` table, can not add him to guild.", plGuid.GetString().c_str()); return false; } } newmember.RankId = plRank; newmember.OFFnote = (std::string)""; newmember.Pnote = (std::string)""; newmember.LogoutTime = time(NULL); members[lowguid] = newmember; std::string dbPnote = newmember.Pnote; std::string dbOFFnote = newmember.OFFnote; CharacterDatabase.escape_string(dbPnote); CharacterDatabase.escape_string(dbOFFnote); CharacterDatabase.PExecute("INSERT INTO guild_member (guildid,guid,rank,pnote,offnote) VALUES ('%u', '%u', '%u','%s','%s')", m_Id, lowguid, newmember.RankId, dbPnote.c_str(), dbOFFnote.c_str()); // If player not in game data in data field will be loaded from guild tables, no need to update it!! if (pl) { pl->SetInGuild(m_Id); pl->SetRank(newmember.RankId); pl->SetGuildIdInvited(0); } UpdateAccountsNumber(); // Used by Eluna #ifdef ENABLE_ELUNA sEluna->OnAddMember(this, pl, newmember.RankId); #endif /* ENABLE_ELUNA */ return true; }
void WorldSession::SendLfgSearchResults(LfgType type, uint32 entry) { WorldPacket data(SMSG_LFG_SEARCH_RESULTS); data << uint32(type); // type data << uint32(entry); // entry from LFGDungeons.dbc uint8 isGuidsPresent = 0; data << uint8(isGuidsPresent); if (isGuidsPresent) { uint32 guids_count = 0; data << uint32(guids_count); for (uint32 i = 0; i < guids_count; ++i) { data << uint64(0); // player/group guid } } uint32 groups_count = 1; data << uint32(groups_count); // groups count data << uint32(groups_count); // groups count (total?) for (uint32 i = 0; i < groups_count; ++i) { data << uint64(1); // group guid uint32 flags = 0x92; data << uint32(flags); // flags if (flags & 0x2) { data << uint8(0); // comment string, max len 256 } if (flags & 0x10) { for (uint32 j = 0; j < 3; ++j) data << uint8(0); // roles } if (flags & 0x80) { data << uint64(0); // instance guid data << uint32(0); // completed encounters } } // TODO: Guard Player map HashMapHolder<Player>::MapType const& players = sObjectAccessor.GetPlayers(); uint32 playersSize = players.size(); data << uint32(playersSize); // players count data << uint32(playersSize); // players count (total?) for (HashMapHolder<Player>::MapType::const_iterator iter = players.begin(); iter != players.end(); ++iter) { Player* plr = iter->second; if (!plr || plr->GetTeam() != _player->GetTeam()) continue; if (!plr->IsInWorld()) continue; data << plr->GetObjectGuid(); // guid uint32 flags = 0xFF; data << uint32(flags); // flags if (flags & 0x1) { data << uint8(plr->getLevel()); data << uint8(plr->getClass()); data << uint8(plr->getRace()); for (uint32 i = 0; i < 3; ++i) data << uint8(0); // talent spec x/x/x data << uint32(0); // armor data << uint32(0); // spd/heal data << uint32(0); // spd/heal data << uint32(0); // HasteMelee data << uint32(0); // HasteRanged data << uint32(0); // HasteSpell data << float(0); // MP5 data << float(0); // MP5 Combat data << uint32(0); // AttackPower data << uint32(0); // Agility data << uint32(0); // Health data << uint32(0); // Mana data << uint32(0); // Unk1 data << float(0); // Unk2 data << uint32(0); // Defence data << uint32(0); // Dodge data << uint32(0); // Block data << uint32(0); // Parry data << uint32(0); // Crit data << uint32(0); // Expertise } if (flags & 0x2) data << ""; // comment if (flags & 0x4) data << uint8(0); // group leader if (flags & 0x8) data << uint64(1); // group guid if (flags & 0x10) data << uint8(0); // roles if (flags & 0x20) data << uint32(plr->GetZoneId()); // areaid if (flags & 0x40) data << uint8(0); // status if (flags & 0x80) { data << uint64(0); // instance guid data << uint32(0); // completed encounters } } SendPacket(&data); }
//teleport at coordinates static bool HandleGoZoneXYCommand(ChatHandler* handler, char const* args) { if (!*args) return false; Player* player = handler->GetSession()->GetPlayer(); char* zoneX = strtok((char*)args, " "); char* zoneY = strtok(NULL, " "); char* tail = strtok(NULL, ""); char* id = handler->extractKeyFromLink(tail, "Harea"); // string or [name] Shift-click form |color|Harea:area_id|h[name]|h|r if (!zoneX || !zoneY) return false; float x = (float)atof(zoneX); float y = (float)atof(zoneY); // prevent accept wrong numeric args if ((x == 0.0f && *zoneX != '0') || (y == 0.0f && *zoneY != '0')) return false; uint32 areaId = id ? (uint32)atoi(id) : player->GetZoneId(); AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId); if (x < 0 || x > 100 || y < 0 || y > 100 || !areaEntry) { handler->PSendSysMessage(LANG_INVALID_ZONE_COORD, x, y, areaId); handler->SetSentErrorMessage(true); return false; } // update to parent zone if exist (client map show only zones without parents) AreaTableEntry const* zoneEntry = areaEntry->zone ? GetAreaEntryByAreaID(areaEntry->zone) : areaEntry; Map const* map = sMapMgr->CreateBaseMap(zoneEntry->mapid); if (map->Instanceable()) { handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name, map->GetId(), map->GetMapName()); handler->SetSentErrorMessage(true); return false; } Zone2MapCoordinates(x, y, zoneEntry->ID); if (!MapManager::IsValidMapCoord(zoneEntry->mapid, x, y)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, zoneEntry->mapid); handler->SetSentErrorMessage(true); return false; } // stop flight if need if (player->IsInFlight()) { player->GetMotionMaster()->MovementExpired(); player->CleanupAfterTaxiFlight(); } // save only in non-flight case else player->SaveRecallPosition(); float z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y)); player->TeleportTo(zoneEntry->mapid, x, y, z, player->GetOrientation()); return true; }
bool ChatHandler::HandleSummonCommand(const char* args, WorldSession* m_session) { if(!*args) return false; // Summon Blocking if(!stricmp(args, "on")) { if(m_session->GetPlayer()->IsSummonDisabled()) { BlueSystemMessage(m_session, "Summon blocking is already enabled"); } else { m_session->GetPlayer()->DisableSummon(true); GreenSystemMessage(m_session, "Summon blocking is now enabled"); } return true; } else if(!stricmp(args, "off")) { if(m_session->GetPlayer()->IsSummonDisabled()) { m_session->GetPlayer()->DisableSummon(false); GreenSystemMessage(m_session, "Summon blocking is now disabled"); } else { BlueSystemMessage(m_session, "Summon blocking is already disabled"); } return true; } Player* chr = objmgr.GetPlayer(args, false); if(chr) { // send message to user char buf[256]; char buf0[256]; if(!m_session->CanUseCommand('z') && chr->IsSummonDisabled()) { snprintf((char*)buf, 256, "%s has blocked other GMs from summoning them.", chr->GetName()); SystemMessage(m_session, buf); return true; } if(chr->GetMapMgr() == NULL) { snprintf((char*)buf, 256, "%s is already being teleported.", chr->GetName()); SystemMessage(m_session, buf); return true; } snprintf((char*)buf, 256, "You are summoning %s.", chr->GetName()); SystemMessage(m_session, buf); // Don't summon the dead, lol, I see dead people. :P // If you do, we better bring them back to life if(chr->getDeathState() == 1) // Just died chr->RemoteRevive(); if(chr->getDeathState() != 0) // Not alive chr->ResurrectPlayer(); if(!m_session->GetPlayer()->m_isGmInvisible) { // send message to player snprintf((char*)buf0, 256, "You are being summoned by %s.", m_session->GetPlayer()->GetName()); SystemMessageToPlr(chr, buf0); } Player* plr = m_session->GetPlayer(); if(plr->GetMapMgr() == chr->GetMapMgr()) chr->_Relocate(plr->GetMapId(), plr->GetPosition(), false, false, plr->GetInstanceID()); else { sEventMgr.AddEvent(chr, &Player::EventPortToGM, plr, 0, 1, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); } } else { PlayerInfo* pinfo = objmgr.GetPlayerInfoByName(args); if(!pinfo) { char buf[256]; snprintf((char*)buf, 256, "Player (%s) does not exist.", args); SystemMessage(m_session, buf); return true; } else { Player* pPlayer = m_session->GetPlayer(); char query[512]; snprintf((char*) &query, 512, "UPDATE characters SET mapId = %u, positionX = %f, positionY = %f, positionZ = %f, zoneId = %u WHERE guid = %u;", pPlayer->GetMapId(), pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ(), pPlayer->GetZoneId(), pinfo->guid); CharacterDatabase.Execute(query); char buf[256]; snprintf((char*)buf, 256, "(Offline) %s has been summoned.", pinfo->name); SystemMessage(m_session, buf); return true; } } sGMLog.writefromsession(m_session, "summoned %s on map %u, %f %f %f", args, m_session->GetPlayer()->GetMapId(), m_session->GetPlayer()->GetPositionX(), m_session->GetPlayer()->GetPositionY(), m_session->GetPlayer()->GetPositionZ()); return true; }
void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket) { SF_LOG_DEBUG("network", "CMSG_MOVE_TELEPORT_ACK"); ObjectGuid guid; uint32 flags, time; recvPacket >> time >> flags; guid[0] = recvPacket.ReadBit(); guid[7] = recvPacket.ReadBit(); guid[3] = recvPacket.ReadBit(); guid[5] = recvPacket.ReadBit(); guid[4] = recvPacket.ReadBit(); guid[6] = recvPacket.ReadBit(); guid[1] = recvPacket.ReadBit(); guid[2] = recvPacket.ReadBit(); recvPacket.ReadByteSeq(guid[4]); recvPacket.ReadByteSeq(guid[1]); recvPacket.ReadByteSeq(guid[6]); recvPacket.ReadByteSeq(guid[7]); recvPacket.ReadByteSeq(guid[0]); recvPacket.ReadByteSeq(guid[2]); recvPacket.ReadByteSeq(guid[5]); recvPacket.ReadByteSeq(guid[3]); SF_LOG_DEBUG("network", "Guid " UI64FMTD, uint64(guid)); SF_LOG_DEBUG("network", "Flags %u, time %u", flags, time/IN_MILLISECONDS); Player* plMover = _player->m_mover->ToPlayer(); if (!plMover || !plMover->IsBeingTeleportedNear()) return; if (guid != plMover->GetGUID()) return; plMover->SetSemaphoreTeleportNear(false); uint32 old_zone = plMover->GetZoneId(); WorldLocation const& dest = plMover->GetTeleportDest(); plMover->UpdatePosition(dest, true); uint32 newzone, newarea; plMover->GetZoneAndAreaId(newzone, newarea); plMover->UpdateZone(newzone, newarea); // new zone if (old_zone != newzone) { // honorless target if (plMover->pvpInfo.IsHostile) plMover->CastSpell(plMover, 2479, true); // in friendly area else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FIELD_PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) plMover->UpdatePvP(false, false); } // resummon pet GetPlayer()->ResummonPetTemporaryUnSummonedIfAny(); // resummon battle pet GetPlayer()->GetBattlePetMgr()->ResummonLastBattlePet(); //lets process all delayed operations on successful teleport GetPlayer()->ProcessDelayedOperations(); }
void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data, 10); std::string name; uint8 race, class_; recv_data >> name >> race >> class_; recv_data.rpos(0); if(!sWorld.VerifyName(name.c_str(), name.length())) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(g_characterNameFilter->Parse(name, false)) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } //reserved for console whisper if(name == "Console" || name == "console") { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(objmgr.GetPlayerInfoByName(name.c_str()) != 0) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(!sHookInterface.OnNewCharacter(race, class_, this, name.c_str())) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if( class_ == DEATHKNIGHT && (!HasFlag(ACCOUNT_FLAG_XPACK_02) || !CanCreateDeathKnight() ) ) { OutPacket(SMSG_CHAR_CREATE, 1, "\x3B"); return; } QueryResult * result = CharacterDatabase.Query("SELECT COUNT(*) FROM banned_names WHERE name = '%s'", CharacterDatabase.EscapeString(name).c_str()); if(result) { if(result->Fetch()[0].GetUInt32() > 0) { // That name is banned! OutPacket(SMSG_CHAR_CREATE, 1, "\x51"); // You cannot use that name delete result; return; } delete result; } // loading characters //checking number of chars is useless since client will not allow to create more than 10 chars //as the 'create' button will not appear (unless we want to decrease maximum number of characters) Player* pNewChar = objmgr.CreatePlayer(); pNewChar->SetSession(this); if(!pNewChar->Create( recv_data )) { // failed. pNewChar->ok_to_remove = true; pNewChar->Destructor(); return; } //Same Faction limitation only applies to PVP and RPPVP realms, after 3.1.0 the Blizzard is disable this function, so actually we are disable this. /*uint32 realmType = sLogonCommHandler.GetRealmType(); if(!HasGMPermissions() && (realmType == REALMTYPE_PVP || realmType == REALMTYPE_RPPVP) && _side >= 0) { if( ((pNewChar->GetTeam() == 0) && (_side == 1)) || ((pNewChar->GetTeam() == 1) && (_side == 0)) ) { pNewChar->ok_to_remove = true; pNewChar->Destructor(); WorldPacket data(1); data.SetOpcode(SMSG_CHAR_CREATE); data << (uint8)ALL_CHARS_ON_PVP_REALM_MUST_AT_SAME_SIDE+1; SendPacket( &data ); return; } }*/ pNewChar->UnSetBanned(); pNewChar->addSpell(22027); // Remove Insignia if(pNewChar->getClass() == WARLOCK) { pNewChar->AddSummonSpell(416, 3110); // imp fireball pNewChar->AddSummonSpell(417, 19505); pNewChar->AddSummonSpell(1860, 3716); pNewChar->AddSummonSpell(1863, 7814); } pNewChar->SaveToDB(true); PlayerInfo *pn=new PlayerInfo; memset(pn, 0, sizeof(PlayerInfo)); pn->guid = pNewChar->GetLowGUID(); pn->name = strdup(pNewChar->GetName()); pn->cl = pNewChar->getClass(); pn->race = pNewChar->getRace(); pn->gender = pNewChar->getGender(); pn->lastLevel = pNewChar->getLevel(); pn->lastZone = pNewChar->GetZoneId(); pn->lastOnline = UNIXTIME; pn->team = pNewChar->GetTeam(); pn->acct = GetAccountId(); #ifdef VOICE_CHAT pn->groupVoiceId = -1; #endif objmgr.AddPlayerInfo(pn); pNewChar->ok_to_remove = true; pNewChar->Destructor(); // CHAR_CREATE_SUCCESS OutPacket(SMSG_CHAR_CREATE, 1, "\x2F"); sLogonCommHandler.UpdateAccountCount(GetAccountId(), 1); m_lastEnumTime = 0; }
void WorldSession::HandleMoveTeleportAck(WorldPacket& recvData) { #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_MOVE_TELEPORT_ACK"); #endif uint64 guid; recvData.readPackGUID(guid); uint32 flags, time; recvData >> flags >> time; // unused #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outStaticDebug("Guid " UI64FMTD, guid); #endif #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outStaticDebug("Flags %u, time %u", flags, time/IN_MILLISECONDS); #endif Player* plMover = _player->m_mover->ToPlayer(); if (!plMover || !plMover->IsBeingTeleportedNear()) return; if (guid != plMover->GetGUID()) return; plMover->SetSemaphoreTeleportNear(0); uint32 old_zone = plMover->GetZoneId(); WorldLocation const& dest = plMover->GetTeleportDest(); Position oldPos(*plMover); plMover->UpdatePosition(dest, true); // xinef: teleport pets if they are not unsummoned if (Pet* pet = plMover->GetPet()) { if (!pet->IsWithinDist3d(plMover, plMover->GetMap()->GetVisibilityRange()-5.0f)) pet->NearTeleportTo(plMover->GetPositionX(), plMover->GetPositionY(), plMover->GetPositionZ(), pet->GetOrientation()); } if (oldPos.GetExactDist2d(plMover) > 100.0f) { uint32 newzone, newarea; plMover->GetZoneAndAreaId(newzone, newarea, true); plMover->UpdateZone(newzone, newarea); // new zone if (old_zone != newzone) { // honorless target if (plMover->pvpInfo.IsHostile) plMover->CastSpell(plMover, 2479, true); // in friendly area else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) plMover->UpdatePvP(false, false); } } // resummon pet GetPlayer()->ResummonPetTemporaryUnSummonedIfAny(); //lets process all delayed operations on successful teleport GetPlayer()->ProcessDelayedOperations(); plMover->GetMotionMaster()->ReinitializeMovement(); // pussywizard: client forgets about losing control, resend it if (plMover->HasUnitState(UNIT_STATE_FLEEING|UNIT_STATE_CONFUSED) || plMover->IsCharmed()) // only in such cases SetClientControl(self, false) is sent plMover->SetClientControl(plMover, false, true); }
bool ChatHandler::HandleFlyMountCommand(char* /*args*/) { Player *chr = m_session->GetPlayer(); // Zakaz: if( chr->isInCombat() // - Pocas combatu || chr->GetMap()->Instanceable() // - V instancii || !chr->CanFreeMove() ) // - Ak sa nemoze volne pohybovat (sap, taxi ...) { SendSysMessage(LANG_YOU_IN_COMBAT); SetSentErrorMessage(true); return false; } // smrt if(chr->isDead()) { SendSysMessage("You are dead!"); SetSentErrorMessage(true); return false; } // zakaz pre low lvl if(chr->getLevel() != 70) { SendSysMessage("Required 70 level!"); SetSentErrorMessage(true); return false; } switch(chr->GetAreaId()) { //case 1637: // orgrimmar //case 1519: // stormwind //case 3487: // silvermoon case 168: // Tirisfal glades sea case 1256: // Azshara sea case 4080: // ioqd SendSysMessage("Not allowed here!"); SetSentErrorMessage(true); return false; } // cely ioqd a Diremaul if(chr->GetZoneId() == 4080 || chr->GetZoneId() == 2557) { SendSysMessage("Not allowed here!"); SetSentErrorMessage(true); return false; } // ine mapy ako azeroth if(chr->GetMapId() != 0 && chr->GetMapId() != 1 && chr->GetMapId() != 530) { SendSysMessage("Not allowed here!"); SetSentErrorMessage(true); return false; } // dismount chr->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED); Item * firstpositem = chr->GetItemByPos(INVENTORY_SLOT_BAG_0, 23); if(firstpositem && ( firstpositem->GetProto()->RequiredSkill == 762 && firstpositem->GetProto()->RequiredSkillRank > 150 || // 762 = riding skill firstpositem->GetProto()->ItemId == 34060 || // Flying Machine Control firstpositem->GetProto()->ItemId == 34061 )) // Turbo-Charged Flying Machine Control chr->CastSpell(chr, firstpositem->GetProto()->Spells[0].SpellId, false); else if(chr->getClass() == CLASS_DRUID) { // odstranenie formy chr->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); // swift flight form chr->CastSpell(chr, 40120, false); } // alici grifina else if (chr->GetTeam() == ALLIANCE) chr->CastSpell(chr, 32290, false); // horda netopiera else chr->CastSpell(chr, 32295, false); return true; }
bool Guild::FillPlayerData(uint64 guid, MemberSlot* memslot) { std::string plName; uint32 plLevel; uint32 plClass; uint32 plZone; Player* pl = objmgr.GetPlayer(guid); if(pl) { plName = pl->GetName(); plLevel = pl->getLevel(); plClass = pl->getClass(); plZone = pl->GetZoneId(); } else { QueryResult *result = CharacterDatabase.PQuery("SELECT name,data,zone,class FROM characters WHERE guid = '%u'", GUID_LOPART(guid)); if(!result) return false; // player doesn't exist Field *fields = result->Fetch(); plName = fields[0].GetCppString(); Tokens data = StrSplit(fields[1].GetCppString(), " "); plLevel = Player::GetUInt32ValueFromArray(data,UNIT_FIELD_LEVEL); plZone = fields[2].GetUInt32(); plClass = fields[3].GetUInt32(); delete result; if(plLevel<1||plLevel>STRONG_MAX_LEVEL) // can be at broken `data` field { sLog.outError("Player (GUID: %u) has a broken data in field `characters`.`data`.",GUID_LOPART(guid)); return false; } if(!plZone) { sLog.outError("Player (GUID: %u) has broken zone-data",GUID_LOPART(guid)); //here it will also try the same, to get the zone from characters-table, but additional it tries to find plZone = Player::GetZoneIdFromDB(guid); //the zone through xy coords.. this is a bit redundant, but //shouldn't be called often } if(plClass<CLASS_WARRIOR||plClass>=MAX_CLASSES) // can be at broken `class` field { sLog.outError("Player (GUID: %u) has a broken data in field `characters`.`class`.",GUID_LOPART(guid)); return false; } } memslot->name = plName; memslot->level = plLevel; memslot->Class = plClass; memslot->zoneId = plZone; return(true); }
/*this procedure handles clients CMSG_REQUEST_PARTY_MEMBER_STATS request*/ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_REQUEST_PARTY_MEMBER_STATS"); uint64 guid; recvData >> guid; Player* player = HashMapHolder<Player>::Find(guid); if (!player) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.appendPackGUID(guid); data << (uint32) GROUP_UPDATE_FLAG_STATUS; data << (uint16) MEMBER_STATUS_OFFLINE; SendPacket(&data); return; } Pet* pet = player->GetPet(); WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.append(player->GetPackGUID()); uint32 mask1 = GROUP_UPDATE_FULL; if (pet) mask1 |= GROUP_UPDATE_PET; Powers powerType = player->getPowerType(); data << uint32(mask1); // group update mask data << uint16(MEMBER_STATUS_ONLINE); // member's online status, GROUP_UPDATE_FLAG_STATUS data << uint32(player->GetHealth()); // GROUP_UPDATE_FLAG_CUR_HP data << uint32(player->GetMaxHealth()); // GROUP_UPDATE_FLAG_MAX_HP data << uint8 (powerType); // GROUP_UPDATE_FLAG_POWER_TYPE data << uint16(player->GetPower(powerType)); // GROUP_UPDATE_FLAG_CUR_POWER data << uint16(player->GetMaxPower(powerType)); // GROUP_UPDATE_FLAG_MAX_POWER data << uint16(player->getLevel()); // GROUP_UPDATE_FLAG_LEVEL data << uint16(player->GetZoneId()); // GROUP_UPDATE_FLAG_ZONE data << uint16(0); // GROUP_UPDATE_FLAG_UNK100 data << uint16(player->GetPositionX()); // GROUP_UPDATE_FLAG_POSITION data << uint16(player->GetPositionY()); // GROUP_UPDATE_FLAG_POSITION data << uint16(player->GetPositionZ()); // GROUP_UPDATE_FLAG_POSITION // GROUP_UPDATE_FLAG_AURAS data << uint8(1); uint64 auramask = 0; size_t maskPos = data.wpos(); data << uint64(auramask); // placeholder data << uint32(MAX_AURAS); // count for (uint8 i = 0; i < MAX_AURAS; ++i) { if (AuraApplication const* aurApp = player->GetVisibleAura(i)) { auramask |= (uint64(1) << i); data << uint32(aurApp->GetBase()->GetId()); data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) data << int32(eff->GetAmount()); else data << int32(0); } } } } data.put<uint64>(maskPos, auramask); // GROUP_UPDATE_FLAG_AURAS if (pet) { Powers petpowertype = pet->getPowerType(); data << uint64(pet->GetGUID()); // GROUP_UPDATE_FLAG_PET_GUID data << pet->GetName(); // GROUP_UPDATE_FLAG_PET_NAME data << uint16(pet->GetDisplayId()); // GROUP_UPDATE_FLAG_PET_MODEL_ID data << uint32(pet->GetHealth()); // GROUP_UPDATE_FLAG_PET_CUR_HP data << uint32(pet->GetMaxHealth()); // GROUP_UPDATE_FLAG_PET_MAX_HP data << uint8 (petpowertype); // GROUP_UPDATE_FLAG_PET_POWER_TYPE data << uint16(pet->GetPower(petpowertype)); // GROUP_UPDATE_FLAG_PET_CUR_POWER data << uint16(pet->GetMaxPower(petpowertype)); // GROUP_UPDATE_FLAG_PET_MAX_POWER // GROUP_UPDATE_FLAG_PET_AURAS data << uint8(1); uint64 petauramask = 0; size_t petMaskPos = data.wpos(); data << uint64(petauramask); // placeholder data << uint32(MAX_AURAS); // count for (uint8 i = 0; i < MAX_AURAS; ++i) { if (AuraApplication const* aurApp = pet->GetVisibleAura(i)) { petauramask |= (uint64(1) << i); data << uint32(aurApp->GetBase()->GetId()); data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) data << int32(eff->GetAmount()); else data << int32(0); } } } } data.put<uint64>(petMaskPos, petauramask); // GROUP_UPDATE_FLAG_PET_AURAS } // else not needed, flags do not include any PET_ update // GROUP_UPDATE_FLAG_PHASE data << uint32(8); // either 0 or 8, same unk found in SMSG_PHASESHIFT data << uint32(0); // count // for (count) *data << uint16(phaseId) SendPacket(&data); }
/*this procedure handles clients CMSG_REQUEST_PARTY_MEMBER_STATS request*/ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recv_data) { DEBUG_LOG("WORLD: Received opcode CMSG_REQUEST_PARTY_MEMBER_STATS"); ObjectGuid guid; recv_data >> guid; Player* player = ObjectAccessor::FindPlayer(guid, false); if (!player) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3 + 4 + 2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data << guid.WriteAsPacked(); data << uint32(GROUP_UPDATE_FLAG_STATUS); data << uint16(MEMBER_STATUS_OFFLINE); SendPacket(&data); return; } Pet* pet = player->GetPet(); WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4 + 2 + 2 + 2 + 1 + 2 * 6 + 8 + 1 + 8); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data << player->GetPackGUID(); uint32 mask1 = GROUP_UPDATE_FLAG_STATUS | GROUP_UPDATE_FLAG_CUR_HP | GROUP_UPDATE_FLAG_MAX_HP | GROUP_UPDATE_FLAG_POWER_TYPE | GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER | GROUP_UPDATE_FLAG_LEVEL | GROUP_UPDATE_FLAG_ZONE | GROUP_UPDATE_FLAG_POSITION | GROUP_UPDATE_FLAG_AURAS | GROUP_UPDATE_FLAG_PET_NAME | GROUP_UPDATE_FLAG_PET_AURAS | GROUP_UPDATE_FLAG_PHASE; if (pet) mask1 = 0x7FEFFEFF; // full mask & ~(GROUP_UPDATE_FLAG_VEHICLE_SEAT | GROUP_UPDATE_FLAG_UNK) Powers powerType = player->getPowerType(); data << uint32(mask1); // group update mask data << uint16(MEMBER_STATUS_ONLINE); // member's online status data << uint32(player->GetHealth()); // GROUP_UPDATE_FLAG_CUR_HP data << uint32(player->GetMaxHealth()); // GROUP_UPDATE_FLAG_MAX_HP data << uint8(powerType); // GROUP_UPDATE_FLAG_POWER_TYPE data << uint16(player->GetPower(powerType)); // GROUP_UPDATE_FLAG_CUR_POWER data << uint16(player->GetMaxPower(powerType)); // GROUP_UPDATE_FLAG_MAX_POWER data << uint16(player->getLevel()); // GROUP_UPDATE_FLAG_LEVEL // verify player coordinates and zoneid to send to teammates uint16 iZoneId = 0; uint16 iCoordX = 0; uint16 iCoordY = 0; uint16 iCoordZ = 0; if (player->IsInWorld()) { iZoneId = player->GetZoneId(); iCoordX = player->GetPositionX(); iCoordY = player->GetPositionY(); iCoordZ = player->GetPositionZ(); } else if (player->IsBeingTeleported()) // Player is in teleportation { WorldLocation& loc = player->GetTeleportDest(); // So take teleportation destination iZoneId = sTerrainMgr.GetZoneId(loc.mapid, loc.coord_x, loc.coord_y, loc.coord_z); iCoordX = loc.coord_x; iCoordY = loc.coord_y; iCoordZ = loc.coord_z; } else { // unknown player status. } data << uint16(iZoneId); // GROUP_UPDATE_FLAG_ZONE data << uint16(iCoordX); // GROUP_UPDATE_FLAG_POSITION data << uint16(iCoordY); // GROUP_UPDATE_FLAG_POSITION data << uint16(iCoordZ); // GROUP_UPDATE_FLAG_POSITION data << uint8(1); // if true, client clears all auras that are not in auramask and whose index is lower amount sent below uint64 auramask = 0; size_t maskPos = data.wpos(); data << uint64(auramask); // placeholder, server sends 0xFFFFFFFFFFFFFFFF here, but with 1 above it seems no difference data << uint32(MAX_AURAS); // server sends here number of visible auras, but client checks // if aura is in auramask, so it seems no difference if there will be MAX_AURAS for (uint8 i = 0; i < MAX_AURAS; ++i) { if (SpellAuraHolder* holder = player->GetVisibleAura(i)) { auramask |= (uint64(1) << i); data << uint32(holder->GetId()); data << uint16(holder->GetAuraFlags()); if (holder->GetAuraFlags() & AFLAG_EFFECT_AMOUNT_SEND) for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i) if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i))) data << int32(aura->GetModifier()->m_amount); else data << int32(0); } } data.put<uint64>(maskPos, auramask); // GROUP_UPDATE_FLAG_AURAS if (pet) { Powers petpowertype = pet->getPowerType(); data << pet->GetObjectGuid(); // GROUP_UPDATE_FLAG_PET_GUID data << pet->GetName(); // GROUP_UPDATE_FLAG_PET_NAME data << uint16(pet->GetDisplayId()); // GROUP_UPDATE_FLAG_PET_MODEL_ID data << uint32(pet->GetHealth()); // GROUP_UPDATE_FLAG_PET_CUR_HP data << uint32(pet->GetMaxHealth()); // GROUP_UPDATE_FLAG_PET_MAX_HP data << uint8(petpowertype); // GROUP_UPDATE_FLAG_PET_POWER_TYPE data << uint16(pet->GetPower(petpowertype)); // GROUP_UPDATE_FLAG_PET_CUR_POWER data << uint16(pet->GetMaxPower(petpowertype)); // GROUP_UPDATE_FLAG_PET_MAX_POWER data << uint8(1); // if true, client clears all auras that are not in auramask and whose index is lower amount sent below uint64 petauramask = 0; size_t petMaskPos = data.wpos(); data << uint64(petauramask); // placeholder, server sends 0xFFFFFFFFFFFFFFFF here, but with 1 above it seems no difference data << uint32(MAX_AURAS); // server sends here number of visible auras, but client checks // if aura is in auramask, so it seems no difference if there will be MAX_AURAS for (uint8 i = 0; i < MAX_AURAS; ++i) { if (SpellAuraHolder* holder = pet->GetVisibleAura(i)) { petauramask |= (uint64(1) << i); data << uint32(holder->GetId()); data << uint16(holder->GetAuraFlags()); if (holder->GetAuraFlags() & AFLAG_EFFECT_AMOUNT_SEND) for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i) if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i))) data << int32(aura->GetModifier()->m_amount); else data << int32(0); } } data.put<uint64>(petMaskPos, petauramask); // GROUP_UPDATE_FLAG_PET_AURAS } else { data << uint8(0); // GROUP_UPDATE_FLAG_PET_NAME data << uint8(1); // GROUP_UPDATE_FLAG_PET_AURAS data << uint64(0); // GROUP_UPDATE_FLAG_PET_AURAS data << uint32(0); // GROUP_UPDATE_FLAG_PET_AURAS } data << uint32(8); // GROUP_UPDATE_FLAG_PHASE data << uint32(0); // GROUP_UPDATE_FLAG_PHASE data << uint8(0); // GROUP_UPDATE_FLAG_PHASE SendPacket(&data); }
bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code) { player->PlayerTalkClass->ClearMenus(); std::string targetName(code); if (player->GetName() == targetName) { player->GetSession()->SendNotification("You can not challenge yourself"); OnGossipSelect(player, creature, SENDER_CHALLENGE, GOSSIP_ACTION_INFO_DEF); return true; } Player* target = sObjectAccessor->FindPlayerByName(targetName); if (!target) { player->GetSession()->SendNotification("Challenged player not logged in"); OnGossipSelect(player, creature, SENDER_CHALLENGE, GOSSIP_ACTION_INFO_DEF); return true; } if (player->GetGUID() == target->GetGUID()) { player->GetSession()->SendNotification("You can not challenge yourself"); OnGossipSelect(player, creature, SENDER_CHALLENGE, GOSSIP_ACTION_INFO_DEF); return true; } if (target->GetZoneId() != player->GetZoneId()) { player->GetSession()->SendNotification("%s is not in same zone", target->GetName().c_str()); OnGossipSelect(player, creature, SENDER_CHALLENGE, GOSSIP_ACTION_INFO_DEF); return true; } #if (USE_TOKEN == 1) if (!player->HasItemCount(TOKEN_ID, action)) { player->GetSession()->SendNotification("You do not have enough tokens"); OnGossipSelect(player, creature, SENDER_CHALLENGE, GOSSIP_ACTION_INFO_DEF); return true; } if (!target->HasItemCount(TOKEN_ID, action)) { player->GetSession()->SendNotification("%s does not have enough tokens", target->GetName().c_str()); OnGossipSelect(player, creature, SENDER_CHALLENGE, GOSSIP_ACTION_INFO_DEF); return true; } #else if (target->GetMoney() < action * GOLD) { player->GetSession()->SendNotification("%s does not have enough money", target->GetName().c_str()); OnGossipSelect(player, creature, SENDER_CHALLENGE, GOSSIP_ACTION_INFO_DEF); return true; } if (player->GetMoney() < action * GOLD) { player->GetSession()->SendNotification("You do not have enough money"); OnGossipSelect(player, creature, SENDER_CHALLENGE, GOSSIP_ACTION_INFO_DEF); return true; } #endif if (!bloodMoney.AddChallenger(target->GetGUIDLow(), player->GetGUIDLow(), action)) { player->GetSession()->SendNotification("One of you already challenged the other"); OnGossipSelect(player, creature, SENDER_CHALLENGE, GOSSIP_ACTION_INFO_DEF); return true; } creature->Whisper(player->GetName() + " has requested a Blood Money duel with you!", LANG_UNIVERSAL, target, true); player->CLOSE_GOSSIP_MENU(); return true; }
void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_MOVE_TELEPORT_ACK"); ObjectGuid guid; uint32 flags, time; recvPacket >> flags >> time; // didn't tested ; in worst case should switch those but i think isn't needed guid[1] = recvPacket.ReadBit(); guid[7] = recvPacket.ReadBit(); guid[0] = recvPacket.ReadBit(); guid[5] = recvPacket.ReadBit(); guid[4] = recvPacket.ReadBit(); guid[2] = recvPacket.ReadBit(); guid[6] = recvPacket.ReadBit(); guid[3] = recvPacket.ReadBit(); recvPacket.ReadByteSeq(guid[1]); recvPacket.ReadByteSeq(guid[5]); recvPacket.ReadByteSeq(guid[4]); recvPacket.ReadByteSeq(guid[2]); recvPacket.ReadByteSeq(guid[7]); recvPacket.ReadByteSeq(guid[6]); recvPacket.ReadByteSeq(guid[0]); recvPacket.ReadByteSeq(guid[3]); sLog->outDebug(LOG_FILTER_NETWORKIO, "Guid " UI64FMTD, uint64(guid)); sLog->outDebug(LOG_FILTER_NETWORKIO, "Flags %u, time %u", flags, time/IN_MILLISECONDS); Player* plMover = _player->m_mover->ToPlayer(); if (!plMover || !plMover->IsBeingTeleportedNear()) return; if (guid != plMover->GetGUID()) return; plMover->SetSemaphoreTeleportNear(false); uint32 old_zone = plMover->GetZoneId(); WorldLocation const& dest = plMover->GetTeleportDest(); plMover->UpdatePosition(dest, true); uint32 newzone, newarea; plMover->GetZoneAndAreaId(newzone, newarea); plMover->UpdateZone(newzone, newarea); // new zone if (old_zone != newzone) { // honorless target if (plMover->pvpInfo.inHostileArea) plMover->CastSpell(plMover, 2479, true); // in friendly area else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) plMover->UpdatePvP(false, false); } // resummon pet GetPlayer()->ResummonPetTemporaryUnSummonedIfAny(); //lets process all delayed operations on successful teleport GetPlayer()->ProcessDelayedOperations(); }
void SocialMgr::AddFriend(Player* plr, std::string friendName) { if(!plr) return; WorldPacket data( SMSG_FRIEND_STATUS, 22 ); PlayerInfo* playerInfo = objmgr.GetPlayerInfo(plr->GetGUID()); PlayerInfo* friendInfo = objmgr.GetPlayerInfoByName(friendName); if(playerInfo == NULL) { // We shouldn't get here data << (uint8)FRIEND_DB_ERROR; plr->GetSession()->SendPacket( &data ); return; } if( friendInfo == NULL) { sLog.outDetail("WORLD: Guid of %s not found ", friendName.c_str() ); data << (uint8)FRIEND_NOT_FOUND; plr->GetSession()->SendPacket( &data ); return; } if( friendInfo->team != playerInfo->team ) { sLog.outDebug("SocialMgr: %s tried to add an ennemy to his friendlist", plr->GetName()); data << (uint8)FRIEND_ENEMY << (uint64)friendInfo->guid; plr->GetSession()->SendPacket( &data ); return; } uint64 pGuid = playerInfo->guid; uint64 fGuid = friendInfo->guid; Player *pFriend = objmgr.GetPlayer(fGuid); if ( pGuid == fGuid ) { sLog.outDebug("SocialMgr: %s tried to add himself to his friendlist", plr->GetName()); data << (uint8)FRIEND_SELF << (uint64)fGuid; plr->GetSession()->SendPacket(&data); return; } if( HasFriend(pGuid, fGuid) ) { sLog.outDebug("SocialMgr: %s tried to add someone who is already in his friendlist", plr->GetName()); data << (uint8)FRIEND_ALREADY << (uint64)fGuid; plr->GetSession()->SendPacket(&data); return; } sLog.outDebug("SocialMgr: %s added %s to his friendlist", playerInfo->name.c_str(), friendInfo->name.c_str()); if ( pFriend ) { data << (uint8)FRIEND_ADDED_ONLINE << (uint64)fGuid << (uint8)1; data << (uint32)pFriend->GetZoneId() << (uint32)pFriend->getLevel() << (uint32)pFriend->getClass(); } else data << (uint8)FRIEND_ADDED_OFFLINE << (uint64)friendInfo->guid; if( m_isInFriendList.find(fGuid) == m_isInFriendList.end() ) m_isInFriendList[fGuid] = new std::set<uint64>; if( m_hasInFriendList.find(pGuid) == m_hasInFriendList.end() ) m_hasInFriendList[pGuid] = new std::set<uint64>; m_hasInFriendList[pGuid]->insert(fGuid); m_isInFriendList[fGuid]->insert(pGuid); plr->GetSession()->SendPacket( &data ); CharacterDatabase.Execute("INSERT INTO social(guid,socialguid,flags) VALUES (%I64u,%I64u,'FRIEND')",pGuid,fGuid); }
void WorldSession::SendPartyMemberStatsChanged(uint64 Guid, uint32 mask) { if (mask == GROUP_UPDATE_FLAG_NONE) return; Player *player = objmgr.GetPlayer(Guid); if(!player) //currently do not send update if player is offline return; /*if(!player && mask != GROUP_UPDATE_FLAG_ONLINE) //if player is offline - then send nothing, but OFFLINE status return;*/ if(mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); uint32 byteCount = 0; for (int i=1;i<GROUP_UPDATE_FLAGS_COUNT;++i) if (mask & 1<<i) byteCount += GroupUpdateLength[i]; WorldPacket data(SMSG_PARTY_MEMBER_STATS, 8+4+byteCount); if (player) data.append(player->GetPackGUID()); else data.appendPackGUID(Guid); data << (uint32) mask; if (mask & GROUP_UPDATE_FLAG_ONLINE) { if (player) { if (player->IsPvP()) data << uint8(MEMBER_STATUS_ONLINE | MEMBER_STATUS_PVP); else data << (uint8) MEMBER_STATUS_ONLINE; } else data << (uint8) MEMBER_STATUS_OFFLINE; } if (mask & GROUP_UPDATE_FLAG_CUR_HP) data << (uint16) player->GetHealth(); if (mask & GROUP_UPDATE_FLAG_MAX_HP) data << (uint16) player->GetMaxHealth(); Powers powerType = player->getPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) data << (uint8) powerType; if (mask & GROUP_UPDATE_FLAG_CUR_POWER) data << (uint16) player->GetPower(powerType); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) data << (uint16) player->GetMaxPower(powerType); if (mask & GROUP_UPDATE_FLAG_LEVEL) data << (uint16) player->getLevel(); if (mask & GROUP_UPDATE_FLAG_ZONE) data << (uint16) player->GetZoneId(); if (mask & GROUP_UPDATE_FLAG_POSITION) data << (uint16) player->GetPositionX() << (uint16) player->GetPositionY(); //TODO: add missing group update flags (pets?) SendPacket(&data); }
void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data, 10); std::string name; uint8 race, class_; recv_data >> name >> race >> class_; recv_data.rpos(0); WorldPacket data(SMSG_CHAR_CREATE, 1); if(!sWorld.VerifyName(name.c_str(), name.length())) { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } if(g_characterNameFilter->Parse(name, false)) { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } //reserved for console whisper if(name == "Console" || name == "console") { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } if(objmgr.GetPlayerInfoByName(name.c_str()) != 0) { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } if(!sHookInterface.OnNewCharacter(race, class_, this, name.c_str())) { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } if( class_ == DEATHKNIGHT ) { if(!HasFlag(ACCOUNT_FLAG_XPACK_02)) { data << uint8(CHAR_CREATE_EXPANSION); SendPacket(&data); return; } else if(!CanCreateDeathKnight() && !HasGMPermissions()) { if(sWorld.m_deathKnightReqLevel > m_highestLevel) data << uint8(CHAR_CREATE_LEVEL_REQUIREMENT); else data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT); SendPacket(&data); return; } } QueryResult * result = CharacterDatabase.Query("SELECT COUNT(*) FROM banned_names WHERE name = '%s'", CharacterDatabase.EscapeString(name).c_str()); if(result) { if(result->Fetch()[0].GetUInt32() > 0) { // That name is banned! data << uint8(CHAR_NAME_PROFANE); SendPacket(&data); delete result; return; } delete result; } // loading characters //checking number of chars is useless since client will not allow to create more than 10 chars //as the 'create' button will not appear (unless we want to decrease maximum number of characters) Player* pNewChar = objmgr.CreatePlayer(); pNewChar->SetSession(this); if(!pNewChar->Create( recv_data )) { // failed. pNewChar->ok_to_remove = true; pNewChar->Destruct(); pNewChar = NULLPLR; return; } pNewChar->UnSetBanned(); pNewChar->addSpell(22027); // Remove Insignia if(pNewChar->getClass() == WARLOCK) { pNewChar->AddSummonSpell(416, 3110); // imp fireball pNewChar->AddSummonSpell(417, 19505); pNewChar->AddSummonSpell(1860, 3716); pNewChar->AddSummonSpell(1863, 7814); } pNewChar->SaveToDB(true); PlayerInfo *pn = new PlayerInfo; memset(pn, 0, sizeof(PlayerInfo)); pn->guid = pNewChar->GetLowGUID(); pn->name = strdup(pNewChar->GetName()); pn->_class = pNewChar->getClass(); pn->race = pNewChar->getRace(); pn->gender = pNewChar->getGender(); pn->lastLevel = pNewChar->getLevel(); pn->lastZone = pNewChar->GetZoneId(); pn->lastOnline = UNIXTIME; pn->team = pNewChar->GetTeam(); pn->acct = GetAccountId(); objmgr.AddPlayerInfo(pn); pNewChar->ok_to_remove = true; pNewChar->Destruct(); pNewChar = NULLPLR; // CHAR_CREATE_SUCCESS data << uint8(CHAR_CREATE_SUCCESS); SendPacket(&data); sLogonCommHandler.UpdateAccountCount(GetAccountId(), 1); }
void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data, 10); std::string name; uint8 race, class_; recv_data >> name >> race >> class_; recv_data.rpos(0); if(!VerifyName(name.c_str(), name.length())) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(g_characterNameFilter->Parse(name, false)) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } //reserved for console whisper if(name == "Console" || name == "console") { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(objmgr.GetPlayerInfoByName(name.c_str()) != 0) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(!sHookInterface.OnNewCharacter(race, class_, this, name.c_str())) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if( class_ == CLASS_DEATHKNIGHT && (!HasFlag(ACCOUNT_FLAG_XPACK_02) || !CanCreateDeathKnight() ) ) { OutPacket(SMSG_CHAR_CREATE, 1, "\x3B"); return; } QueryResult * result = CharacterDatabase.Query("SELECT COUNT(*) FROM banned_names WHERE name = '%s'", CharacterDatabase.EscapeString(name).c_str()); if(result) { if(result->Fetch()[0].GetUInt32() > 0) { // That name is banned! OutPacket(SMSG_CHAR_CREATE, 1, "\x51"); // You cannot use that name delete result; return; } delete result; } // loading characters // checking number of chars is useless since client will not allow to create more than 10 chars // as the 'create' button will not appear (unless we want to decrease maximum number of characters) Player* pNewChar = objmgr.CreatePlayer(); pNewChar->SetSession(this); if(!pNewChar->Create( recv_data )) { // Player not create (race/class problem?) pNewChar->ok_to_remove = true; pNewChar->Destructor(); pNewChar = NULL; return; } pNewChar->UnSetBanned(); pNewChar->addSpell(22027); // Remove Insignia if(pNewChar->getClass() == CLASS_WARLOCK) { pNewChar->AddSummonSpell(416, 3110); // imp fireball pNewChar->AddSummonSpell(417, 19505); pNewChar->AddSummonSpell(1860, 3716); pNewChar->AddSummonSpell(1863, 7814); } // Player created, save it now pNewChar->SaveToDB(true); PlayerInfo *pn=new PlayerInfo; memset(pn, 0, sizeof(PlayerInfo)); pn->guid = pNewChar->GetLowGUID(); pn->name = strdup(pNewChar->GetName()); pn->cl = pNewChar->getClass(); pn->race = pNewChar->getRace(); pn->gender = pNewChar->getGender(); pn->lastLevel = pNewChar->getLevel(); pn->lastZone = pNewChar->GetZoneId(); pn->lastOnline = UNIXTIME; pn->team = pNewChar->GetTeam(); pn->acct = GetAccountId(); objmgr.AddPlayerInfo(pn); pNewChar->ok_to_remove = true; pNewChar->Destructor(); pNewChar = NULL; // CHAR_CREATE_SUCCESS OutPacket(SMSG_CHAR_CREATE, 1, "\x2F"); sLogonCommHandler.UpdateAccountCount(GetAccountId(), 1); m_lastEnumTime = 0; }
/*this procedure handles clients CMSG_REQUEST_PARTY_MEMBER_STATS request*/ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_REQUEST_PARTY_MEMBER_STATS"); uint64 guid; recvData >> guid; Player* player = HashMapHolder<Player>::Find(guid); if (!player) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.appendPackGUID(guid); data << uint32(GROUP_UPDATE_FLAG_STATUS); data << uint16(MEMBER_STATUS_OFFLINE); SendPacket(&data); return; } Pet* pet = player->GetPet(); Powers powerType = player->getPowerType(); std::set<uint16> phaseIds = player->GetPhaseIds(); WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.append(player->GetPackGUID()); uint32 updateFlags = GROUP_UPDATE_FLAG_STATUS | GROUP_UPDATE_FLAG_CUR_HP | GROUP_UPDATE_FLAG_MAX_HP | GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER | GROUP_UPDATE_FLAG_LEVEL | GROUP_UPDATE_FLAG_ZONE | GROUP_UPDATE_FLAG_POSITION | GROUP_UPDATE_FLAG_AURAS | GROUP_UPDATE_FLAG_PET_NAME | GROUP_UPDATE_FLAG_PET_MODEL_ID | GROUP_UPDATE_FLAG_PET_AURAS; if (powerType != POWER_MANA) updateFlags |= GROUP_UPDATE_FLAG_POWER_TYPE; if (pet) updateFlags |= GROUP_UPDATE_FLAG_PET_GUID | GROUP_UPDATE_FLAG_PET_CUR_HP | GROUP_UPDATE_FLAG_PET_MAX_HP | GROUP_UPDATE_FLAG_PET_POWER_TYPE | GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER; if (player->GetVehicle()) updateFlags |= GROUP_UPDATE_FLAG_VEHICLE_SEAT; if (!phaseIds.empty()) updateFlags |= GROUP_UPDATE_FLAG_PHASE; uint16 playerStatus = MEMBER_STATUS_ONLINE; if (player->IsPvP()) playerStatus |= MEMBER_STATUS_PVP; if (!player->IsAlive()) { if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) playerStatus |= MEMBER_STATUS_GHOST; else playerStatus |= MEMBER_STATUS_DEAD; } if (player->IsFFAPvP()) playerStatus |= MEMBER_STATUS_PVP_FFA; if (player->isAFK()) playerStatus |= MEMBER_STATUS_AFK; if (player->isDND()) playerStatus |= MEMBER_STATUS_DND; data << uint32(updateFlags); data << uint16(playerStatus); // GROUP_UPDATE_FLAG_STATUS data << uint32(player->GetHealth()); // GROUP_UPDATE_FLAG_CUR_HP data << uint32(player->GetMaxHealth()); // GROUP_UPDATE_FLAG_MAX_HP if (updateFlags & GROUP_UPDATE_FLAG_POWER_TYPE) data << uint8(powerType); data << uint16(player->GetPower(powerType)); // GROUP_UPDATE_FLAG_CUR_POWER data << uint16(player->GetMaxPower(powerType)); // GROUP_UPDATE_FLAG_MAX_POWER data << uint16(player->getLevel()); // GROUP_UPDATE_FLAG_LEVEL data << uint16(player->GetZoneId()); // GROUP_UPDATE_FLAG_ZONE data << uint16(player->GetPositionX()); // GROUP_UPDATE_FLAG_POSITION data << uint16(player->GetPositionY()); // GROUP_UPDATE_FLAG_POSITION data << uint16(player->GetPositionZ()); // GROUP_UPDATE_FLAG_POSITION // GROUP_UPDATE_FLAG_AURAS data << uint8(1); uint64 auramask = 0; size_t maskPos = data.wpos(); data << uint64(auramask); // placeholder data << uint32(MAX_AURAS); // count for (uint8 i = 0; i < MAX_AURAS; ++i) { if (AuraApplication const* aurApp = player->GetVisibleAura(i)) { auramask |= (uint64(1) << i); data << uint32(aurApp->GetBase()->GetId()); data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) data << int32(eff->GetAmount()); else data << int32(0); } } } } data.put<uint64>(maskPos, auramask); // GROUP_UPDATE_FLAG_AURAS if (updateFlags & GROUP_UPDATE_FLAG_PET_GUID) data << uint64(pet->GetGUID()); data << std::string(pet ? pet->GetName() : ""); // GROUP_UPDATE_FLAG_PET_NAME data << uint16(pet ? pet->GetDisplayId() : 0); // GROUP_UPDATE_FLAG_PET_MODEL_ID if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_HP) data << uint32(pet->GetHealth()); if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_HP) data << uint32(pet->GetMaxHealth()); if (updateFlags & GROUP_UPDATE_FLAG_PET_POWER_TYPE) data << (uint8)pet->getPowerType(); if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_POWER) data << uint16(pet->GetPower(pet->getPowerType())); if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_POWER) data << uint16(pet->GetMaxPower(pet->getPowerType())); // GROUP_UPDATE_FLAG_PET_AURAS uint64 petAuraMask = 0; data << uint8(1); maskPos = data.wpos(); data << uint64(petAuraMask); // placeholder data << uint32(MAX_AURAS); // count if (pet) { for (uint8 i = 0; i < MAX_AURAS; ++i) { if (AuraApplication const* aurApp = pet->GetVisibleAura(i)) { petAuraMask |= (uint64(1) << i); data << uint32(aurApp->GetBase()->GetId()); data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) data << int32(eff->GetAmount()); else data << int32(0); } } } } } data.put<uint64>(maskPos, petAuraMask); // GROUP_UPDATE_FLAG_PET_AURAS if (updateFlags & GROUP_UPDATE_FLAG_VEHICLE_SEAT) data << uint32(player->GetVehicle()->GetVehicleInfo()->m_seatID[player->m_movementInfo.transport.seat]); if (updateFlags & GROUP_UPDATE_FLAG_PHASE) { data << uint32(phaseIds.empty() ? 8 : 0); data << uint32(phaseIds.size()); for (std::set<uint16>::const_iterator itr = phaseIds.begin(); itr != phaseIds.end(); ++itr) data << uint16(*itr); } SendPacket(&data); }
void WorldSession::HandleWhoOpcode(WorldPacket& recv_data) { DEBUG_LOG("WORLD: Received opcode CMSG_WHO"); // recv_data.hexlike(); uint32 clientcount = 0; uint32 level_min, level_max, racemask, classmask, zones_count, str_count; uint32 zoneids[10]; // 10 is client limit std::string player_name, guild_name; recv_data >> level_min; // maximal player level, default 0 recv_data >> level_max; // minimal player level, default 100 (MAX_LEVEL) recv_data >> player_name; // player name, case sensitive... recv_data >> guild_name; // guild name, case sensitive... recv_data >> racemask; // race mask recv_data >> classmask; // class mask recv_data >> zones_count; // zones count, client limit=10 (2.0.10) if (zones_count > 10) return; // can't be received from real client or broken packet for (uint32 i = 0; i < zones_count; ++i) { uint32 temp; recv_data >> temp; // zone id, 0 if zone is unknown... zoneids[i] = temp; DEBUG_LOG("Zone %u: %u", i, zoneids[i]); } recv_data >> str_count; // user entered strings count, client limit=4 (checked on 2.0.10) if (str_count > 4) return; // can't be received from real client or broken packet DEBUG_LOG("Minlvl %u, maxlvl %u, name %s, guild %s, racemask %u, classmask %u, zones %u, strings %u", level_min, level_max, player_name.c_str(), guild_name.c_str(), racemask, classmask, zones_count, str_count); std::wstring str[4]; // 4 is client limit for (uint32 i = 0; i < str_count; ++i) { std::string temp; recv_data >> temp; // user entered string, it used as universal search pattern(guild+player name)? if (!Utf8toWStr(temp, str[i])) continue; wstrToLower(str[i]); DEBUG_LOG("String %u: %s", i, temp.c_str()); } std::wstring wplayer_name; std::wstring wguild_name; if (!(Utf8toWStr(player_name, wplayer_name) && Utf8toWStr(guild_name, wguild_name))) return; wstrToLower(wplayer_name); wstrToLower(wguild_name); // client send in case not set max level value 100 but mangos support 255 max level, // update it to show GMs with characters after 100 level if (level_max >= MAX_LEVEL) level_max = STRONG_MAX_LEVEL; Team team = _player->GetTeam(); uint32 security = GetSecurity(); bool allowTwoSideWhoList = sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_WHO_LIST); AccountTypes gmLevelInWhoList = (AccountTypes)sWorld.getConfig(CONFIG_UINT32_GM_LEVEL_IN_WHO_LIST); WorldPacket data(SMSG_WHO, 50); // guess size data << uint32(clientcount); // clientcount place holder, listed count data << uint32(clientcount); // clientcount place holder, online count // TODO: Guard Player map HashMapHolder<Player>::MapType& m = sObjectAccessor.GetPlayers(); for (HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr) { Player* pl = itr->second; if (security == SEC_PLAYER) { // player can see member of other team only if CONFIG_BOOL_ALLOW_TWO_SIDE_WHO_LIST if (pl->GetTeam() != team && !allowTwoSideWhoList) continue; // player can see MODERATOR, GAME MASTER, ADMINISTRATOR only if CONFIG_GM_IN_WHO_LIST if (pl->GetSession()->GetSecurity() > gmLevelInWhoList) continue; } // do not process players which are not in world if (!pl->IsInWorld()) continue; // check if target is globally visible for player if (!pl->IsVisibleGloballyFor(_player)) continue; // check if target's level is in level range uint32 lvl = pl->getLevel(); if (lvl < level_min || lvl > level_max) continue; // check if class matches classmask uint32 class_ = pl->getClass(); if (!(classmask & (1 << class_))) continue; // check if race matches racemask uint32 race = pl->getRace(); if (!(racemask & (1 << race))) continue; uint32 pzoneid = pl->GetZoneId(); uint8 gender = pl->getGender(); bool z_show = true; for (uint32 i = 0; i < zones_count; ++i) { if (zoneids[i] == pzoneid) { z_show = true; break; } z_show = false; } if (!z_show) continue; std::string pname = pl->GetName(); std::wstring wpname; if (!Utf8toWStr(pname, wpname)) continue; wstrToLower(wpname); if (!(wplayer_name.empty() || wpname.find(wplayer_name) != std::wstring::npos)) continue; std::string gname = sGuildMgr.GetGuildNameById(pl->GetGuildId()); std::wstring wgname; if (!Utf8toWStr(gname, wgname)) continue; wstrToLower(wgname); if (!(wguild_name.empty() || wgname.find(wguild_name) != std::wstring::npos)) continue; std::string aname; if (AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(pzoneid)) aname = areaEntry->area_name[GetSessionDbcLocale()]; bool s_show = true; for (uint32 i = 0; i < str_count; ++i) { if (!str[i].empty()) { if (wgname.find(str[i]) != std::wstring::npos || wpname.find(str[i]) != std::wstring::npos || Utf8FitTo(aname, str[i])) { s_show = true; break; } s_show = false; } } if (!s_show) continue; data << pname; // player name data << gname; // guild name data << uint32(lvl); // player level data << uint32(class_); // player class data << uint32(race); // player race data << uint8(gender); // player gender data << uint32(pzoneid); // player zone id // 50 is maximum player count sent to client if ((++clientcount) == 50) break; } uint32 count = m.size(); data.put(0, clientcount); // insert right count, listed count data.put(4, count > 50 ? count : clientcount); // insert right count, online count SendPacket(&data); DEBUG_LOG("WORLD: Send SMSG_WHO Message"); }
/*this procedure handles clients CMSG_REQUEST_PARTY_MEMBER_STATS request*/ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recv_data) { DEBUG_LOG("WORLD: Received opcode CMSG_REQUEST_PARTY_MEMBER_STATS"); ObjectGuid guid; recv_data >> guid; Player* player = ObjectAccessor::FindPlayer(guid, false); if (!player) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3 + 4 + 2); data << guid.WriteAsPacked(); data << uint32(GROUP_UPDATE_FLAG_STATUS); data << uint8(MEMBER_STATUS_OFFLINE); SendPacket(&data); return; } Pet* pet = player->GetPet(); WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4 + 2 + 2 + 2 + 1 + 2 * 6 + 8 + 1 + 8); data << player->GetPackGUID(); uint32 mask1 = 0x00040BFF; // common mask, real flags used 0x000040BFF if (pet) mask1 = 0x7FFFFFFF; // for hunters and other classes with pets Powers powerType = player->GetPowerType(); data << uint32(mask1); // group update mask data << uint8(MEMBER_STATUS_ONLINE); // member's online status data << uint16(player->GetHealth()); // GROUP_UPDATE_FLAG_CUR_HP data << uint16(player->GetMaxHealth()); // GROUP_UPDATE_FLAG_MAX_HP data << uint8(powerType); // GROUP_UPDATE_FLAG_POWER_TYPE data << uint16(player->GetPower(powerType)); // GROUP_UPDATE_FLAG_CUR_POWER data << uint16(player->GetMaxPower(powerType)); // GROUP_UPDATE_FLAG_MAX_POWER data << uint16(player->getLevel()); // GROUP_UPDATE_FLAG_LEVEL // verify player coordinates and zoneid to send to teammates uint16 iZoneId = 0; uint16 iCoordX = 0; uint16 iCoordY = 0; if (player->IsInWorld()) { iZoneId = player->GetZoneId(); iCoordX = player->GetPositionX(); iCoordY = player->GetPositionY(); } else if (player->IsBeingTeleported()) // Player is in teleportation { WorldLocation& loc = player->GetTeleportDest(); // So take teleportation destination iZoneId = sTerrainMgr.GetZoneId(loc.mapid, loc.coord_x, loc.coord_y, loc.coord_z); iCoordX = loc.coord_x; iCoordY = loc.coord_y; } else { // unknown player status. } data << uint16(iZoneId); // GROUP_UPDATE_FLAG_ZONE data << uint16(iCoordX); // GROUP_UPDATE_FLAG_POSITION data << uint16(iCoordY); // GROUP_UPDATE_FLAG_POSITION uint32 auramask = 0; size_t maskPos = data.wpos(); data << uint32(auramask); // placeholder for (uint8 i = 0; i < MAX_AURAS; ++i) { if (uint32 aura = player->GetUInt32Value(UNIT_FIELD_AURA + i)) { auramask |= (uint32(1) << i); data << uint16(aura); } } data.put<uint32>(maskPos, auramask); // GROUP_UPDATE_FLAG_AURAS if (pet) { Powers petpowertype = pet->GetPowerType(); data << pet->GetObjectGuid(); // GROUP_UPDATE_FLAG_PET_GUID data << pet->GetName(); // GROUP_UPDATE_FLAG_PET_NAME data << uint16(pet->GetDisplayId()); // GROUP_UPDATE_FLAG_PET_MODEL_ID data << uint16(pet->GetHealth()); // GROUP_UPDATE_FLAG_PET_CUR_HP data << uint16(pet->GetMaxHealth()); // GROUP_UPDATE_FLAG_PET_MAX_HP data << uint8(petpowertype); // GROUP_UPDATE_FLAG_PET_POWER_TYPE data << uint16(pet->GetPower(petpowertype)); // GROUP_UPDATE_FLAG_PET_CUR_POWER data << uint16(pet->GetMaxPower(petpowertype)); // GROUP_UPDATE_FLAG_PET_MAX_POWER uint32 petauramask = 0; size_t petMaskPos = data.wpos(); data << uint32(petauramask); // placeholder for (uint8 i = 0; i < MAX_AURAS; ++i) { if (uint32 petaura = pet->GetUInt32Value(UNIT_FIELD_AURA + i)) { petauramask |= (uint32(1) << i); data << uint16(petaura); } } data.put<uint32>(petMaskPos, petauramask); // GROUP_UPDATE_FLAG_PET_AURAS } else { data << uint8(0); // GROUP_UPDATE_FLAG_PET_NAME data << uint32(0); // GROUP_UPDATE_FLAG_PET_AURAS } SendPacket(&data); }
/*this procedure handles clients CMSG_REQUEST_PARTY_MEMBER_STATS request*/ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recv_data) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_REQUEST_PARTY_MEMBER_STATS"); uint64 Guid; recv_data >> Guid; Player* player = HashMapHolder<Player>::Find(Guid); if (!player) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.appendPackGUID(Guid); data << (uint32) GROUP_UPDATE_FLAG_STATUS; data << (uint16) MEMBER_STATUS_OFFLINE; SendPacket(&data); return; } Pet* pet = player->GetPet(); WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.append(player->GetPackGUID()); uint32 mask1 = 0x00040BFF; // common mask, real flags used 0x000040BFF if (pet) mask1 = 0x7FFFFFFF; // for hunters and other classes with pets Powers powerType = player->getPowerType(); data << (uint32) mask1; // group update mask data << (uint16) MEMBER_STATUS_ONLINE; // member's online status data << (uint32) player->GetHealth(); // GROUP_UPDATE_FLAG_CUR_HP data << (uint32) player->GetMaxHealth(); // GROUP_UPDATE_FLAG_MAX_HP data << (uint8) powerType; // GROUP_UPDATE_FLAG_POWER_TYPE data << (uint16) player->GetPower(powerType); // GROUP_UPDATE_FLAG_CUR_POWER data << (uint16) player->GetMaxPower(powerType); // GROUP_UPDATE_FLAG_MAX_POWER data << (uint16) player->getLevel(); // GROUP_UPDATE_FLAG_LEVEL data << (uint16) player->GetZoneId(); // GROUP_UPDATE_FLAG_ZONE data << (uint16) player->GetPositionX(); // GROUP_UPDATE_FLAG_POSITION data << (uint16) player->GetPositionY(); // GROUP_UPDATE_FLAG_POSITION uint64 auramask = 0; data << uint8(0); // if true client clears auras that are not covered by auramask // TODO: looks like now client requires all active auras to be in the beginning of the auramask // e.g. if you have holes in the aura mask the values after are ignored. size_t maskPos = data.wpos(); data << (uint64) auramask; // placeholder data << uint32(64); // how many bits client reads from auramask for (uint8 i = 0; i < MAX_AURAS; ++i) { if (AuraApplication * aurApp = player->GetVisibleAura(i)) { auramask |= (uint64(1) << i); data << (uint32) aurApp->GetBase()->GetId(); data << (uint8) 1; } } data.put<uint64>(maskPos, auramask); // GROUP_UPDATE_FLAG_AURAS if (pet) { Powers petpowertype = pet->getPowerType(); data << (uint64) pet->GetGUID(); // GROUP_UPDATE_FLAG_PET_GUID data << pet->GetName(); // GROUP_UPDATE_FLAG_PET_NAME data << (uint16) pet->GetDisplayId(); // GROUP_UPDATE_FLAG_PET_MODEL_ID data << (uint32) pet->GetHealth(); // GROUP_UPDATE_FLAG_PET_CUR_HP data << (uint32) pet->GetMaxHealth(); // GROUP_UPDATE_FLAG_PET_MAX_HP data << (uint8) petpowertype; // GROUP_UPDATE_FLAG_PET_POWER_TYPE data << (uint16) pet->GetPower(petpowertype); // GROUP_UPDATE_FLAG_PET_CUR_POWER data << (uint16) pet->GetMaxPower(petpowertype); // GROUP_UPDATE_FLAG_PET_MAX_POWER uint64 petauramask = 0; data << uint8(0); // if true client clears auras that are not covered by auramask // TODO: looks like now client requires all active auras to be in the beginning of the auramask // e.g. if you have holes in the aura mask the values after are ignored. size_t petMaskPos = data.wpos(); data << (uint64) petauramask; // placeholder data << uint32(64); // how many bits client reads from auramask for (uint8 i = 0; i < MAX_AURAS; ++i) { if (AuraApplication * auraApp = pet->GetVisibleAura(i)) { petauramask |= (uint64(1) << i); data << (uint32) auraApp->GetBase()->GetId(); data << (uint8) 1; } } data.put<uint64>(petMaskPos, petauramask); // GROUP_UPDATE_FLAG_PET_AURAS } else { data << (uint8) 0; // GROUP_UPDATE_FLAG_PET_NAME data << (uint8) 0; // GROUP_UPDATE_FLAG_PET_AURAS data << (uint64) 0; // GROUP_UPDATE_FLAG_PET_AURAS data << (uint32) 0; } SendPacket(&data); }
void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) { sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_MOVE_TELEPORT_ACK"); BitStream mask = recv_data.ReadBitStream(8); uint32 flags, time; recv_data >> flags >> time; ByteBuffer bytes(8, true); recv_data.ReadXorByte(mask[6], bytes[1]); recv_data.ReadXorByte(mask[0], bytes[3]); recv_data.ReadXorByte(mask[1], bytes[2]); recv_data.ReadXorByte(mask[7], bytes[0]); recv_data.ReadXorByte(mask[5], bytes[6]); recv_data.ReadXorByte(mask[3], bytes[4]); recv_data.ReadXorByte(mask[2], bytes[7]); recv_data.ReadXorByte(mask[4], bytes[5]); uint64 guid = BitConverter::ToUInt64(bytes); sLog->outStaticDebug("Guid " UI64FMTD, guid); sLog->outStaticDebug("Flags %u, time %u", flags, time/IN_MILLISECONDS); Unit* mover = _player->_mover; Player* plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL; if (!plMover || !plMover->IsBeingTeleportedNear()) return; if (guid != plMover->GetGUID()) return; plMover->SetSemaphoreTeleportNear(false); uint32 old_zone = plMover->GetZoneId(); WorldLocation const& dest = plMover->GetTeleportDest(); plMover->UpdatePosition(dest, true); uint32 newzone, newarea; plMover->GetZoneAndAreaId(newzone, newarea); plMover->UpdateZone(newzone, newarea); // new zone if (old_zone != newzone) { // honorless target if (plMover->pvpInfo.inHostileArea) plMover->CastSpell(plMover, 2479, true); // in friendly area else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) plMover->UpdatePvP(false, false); } // resummon pet GetPlayer()->ResummonPetTemporaryUnSummonedIfAny(); //lets process all delayed operations on successful teleport GetPlayer()->ProcessDelayedOperations(); }
bool ChatHandler::HandleSummonCommand(const char* args, WorldSession *m_session) { if (!*args) return false; sGMLog.writefromsession(m_session, "summoned %s on map %u, %f %f %f", args, m_session->GetPlayer()->GetMapId(), m_session->GetPlayer()->GetPositionX(), m_session->GetPlayer()->GetPositionY(), m_session->GetPlayer()->GetPositionZ()); Player *chr = objmgr.GetPlayer(args, false); if (chr) { // send message to user char buf[256]; char buf0[256]; if (chr->IsBeingTeleported() == true) { snprintf((char*)buf, 256, "%s is already being teleported.", chr->GetName()); SystemMessage(m_session, buf); return true; } snprintf((char*)buf, 256, "You are summoning %s.", chr->GetName()); SystemMessage(m_session, buf); if (!m_session->GetPlayer()->m_isGmInvisible) { // send message to player snprintf((char*)buf0, 256, "You are being summoned by %s.", m_session->GetPlayer()->GetName()); SystemMessageToPlr(chr, buf0); } Player * plr = m_session->GetPlayer(); if (plr->GetMapMgr() == chr->GetMapMgr()) chr->_Relocate(plr->GetMapId(), plr->GetPosition(), false, false, plr->GetInstanceID()); else { sEventMgr.AddEvent(chr, &Player::EventPortToGM, plr, 0, 1, 1, 0); } } else { PlayerInfo * pinfo = objmgr.GetPlayerInfoByName(args); if (!pinfo) { char buf[256]; snprintf((char*)buf, 256, "Player (%s) does not exist.", args); SystemMessage(m_session, buf); } else { Player * pPlayer = m_session->GetPlayer(); char query[512]; snprintf((char*)&query, 512, "UPDATE characters SET mapId = %u, positionX = %f, positionY = %f, positionZ = %f, zoneId = %u WHERE guid = %u;", pPlayer->GetMapId(), pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ(), pPlayer->GetZoneId(), pinfo->guid); CharacterDatabase.Execute(query); char buf[256]; snprintf((char*)buf, 256, "(Offline) %s has been summoned.", pinfo->name); SystemMessage(m_session, buf); } } return true; }
void LfgMgr::SendLfgList(Player* plr, uint32 Dungeon) { if (plr == NULL) return; if (Dungeon >= MAX_DUNGEONS) return; LfgPlayerList::iterator itr; GroupMembersSet::iterator it2; uint32 count = 0; Player * pl; uint32 i; uint64 tguid; SubGroup * sgrp; m_lock.Acquire(); WorldPacket data(MSG_LOOKING_FOR_GROUP, ((m_lookingForGroup[Dungeon].size() + m_lookingForMore[Dungeon].size()) * 20) + 20); data << LfgDungeonTypes[Dungeon]; data << Dungeon; data << uint32(m_lookingForGroup[Dungeon].size()); data << uint32(m_lookingForGroup[Dungeon].size()); for (itr = m_lookingForGroup[Dungeon].begin(); itr != m_lookingForGroup[Dungeon].end(); ++itr) { pl = *itr; if (pl->GetTeam() != plr->GetTeam() || pl == plr) continue; ++count; data << pl->GetNewGUID(); data << pl->getLevel(); data << pl->GetZoneId(); data << uint8(0); // 1=LFG? for (i = 0; i < MAX_LFG_QUEUE_ID; ++i) data << pl->LfgDungeonId[i] << uint8(0) << pl->LfgType[i]; data << pl->Lfgcomment; // LFG members are never in parties. data << uint32(0); } for (itr = m_lookingForMore[Dungeon].begin(); itr != m_lookingForMore[Dungeon].end(); ++itr) { pl = *itr; if (pl->GetTeam() != plr->GetTeam() || pl == plr) continue; ++count; data << pl->GetNewGUID(); data << pl->getLevel(); data << pl->GetZoneId(); data << uint8(1); // 1=LFM? for (i = 0; i < MAX_LFG_QUEUE_ID; ++i) data << pl->LfgDungeonId[i] << uint8(0) << pl->LfgType[i]; data << pl->Lfgcomment; if (pl->GetGroup() && pl->GetGroup()->GetGroupType() == GROUP_TYPE_PARTY) { pl->GetGroup()->Lock(); sgrp = pl->GetGroup()->GetSubGroup(0); data << uint32(sgrp->GetMemberCount() - 1); for (it2 = sgrp->GetGroupMembersBegin(); it2 != sgrp->GetGroupMembersEnd(); ++it2) { if ((*it2)->m_loggedInPlayer) data << (*it2)->m_loggedInPlayer->GetNewGUID(); else { tguid = (*it2)->guid; FastGUIDPack(data, tguid); } } pl->GetGroup()->Unlock(); } else data << uint32(0); } m_lock.Release(); //*(uint32*)(data.contents()[8]) = count; //*(uint32*)(data.contents()[12]) = count; data.put(8, count); data.put(12, count); plr->GetSession()->SendPacket(&data); }
/*this procedure handles clients CMSG_REQUEST_PARTY_MEMBER_STATS request*/ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_REQUEST_PARTY_MEMBER_STATS"); uint64 Guid; recvData >> Guid; Player* player = HashMapHolder<Player>::Find(Guid); if (!player) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.appendPackGUID(Guid); data << uint32(GROUP_UPDATE_FLAG_STATUS); data << uint16(MEMBER_STATUS_OFFLINE); SendPacket(&data); return; } Pet* pet = player->GetPet(); Powers powerType = player->getPowerType(); WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related data.append(player->GetPackGUID()); uint32 updateFlags = GROUP_UPDATE_FLAG_STATUS | GROUP_UPDATE_FLAG_CUR_HP | GROUP_UPDATE_FLAG_MAX_HP | GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER | GROUP_UPDATE_FLAG_LEVEL | GROUP_UPDATE_FLAG_ZONE | GROUP_UPDATE_FLAG_POSITION | GROUP_UPDATE_FLAG_AURAS | GROUP_UPDATE_FLAG_PET_NAME | GROUP_UPDATE_FLAG_PET_MODEL_ID | GROUP_UPDATE_FLAG_PET_AURAS; if (powerType != POWER_MANA) updateFlags |= GROUP_UPDATE_FLAG_POWER_TYPE; if (pet) updateFlags |= GROUP_UPDATE_FLAG_PET_GUID | GROUP_UPDATE_FLAG_PET_CUR_HP | GROUP_UPDATE_FLAG_PET_MAX_HP | GROUP_UPDATE_FLAG_PET_POWER_TYPE | GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER; if (player->GetVehicle()) updateFlags |= GROUP_UPDATE_FLAG_VEHICLE_SEAT; uint16 playerStatus = MEMBER_STATUS_ONLINE; if (player->IsPvP()) playerStatus |= MEMBER_STATUS_PVP; if (!player->isAlive()) { if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) playerStatus |= MEMBER_STATUS_GHOST; else playerStatus |= MEMBER_STATUS_DEAD; } if (player->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP)) playerStatus |= MEMBER_STATUS_PVP_FFA; if (player->isAFK()) playerStatus |= MEMBER_STATUS_AFK; if (player->isDND()) playerStatus |= MEMBER_STATUS_DND; data << uint32(updateFlags); data << uint16(playerStatus); // GROUP_UPDATE_FLAG_STATUS data << uint32(player->GetHealth()); // GROUP_UPDATE_FLAG_CUR_HP data << uint32(player->GetMaxHealth()); // GROUP_UPDATE_FLAG_MAX_HP if (updateFlags & GROUP_UPDATE_FLAG_POWER_TYPE) data << uint8(powerType); data << uint16(player->GetPower(powerType)); // GROUP_UPDATE_FLAG_CUR_POWER data << uint16(player->GetMaxPower(powerType)); // GROUP_UPDATE_FLAG_MAX_POWER data << uint16(player->getLevel()); // GROUP_UPDATE_FLAG_LEVEL data << uint16(player->GetZoneId()); // GROUP_UPDATE_FLAG_ZONE data << uint16(player->GetPositionX()); // GROUP_UPDATE_FLAG_POSITION data << uint16(player->GetPositionY()); // GROUP_UPDATE_FLAG_POSITION uint64 auraMask = 0; size_t maskPos = data.wpos(); data << uint64(auraMask); // placeholder for (uint8 i = 0; i < MAX_AURAS; ++i) { if (AuraApplication const* aurApp = player->GetVisibleAura(i)) { auraMask |= uint64(1) << i; data << uint32(aurApp->GetBase()->GetId()); data << uint8(aurApp->GetFlags()); } } data.put<uint64>(maskPos, auraMask); // GROUP_UPDATE_FLAG_AURAS if (updateFlags & GROUP_UPDATE_FLAG_PET_GUID) data << uint64(pet->GetGUID()); data << std::string(pet ? pet->GetName() : ""); // GROUP_UPDATE_FLAG_PET_NAME data << uint16(pet ? pet->GetDisplayId() : 0); // GROUP_UPDATE_FLAG_PET_MODEL_ID if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_HP) data << uint32(pet->GetHealth()); if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_HP) data << uint32(pet->GetMaxHealth()); if (updateFlags & GROUP_UPDATE_FLAG_PET_POWER_TYPE) data << (uint8)pet->getPowerType(); if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_POWER) data << uint16(pet->GetPower(pet->getPowerType())); if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_POWER) data << uint16(pet->GetMaxPower(pet->getPowerType())); uint64 petAuraMask = 0; maskPos = data.wpos(); data << uint64(petAuraMask); // placeholder if (pet) { for (uint8 i = 0; i < MAX_AURAS; ++i) { if (AuraApplication const* aurApp = pet->GetVisibleAura(i)) { petAuraMask |= uint64(1) << i; data << uint32(aurApp->GetBase()->GetId()); data << uint8(aurApp->GetFlags()); } } } data.put<uint64>(maskPos, petAuraMask); // GROUP_UPDATE_FLAG_PET_AURAS if (updateFlags & GROUP_UPDATE_FLAG_VEHICLE_SEAT) data << uint32(player->GetVehicle()->GetVehicleInfo()->m_seatID[player->m_movementInfo.t_seat]); SendPacket(&data); }
bool ChatHandler::HandleSummonCommand(const char* args, WorldSession *m_session) { if(!*args) return false; sGMLog.writefromsession(m_session, "summoned %s on map %u, %f %f %f", args, m_session->GetPlayer()->GetMapId(),m_session->GetPlayer()->GetPositionX(),m_session->GetPlayer()->GetPositionY(),m_session->GetPlayer()->GetPositionZ()); Player * plr = m_session->GetPlayer(); Player *chr = objmgr.GetPlayer(args, false); if( chr && chr->m_isGmInvisible < 2 ) { // send message to user char buf[256]; char buf0[256]; if( chr->IsBeingTeleported() == true ) { snprintf((char*)buf,256, "%s is already being teleported.", chr->GetName()); SystemMessage(m_session, buf); return true; } if(!chr->RemoveTransporterStatus()) { char buff[256]; snprintf((char*)buf,256, "%s already being teleported.", chr->GetName()); SystemMessage(m_session, buff); return true; } if( plr->RS_getAccess() < chr->RS_getAccess() || chr->m_isGmInvisible > INVIS_NONE ) { snprintf((char*)buf,256, "%s is attempting to summon you!", plr->GetName()); SystemMessageToPlr(chr, buf); chr->SummonRequest(plr->GetLowGUID(), plr->GetZoneId(), plr->GetMapId(), plr->GetInstanceID(), plr->GetPosition()); snprintf((char*)buf0,256, "Summon request sent.", chr->GetName()); SystemMessage(m_session, buf0); return true; } snprintf((char*)buf,256, "You are summoning %s.", chr->GetName()); SystemMessage(m_session, buf); if(!(plr->m_isGmInvisible && chr->RS_getAccess() >= RS_SCRIPTER)) { // send message to player snprintf((char*)buf0,256, "You are being summoned by %s.", m_session->GetPlayer()->GetName()); SystemMessageToPlr(chr, buf0); } if(chr->GetTaxiState()) { sEventMgr.RemoveEvents(chr, EVENT_PLAYER_TAXI_DISMOUNT); sEventMgr.RemoveEvents(chr, EVENT_PLAYER_TAXI_INTERPOLATE); chr->SetTaxiState(false); chr->SetTaxiPath(NULL); chr->UnSetTaxiPos(); chr->m_taxi_ride_time = 0; chr->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID , 0); chr->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNTED_TAXI); chr->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_LOCK_PLAYER); chr->SetPlayerSpeed(RUN, chr->m_runSpeed); } if(chr->m_TransporterGUID) { Transporter * pTrans = objmgr.GetTransporter(GUID_LOPART(chr->m_TransporterGUID)); if(pTrans) { if(chr->m_lockTransportVariables == true) { char buff[256]; snprintf((char*)buf,256, "%s is already being teleported.", chr->GetName()); SystemMessage(m_session, buff); return true; } pTrans->RemovePlayer(chr); chr->m_CurrentTransporter = NULL; chr->m_TransporterGUID = 0; } } if( plr->GetMapMgr() == chr->GetMapMgr() ) { chr->_Relocate(plr->GetMapId(),plr->GetPosition(),false,false,plr->GetInstanceID()); } else { sEventMgr.AddEvent(chr,&Player::EventPortToGM,plr,0,1,1,0); } } else { PlayerInfo * pinfo = objmgr.GetPlayerInfoByName(args); if(!pinfo) { char buf[256]; snprintf((char*)buf,256,"Player (%s) does not exist.", args); SystemMessage(m_session, buf); } else { Player * pPlayer = m_session->GetPlayer(); char query[512]; snprintf((char*) &query,512, "UPDATE characters SET mapId = %u, positionX = %f, positionY = %f, positionZ = %f, zoneId = %u WHERE guid = %u;", pPlayer->GetMapId(), pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ(), pPlayer->GetZoneId(), pinfo->guid); CharacterDatabase.Execute(query); char buf[256]; snprintf((char*)buf,256,"(Offline) %s has been summoned.", pinfo->name); SystemMessage(m_session, buf); } } return true; }