void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult *result, uint32 accountId, std::string newname) { WorldSession * session = sWorld.FindSession(accountId); if(!session) { if(result) delete result; return; } if (!result) { WorldPacket data(SMSG_CHAR_RENAME, 1); data << uint8(CHAR_CREATE_ERROR); session->SendPacket( &data ); return; } uint32 guidLow = result->Fetch()[0].GetUInt32(); uint64 guid = MAKE_NEW_GUID(guidLow, 0, HIGHGUID_PLAYER); std::string oldname = result->Fetch()[1].GetCppString(); delete result; CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_RENAME), guidLow); CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", guidLow); sLog.outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s", session->GetAccountId(), session->GetRemoteAddress().c_str(), oldname.c_str(), guidLow, newname.c_str()); WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newname.size()+1)); data << uint8(RESPONSE_SUCCESS); data << uint64(guid); data << newname; session->SendPacket(&data); }
void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult *result, uint32 accountId, std::string newname) { WorldSession * session = sWorld.FindSession(accountId); if(!session) return; if (!result || result->GetRowCount() != 1) { WorldPacket data(SMSG_CHAR_RENAME, 1); data << (uint8)CHAR_CREATE_ERROR; session->SendPacket( &data ); return; } Field *fields = result->Fetch(); uint32 guidLow = fields[0].GetUInt32(); uint64 guid = MAKE_NEW_GUID(guidLow, 0, HIGHGUID_PLAYER); uint32 at_loginFlags = fields[1].GetUInt32(); std::string oldname = fields[2].GetCppString(); delete result; if(oldname == newname) { WorldPacket data(SMSG_CHAR_RENAME, 1); data << (uint8)CHAR_CREATE_ERROR; session->SendPacket( &data ); return; } // we have to check character at_login_flag & AT_LOGIN_RENAME also (fake packets hehe) if (!(at_loginFlags & AT_LOGIN_RENAME)) { WorldPacket data(SMSG_CHAR_RENAME, 1); data << (uint8)CHAR_CREATE_ERROR; session->SendPacket( &data ); return; } CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_RENAME),guidLow); CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", guidLow); sLog.outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s",session->GetAccountId(),session->GetRemoteAddress().c_str(),oldname.c_str(),guidLow,newname.c_str()); WorldPacket data(SMSG_CHAR_RENAME,1+8+(newname.size()+1)); data << (uint8)RESPONSE_SUCCESS; data << guid; data << newname; session->SendPacket(&data); }
void SocialMgr::BroadcastToFriendListers(Player* player, WorldPacket const* packet) { ASSERT(player); AccountTypes gmSecLevel = AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST)); for (SocialMap::const_iterator itr = _socialMap.begin(); itr != _socialMap.end(); ++itr) { PlayerSocial::PlayerSocialMap::const_iterator itr2 = itr->second._playerSocialMap.find(player->GetGUID()); if (itr2 != itr->second._playerSocialMap.end() && (itr2->second.Flags & SOCIAL_FLAG_FRIEND) != 0) { Player* target = ObjectAccessor::FindPlayer(itr->first); if (!target) continue; WorldSession* session = target->GetSession(); if (!session->HasPermission(rbac::RBAC_PERM_WHO_SEE_ALL_SEC_LEVELS) && player->GetSession()->GetSecurity() > gmSecLevel) continue; if (target->GetTeam() != player->GetTeam() && !session->HasPermission(rbac::RBAC_PERM_TWO_SIDE_WHO_LIST)) continue; if (player->IsVisibleGloballyFor(target)) session->SendPacket(packet); } } }
void WorldSession::SendNameQueryOpcodeFromDBCallBack(QueryResult* result, uint32 accountId) { if (!result) { return; } WorldSession* session = sWorld.FindSession(accountId); if (!session) { delete result; return; } Field* fields = result->Fetch(); uint32 lowguid = fields[0].GetUInt32(); std::string name = fields[1].GetCppString(); uint8 pRace = 0, pGender = 0, pClass = 0; if (!name.empty()) { pRace = fields[2].GetUInt8(); pGender = fields[3].GetUInt8(); pClass = fields[4].GetUInt8(); } // guess size WorldPacket data(SMSG_NAME_QUERY_RESPONSE, (8 + (name.size()+1) + 1 + 4 + 4 + 4)); data << ObjectGuid(HIGHGUID_PLAYER, lowguid); data << name; data << uint8(0); // realm name for cross realm BG usage data << uint32(pRace); // race data << uint32(pGender); // gender data << uint32(pClass); // class session->SendPacket(&data); delete result; }
void Object::SendMessageToSet(WorldPacket *data, bool bToSelf) { #ifndef ENABLE_GRID_SYSTEM if (bToSelf && GetTypeId() == TYPEID_PLAYER) { // has to be a player to send to self ((Player*)this)->GetSession()->SendPacket(data); } std::set<Object*>::iterator itr; for (itr = m_objectsInRange.begin(); itr != m_objectsInRange.end(); ++itr) { ASSERT(*itr); if ((*itr)->GetTypeId() == TYPEID_PLAYER) { WorldSession *session = ((Player*)(*itr))->GetSession(); WPWarning( session, "Null client in message set!" ); session->SendPacket(data); } } #else MapManager::Instance().GetMap(m_mapId)->MessageBoardcast(this, data); #endif }
void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResultAutoPtr result, uint32 accountId, std::string newname) { WorldSession * session = sWorld.FindSession(accountId); if (!session) return; if (!result) { WorldPacket data(SMSG_CHAR_RENAME, 1); data << uint8(CHAR_CREATE_ERROR); session->SendPacket(&data); return; } uint32 guidLow = result->Fetch()[0].GetUInt32(); uint64 guid = MAKE_NEW_GUID(guidLow, 0, HIGHGUID_PLAYER); std::string oldname = result->Fetch()[1].GetCppString(); static SqlStatementID changeCharName; static SqlStatementID deleteDeclinedName; RealmDataDatabase.BeginTransaction(); SqlStatement stmt = RealmDataDatabase.CreateStatement(changeCharName, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?"); stmt.addString(newname); stmt.addUInt32(uint32(AT_LOGIN_RENAME)); stmt.addUInt32(guidLow); stmt.Execute(); stmt = RealmDataDatabase.CreateStatement(deleteDeclinedName, "DELETE FROM character_declinedname WHERE guid = ?"); stmt.PExecute(guidLow); RealmDataDatabase.CommitTransaction(); sLog.outLog(LOG_CHAR, "Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s", session->GetAccountId(), session->GetRemoteAddress().c_str(), oldname.c_str(), guidLow, newname.c_str()); WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newname.size()+1)); data << uint8(RESPONSE_SUCCESS); data << uint64(guid); data << newname; session->SendPacket(&data); }
void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult* result, uint32 accountId, std::string newname) { WorldSession* session = sWorld.FindSession(accountId); if (!session) { delete result; return; } if (!result) { WorldPacket data(SMSG_CHAR_RENAME, 1); data << uint8(CHAR_CREATE_ERROR); session->SendPacket(data, true); return; } uint32 guidLow = result->Fetch()[0].GetUInt32(); ObjectGuid guid = ObjectGuid(HIGHGUID_PLAYER, guidLow); std::string oldname = result->Fetch()[1].GetCppString(); delete result; CharacterDatabase.BeginTransaction(); CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_RENAME), guidLow); CharacterDatabase.CommitTransaction(); sLog.outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s", session->GetAccountId(), session->GetRemoteAddress().c_str(), oldname.c_str(), guidLow, newname.c_str()); WorldPacket data(SMSG_CHAR_RENAME, 1 + 8 + (newname.size() + 1)); data << uint8(RESPONSE_SUCCESS); data << guid; data << newname; session->SendPacket(data, true); sWorld.InvalidatePlayerDataToAllClient(guid); }
void WorldSession::SendNameQueryOpcodeFromDBCallBack(QueryResult *result, uint32 accountId) { if(!result) return; WorldSession * session = sWorld.FindSession(accountId); if(!session) { delete result; return; } Field *fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); std::string name = fields[1].GetCppString(); uint8 pRace = 0, pGender = 0, pClass = 0; if(name == "") name = session->GetMangosString(LANG_NON_EXIST_CHARACTER); else { pRace = fields[2].GetUInt8(); pGender = fields[3].GetUInt8(); pClass = fields[4].GetUInt8(); } // guess size WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+1+10) ); data.appendPackGUID(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)); data << uint8(0); // added in 3.1 data << name; data << uint8(0); // realm name for cross realm BG usage data << uint8(pRace); // race data << uint8(pGender); // gender data << uint8(pClass); // class // if the first declined name field (5) is empty, the rest must be too if(sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) && fields[5].GetCppString() != "") { data << uint8(1); // is declined for(int i = 5; i < MAX_DECLINED_NAME_CASES+5; ++i) data << fields[i].GetCppString(); } else data << uint8(0); // is not declined session->SendPacket( &data ); delete result; }
void WorldSession::SendNameQueryOpcodeFromDBCallBack(QueryResult *result, uint32 accountId) { if(!result) return; WorldSession * session = sWorld.FindSession(accountId); if(!session) { delete result; return; } Field *fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); std::string name = fields[1].GetCppString(); uint8 pRace = 0, pGender = 0, pClass = 0; if(name == "") name = session->GetMangosString(LANG_NON_EXIST_CHARACTER); else { pRace = fields[2].GetUInt8(); pGender = fields[3].GetUInt8(); pClass = fields[4].GetUInt8(); } // guess size WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+4+4+4+10) ); data << MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER); data << name; data << uint8(0); // realm name for cross realm BG usage data << uint32(pRace); // race data << uint32(pGender); // gender data << uint32(pClass); // class session->SendPacket( &data ); delete result; }
void ClusterInterface::HandleTeleportResult(WorldPacket & pck) { uint32 sessionid; uint8 result; uint32 mapid, instanceid; LocationVector vec; float o; pck >> sessionid; WorldSession* s = GetSession(sessionid); if (!s) { //tell the realm-server we have no session WorldPacket data(ICMSG_ERROR_HANDLER, 5); data << uint8(1); //1 = no session data << sessionid; sClusterInterface.SendPacket(&data); return; } pck >> result >> mapid >> instanceid >> vec >> o; //the destination is on the same server if (result == 1) { if (s->GetPlayer() != NULL) sEventMgr.AddEvent(s->GetPlayer(), &Player::EventClusterMapChange, mapid, instanceid, vec, EVENT_UNK, 1, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); } else { //make this non-async, needs redone to support packing the player //since were saving it HAS TO BE HERE so the new server has the correct data WorldPacket nw(SMSG_NEW_WORLD); nw << mapid << vec << o; s->SendPacket(&nw); uint32 oldmapid = s->GetPlayer()->GetMapId(); uint32 oldinstanceid = s->GetPlayer()->GetInstanceID(); uint32 playerlowguid = s->GetPlayer()->GetLowGUID(); s->GetPlayer()->SetMapId(mapid); s->GetPlayer()->SetInstanceID(instanceid); s->GetPlayer()->SetPosition(vec.x, vec.y, vec.z, o); s->GetPlayer()->SaveToDB(true); //need to shift back to old ones for removing from world :) s->GetPlayer()->SetMapId(oldmapid); s->GetPlayer()->SetInstanceID(oldinstanceid); WorldPacket data(ICMSG_SWITCH_SERVER, 100); data << sessionid << playerlowguid << mapid << instanceid << vec << o; sClusterInterface.SendPacket(&data); RPlayerInfo * pRPlayer = GetPlayer(playerlowguid); bool newRplr = false; if(pRPlayer == NULL) { pRPlayer = new RPlayerInfo; newRplr = true; } s->GetPlayer()->UpdateRPlayerInfo(pRPlayer, newRplr); pRPlayer->MapId = mapid; pRPlayer->InstanceId = instanceid; data.Initialize(ICMSG_PLAYER_INFO); pRPlayer->Pack(data); sClusterInterface.SendPacket(&data); sEventMgr.AddEvent(s->GetPlayer(), &Player::HandleClusterRemove, EVENT_UNK, 1, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); } }
/// <summary> /// Update the Role check info with the player selected role. /// </summary> /// <param name="grp">Group</param> /// <param name="plr">Player</param> void LFGMgr::UpdateRoleCheck(Group *grp, Player *plr /* = NULL*/) { assert(grp); uint32 rolecheckId = GUID_LOPART(grp->GetGUID()); LfgRoleCheck *pRoleCheck = NULL; LfgRolesMap check_roles; LfgRoleCheckMap::iterator itRoleCheck = m_RoleChecks.find(rolecheckId); bool newRoleCheck = itRoleCheck == m_RoleChecks.end(); if (newRoleCheck) { if (!grp->IsLeader(plr->GetGUID())) return; pRoleCheck = new LfgRoleCheck(); pRoleCheck->cancelTime = time_t(time(NULL)) + LFG_TIME_ROLECHECK; pRoleCheck->result = LFG_ROLECHECK_INITIALITING; pRoleCheck->leader = plr->GetGUID(); for (GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) if (Player *plrg = itr->getSource()) pRoleCheck->roles[plrg->GetGUID()] = 0; pRoleCheck->dungeons = plr->m_lookingForGroup.applyDungeons; } else pRoleCheck = itRoleCheck->second; LfgLockStatusMap *playersLockMap = NULL; if (plr) { // Player selected no role. if (plr->m_lookingForGroup.roles < ROLE_TANK) pRoleCheck->result = LFG_ROLECHECK_NO_ROLE; else { // Check if all players have selected a role pRoleCheck->roles[plr->GetGUID()] = plr->m_lookingForGroup.roles; uint8 size = 0; for (LfgRolesMap::const_iterator itRoles = pRoleCheck->roles.begin(); itRoles != pRoleCheck->roles.end() && itRoles->second != ROLE_NONE; ++itRoles) ++size; if (pRoleCheck->roles.size() == size) { // use temporal var to check roles, CheckGroupRoles modifies the roles for (LfgRolesMap::const_iterator itRoles = pRoleCheck->roles.begin(); itRoles != pRoleCheck->roles.end(); ++itRoles) check_roles[itRoles->first] = itRoles->second; if (!CheckGroupRoles(check_roles)) // Group is not posible pRoleCheck->result = LFG_ROLECHECK_WRONG_ROLES; else { // Check if we can find a dungeon for that group pRoleCheck->result = LFG_ROLECHECK_FINISHED; if (pRoleCheck->dungeons.size() > 1) playersLockMap = GetPartyLockStatusDungeons(plr, &pRoleCheck->dungeons); else { LfgDungeonSet::const_iterator it = pRoleCheck->dungeons.begin(); LFGDungeonEntry const *dungeon = sLFGDungeonStore.LookupEntry(*it); if (dungeon && dungeon->type == LFG_TYPE_RANDOM) playersLockMap = GetPartyLockStatusDungeons(plr, m_DungeonsMap[*it]); else playersLockMap = GetPartyLockStatusDungeons(plr, &pRoleCheck->dungeons); } } } } } else pRoleCheck->result = LFG_ROLECHECK_ABORTED; WorldSession *session; WorldPacket data(SMSG_LFG_ROLE_CHECK_UPDATE, 4 + 1 + 1 + pRoleCheck->dungeons.size() * 4 + 1 + pRoleCheck->roles.size() * (8 + 1 + 4 + 1)); DEBUG_LOG("SMSG_LFG_ROLE_CHECK_UPDATE"); BuildLfgRoleCheck(data, pRoleCheck); Player *plrg = NULL; for (GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { plrg = itr->getSource(); if (!plrg) continue; session = plrg->GetSession(); if (!newRoleCheck && plr) session->SendLfgRoleChosen(plr->GetGUID(), plr->m_lookingForGroup.roles); session->SendPacket(&data); switch (pRoleCheck->result) { case LFG_ROLECHECK_INITIALITING: continue; case LFG_ROLECHECK_FINISHED: if (!playersLockMap) { session->SendLfgUpdateParty(LFG_UPDATETYPE_ADDED_TO_QUEUE); } else { if (grp->IsLeader(plrg->GetGUID())) { uint32 size = 0; for (LfgLockStatusMap::const_iterator it = playersLockMap->begin(); it != playersLockMap->end(); ++it) size += 8 + 4 + it->second->size() * (4 + 4); WorldPacket data(SMSG_LFG_JOIN_RESULT, 4 + 4 + size); DEBUG_LOG("SMSG_LFG_JOIN_RESULT"); data << uint32(LFG_JOIN_PARTY_NOT_MEET_REQS); // Check Result data << uint32(0); // Check Value (always 0 when PartyNotMeetReqs BuildPartyLockDungeonBlock(data, playersLockMap); session->SendPacket(&data); } session->SendLfgUpdateParty(LFG_UPDATETYPE_ROLECHECK_FAILED); plrg->m_lookingForGroup.applyDungeons.clear(); plrg->m_lookingForGroup.roles = 0; } break; default: if (grp->IsLeader(plrg->GetGUID())) session->SendLfgJoinResult(LFG_JOIN_FAILED, pRoleCheck->result); session->SendLfgUpdateParty(LFG_UPDATETYPE_ROLECHECK_FAILED); plrg->m_lookingForGroup.applyDungeons.clear(); plrg->m_lookingForGroup.roles = 0; break; } } if (pRoleCheck->result == LFG_ROLECHECK_FINISHED) { // Add qroup to queue LfgQueueInfo *pqInfo; uint8 groupType = 0; uint8 tanks = LFG_TANKS_NEEDED; uint8 healers = LFG_HEALERS_NEEDED; uint8 dps = LFG_DPS_NEEDED; for (LfgRolesMap::const_iterator it = check_roles.begin(); it != check_roles.end(); ++it) { if (it->second & ROLE_TANK) --tanks; else if (it->second & ROLE_HEALER) --healers; else --dps; } uint64 guid = grp->GetGUID(); m_update = false; for (LfgDungeonSet::const_iterator it = pRoleCheck->dungeons.begin(); it != pRoleCheck->dungeons.end(); ++it) { groupType = GetDungeonGroupType(*it); pqInfo = m_Queues[groupType] ? m_Queues[groupType]->GetQueueInfo(guid) : NULL; // if exist we have already added the player with another dungeon sharing same GroupType if (pqInfo) continue; pqInfo = new LfgQueueInfo(); pqInfo->dungeonId = *it; pqInfo->joinTime = time_t(time(NULL)); pqInfo->tanks = tanks; pqInfo->healers = healers; pqInfo->dps = dps; for (GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { if (Player *plrg = itr->getSource()) pqInfo->roles[plrg->GetGUID()] = plrg->m_lookingForGroup.roles; } if (!m_Queues[groupType]) m_Queues[groupType] = new LFGQueue(); m_Queues[groupType]->AddToQueue(guid, pqInfo); } m_update = true; } if (pRoleCheck->result != LFG_ROLECHECK_INITIALITING) { delete pRoleCheck; if (!newRoleCheck) m_RoleChecks.erase(itRoleCheck); } else if (newRoleCheck) m_RoleChecks[rolecheckId] = pRoleCheck; }
bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { WorldSession* session = player->GetSession(); player->PlayerTalkClass->ClearMenus(); switch(sender) { case SENDER_SELECT_VENDOR: // action = slot { Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, action); if (!item) { if (const char* slotname = getSlotName(action)) session->SendNotification("No item equipped in %s slot", slotname); OnGossipHello(player, creature); return true; } const ItemTemplate * itemTemplate = item->GetTemplate(); optionData* oM = &optionMap[(itemTemplate->Class == ITEM_CLASS_WEAPON ? MAX_ITEM_SUBCLASS_WEAPON : 0)+itemTemplate->SubClass][getCorrectInvType(itemTemplate->InventoryType)]; if (!oM->size()) { if (const char* slotname = getSlotName(action)) session->SendNotification("No transmogrifications available for %s", slotname); OnGossipHello(player, creature); return true; } player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, (std::string)"Update selected; "+getItemName(itemTemplate, session), sender, action); for(optionData::iterator it = oM->begin(); it != oM->end(); ++it) { if (!TransmogDisplayVendorMgr::AllowedQuality(it->first)) // skip not allowed qualities continue; for(uint32 count = 0; count*MAX_VENDOR_ITEMS < it->second.size(); ++count) { std::ostringstream ss; ss << getQualityName(it->first); if (count) ss << " [" << count << "]"; player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, ss.str().c_str(), it->first, count*MAX_VENDOR_ITEMS); } } if (player->PlayerTalkClass->GetGossipMenu().GetMenuItemCount() <= 1) { if (const char* slotname = getSlotName(action)) session->SendNotification("No transmogrifications available for %s", slotname); player->PlayerTalkClass->ClearMenus(); OnGossipHello(player, creature); return true; } selDataStruct temp = {action, 0, 0}; // slot, offset, quality selData[player->GetGUIDLow()] = temp; player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "Back..", SENDER_BACK, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } break; case SENDER_BACK: // Back { OnGossipHello(player, creature); } break; case SENDER_REMOVE_ALL: // Remove TransmogDisplayVendorMgrs { bool removed = false; for (uint8 Slot = EQUIPMENT_SLOT_START; Slot < EQUIPMENT_SLOT_END; Slot++) { if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, Slot)) { if (TransmogDisplayVendorMgr::DeleteFakeEntry(newItem) && !removed) removed = true; } } if (removed) { session->SendAreaTriggerMessage("Transmogrifications removed from equipped items"); player->PlayDirectSound(3337); } else session->SendNotification("You have no transmogrified items equipped"); OnGossipSelect(player, creature, SENDER_REMOVE_MENU, 0); } break; case SENDER_REMOVE_ONE: // Remove TransmogDisplayVendorMgr from single item { const char* slotname = getSlotName(action); if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, action)) { if (TransmogDisplayVendorMgr::DeleteFakeEntry(newItem)) { if (slotname) session->SendAreaTriggerMessage("%s transmogrification removed", slotname); player->PlayDirectSound(3337); } else if (slotname) session->SendNotification("No transmogrification on %s slot", slotname); } else if (slotname) session->SendNotification("No item equipped in %s slot", slotname); OnGossipSelect(player, creature, SENDER_REMOVE_MENU, 0); } break; case SENDER_REMOVE_MENU: { for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; slot++) { const char* slotname = getSlotName(slot); if (!slotname) continue; std::ostringstream ss; ss << "Remove transmogrification from " << slotname << "?"; player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, (std::string)"Remove from "+slotname, SENDER_REMOVE_ONE, slot, ss.str().c_str(), 0, false); } player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Remove all transmogrifications", SENDER_REMOVE_ALL, 0, "Are you sure you want to remove all transmogrifications?", 0, false); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "Back..", SENDER_BACK, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } break; default: // Show items you can use { if (sender >= MAX_ITEM_QUALITY) // sender = quality, action = iterator return false; // cheat if (selData.find(player->GetGUIDLow()) == selData.end()) return false; // cheat if (selData[player->GetGUIDLow()].offset != 0 || selData[player->GetGUIDLow()].quality != 0) return false; // cheat (something is off) selData[player->GetGUIDLow()].offset = action; selData[player->GetGUIDLow()].quality = sender; uint32 slot = selData[player->GetGUIDLow()].slot; // slot if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) { if (!TransmogDisplayVendorMgr::AllowedQuality(item->GetTemplate()->Quality)) { session->SendNotification("Equipped item has wrong quality"); OnGossipSelect(player, creature, SENDER_SELECT_VENDOR, slot); return true; } optionDataList oM = optionMap[(item->GetTemplate()->Class == ITEM_CLASS_WEAPON ? MAX_ITEM_SUBCLASS_WEAPON : 0)+item->GetTemplate()->SubClass][getCorrectInvType(item->GetTemplate()->InventoryType)][sender]; uint32 itemCount = (oM.size()-action); if (itemCount > MAX_VENDOR_ITEMS) itemCount = MAX_VENDOR_ITEMS; if (!itemCount) { session->SendAreaTriggerMessage("No items found"); OnGossipSelect(player, creature, SENDER_SELECT_VENDOR, slot); return true; } player->CLOSE_GOSSIP_MENU(); TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_LIST_INVENTORY"); Creature* vendor = player->GetNPCIfCanInteractWith(creature->GetGUID(), UNIT_NPC_FLAG_VENDOR); if (!vendor) { TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: SendListInventory - Unit (GUID: %u) not found or you can not interact with him.", creature->GetGUIDLow()); player->SendSellError(SELL_ERR_CANT_FIND_VENDOR, NULL, 0, 0); return true; } if (player->HasUnitState(UNIT_STATE_DIED)) player->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (vendor->HasUnitState(UNIT_STATE_MOVING)) vendor->StopMoving(); uint8 count = 0; WorldPacket data(SMSG_LIST_INVENTORY, 8 + 1 + itemCount * 8 * 4); data << uint64(creature->GetGUID()); size_t countPos = data.wpos(); data << uint8(count); bool added = false; optionDataList::iterator it = oM.begin(); std::advance(it, action); for (; it != oM.end() && count < itemCount; ++it, ++count) { if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(*it)) { data << uint32(count + 1); data << uint32(itemTemplate->ItemId); data << uint32(itemTemplate->DisplayInfoID); data << int32(0xFFFFFFFF); data << uint32(0); data << uint32(itemTemplate->MaxDurability); data << uint32(itemTemplate->BuyCount); data << uint32(0); added = true; } } if (!added) { data << uint8(0); session->SendPacket(&data); } else { data.put<uint8>(countPos, count); session->SendPacket(&data); } } else { session->SendNotification("No item equipped"); OnGossipSelect(player, creature, SENDER_SELECT_VENDOR, slot); return true; } } break; } return true; }