diff options
author | treeston <treeston.mmoc@gmail.com> | 2017-06-12 19:10:41 +0200 |
---|---|---|
committer | Carbenium <carbenium@outlook.com> | 2020-07-16 22:00:29 +0200 |
commit | 64d8b183de9c56e1350b7323167b509fe2c43805 (patch) | |
tree | 38e723ac8b864c086c354caed7f97a27d8543f53 | |
parent | d4caff90aab165973c862847a3e4e4b49ab3cad6 (diff) |
Add new command 'npc showloot'. Does exactly what it says on the tin.
(cherry picked from commit 6f29aac93626ce37922c3c9a85d20b2e4d9d3bbc)
-rw-r--r-- | sql/base/auth_database.sql | 4 | ||||
-rw-r--r-- | sql/updates/auth/master/2017_06_12_02_auth.sql | 7 | ||||
-rw-r--r-- | sql/updates/world/master/2020_07_16_05_world_2017_06_12_02_world.sql | 17 | ||||
-rw-r--r-- | src/server/game/Accounts/RBAC.h | 2 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/Language.h | 10 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 93 |
6 files changed, 129 insertions, 4 deletions
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 0f8d8876224..b77cf6c9b73 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -1267,7 +1267,8 @@ INSERT INTO `rbac_linked_permissions` VALUES (197,857), (197,858), (197,859), -(197,860) +(197,860), +(197,865), (198,218), (198,300), (198,312), @@ -2099,6 +2100,7 @@ INSERT INTO `rbac_permissions` VALUES (858,'Command: gobject spawngroup'), (859,'Command: gobject despawngroup'), (860,'Command: list respawns'), +(865,'Command: npc showloot'), (868,'Command: modify power'), (869,'Command: debug send playerchoice'), (872,'Command: server debug'); diff --git a/sql/updates/auth/master/2017_06_12_02_auth.sql b/sql/updates/auth/master/2017_06_12_02_auth.sql new file mode 100644 index 00000000000..2b42dc39b12 --- /dev/null +++ b/sql/updates/auth/master/2017_06_12_02_auth.sql @@ -0,0 +1,7 @@ +DELETE FROM `rbac_permissions` WHERE `id`=865; +INSERT INTO `rbac_permissions` (`id`,`name`) VALUES +(865, 'Command: npc showloot'); + +DELETE FROM `rbac_linked_permissions` WHERE `linkedId`=865; +INSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES +(197,865); diff --git a/sql/updates/world/master/2020_07_16_05_world_2017_06_12_02_world.sql b/sql/updates/world/master/2020_07_16_05_world_2017_06_12_02_world.sql new file mode 100644 index 00000000000..77f854df9bd --- /dev/null +++ b/sql/updates/world/master/2020_07_16_05_world_2017_06_12_02_world.sql @@ -0,0 +1,17 @@ +-- +DELETE FROM `trinity_string` WHERE `entry` BETWEEN 288 AND 295; +INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES + (288, '%s either isn\'t dead or has no loot available.'), + (289, 'LOOT INFO: %s (%d)'), + (290, '├ %s (%d items):'), + (291, '├─ %dx |c%08x|Hitem:%d:0:0:0:0:0:0:0:0|h[%s]|h|r (#%05d)'), + (292, '├ Money: %01d|TInterface\\MoneyFrame\\UI-GoldIcon:0:0:2:0|t %02d|TInterface\\MoneyFrame\\UI-SilverIcon:0:0:2:0|t %02d|TInterface\\MoneyFrame\\UI-CopperIcon:0:0:2:0|t'), + (293, '├ %s:'), + (294, '├─ %s (%d items):'), + (295, '├── %dx |c%08x|Hitem:%d:0:0:0:0:0:0:0:0|h[%s]|h|r (#%05d)'); + +DELETE FROM `command` WHERE `name`='npc showloot'; +INSERT INTO `command` (`name`,`permission`,`help`) VALUES +('npc showloot', 865, "Syntax: .npc showloot [all] + +Shows the loot contained in targeted dead creature."); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index a63f4c66a3e..b64f1509bdc 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -770,7 +770,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_GROUP_ASSISTANT = 862, RBAC_PERM_COMMAND_GROUP_MAINTANK = 863, RBAC_PERM_COMMAND_GROUP_MAINASSIST = 864, - RBAC_PERM_COMMAND_NPC_SHOWLOOT = 865, // reserved + RBAC_PERM_COMMAND_NPC_SHOWLOOT = 865, RBAC_PERM_COMMAND_LIST_SPAWNPOINTS = 866, // reserved RBAC_PERM_COMMAND_RELOAD_QUEST_GREETING_LOCALE = 867, // reserved RBAC_PERM_COMMAND_MODIFY_POWER = 868, diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 4893d46c5d3..df3f8a55ab1 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -322,7 +322,15 @@ enum TrinityStrings LANG_COMMAND_WHISPERON = 285, LANG_COMMAND_WHISPEROFF = 286, LANG_COMMAND_CREATGUIDNOTFOUND = 287, - // TICKET STRINGS NEED REWRITE // 288-296 FREE + LANG_COMMAND_NOT_DEAD_OR_NO_LOOT = 288, + LANG_COMMAND_NPC_SHOWLOOT_HEADER = 289, + LANG_COMMAND_NPC_SHOWLOOT_LABEL = 290, + LANG_COMMAND_NPC_SHOWLOOT_ENTRY = 291, + LANG_COMMAND_NPC_SHOWLOOT_MONEY = 292, + LANG_COMMAND_NPC_SHOWLOOT_LABEL_2 = 293, + LANG_COMMAND_NPC_SHOWLOOT_SUBLABEL = 294, + LANG_COMMAND_NPC_SHOWLOOT_ENTRY_2 = 295, + // 296 free // END LANG_COMMAND_SPAWNDIST = 297, diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 4d818db8f9d..a9258373afd 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -264,6 +264,7 @@ public: { "follow", rbac::RBAC_PERM_COMMAND_NPC_FOLLOW, false, nullptr, "", npcFollowCommandTable }, { "set", rbac::RBAC_PERM_COMMAND_NPC_SET, false, nullptr, "", npcSetCommandTable }, { "evade", rbac::RBAC_PERM_COMMAND_NPC_EVADE, false, &HandleNpcEvadeCommand, "" }, + { "showloot", rbac::RBAC_PERM_COMMAND_NPC_SHOWLOOT, false, &HandleNpcShowLootCommand, "" }, }; static std::vector<ChatCommand> commandTable = { @@ -1464,7 +1465,7 @@ public: pet->SetReactState(REACT_DEFENSIVE); // calculate proper level - uint8 level = (creatureTarget->getLevel() < (player->getLevel() - 5)) ? (player->getLevel() - 5) : creatureTarget->getLevel(); + uint8 level = std::max<uint8>(player->getLevel()-5, creatureTarget->getLevel()); // prepare visual effect for levelup pet->SetLevel(level - 1); @@ -1529,6 +1530,96 @@ public: return true; } + static void _ShowLootEntry(ChatHandler* handler, uint32 itemId, uint8 itemCount, bool alternateString = false) + { + ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); + char const* name = nullptr; + if (!itemTemplate) + name = itemTemplate->GetName(handler->GetSessionDbcLocale()); + if (!name) + name = "Unknown item"; + handler->PSendSysMessage(alternateString ? LANG_COMMAND_NPC_SHOWLOOT_ENTRY_2 : LANG_COMMAND_NPC_SHOWLOOT_ENTRY, + itemCount, ItemQualityColors[itemTemplate ? static_cast<ItemQualities>(itemTemplate->GetQuality()) : ITEM_QUALITY_POOR], itemId, name, itemId); + } + static void _IterateNotNormalLootMap(ChatHandler* handler, NotNormalLootItemMap const& map, std::vector<LootItem> const& items) + { + for (NotNormalLootItemMap::value_type const& pair : map) + { + if (!pair.second) + continue; + Player const* player = ObjectAccessor::FindConnectedPlayer(pair.first); + handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_SUBLABEL, player ? player->GetName() : Trinity::StringFormat("Offline player (GUID %s)", pair.first.ToString()).c_str(), pair.second->size()); + + for (auto it = pair.second->cbegin(); it != pair.second->cend(); ++it) + { + LootItem const& item = items[it->index]; + if (!(it->is_looted) && !item.is_looted) + _ShowLootEntry(handler, item.itemid, item.count, true); + } + } + } + static bool HandleNpcShowLootCommand(ChatHandler* handler, char const* args) + { + Creature* creatureTarget = handler->getSelectedCreature(); + if (!creatureTarget || creatureTarget->IsPet()) + { + handler->PSendSysMessage(LANG_SELECT_CREATURE); + handler->SetSentErrorMessage(true); + return false; + } + + Loot const& loot = creatureTarget->loot; + if (!creatureTarget->isDead() || loot.empty()) + { + handler->PSendSysMessage(LANG_COMMAND_NOT_DEAD_OR_NO_LOOT, creatureTarget->GetName()); + handler->SetSentErrorMessage(true); + return false; + } + + handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_HEADER, creatureTarget->GetName(), creatureTarget->GetEntry()); + handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_MONEY, loot.gold / GOLD, (loot.gold%GOLD) / SILVER, loot.gold%SILVER); + + if (strcmp(args, "all")) // nonzero from strcmp <-> not equal + { + handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_LABEL, "Standard items", loot.items.size()); + for (LootItem const& item : loot.items) + if (!item.is_looted) + _ShowLootEntry(handler, item.itemid, item.count); + + handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_LABEL, "Quest items", loot.quest_items.size()); + for (LootItem const& item : loot.quest_items) + if (!item.is_looted) + _ShowLootEntry(handler, item.itemid, item.count); + } + else + { + handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_LABEL, "Standard items", loot.items.size()); + for (LootItem const& item : loot.items) + if (!item.is_looted && !item.freeforall && item.conditions.empty()) + _ShowLootEntry(handler, item.itemid, item.count); + + if (!loot.GetPlayerQuestItems().empty()) + { + handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_LABEL_2, "Per-player quest items"); + _IterateNotNormalLootMap(handler, loot.GetPlayerQuestItems(), loot.quest_items); + } + + if (!loot.GetPlayerFFAItems().empty()) + { + handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_LABEL_2, "FFA items per allowed player"); + _IterateNotNormalLootMap(handler, loot.GetPlayerFFAItems(), loot.items); + } + + if (!loot.GetPlayerNonQuestNonFFAConditionalItems().empty()) + { + handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_LABEL_2, "Per-player conditional items"); + _IterateNotNormalLootMap(handler, loot.GetPlayerNonQuestNonFFAConditionalItems(), loot.items); + } + } + + return true; + } + static bool HandleNpcAddFormationCommand(ChatHandler* handler, char const* args) { if (!*args) |