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 000000000..3337215d7 --- /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 ebabef2d2..e24d3b6f8 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 b762a5989..f5d0e44be 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 b43dbc723..635d0cc05 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 871fe050d..2a1419fd7 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 c4142f807..b63c36b77 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()