aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/base/auth_database.sql4
-rw-r--r--sql/updates/auth/master/2017_06_12_02_auth.sql7
-rw-r--r--sql/updates/world/master/2020_07_16_05_world_2017_06_12_02_world.sql17
-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
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)