void WorldSession::HandleCharDeleteOpcode( WorldPacket & recv_data ) { uint64 guid; recv_data >> guid; // can't delete loaded character if(objmgr.GetPlayer(guid)) return; uint32 accountId = 0; std::string name; // is guild leader if(objmgr.GetGuildByLeader(guid)) { WorldPacket data(SMSG_CHAR_DELETE, 1); data << (uint8)CHAR_DELETE_FAILED_GUILD_LEADER; SendPacket( &data ); return; } // is arena team captain if(objmgr.GetArenaTeamByCaptain(guid)) { WorldPacket data(SMSG_CHAR_DELETE, 1); data << (uint8)CHAR_DELETE_FAILED_ARENA_CAPTAIN; SendPacket( &data ); return; } QueryResult *result = CharacterDatabase.PQuery("SELECT account,name FROM characters WHERE guid='%u'", GUID_LOPART(guid)); if(result) { Field *fields = result->Fetch(); accountId = fields[0].GetUInt32(); name = fields[1].GetCppString(); delete result; } // prevent deleting other players' characters using cheating tools if(accountId != GetAccountId()) return; std::string IP_str = GetRemoteAddress(); sLog.outBasic("Account: %d (IP: %s) Delete Character:[%s] (guid: %u)", GetAccountId(), IP_str.c_str(), name.c_str(), GUID_LOPART(guid)); sLog.outChar("Account: %d (IP: %s) Delete Character:[%s] (guid: %u)", GetAccountId(), IP_str.c_str(), name.c_str(), GUID_LOPART(guid)); if(sLog.IsOutCharDump()) // optimize GetPlayerDump call { std::string dump = PlayerDumpWriter().GetDump(GUID_LOPART(guid)); sLog.outCharDump(dump.c_str(), GetAccountId(), GUID_LOPART(guid), name.c_str()); } Player::DeleteFromDB(guid, GetAccountId()); WorldPacket data(SMSG_CHAR_DELETE, 1); data << (uint8)CHAR_DELETE_SUCCESS; SendPacket( &data ); }
static bool HandlePDumpWriteCommand(ChatHandler* handler, char const* args) { if (!*args) return false; char* fileStr = strtok((char*)args, " "); char* playerStr = strtok(NULL, " "); if (!fileStr || !playerStr) return false; ObjectGuid guid; // character name can't start from number if (isNumeric(playerStr)) guid = ObjectGuid::Create<HighGuid::Player>(strtoull(playerStr, nullptr, 10)); else { std::string name = handler->extractPlayerNameFromLink(playerStr); if (name.empty()) { handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); handler->SetSentErrorMessage(true); return false; } guid = ObjectMgr::GetPlayerGUIDByName(name); } if (!ObjectMgr::GetPlayerAccountIdByGUID(guid)) { handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND); handler->SetSentErrorMessage(true); return false; } switch (PlayerDumpWriter().WriteDump(fileStr, guid.GetCounter())) { case DUMP_SUCCESS: handler->PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS); break; case DUMP_FILE_OPEN_ERROR: handler->PSendSysMessage(LANG_FILE_OPEN_FAIL, fileStr); handler->SetSentErrorMessage(true); return false; case DUMP_CHARACTER_DELETED: handler->PSendSysMessage(LANG_COMMAND_EXPORT_DELETED_CHAR); handler->SetSentErrorMessage(true); return false; default: handler->PSendSysMessage(LANG_COMMAND_EXPORT_FAILED); handler->SetSentErrorMessage(true); return false; } return true; }
static bool HandlePDumpWriteCommand(ChatHandler* handler, char const* args) { if (!*args) return false; char* fileStr = strtok((char*)args, " "); char* playerStr = strtok(NULL, " "); if (!fileStr || !playerStr) return false; uint64 guid; // character name can't start from number if (isNumeric(playerStr)) guid = MAKE_NEW_GUID(atoi(playerStr), 0, HIGHGUID_PLAYER); else { std::string name = handler->extractPlayerNameFromLink(playerStr); if (name.empty()) { handler->SendSysMessage(LANGUAGE_PLAYER_NOT_FOUND); handler->SetSentErrorMessage(true); return false; } guid = sObjectMgr->GetPlayerGUIDByName(name); } if (!sObjectMgr->GetPlayerAccountIdByGUID(guid)) { handler->PSendSysMessage(LANGUAGE_PLAYER_NOT_FOUND); handler->SetSentErrorMessage(true); return false; } switch (PlayerDumpWriter().WriteDump(fileStr, uint32(guid))) { case DUMP_SUCCESS: handler->PSendSysMessage(LANGUAGE_COMMAND_EXPORT_SUCCESS); break; case DUMP_FILE_OPEN_ERROR: handler->PSendSysMessage(LANGUAGE_FILE_OPEN_FAIL, fileStr); handler->SetSentErrorMessage(true); return false; case DUMP_CHARACTER_DELETED: handler->PSendSysMessage(LANGUAGE_COMMAND_EXPORT_DELETED_CHAR); handler->SetSentErrorMessage(true); return false; default: handler->PSendSysMessage(LANGUAGE_COMMAND_EXPORT_FAILED); handler->SetSentErrorMessage(true); return false; } return true; }
void WorldSession::HandleCharDeleteOpcode(WorldPacket& recv_data) { ObjectGuid guid; recv_data >> guid; // can't delete loaded character if (sObjectMgr.GetPlayer(guid)) return; uint32 accountId = 0; std::string name; // is guild leader if (sGuildMgr.GetGuildByLeader(guid)) { WorldPacket data(SMSG_CHAR_DELETE, 1); data << (uint8)CHAR_DELETE_FAILED_GUILD_LEADER; SendPacket(data, true); return; } uint32 lowguid = guid.GetCounter(); QueryResult* result = CharacterDatabase.PQuery("SELECT account,name FROM characters WHERE guid='%u'", lowguid); if (result) { Field* fields = result->Fetch(); accountId = fields[0].GetUInt32(); name = fields[1].GetCppString(); delete result; } // prevent deleting other players' characters using cheating tools if (accountId != GetAccountId()) return; std::string IP_str = GetRemoteAddress(); BASIC_LOG("Account: %d (IP: %s) Delete Character:[%s] (guid: %u)", GetAccountId(), IP_str.c_str(), name.c_str(), lowguid); sLog.outChar("Account: %d (IP: %s) Delete Character:[%s] (guid: %u)", GetAccountId(), IP_str.c_str(), name.c_str(), lowguid); if (sLog.IsOutCharDump()) // optimize GetPlayerDump call { std::string dump = PlayerDumpWriter().GetDump(lowguid); sLog.outCharDump(dump.c_str(), GetAccountId(), lowguid, name.c_str()); } Player::DeleteFromDB(guid, GetAccountId()); WorldPacket data(SMSG_CHAR_DELETE, 1); data << (uint8)CHAR_DELETE_SUCCESS; SendPacket(data, true); }
bool ChatHandler::HandleCharacterAutodumpCommand(char *args) { char* cname = strtok (args, " "); if (!cname || !*cname) return false; ObjectGuid guid64; uint32 accid = 0; Player *target = sObjectMgr.GetPlayer(cname); std::string normalName; if(target) { // player online guid64 = target->GetObjectGuid(); accid = target->GetSession()->GetAccountId(); normalName = target->GetName(); } else { // player offline, ask DB guid64 = sObjectMgr.GetPlayerGuidByName(cname); accid = sObjectMgr.GetPlayerAccountIdByGUID(guid64); if(guid64 && accid) { normalName = cname; normalizePlayerName(normalName); } else // nothing found or wrong data { PSendSysMessage(LANG_NO_PLAYER, cname); SetSentErrorMessage(true); return false; } } ObjectGuid guid; guid.Set(guid64); std::string dump = PlayerDumpWriter().GetDump(guid.GetCounter()); std::string outfile; bool result = sLog.outCharDumpExtra(dump.c_str(),accid,guid.GetCounter(),normalName.c_str(),&outfile); if(!result) { PSendSysMessage(LANG_FILE_OPEN_FAIL, outfile.c_str()); SetSentErrorMessage(true); return false; } PSendSysMessage("Dump of '%s' saved to: %s", normalName.c_str(), outfile.c_str()); return true; }
bool ChatHandler::CharacterDizintegrateHelper(Player *pl, char* args) { if(!pl) { SendSysMessage(LANG_PLAYER_NOT_FOUND); SetSentErrorMessage(true); return false; } ObjectGuid guid = pl->GetObjectGuid(); if(!stricmp(args,"all")) // remove all items except totems!! { if(sLog.IsOutCharDump()) { std::string dump = PlayerDumpWriter().GetDump(guid.GetCounter()); sLog.outCharDump(dump.c_str(),m_session->GetAccountId(),guid.GetCounter(),pl->GetName()); } // in inventory for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; ++i) if (Item* pItem = pl->GetItemByPos( INVENTORY_SLOT_BAG_0, i )) if ( !pItem->IsBag() && !(pItem->GetProto()->Class == ITEM_CLASS_MISC && pItem->GetProto()->SubClass == ITEM_SUBCLASS_ARMOR_CLOTH && pItem->GetProto()->Flags & 32) ) pl->DestroyItem( INVENTORY_SLOT_BAG_0, i, true); // in inventory bags for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i) if (Bag* pBag = (Bag*)pl->GetItemByPos( INVENTORY_SLOT_BAG_0, i )) for(uint32 j = 0; j < pBag->GetBagSize(); ++j) if (Item* pItem = pBag->GetItemByPos(j)) if ( !pItem->IsBag() && !(pItem->GetProto()->Class == ITEM_CLASS_MISC && pItem->GetProto()->SubClass == ITEM_SUBCLASS_ARMOR_CLOTH && pItem->GetProto()->Flags & 32) ) pl->DestroyItem( i, j, true); // in equipment and bag list for(int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i) if (Item* pItem = pl->GetItemByPos( INVENTORY_SLOT_BAG_0, i )) if ( !pItem->IsBag() && !(pItem->GetProto()->Class == ITEM_CLASS_MISC && pItem->GetProto()->SubClass == ITEM_SUBCLASS_ARMOR_CLOTH && pItem->GetProto()->Flags & 32) ) pl->DestroyItem( INVENTORY_SLOT_BAG_0, i, true); // in bank for(int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; ++i) if (Item* pItem = pl->GetItemByPos( INVENTORY_SLOT_BAG_0, i )) if ( !pItem->IsBag() && !(pItem->GetProto()->Class == ITEM_CLASS_MISC && pItem->GetProto()->SubClass == ITEM_SUBCLASS_ARMOR_CLOTH && pItem->GetProto()->Flags & 32) ) pl->DestroyItem( INVENTORY_SLOT_BAG_0, i, true); // in bank bags // in inventory bags for(int i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) if (Bag* pBag = (Bag*)pl->GetItemByPos( INVENTORY_SLOT_BAG_0, i )) for(uint32 j = 0; j < pBag->GetBagSize(); ++j) if (Item* pItem = pBag->GetItemByPos(j)) if ( !pItem->IsBag() && !(pItem->GetProto()->Class == ITEM_CLASS_MISC && pItem->GetProto()->SubClass == ITEM_SUBCLASS_ARMOR_CLOTH && pItem->GetProto()->Flags & 32) ) pl->DestroyItem( i, j, true); std::string bannedby = m_session->GetPlayerName(); std::string banreason = "[auto-message] DIZINTEGRATED!"; LoginDatabase.escape_string(bannedby); LoginDatabase.escape_string(banreason); LoginDatabase.PExecute("INSERT INTO account_banned(id,bandate,unbandate,bannedby,banreason,active) VALUES (%u,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+1,'%s','%s',0)", pl->GetSession()->GetAccountId(), bannedby.c_str(), banreason.c_str() ); SendSysMessage("All items removed"); } else { return false; } return true; }