From e6143a1efd7b4757d2ee511fa777611caf327aaa Mon Sep 17 00:00:00 2001 From: IntelligentQuantum Date: Sun, 12 Sep 2021 14:49:14 +0430 Subject: [PATCH] feat(Core/Commands): Gear (#7717) --- .../rev_1630714167178408255.sql | 7 +++ .../Implementation/CharacterDatabase.cpp | 1 + .../Implementation/CharacterDatabase.h | 1 + src/server/game/Entities/Player/Player.cpp | 22 ++++++++ src/server/game/Entities/Player/Player.h | 2 + src/server/scripts/Commands/cs_misc.cpp | 52 ++++++++++++++++++- 6 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1630714167178408255.sql diff --git a/data/sql/updates/pending_db_world/rev_1630714167178408255.sql b/data/sql/updates/pending_db_world/rev_1630714167178408255.sql new file mode 100644 index 0000000000..3337215d7d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1630714167178408255.sql @@ -0,0 +1,7 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1630714167178408255'); + +DELETE FROM `command` WHERE `name` IN ('repairitems', 'gear repair', 'gear stats'); + +INSERT INTO `command` VALUES +('gear repair', 2, 'Syntax: .gear repair \nRepair all selected player''s items.'), +('gear stats', 0, 'Syntax: .gear stats'); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index ebabef2d25..e24d3b6f8c 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -500,6 +500,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, strength, agility, stamina, intellect, spirit, " "armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, " "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHAR_STATS, "SELECT maxhealth, strength, agility, stamina, intellect, spirit, armor, attackPower, spellPower, resilience FROM character_stats WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, "DELETE FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index b762a5989f..f5d0e44be9 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -424,6 +424,7 @@ enum CharacterDatabaseStatements : uint32 CHAR_INS_CHAR_SPELL, CHAR_DEL_CHAR_STATS, CHAR_INS_CHAR_STATS, + CHAR_SEL_CHAR_STATS, CHAR_DEL_PETITION_BY_OWNER, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index b43dbc7233..635d0cc057 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15207,3 +15207,25 @@ float Player::GetSightRange(const WorldObject* target) const return sightRange; } + +std::string Player::GetPlayerName() +{ + std::string name = GetName(); + std::string color = ""; + + switch (getClass()) + { + case CLASS_DEATH_KNIGHT: color = "|cffC41F3B"; break; + case CLASS_DRUID: color = "|cffFF7D0A"; break; + case CLASS_HUNTER: color = "|cffABD473"; break; + case CLASS_MAGE: color = "|cff69CCF0"; break; + case CLASS_PALADIN: color = "|cffF58CBA"; break; + case CLASS_PRIEST: color = "|cffFFFFFF"; break; + case CLASS_ROGUE: color = "|cffFFF569"; break; + case CLASS_SHAMAN: color = "|cff0070DE"; break; + case CLASS_WARLOCK: color = "|cff9482C9"; break; + case CLASS_WARRIOR: color = "|cffC79C6E"; break; + } + + return "|Hplayer:" + name + "|h" + color + name + "|h|r"; +} diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 871fe050d6..2a1419fd74 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2525,6 +2525,8 @@ public: float GetSightRange(const WorldObject* target = nullptr) const override; + std::string GetPlayerName(); + protected: // Gamemaster whisper whitelist WhisperListContainer WhisperList; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index c4142f8072..b63c36b778 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -58,6 +58,11 @@ public: { "message", SEC_ADMINISTRATOR, true, &HandleSendMessageCommand, "" }, { "money", SEC_GAMEMASTER, true, &HandleSendMoneyCommand, "" } }; + static std::vector gearCommandTable = + { + { "repair", SEC_GAMEMASTER, false, &HandleGearRepairCommand, "" }, + { "stats", SEC_PLAYER, false, &HandleGearStatsCommand, "" } + }; static std::vector commandTable = { { "dev", SEC_ADMINISTRATOR, false, &HandleDevCommand, "" }, @@ -102,10 +107,10 @@ public: { "damage", SEC_GAMEMASTER, false, &HandleDamageCommand, "" }, { "combatstop", SEC_GAMEMASTER, true, &HandleCombatStopCommand, "" }, { "flusharenapoints", SEC_ADMINISTRATOR, false, &HandleFlushArenaPointsCommand, "" }, - { "repairitems", SEC_GAMEMASTER, true, &HandleRepairitemsCommand, "" }, { "freeze", SEC_GAMEMASTER, false, &HandleFreezeCommand, "" }, { "unfreeze", SEC_GAMEMASTER, false, &HandleUnFreezeCommand, "" }, { "group", SEC_GAMEMASTER, false, nullptr, "", groupCommandTable }, + { "gear", SEC_PLAYER, false, nullptr, "", gearCommandTable }, { "possess", SEC_GAMEMASTER, false, HandlePossessCommand, "" }, { "unpossess", SEC_GAMEMASTER, false, HandleUnPossessCommand, "" }, { "bindsight", SEC_ADMINISTRATOR, false, HandleBindSightCommand, "" }, @@ -2625,7 +2630,7 @@ public: return true; } - static bool HandleRepairitemsCommand(ChatHandler* handler, char const* args) + static bool HandleGearRepairCommand(ChatHandler* handler, char const* args) { Player* target; if (!handler->extractPlayerTarget((char*)args, &target)) @@ -3385,6 +3390,49 @@ public: return true; } } + + static bool HandleGearStatsCommand(ChatHandler* handler, char const* /*args*/) + { + Player* player = handler->getSelectedPlayerOrSelf(); + + if (!player) + { + return false; + } + + handler->PSendSysMessage("Character: %s", player->GetPlayerName().c_str()); + handler->PSendSysMessage("Current equipment average item level: |cff00ffff%u|r", (int16)player->GetAverageItemLevel()); + + if (sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE)) + { + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_STATS); + stmt->setUInt32(0, player->GetGUID().GetCounter()); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (result) + { + Field* fields = result->Fetch(); + uint32 MaxHealth = fields[0].GetUInt32(); + uint32 Strength = fields[1].GetUInt32(); + uint32 Agility = fields[2].GetUInt32(); + uint32 Stamina = fields[3].GetUInt32(); + uint32 Intellect = fields[4].GetUInt32(); + uint32 Spirit = fields[5].GetUInt32(); + uint32 Armor = fields[6].GetUInt32(); + uint32 AttackPower = fields[7].GetUInt32(); + uint32 SpellPower = fields[8].GetUInt32(); + uint32 Resilience = fields[9].GetUInt32(); + + handler->PSendSysMessage("Health: |cff00ffff%u|r - Stamina: |cff00ffff%u|r", MaxHealth, Stamina); + handler->PSendSysMessage("Strength: |cff00ffff%u|r - Agility: |cff00ffff%u|r", Strength, Agility); + handler->PSendSysMessage("Intellect: |cff00ffff%u|r - Spirit: |cff00ffff%u|r", Intellect, Spirit); + handler->PSendSysMessage("AttackPower: |cff00ffff%u|r - SpellPower: |cff00ffff%u|r", AttackPower, SpellPower); + handler->PSendSysMessage("Armor: |cff00ffff%u|r - Resilience: |cff00ffff%u|r", Armor, Resilience); + } + } + + return true; + } }; void AddSC_misc_commandscript()