aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Accounts/RBAC.h2
-rw-r--r--src/server/game/Miscellaneous/Language.h10
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp93
3 files changed, 102 insertions, 3 deletions
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)