diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index 45ed122ac..46e4c43bf 100644 --- a/src/common/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp @@ -19,7 +19,9 @@ #include "Common.h" #include "Containers.h" #include "IpAddress.h" +#include "StringConvert.h" #include "StringFormat.h" +#include "Tokenize.h" #include #include #include @@ -185,41 +187,55 @@ std::string secsToTimeString(uint64 timeInSecs, bool shortText) return str; } -int32 MoneyStringToMoney(const std::string& moneyString) +Optional MoneyStringToMoney(std::string_view moneyString) { int32 money = 0; - if (!(std::count(moneyString.begin(), moneyString.end(), 'g') == 1 || - std::count(moneyString.begin(), moneyString.end(), 's') == 1 || - std::count(moneyString.begin(), moneyString.end(), 'c') == 1)) - { - return 0; // Bad format - } + bool hadG = false; + bool hadS = false; + bool hadC = false; - Tokenizer tokens(moneyString, ' '); - for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr) + for (std::string_view token : Acore::Tokenize(moneyString, ' ', false)) { - std::string tokenString(*itr); - size_t gCount = std::count(tokenString.begin(), tokenString.end(), 'g'); - size_t sCount = std::count(tokenString.begin(), tokenString.end(), 's'); - size_t cCount = std::count(tokenString.begin(), tokenString.end(), 'c'); - if (gCount + sCount + cCount != 1) + uint32 unit; + switch (token[token.length() - 1]) { - return 0; + case 'g': + if (hadG) + { + return std::nullopt; + } + hadG = true; + unit = 100 * 100; + break; + case 's': + if (hadS) + { + return std::nullopt; + } + hadS = true; + unit = 100; + break; + case 'c': + if (hadC) + { + return std::nullopt; + } + hadC = true; + unit = 1; + break; + default: + return std::nullopt; } - uint32 amount = atoi(*itr); - if (gCount == 1) + Optional amount = Acore::StringTo(token.substr(0, token.length() - 1)); + if (amount) { - money += amount * 100 * 100; + money += (unit * *amount); } - else if (sCount == 1) + else { - money += amount * 100; - } - else if (cCount == 1) - { - money += amount; + return std::nullopt; } } diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index a3032ac91..78d9a5fb0 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -21,6 +21,7 @@ #include "Containers.h" #include "Define.h" #include "Errors.h" +#include "Optional.h" #include #include #include @@ -74,7 +75,7 @@ tm TimeBreakdown(time_t t); void stripLineInvisibleChars(std::string& src); -int32 MoneyStringToMoney(const std::string& moneyString); +AC_COMMON_API Optional MoneyStringToMoney(std::string_view moneyString); std::string secsToTimeString(uint64 timeInSecs, bool shortText = false); uint32 TimeStringToSecs(const std::string& timestring); diff --git a/src/server/game/Reputation/ReputationMgr.h b/src/server/game/Reputation/ReputationMgr.h index 3f9ae9af0..cf81a8759 100644 --- a/src/server/game/Reputation/ReputationMgr.h +++ b/src/server/game/Reputation/ReputationMgr.h @@ -25,10 +25,16 @@ #include "SharedDefines.h" #include -static uint32 ReputationRankStrIndex[MAX_REPUTATION_RANK] = +constexpr std::array ReputationRankStrIndex = { - LANG_REP_HATED, LANG_REP_HOSTILE, LANG_REP_UNFRIENDLY, LANG_REP_NEUTRAL, - LANG_REP_FRIENDLY, LANG_REP_HONORED, LANG_REP_REVERED, LANG_REP_EXALTED + LANG_REP_HATED, + LANG_REP_HOSTILE, + LANG_REP_UNFRIENDLY, + LANG_REP_NEUTRAL, + LANG_REP_FRIENDLY, + LANG_REP_HONORED, + LANG_REP_REVERED, + LANG_REP_EXALTED }; typedef uint32 RepListID; diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index bc805d7c5..a9e912dbc 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -32,10 +32,6 @@ EndScriptData */ #include "ScriptMgr.h" #include "StringConvert.h" -#if AC_COMPILER == AC_COMPILER_GNU -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - using namespace Acore::ChatCommands; class modify_commandscript : public CommandScript @@ -47,49 +43,50 @@ public: { static ChatCommandTable modifyspeedCommandTable = { - { "fly", SEC_GAMEMASTER, false, &HandleModifyFlyCommand, "" }, - { "all", SEC_GAMEMASTER, false, &HandleModifyASpeedCommand, "" }, - { "walk", SEC_GAMEMASTER, false, &HandleModifySpeedCommand, "" }, - { "backwalk", SEC_GAMEMASTER, false, &HandleModifyBWalkCommand, "" }, - { "swim", SEC_GAMEMASTER, false, &HandleModifySwimCommand, "" }, - { "", SEC_GAMEMASTER, false, &HandleModifyASpeedCommand, "" } + { "fly", HandleModifyFlyCommand, SEC_GAMEMASTER, Console::No }, + { "all", HandleModifyASpeedCommand, SEC_GAMEMASTER, Console::No }, + { "walk", HandleModifySpeedCommand, SEC_GAMEMASTER, Console::No }, + { "backwalk", HandleModifyBWalkCommand, SEC_GAMEMASTER, Console::No }, + { "swim", HandleModifySwimCommand, SEC_GAMEMASTER, Console::No }, + { "", HandleModifyASpeedCommand, SEC_GAMEMASTER, Console::No } }; static ChatCommandTable modifyCommandTable = { - { "hp", SEC_GAMEMASTER, false, &HandleModifyHPCommand, "" }, - { "mana", SEC_GAMEMASTER, false, &HandleModifyManaCommand, "" }, - { "rage", SEC_GAMEMASTER, false, &HandleModifyRageCommand, "" }, - { "runicpower", SEC_GAMEMASTER, false, &HandleModifyRunicPowerCommand, "" }, - { "energy", SEC_GAMEMASTER, false, &HandleModifyEnergyCommand, "" }, - { "money", SEC_GAMEMASTER, false, &HandleModifyMoneyCommand, "" }, - { "scale", SEC_GAMEMASTER, false, &HandleModifyScaleCommand, "" }, - { "bit", SEC_GAMEMASTER, false, &HandleModifyBitCommand, "" }, - { "faction", SEC_ADMINISTRATOR, false, &HandleModifyFactionCommand, "" }, - { "spell", SEC_CONSOLE, false, &HandleModifySpellCommand, "" }, - { "talentpoints", SEC_GAMEMASTER, false, &HandleModifyTalentCommand, "" }, - { "mount", SEC_GAMEMASTER, false, &HandleModifyMountCommand, "" }, - { "honor", SEC_GAMEMASTER, false, &HandleModifyHonorCommand, "" }, - { "reputation", SEC_GAMEMASTER, false, &HandleModifyRepCommand, "" }, - { "arenapoints", SEC_GAMEMASTER, false, &HandleModifyArenaCommand, "" }, - { "drunk", SEC_GAMEMASTER, false, &HandleModifyDrunkCommand, "" }, - { "standstate", SEC_GAMEMASTER, false, &HandleModifyStandStateCommand, "" }, - { "phase", SEC_GAMEMASTER, false, &HandleModifyPhaseCommand, "" }, - { "gender", SEC_GAMEMASTER, false, &HandleModifyGenderCommand, "" }, - { "speed", SEC_GAMEMASTER, false, nullptr, "", modifyspeedCommandTable } + { "hp", HandleModifyHPCommand, SEC_GAMEMASTER, Console::No }, + { "mana", HandleModifyManaCommand, SEC_GAMEMASTER, Console::No }, + { "rage", HandleModifyRageCommand, SEC_GAMEMASTER, Console::No }, + { "runicpower", HandleModifyRunicPowerCommand, SEC_GAMEMASTER, Console::No }, + { "energy", HandleModifyEnergyCommand, SEC_GAMEMASTER, Console::No }, + { "money", HandleModifyMoneyCommand, SEC_GAMEMASTER, Console::No }, + { "scale", HandleModifyScaleCommand, SEC_GAMEMASTER, Console::No }, + { "bit", HandleModifyBitCommand, SEC_GAMEMASTER, Console::No }, + { "faction", HandleModifyFactionCommand, SEC_ADMINISTRATOR, Console::No }, + { "spell", HandleModifySpellCommand, SEC_CONSOLE, Console::No }, + { "talentpoints", HandleModifyTalentCommand, SEC_GAMEMASTER, Console::No }, + { "mount", HandleModifyMountCommand, SEC_GAMEMASTER, Console::No }, + { "honor", HandleModifyHonorCommand, SEC_GAMEMASTER, Console::No }, + { "reputation", HandleModifyRepCommand, SEC_GAMEMASTER, Console::No }, + { "arenapoints", HandleModifyArenaCommand, SEC_GAMEMASTER, Console::No }, + { "drunk", HandleModifyDrunkCommand, SEC_GAMEMASTER, Console::No }, + { "standstate", HandleModifyStandStateCommand, SEC_GAMEMASTER, Console::No }, + { "phase", HandleModifyPhaseCommand, SEC_GAMEMASTER, Console::No }, + { "gender", HandleModifyGenderCommand, SEC_GAMEMASTER, Console::No }, + { "speed", modifyspeedCommandTable } }; static ChatCommandTable morphCommandTable = { - { "reset", SEC_MODERATOR, false, &HandleMorphResetCommand, "" }, - { "target", SEC_MODERATOR, false, &HandleMorphTargetCommand, "" } + { "reset", HandleMorphResetCommand, SEC_MODERATOR, Console::No }, + { "target", HandleMorphTargetCommand, SEC_MODERATOR, Console::No } }; static ChatCommandTable commandTable = { - { "morph", SEC_MODERATOR, false, nullptr, "", morphCommandTable }, - { "modify", SEC_GAMEMASTER, false, nullptr, "", modifyCommandTable } + { "morph", morphCommandTable }, + { "modify", modifyCommandTable } }; + return commandTable; } @@ -98,7 +95,8 @@ public: { if (Player* player = target->ToPlayer()) { - handler->PSendSysMessage(resourceMessage, handler->GetNameLink(player).c_str(), args...); + handler->PSendSysMessage(resourceMessage, std::forward(args)..., handler->GetNameLink(player).c_str()); + if (handler->needReportToTarget(player)) { ChatHandler(player->GetSession()).PSendSysMessage(resourceReportMessage, handler->GetNameLink().c_str(), std::forward(args)...); @@ -106,23 +104,15 @@ public: } } - //Edit Player HP - static bool HandleModifyHPCommand(ChatHandler* handler, const char* args) + static bool CheckModifyInt32(ChatHandler* handler, Player* target, int32 modifyValue) { - if (!*args) - return false; - - int32 hp = atoi((char*)args); - int32 hpm = atoi((char*)args); - - if (hp < 1 || hpm < 1 || hpm < hp) + if (modifyValue < 1) { handler->SendSysMessage(LANG_BAD_VALUE); handler->SetSentErrorMessage(true); return false; } - Player* target = handler->getSelectedPlayer(); if (!target) { handler->SendSysMessage(LANG_NO_CHAR_SELECTED); @@ -131,101 +121,80 @@ public: } if (handler->HasLowerSecurity(target)) + { return false; + } + + return true; + } + + //Edit Player HP + static bool HandleModifyHPCommand(ChatHandler* handler, int32 healthPoints) + { + Player* target = handler->getSelectedPlayer(); + + if (!CheckModifyInt32(handler, target, healthPoints)) + { + return false; + } + + handler->PSendSysMessage(LANG_YOU_CHANGE_HP, handler->GetNameLink(target).c_str(), healthPoints, healthPoints); - handler->PSendSysMessage(LANG_YOU_CHANGE_HP, handler->GetNameLink(target).c_str(), hp, hpm); if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_HP_CHANGED, handler->GetNameLink().c_str(), hp, hpm); + { + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_HP_CHANGED, handler->GetNameLink().c_str(), healthPoints, healthPoints); + } - target->SetMaxHealth(hpm); - target->SetHealth(hp); + target->SetMaxHealth(healthPoints); + target->SetHealth(healthPoints); return true; } //Edit Player Mana - static bool HandleModifyManaCommand(ChatHandler* handler, const char* args) + static bool HandleModifyManaCommand(ChatHandler* handler, int32 manaPoints) { - if (!*args) - return false; - - int32 mana = atoi((char*)args); - int32 manam = atoi((char*)args); - - if (mana <= 0 || manam <= 0 || manam < mana) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - Player* target = handler->getSelectedPlayer(); - if (!target) + + if (!CheckModifyInt32(handler, target, manaPoints)) { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); return false; } - // check online security - if (handler->HasLowerSecurity(target)) - return false; + handler->PSendSysMessage(LANG_YOU_CHANGE_MANA, handler->GetNameLink(target).c_str(), manaPoints, manaPoints); - handler->PSendSysMessage(LANG_YOU_CHANGE_MANA, handler->GetNameLink(target).c_str(), mana, manam); if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_MANA_CHANGED, handler->GetNameLink().c_str(), mana, manam); + { + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MANA_CHANGED, handler->GetNameLink().c_str(), manaPoints, manaPoints); + } - target->SetMaxPower(POWER_MANA, manam); - target->SetPower(POWER_MANA, mana); + target->SetMaxPower(POWER_MANA, manaPoints); + target->SetPower(POWER_MANA, manaPoints); return true; } //Edit Player Energy - static bool HandleModifyEnergyCommand(ChatHandler* handler, const char* args) + static bool HandleModifyEnergyCommand(ChatHandler* handler, int32 energyPoints) { - if (!*args) - return false; - - // char* pmana = strtok((char*)args, " "); - // if (!pmana) - // return false; - - // char* pmanaMax = strtok(nullptr, " "); - // if (!pmanaMax) - // return false; - - // int32 manam = atoi(pmanaMax); - // int32 mana = atoi(pmana); - - int32 energy = atoi((char*)args) * 10; - int32 energym = atoi((char*)args) * 10; - - if (energy <= 0 || energym <= 0 || energym < energy) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - Player* target = handler->getSelectedPlayer(); - if (!target) + + if (!CheckModifyInt32(handler, target, energyPoints)) { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); return false; } - // check online security - if (handler->HasLowerSecurity(target)) - return false; + energyPoints *= 10; + + handler->PSendSysMessage(LANG_YOU_CHANGE_ENERGY, handler->GetNameLink(target).c_str(), energyPoints / 10, energyPoints / 10); - handler->PSendSysMessage(LANG_YOU_CHANGE_ENERGY, handler->GetNameLink(target).c_str(), energy / 10, energym / 10); if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, handler->GetNameLink().c_str(), energy / 10, energym / 10); + { + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, handler->GetNameLink().c_str(), energyPoints / 10, energyPoints / 10); + } - target->SetMaxPower(POWER_ENERGY, energym); - target->SetPower(POWER_ENERGY, energy); + target->SetMaxPower(POWER_ENERGY, energyPoints); + target->SetPower(POWER_ENERGY, energyPoints); LOG_DEBUG("misc", handler->GetAcoreString(LANG_CURRENT_ENERGY), target->GetMaxPower(POWER_ENERGY)); @@ -233,96 +202,58 @@ public: } //Edit Player Rage - static bool HandleModifyRageCommand(ChatHandler* handler, const char* args) + static bool HandleModifyRageCommand(ChatHandler* handler, int32 ragePoints) { - if (!*args) - return false; - - // char* pmana = strtok((char*)args, " "); - // if (!pmana) - // return false; - - // char* pmanaMax = strtok(nullptr, " "); - // if (!pmanaMax) - // return false; - - // int32 manam = atoi(pmanaMax); - // int32 mana = atoi(pmana); - - int32 rage = atoi((char*)args) * 10; - int32 ragem = atoi((char*)args) * 10; - - if (rage <= 0 || ragem <= 0 || ragem < rage) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - Player* target = handler->getSelectedPlayer(); - if (!target) + + if (!CheckModifyInt32(handler, target, ragePoints)) { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); return false; } - // check online security - if (handler->HasLowerSecurity(target)) - return false; + ragePoints *= 10; + + handler->PSendSysMessage(LANG_YOU_CHANGE_RAGE, handler->GetNameLink(target).c_str(), ragePoints / 10, ragePoints / 10); - handler->PSendSysMessage(LANG_YOU_CHANGE_RAGE, handler->GetNameLink(target).c_str(), rage / 10, ragem / 10); if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, handler->GetNameLink().c_str(), rage / 10, ragem / 10); + { + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, handler->GetNameLink().c_str(), ragePoints / 10, ragePoints / 10); + } - target->SetMaxPower(POWER_RAGE, ragem); - target->SetPower(POWER_RAGE, rage); + target->SetMaxPower(POWER_RAGE, ragePoints); + target->SetPower(POWER_RAGE, ragePoints); return true; } // Edit Player Runic Power - static bool HandleModifyRunicPowerCommand(ChatHandler* handler, const char* args) + static bool HandleModifyRunicPowerCommand(ChatHandler* handler, int32 runePoints) { - if (!*args) - return false; - - int32 rune = atoi((char*)args) * 10; - int32 runem = atoi((char*)args) * 10; - - if (rune <= 0 || runem <= 0 || runem < rune) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - Player* target = handler->getSelectedPlayer(); - if (!target) + + if (!CheckModifyInt32(handler, target, runePoints)) { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); return false; } - handler->PSendSysMessage(LANG_YOU_CHANGE_RUNIC_POWER, handler->GetNameLink(target).c_str(), rune / 10, runem / 10); - if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_RUNIC_POWER_CHANGED, handler->GetNameLink().c_str(), rune / 10, runem / 10); + runePoints *= 10; - target->SetMaxPower(POWER_RUNIC_POWER, runem); - target->SetPower(POWER_RUNIC_POWER, rune); + handler->PSendSysMessage(LANG_YOU_CHANGE_RUNIC_POWER, handler->GetNameLink(target).c_str(), runePoints / 10, runePoints / 10); + + if (handler->needReportToTarget(target)) + { + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_RUNIC_POWER_CHANGED, handler->GetNameLink().c_str(), runePoints / 10, runePoints / 10); + } + + target->SetMaxPower(POWER_RUNIC_POWER, runePoints); + target->SetPower(POWER_RUNIC_POWER, runePoints); return true; } //Edit Player Faction - static bool HandleModifyFactionCommand(ChatHandler* handler, const char* args) + static bool HandleModifyFactionCommand(ChatHandler* handler, Optional factionID, Optional flagID, Optional npcFlagID, Optional dynamicFlagID) { - if (!*args) - return false; - - char* pfactionid = handler->extractKeyFromLink((char*)args, "Hfaction"); - Creature* target = handler->getSelectedCreature(); if (!target) { @@ -331,7 +262,7 @@ public: return false; } - if (!pfactionid) + if (!factionID) { uint32 factionid = target->GetFaction(); uint32 flag = target->GetUInt32Value(UNIT_FIELD_FLAGS); @@ -341,30 +272,28 @@ public: return true; } - uint32 factionid = atoi(pfactionid); + uint32 factionid = factionID.value(); uint32 flag; + uint32 npcflag; + uint32 dyflag; - char* pflag = strtok(nullptr, " "); + auto pflag = flagID; if (!pflag) flag = target->GetUInt32Value(UNIT_FIELD_FLAGS); else - flag = atoi(pflag); + flag = *pflag; - char* pnpcflag = strtok(nullptr, " "); - - uint32 npcflag; + auto pnpcflag = npcFlagID; if (!pnpcflag) - npcflag = target->GetUInt32Value(UNIT_NPC_FLAGS); + npcflag = target->GetUInt32Value(UNIT_NPC_FLAGS); else - npcflag = atoi(pnpcflag); + npcflag = *npcFlagID; - char* pdyflag = strtok(nullptr, " "); - - uint32 dyflag; + auto pdyflag = dynamicFlagID; if (!pdyflag) - dyflag = target->GetUInt32Value(UNIT_DYNAMIC_FLAGS); + dyflag = target->GetUInt32Value(UNIT_DYNAMIC_FLAGS); else - dyflag = atoi(pdyflag); + dyflag = *dynamicFlagID; if (!sFactionTemplateStore.LookupEntry(factionid)) { @@ -384,37 +313,10 @@ public: } //Edit Player Spell - static bool HandleModifySpellCommand(ChatHandler* handler, const char* args) + static bool HandleModifySpellCommand(ChatHandler* handler, uint8 spellFlatID, uint8 op, uint16 val, Optional mark) { - if (!*args) - return false; - - char* pspellflatid = strtok((char*)args, " "); - if (!pspellflatid) - return false; - - char* pop = strtok(nullptr, " "); - if (!pop) - return false; - - char* pval = strtok(nullptr, " "); - if (!pval) - return false; - - uint16 mark; - - char* pmark = strtok(nullptr, " "); - - uint8 spellflatid = atoi(pspellflatid); - uint8 op = atoi(pop); - uint16 val = atoi(pval); - if (!pmark) - mark = 65535; - else - mark = atoi(pmark); - Player* target = handler->getSelectedPlayer(); - if (target == nullptr) + if (!target) { handler->SendSysMessage(LANG_NO_CHAR_SELECTED); handler->SetSentErrorMessage(true); @@ -423,31 +325,33 @@ public: // check online security if (handler->HasLowerSecurity(target)) + { return false; + } - handler->PSendSysMessage(LANG_YOU_CHANGE_SPELLFLATID, spellflatid, val, mark, handler->GetNameLink(target).c_str()); + handler->PSendSysMessage(LANG_YOU_CHANGE_SPELLFLATID, spellFlatID, val, mark ? *mark : 65535, handler->GetNameLink(target).c_str()); if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, handler->GetNameLink().c_str(), spellflatid, val, mark); + { + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, handler->GetNameLink().c_str(), spellFlatID, val, mark ? *mark : 65535); + } WorldPacket data(SMSG_SET_FLAT_SPELL_MODIFIER, (1 + 1 + 2 + 2)); - data << uint8(spellflatid); + data << uint8(spellFlatID); data << uint8(op); data << uint16(val); - data << uint16(mark); + data << uint16(mark ? *mark : 65535); target->GetSession()->SendPacket(&data); return true; } //Edit Player TP - static bool HandleModifyTalentCommand (ChatHandler* handler, const char* args) + static bool HandleModifyTalentCommand(ChatHandler* handler, uint32 talentPoints) { - if (!*args) - return false; - - int tp = atoi((char*)args); - if (tp < 0) + if (!talentPoints) + { return false; + } Unit* target = handler->getSelectedUnit(); if (!target) @@ -461,8 +365,11 @@ public: { // check online security if (handler->HasLowerSecurity(target->ToPlayer())) + { return false; - target->ToPlayer()->SetFreeTalentPoints(tp); + } + + target->ToPlayer()->SetFreeTalentPoints(talentPoints); target->ToPlayer()->SendTalentsInfoData(false); return true; } @@ -474,7 +381,7 @@ public: // check online security if (handler->HasLowerSecurity(owner->ToPlayer())) return false; - ((Pet*)target)->SetFreeTalentPoints(tp); + ((Pet*)target)->SetFreeTalentPoints(talentPoints); owner->ToPlayer()->SendTalentsInfoData(true); return true; } @@ -485,9 +392,8 @@ public: return false; } - static bool CheckModifySpeed(ChatHandler* handler, float& speed, Unit* target, float minimumBound, float maximumBound, bool checkInFlight = true) + static bool CheckModifySpeed(ChatHandler* handler, Unit* target, float speed, float minimumBound, float maximumBound, bool checkInFlight = true) { - if (speed > maximumBound || speed < minimumBound) { handler->SendSysMessage(LANG_BAD_VALUE); @@ -505,7 +411,7 @@ public: if (Player* player = target->ToPlayer()) { // check online security - if (handler->HasLowerSecurity(player, ObjectGuid::Empty)) + if (handler->HasLowerSecurity(player)) { return false; } @@ -522,242 +428,82 @@ public: } //Edit Player Aspeed - static bool HandleModifyASpeedCommand(ChatHandler* handler, const char* args) + static bool HandleModifyASpeedCommand(ChatHandler* handler, float allSpeed) { - if (!*args) - return false; - - float ASpeed = (float)atof((char*)args); - - if (ASpeed > 50.0f || ASpeed < 0.1f) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - Player* target = handler->getSelectedPlayerOrSelf(); - if (AccountMgr::IsGMAccount(handler->GetSession()->GetSecurity())) - target = handler->GetSession()->GetPlayer(); - if (!target) + if (CheckModifySpeed(handler, target, allSpeed, 0.1f, 50.0f)) { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; + NotifyModification(handler, target, LANG_YOU_CHANGE_ASPEED, LANG_YOURS_ASPEED_CHANGED, allSpeed); + target->SetSpeed(MOVE_WALK, allSpeed); + target->SetSpeed(MOVE_RUN, allSpeed); + target->SetSpeed(MOVE_SWIM, allSpeed); + target->SetSpeed(MOVE_FLIGHT, allSpeed); + return true; } - // check online security - if (handler->HasLowerSecurity(target)) - return false; - - std::string targetNameLink = handler->GetNameLink(target); - - if (target->IsInFlight()) - { - handler->PSendSysMessage(LANG_CHAR_IN_FLIGHT, targetNameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - handler->PSendSysMessage(LANG_YOU_CHANGE_ASPEED, ASpeed, targetNameLink.c_str()); - if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_ASPEED_CHANGED, handler->GetNameLink().c_str(), ASpeed); - - target->SetSpeed(MOVE_WALK, ASpeed, true); - target->SetSpeed(MOVE_RUN, ASpeed, true); - target->SetSpeed(MOVE_SWIM, ASpeed, true); - //target->SetSpeed(MOVE_TURN, ASpeed, true); - target->SetSpeed(MOVE_FLIGHT, ASpeed, true); - return true; + return false; } //Edit Player Speed - static bool HandleModifySpeedCommand(ChatHandler* handler, const char* args) + static bool HandleModifySpeedCommand(ChatHandler* handler, float speed) { - if (!*args) - return false; - - float Speed = (float)atof((char*)args); - - if (Speed > 50.0f || Speed < 0.1f) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - Player* target = handler->getSelectedPlayerOrSelf(); - if (AccountMgr::IsGMAccount(handler->GetSession()->GetSecurity())) - target = handler->GetSession()->GetPlayer(); - if (!target) + if (CheckModifySpeed(handler, target, speed, 0.1f, 50.0f)) { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; + NotifyModification(handler, target, LANG_YOU_CHANGE_SPEED, LANG_YOURS_SPEED_CHANGED, speed); + target->SetSpeedRate(MOVE_RUN, speed); + return true; } - // check online security - if (handler->HasLowerSecurity(target)) - return false; - - std::string targetNameLink = handler->GetNameLink(target); - - if (target->IsInFlight()) - { - handler->PSendSysMessage(LANG_CHAR_IN_FLIGHT, targetNameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - handler->PSendSysMessage(LANG_YOU_CHANGE_SPEED, Speed, targetNameLink.c_str()); - if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_SPEED_CHANGED, handler->GetNameLink().c_str(), Speed); - - target->SetSpeed(MOVE_RUN, Speed, true); - - return true; + return false; } //Edit Player Swim Speed - static bool HandleModifySwimCommand(ChatHandler* handler, const char* args) + static bool HandleModifySwimCommand(ChatHandler* handler, float swimSpeed) { - if (!*args) - return false; - - float Swim = (float)atof((char*)args); - - if (Swim > 50.0f || Swim < 0.1f) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - Player* target = handler->getSelectedPlayerOrSelf(); - if (AccountMgr::IsGMAccount(handler->GetSession()->GetSecurity())) - target = handler->GetSession()->GetPlayer(); - if (!target) + if (CheckModifySpeed(handler, target, swimSpeed, 0.1f, 50.0f)) { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; + NotifyModification(handler, target, LANG_YOU_CHANGE_SWIM_SPEED, LANG_YOURS_SWIM_SPEED_CHANGED, swimSpeed); + target->SetSpeedRate(MOVE_SWIM, swimSpeed); + return true; } - // check online security - if (handler->HasLowerSecurity(target)) - return false; - - std::string targetNameLink = handler->GetNameLink(target); - - if (target->IsInFlight()) - { - handler->PSendSysMessage(LANG_CHAR_IN_FLIGHT, targetNameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - handler->PSendSysMessage(LANG_YOU_CHANGE_SWIM_SPEED, Swim, targetNameLink.c_str()); - if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_SWIM_SPEED_CHANGED, handler->GetNameLink().c_str(), Swim); - - target->SetSpeed(MOVE_SWIM, Swim, true); - - return true; + return false; } //Edit Player Walk Speed - static bool HandleModifyBWalkCommand(ChatHandler* handler, const char* args) + static bool HandleModifyBWalkCommand(ChatHandler* handler, float backSpeed) { - if (!*args) - return false; - - float BSpeed = (float)atof((char*)args); - - if (BSpeed > 50.0f || BSpeed < 0.1f) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - Player* target = handler->getSelectedPlayerOrSelf(); - if (AccountMgr::IsGMAccount(handler->GetSession()->GetSecurity())) - target = handler->GetSession()->GetPlayer(); - if (!target) + if (CheckModifySpeed(handler, target, backSpeed, 0.1f, 50.0f)) { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; + NotifyModification(handler, target, LANG_YOU_CHANGE_BACK_SPEED, LANG_YOURS_BACK_SPEED_CHANGED, backSpeed); + target->SetSpeedRate(MOVE_RUN_BACK, backSpeed); + return true; } - // check online security - if (handler->HasLowerSecurity(target)) - return false; - - std::string targetNameLink = handler->GetNameLink(target); - - if (target->IsInFlight()) - { - handler->PSendSysMessage(LANG_CHAR_IN_FLIGHT, targetNameLink.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - handler->PSendSysMessage(LANG_YOU_CHANGE_BACK_SPEED, BSpeed, targetNameLink.c_str()); - if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, handler->GetNameLink().c_str(), BSpeed); - - target->SetSpeed(MOVE_RUN_BACK, BSpeed, true); - - return true; + return false; } //Edit Player Fly - static bool HandleModifyFlyCommand(ChatHandler* handler, const char* args) + static bool HandleModifyFlyCommand(ChatHandler* handler, float flySpeed) { - if (!*args) - return false; - - float FSpeed = (float)atof((char*)args); - - if (FSpeed > 50.0f || FSpeed < 0.1f) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - Player* target = handler->getSelectedPlayerOrSelf(); - if (AccountMgr::IsGMAccount(handler->GetSession()->GetSecurity())) - target = handler->GetSession()->GetPlayer(); - if (!target) + if (CheckModifySpeed(handler, target, flySpeed, 0.1f, 50.0f, false)) { - handler->SendSysMessage(LANG_NO_CHAR_SELECTED); - handler->SetSentErrorMessage(true); - return false; + NotifyModification(handler, target, LANG_YOU_CHANGE_FLY_SPEED, LANG_YOURS_FLY_SPEED_CHANGED, flySpeed); + target->SetSpeedRate(MOVE_FLIGHT, flySpeed); + return true; } - // check online security - if (handler->HasLowerSecurity(target)) - return false; - - handler->PSendSysMessage(LANG_YOU_CHANGE_FLY_SPEED, FSpeed, handler->GetNameLink(target).c_str()); - if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, handler->GetNameLink().c_str(), FSpeed); - - target->SetSpeed(MOVE_FLIGHT, FSpeed, true); - - return true; + return false; } //Edit Player or Creature Scale - static bool HandleModifyScaleCommand(ChatHandler* handler, const char* args) + static bool HandleModifyScaleCommand(ChatHandler* handler, float scale) { - if (!*args) - return false; - - float Scale = (float)atof((char*)args); - if (Scale > 10.0f || Scale < 0.1f) + if (scale > 10.0f || scale < 0.1f) { handler->SendSysMessage(LANG_BAD_VALUE); handler->SetSentErrorMessage(true); @@ -778,29 +524,20 @@ public: if (handler->HasLowerSecurity(player)) return false; - handler->PSendSysMessage(LANG_YOU_CHANGE_SIZE, Scale, handler->GetNameLink(player).c_str()); + handler->PSendSysMessage(LANG_YOU_CHANGE_SIZE, scale, handler->GetNameLink(player).c_str()); if (handler->needReportToTarget(player)) - (ChatHandler(player->GetSession())).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, handler->GetNameLink().c_str(), Scale); + ChatHandler(player->GetSession()).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, handler->GetNameLink().c_str(), scale); } - target->SetObjectScale(Scale); + target->SetObjectScale(scale); return true; } //Enable Player mount - static bool HandleModifyMountCommand(ChatHandler* handler, const char* args) + static bool HandleModifyMountCommand(ChatHandler* handler, uint32 creatureDisplayID, Optional speed) { - if (!*args) - { - return false; - } - - char* token = strtok((char*)args, " "); - int mount = atoi(token); - float speed = atof(strtok(nullptr, " ")); - - if (!sCreatureDisplayInfoStore.LookupEntry(mount)) + if (!sCreatureDisplayInfoStore.LookupEntry(creatureDisplayID)) { handler->SendSysMessage(LANG_NO_MOUNT); handler->SetSentErrorMessage(true); @@ -821,24 +558,28 @@ public: return false; } - if (!CheckModifySpeed(handler, speed, target, 0.1f, 50.0f)) + float _speed = speed ? *speed : 1.0f; + + if (!CheckModifySpeed(handler, target, _speed, 0.1f, 50.0f)) { return false; } NotifyModification(handler, target, LANG_YOU_GIVE_MOUNT, LANG_MOUNT_GIVED); - target->Mount(mount); - target->SetSpeed(MOVE_RUN, speed, true); - target->SetSpeed(MOVE_FLIGHT, speed, true); + target->Mount(creatureDisplayID); + target->SetSpeed(MOVE_RUN, _speed, true); + target->SetSpeed(MOVE_FLIGHT, _speed, true); return true; } //Edit Player money - static bool HandleModifyMoneyCommand(ChatHandler* handler, const char* args) + static bool HandleModifyMoneyCommand(ChatHandler* handler, Tail money) { - if (!*args) + if (money.empty()) + { return false; + } Player* target = handler->getSelectedPlayer(); if (!target) @@ -850,14 +591,39 @@ public: // check online security if (handler->HasLowerSecurity(target)) + { return false; + } - int32 moneyToAdd = 0; - if (strchr(args, 'g') || strchr(args, 's') || strchr(args, 'c')) - moneyToAdd = MoneyStringToMoney(std::string(args)); + auto IsExistWord = [](std::string_view line, std::initializer_list words) + { + for (auto const& word : words) + { + if (line.find(word) != std::string_view::npos) + { + return true; + } + } + + return false; + }; + + Optional moneyToAddO = 0; + if (IsExistWord(money, { "g", "s", "c" })) + { + moneyToAddO = MoneyStringToMoney(money); + } else - moneyToAdd = atoi(args); + { + moneyToAddO = Acore::StringTo(money); + } + if (!moneyToAddO) + { + return false; + } + + int32 moneyToAdd = *moneyToAddO; uint32 targetMoney = target->GetMoney(); if (moneyToAdd < 0) @@ -905,11 +671,8 @@ public: } //Edit Unit field - static bool HandleModifyBitCommand(ChatHandler* handler, const char* args) + static bool HandleModifyBitCommand(ChatHandler* handler, uint16 field, uint32 bit) { - if (!*args) - return false; - Unit* target = handler->getSelectedUnit(); if (!target) { @@ -920,18 +683,9 @@ public: // check online security if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer())) + { return false; - - char* pField = strtok((char*)args, " "); - if (!pField) - return false; - - char* pBit = strtok(nullptr, " "); - if (!pBit) - return false; - - uint16 field = atoi(pField); - uint32 bit = atoi(pBit); + } if (field < OBJECT_END || field >= target->GetValuesCount()) { @@ -939,6 +693,7 @@ public: handler->SetSentErrorMessage(true); return false; } + if (bit < 1 || bit > 32) { handler->SendSysMessage(LANG_BAD_VALUE); @@ -956,14 +711,12 @@ public: target->SetFlag(field, (1 << (bit - 1))); handler->PSendSysMessage(LANG_SET_BIT, bit, field); } + return true; } - static bool HandleModifyHonorCommand (ChatHandler* handler, const char* args) + static bool HandleModifyHonorCommand(ChatHandler* handler, int32 amount) { - if (!*args) - return false; - Player* target = handler->getSelectedPlayer(); if (!target) { @@ -974,9 +727,9 @@ public: // check online security if (handler->HasLowerSecurity(target)) + { return false; - - int32 amount = (uint32)atoi(args); + } target->ModifyHonorPoints(amount); @@ -985,26 +738,23 @@ public: return true; } - static bool HandleModifyDrunkCommand(ChatHandler* handler, const char* args) + static bool HandleModifyDrunkCommand(ChatHandler* handler, uint8 drunklevel) { - if (!*args) - return false; - - uint8 drunklevel = (uint8)atoi(args); if (drunklevel > 100) + { drunklevel = 100; + } if (Player* target = handler->getSelectedPlayer()) + { target->SetDrunkValue(drunklevel); + } return true; } - static bool HandleModifyRepCommand(ChatHandler* handler, const char* args) + static bool HandleModifyRepCommand(ChatHandler* handler, uint32 factionId, Variant rank, Optional delta) { - if (!*args) - return false; - Player* target = handler->getSelectedPlayer(); if (!target) { @@ -1015,30 +765,27 @@ public: // check online security if (handler->HasLowerSecurity(target)) + { return false; - - char* factionTxt = handler->extractKeyFromLink((char*)args, "Hfaction"); - if (!factionTxt) - return false; - - uint32 factionId = atoi(factionTxt); + } int32 amount = 0; - char* rankTxt = strtok(nullptr, " "); - if (!factionTxt || !rankTxt) - return false; - amount = atoi(rankTxt); - if ((amount == 0) && (rankTxt[0] != '-') && !isdigit(rankTxt[0])) + if (rank.holds_alternative()) { - std::string rankStr = rankTxt; + std::string rankStr = rank.get(); std::wstring wrankStr; + if (!Utf8toWStr(rankStr, wrankStr)) + { return false; + } + wstrToLower(wrankStr); - int r = 0; + int32 r = 0; amount = -42000; + for (; r < MAX_REPUTATION_RANK; ++r) { std::string rank = handler->GetAcoreString(ReputationRankStrIndex[r]); @@ -1053,29 +800,40 @@ public: if (wrank.substr(0, wrankStr.size()) == wrankStr) { - char* deltaTxt = strtok(nullptr, " "); - if (deltaTxt) + if (delta) { - int32 delta = atoi(deltaTxt); - if ((delta < 0) || (delta > ReputationMgr::PointsInRank[r] - 1)) + if (*delta < 0 || (*delta > ReputationMgr::PointsInRank[r] - 1)) { - handler->PSendSysMessage(LANG_COMMAND_FACTION_DELTA, (ReputationMgr::PointsInRank[r] - 1)); + handler->PSendSysMessage(LANG_COMMAND_FACTION_DELTA, ReputationMgr::PointsInRank[r] - 1); handler->SetSentErrorMessage(true); return false; } - amount += delta; + + amount += *delta; } + break; } + amount += ReputationMgr::PointsInRank[r]; } + if (r >= MAX_REPUTATION_RANK) { - handler->PSendSysMessage(LANG_COMMAND_FACTION_INVPARAM, rankTxt); + handler->PSendSysMessage(LANG_COMMAND_FACTION_INVPARAM, rankStr.c_str()); handler->SetSentErrorMessage(true); return false; } } + else + { + amount = rank.get(); + } + + if (!amount) + { + return false; + } FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); @@ -1095,82 +853,72 @@ public: target->GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false); target->GetReputationMgr().SendState(target->GetReputationMgr().GetState(factionEntry)); + handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[handler->GetSessionDbcLocale()], factionId, handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry)); return true; } - static bool HandleMorphTargetCommand(ChatHandler* handler, const char* args) + + static bool HandleMorphTargetCommand(ChatHandler* handler, uint32 displayID) { - if (!*args) - return false; - - uint32 display_id = (uint32)atoi((char*)args); Unit* target = handler->getSelectedUnit(); + if (!target) + { target = handler->GetSession()->GetPlayer(); - - // check online security - else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer())) + } + else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer())) // check online security + { return false; + } - target->SetDisplayId(display_id); - + target->SetDisplayId(displayID); return true; } //morph creature or player - static bool HandleMorphResetCommand(ChatHandler* handler, const char* /*args*/) + static bool HandleMorphResetCommand(ChatHandler* handler) { Unit* target = handler->getSelectedUnit(); if (!target) + { target = handler->GetSession()->GetPlayer(); - - // check online security - else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer())) + } + else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer())) // check online security + { return false; + } target->DeMorph(); return true; } //set temporary phase mask for player - static bool HandleModifyPhaseCommand(ChatHandler* handler, const char* args) + static bool HandleModifyPhaseCommand(ChatHandler* handler, uint32 phaseMask) { - if (!*args) - return false; - - uint32 phasemask = (uint32)atoi((char*)args); - Unit* target = handler->getSelectedUnit(); if (!target) + { target = handler->GetSession()->GetPlayer(); - - // check online security - else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer())) + } + else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer())) // check online security + { return false; + } - target->SetPhaseMask(phasemask, true); - + target->SetPhaseMask(phaseMask, true); return true; } //change standstate - static bool HandleModifyStandStateCommand(ChatHandler* handler, const char* args) + static bool HandleModifyStandStateCommand(ChatHandler* handler, uint32 anim) { - if (!*args) - return false; - - uint32 anim_id = atoi((char*)args); - handler->GetSession()->GetPlayer()->SetUInt32Value(UNIT_NPC_EMOTESTATE, anim_id); - + handler->GetSession()->GetPlayer()->SetUInt32Value(UNIT_NPC_EMOTESTATE, anim); return true; } - static bool HandleModifyArenaCommand(ChatHandler* handler, const char* args) + static bool HandleModifyArenaCommand(ChatHandler* handler, int32 amount) { - if (!*args) - return false; - Player* target = handler->getSelectedPlayer(); if (!target) { @@ -1179,8 +927,6 @@ public: return false; } - int32 amount = (uint32)atoi(args); - target->ModifyArenaPoints(amount); handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetArenaPoints()); @@ -1188,13 +934,14 @@ public: return true; } - static bool HandleModifyGenderCommand(ChatHandler* handler, const char* args) + static bool HandleModifyGenderCommand(ChatHandler* handler, Tail genderString) { - if (!*args) + if (genderString.empty()) + { return false; + } Player* target = handler->getSelectedPlayer(); - if (!target) { handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND); @@ -1204,21 +951,20 @@ public: PlayerInfo const* info = sObjectMgr->GetPlayerInfo(target->getRace(), target->getClass()); if (!info) + { return false; - - char const* gender_str = (char*)args; - int gender_len = strlen(gender_str); + } Gender gender; - if (!strncmp(gender_str, "male", gender_len)) // MALE + if (StringEqualI(genderString, "male")) // MALE { if (target->getGender() == GENDER_MALE) return true; gender = GENDER_MALE; } - else if (!strncmp(gender_str, "female", gender_len)) // FEMALE + else if (StringEqualI(genderString, "female")) // FEMALE { if (target->getGender() == GENDER_FEMALE) return true; @@ -1244,7 +990,9 @@ public: handler->PSendSysMessage(LANG_YOU_CHANGE_GENDER, handler->GetNameLink(target).c_str(), gender_full); if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full, handler->GetNameLink().c_str()); + { + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full, handler->GetNameLink().c_str()); + } return true; }