/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2 * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS */ /* ScriptData Name: list_commandscript %Complete: 100 Comment: All list related commands Category: commandscripts EndScriptData */ #include "ScriptMgr.h" #include "Chat.h" #include "SpellAuraEffects.h" #include "Language.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Player.h" class list_commandscript : public CommandScript { public: list_commandscript() : CommandScript("list_commandscript") { } std::vector GetCommands() const override { static std::vector listCommandTable = { { "creature", SEC_MODERATOR, true, &HandleListCreatureCommand, "" }, { "item", SEC_MODERATOR, true, &HandleListItemCommand, "" }, { "object", SEC_MODERATOR, true, &HandleListObjectCommand, "" }, { "auras", SEC_MODERATOR, false, &HandleListAurasCommand, "" } }; static std::vector commandTable = { { "list", SEC_MODERATOR, true, nullptr, "", listCommandTable } }; return commandTable; } static bool HandleListCreatureCommand(ChatHandler* handler, char const* args) { if (!*args) return false; // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r char* id = handler->extractKeyFromLink((char*)args, "Hcreature_entry"); if (!id) return false; uint32 creatureId = atol(id); if (!creatureId) { handler->PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, creatureId); handler->SetSentErrorMessage(true); return false; } CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(creatureId); if (!cInfo) { handler->PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, creatureId); handler->SetSentErrorMessage(true); return false; } char* countStr = strtok(nullptr, " "); uint32 count = countStr ? atol(countStr) : 10; if (count == 0) return false; QueryResult result; uint32 creatureCount = 0; result = WorldDatabase.PQuery("SELECT COUNT(guid) FROM creature WHERE id='%u'", creatureId); if (result) creatureCount = (*result)[0].GetUInt64(); if (handler->GetSession()) { Player* player = handler->GetSession()->GetPlayer(); result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM creature WHERE id = '%u' ORDER BY order_ ASC LIMIT %u", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), creatureId, count); } else result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map FROM creature WHERE id = '%u' LIMIT %u", creatureId, count); if (result) { do { Field* fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); float x = fields[1].GetFloat(); float y = fields[2].GetFloat(); float z = fields[3].GetFloat(); uint16 mapId = fields[4].GetUInt16(); if (handler->GetSession()) handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, cInfo->Name.c_str(), x, y, z, mapId); else handler->PSendSysMessage(LANG_CREATURE_LIST_CONSOLE, guid, cInfo->Name.c_str(), x, y, z, mapId); } while (result->NextRow()); } handler->PSendSysMessage(LANG_COMMAND_LISTCREATUREMESSAGE, creatureId, creatureCount); return true; } static bool HandleListItemCommand(ChatHandler* handler, char const* args) { if (!*args) return false; char* id = handler->extractKeyFromLink((char*)args, "Hitem"); if (!id) return false; uint32 itemId = atol(id); if (!itemId) { handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); handler->SetSentErrorMessage(true); return false; } ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); if (!itemTemplate) { handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); handler->SetSentErrorMessage(true); return false; } char* countStr = strtok(nullptr, " "); uint32 count = countStr ? atol(countStr) : 10; if (count == 0) return false; PreparedQueryResult result; // inventory case uint32 inventoryCount = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM); stmt->setUInt32(0, itemId); result = CharacterDatabase.Query(stmt); if (result) inventoryCount = (*result)[0].GetUInt64(); stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY); stmt->setUInt32(0, itemId); stmt->setUInt32(1, count); result = CharacterDatabase.Query(stmt); if (result) { do { Field* fields = result->Fetch(); uint32 itemGuid = fields[0].GetUInt32(); uint32 itemBag = fields[1].GetUInt32(); uint8 itemSlot = fields[2].GetUInt8(); uint32 ownerGuid = fields[3].GetUInt32(); uint32 ownerAccountId = fields[4].GetUInt32(); std::string ownerName = fields[5].GetString(); char const* itemPos = 0; if (Player::IsEquipmentPos(itemBag, itemSlot)) itemPos = "[equipped]"; else if (Player::IsInventoryPos(itemBag, itemSlot)) itemPos = "[in inventory]"; else if (Player::IsBankPos(itemBag, itemSlot)) itemPos = "[in bank]"; else itemPos = ""; handler->PSendSysMessage(LANG_ITEMLIST_SLOT, itemGuid, ownerName.c_str(), ownerGuid, ownerAccountId, itemPos); } while (result->NextRow()); uint32 resultCount = uint32(result->GetRowCount()); if (count > resultCount) count -= resultCount; else if (count) count = 0; } // mail case uint32 mailCount = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_COUNT_ITEM); stmt->setUInt32(0, itemId); result = CharacterDatabase.Query(stmt); if (result) mailCount = (*result)[0].GetUInt64(); if (count > 0) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_ITEMS_BY_ENTRY); stmt->setUInt32(0, itemId); stmt->setUInt32(1, count); result = CharacterDatabase.Query(stmt); } else result = PreparedQueryResult(nullptr); if (result) { do { Field* fields = result->Fetch(); uint32 itemGuid = fields[0].GetUInt32(); uint32 itemSender = fields[1].GetUInt32(); uint32 itemReceiver = fields[2].GetUInt32(); uint32 itemSenderAccountId = fields[3].GetUInt32(); std::string itemSenderName = fields[4].GetString(); uint32 itemReceiverAccount = fields[5].GetUInt32(); std::string itemReceiverName = fields[6].GetString(); char const* itemPos = "[in mail]"; handler->PSendSysMessage(LANG_ITEMLIST_MAIL, itemGuid, itemSenderName.c_str(), itemSender, itemSenderAccountId, itemReceiverName.c_str(), itemReceiver, itemReceiverAccount, itemPos); } while (result->NextRow()); uint32 resultCount = uint32(result->GetRowCount()); if (count > resultCount) count -= resultCount; else if (count) count = 0; } // auction case uint32 auctionCount = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTIONHOUSE_COUNT_ITEM); stmt->setUInt32(0, itemId); result = CharacterDatabase.Query(stmt); if (result) auctionCount = (*result)[0].GetUInt64(); if (count > 0) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY); stmt->setUInt32(0, itemId); stmt->setUInt32(1, count); result = CharacterDatabase.Query(stmt); } else result = PreparedQueryResult(nullptr); if (result) { do { Field* fields = result->Fetch(); uint32 itemGuid = fields[0].GetUInt32(); uint32 owner = fields[1].GetUInt32(); uint32 ownerAccountId = fields[2].GetUInt32(); std::string ownerName = fields[3].GetString(); char const* itemPos = "[in auction]"; handler->PSendSysMessage(LANG_ITEMLIST_AUCTION, itemGuid, ownerName.c_str(), owner, ownerAccountId, itemPos); } while (result->NextRow()); } // guild bank case uint32 guildCount = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_COUNT_ITEM); stmt->setUInt32(0, itemId); result = CharacterDatabase.Query(stmt); if (result) guildCount = (*result)[0].GetUInt64(); stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY); stmt->setUInt32(0, itemId); stmt->setUInt32(1, count); result = CharacterDatabase.Query(stmt); if (result) { do { Field* fields = result->Fetch(); uint32 itemGuid = fields[0].GetUInt32(); uint32 guildGuid = fields[1].GetUInt32(); std::string guildName = fields[2].GetString(); char const* itemPos = "[in guild bank]"; handler->PSendSysMessage(LANG_ITEMLIST_GUILD, itemGuid, guildName.c_str(), guildGuid, itemPos); } while (result->NextRow()); uint32 resultCount = uint32(result->GetRowCount()); if (count > resultCount) count -= resultCount; else if (count) count = 0; } if (inventoryCount + mailCount + auctionCount + guildCount == 0) { handler->SendSysMessage(LANG_COMMAND_NOITEMFOUND); handler->SetSentErrorMessage(true); return false; } handler->PSendSysMessage(LANG_COMMAND_LISTITEMMESSAGE, itemId, inventoryCount + mailCount + auctionCount + guildCount, inventoryCount, mailCount, auctionCount, guildCount); return true; } static bool HandleListObjectCommand(ChatHandler* handler, char const* args) { if (!*args) return false; // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r char* id = handler->extractKeyFromLink((char*)args, "Hgameobject_entry"); if (!id) return false; uint32 gameObjectId = atol(id); if (!gameObjectId) { handler->PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, gameObjectId); handler->SetSentErrorMessage(true); return false; } GameObjectTemplate const* gInfo = sObjectMgr->GetGameObjectTemplate(gameObjectId); if (!gInfo) { handler->PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, gameObjectId); handler->SetSentErrorMessage(true); return false; } char* countStr = strtok(nullptr, " "); uint32 count = countStr ? atol(countStr) : 10; if (count == 0) return false; QueryResult result; uint32 objectCount = 0; result = WorldDatabase.PQuery("SELECT COUNT(guid) FROM gameobject WHERE id='%u'", gameObjectId); if (result) objectCount = (*result)[0].GetUInt64(); if (handler->GetSession()) { Player* player = handler->GetSession()->GetPlayer(); result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, id, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE id = '%u' ORDER BY order_ ASC LIMIT %u", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), gameObjectId, count); } else result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, id FROM gameobject WHERE id = '%u' LIMIT %u", gameObjectId, count); if (result) { do { Field* fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); float x = fields[1].GetFloat(); float y = fields[2].GetFloat(); float z = fields[3].GetFloat(); uint16 mapId = fields[4].GetUInt16(); uint32 entry = fields[5].GetUInt32(); if (handler->GetSession()) handler->PSendSysMessage(LANG_GO_LIST_CHAT, guid, entry, guid, gInfo->name.c_str(), x, y, z, mapId); else handler->PSendSysMessage(LANG_GO_LIST_CONSOLE, guid, gInfo->name.c_str(), x, y, z, mapId); } while (result->NextRow()); } handler->PSendSysMessage(LANG_COMMAND_LISTOBJMESSAGE, gameObjectId, objectCount); return true; } static bool HandleListAurasCommand(ChatHandler* handler, char const* args) { Unit* unit = handler->getSelectedUnit(); if (!unit) { handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); handler->SetSentErrorMessage(true); return false; } char const* talentStr = handler->GetTrinityString(LANG_TALENT); char const* passiveStr = handler->GetTrinityString(LANG_PASSIVE); Unit::AuraApplicationMap const& auras = unit->GetAppliedAuras(); handler->PSendSysMessage(LANG_COMMAND_TARGET_LISTAURAS, auras.size()); for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) { bool talent = GetTalentSpellCost(itr->second->GetBase()->GetId()) > 0; AuraApplication const* aurApp = itr->second; Aura const* aura = aurApp->GetBase(); char const* name = aura->GetSpellInfo()->SpellName[handler->GetSessionDbcLocale()]; std::ostringstream ss_name; ss_name << "|cffffffff|Hspell:" << aura->GetId() << "|h[" << name << "]|h|r"; handler->PSendSysMessage(LANG_COMMAND_TARGET_AURADETAIL, aura->GetId(), (handler->GetSession() ? ss_name.str().c_str() : name), aurApp->GetEffectMask(), aura->GetCharges(), aura->GetStackAmount(), aurApp->GetSlot(), aura->GetDuration(), aura->GetMaxDuration(), (aura->IsPassive() ? passiveStr : ""), (talent ? talentStr : ""), IS_PLAYER_GUID(aura->GetCasterGUID()) ? "player" : "creature", GUID_LOPART(aura->GetCasterGUID())); } if (!args || std::string(args) != "all") return true; for (uint16 i = 0; i < TOTAL_AURAS; ++i) { Unit::AuraEffectList const& auraList = unit->GetAuraEffectsByType(AuraType(i)); if (auraList.empty()) continue; handler->PSendSysMessage(LANG_COMMAND_TARGET_LISTAURATYPE, auraList.size(), i); for (Unit::AuraEffectList::const_iterator itr = auraList.begin(); itr != auraList.end(); ++itr) handler->PSendSysMessage(LANG_COMMAND_TARGET_AURASIMPLE, (*itr)->GetId(), (*itr)->GetEffIndex(), (*itr)->GetAmount()); } return true; } }; void AddSC_list_commandscript() { new list_commandscript(); }