aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Accounts/RBAC.h1
-rw-r--r--src/server/game/Miscellaneous/Language.h10
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp97
3 files changed, 106 insertions, 2 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index 4ff5032e60b..fd9e3befaca 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -769,6 +769,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,
// custom permissions 1000+
RBAC_PERM_MAX
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index eb518ea19b7..d96b33fd968 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -315,7 +315,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 e037eff5bbc..5eea88f13c8 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -226,6 +226,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 =
{
@@ -1379,7 +1380,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->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
@@ -1444,6 +1445,100 @@ public:
return true;
}
+ static void _ShowLootEntry(ChatHandler* handler, uint32 itemId, uint8 itemCount, bool alternateString = false)
+ {
+ ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId);
+ ItemLocale const* itemLocale = sObjectMgr->GetItemLocale(itemId);
+ char const* name = nullptr;
+ if (itemLocale)
+ name = itemLocale->Name[handler->GetSessionDbcLocale()].c_str();
+ if ((!name || !*name) && itemTemplate)
+ name = itemTemplate->Name1.c_str();
+ if (!name)
+ name = "Unknown item";
+ handler->PSendSysMessage(alternateString ? LANG_COMMAND_NPC_SHOWLOOT_ENTRY_2 : LANG_COMMAND_NPC_SHOWLOOT_ENTRY,
+ itemCount, ItemQualityColors[itemTemplate ? itemTemplate->Quality : 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;
+ ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(pair.first);
+ Player const* player = ObjectAccessor::FindConnectedPlayer(guid);
+ handler->PSendSysMessage(LANG_COMMAND_NPC_SHOWLOOT_SUBLABEL, player ? player->GetName() : Trinity::StringFormat("Offline player (GuidLow 0x%08x)", pair.first).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)