From 3260b94dd627b7b0c7114f94bb97d108b005af3e Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 13 May 2023 15:46:27 +0200 Subject: Core/Misc: Replace string to int conversion functions from Common.h with c++17 std::from_chars based ones Trinity::StringTo --- sql/updates/world/master/2023_05_13_00_world.sql | 3 + src/common/Common.h | 25 ---- src/common/IPLocation/IPLocation.cpp | 15 ++- src/common/Utilities/StringFormat.h | 13 ++ src/common/Utilities/Util.cpp | 17 +-- src/server/database/Database/Field.cpp | 25 ++-- src/server/game/Chat/Channels/Channel.cpp | 11 +- src/server/game/Chat/Chat.cpp | 75 +---------- src/server/game/Chat/Chat.h | 1 - src/server/game/Chat/LanguageMgr.cpp | 6 +- src/server/game/DataStores/DB2Stores.cpp | 2 +- src/server/game/DataStores/GameTables.cpp | 9 +- src/server/game/Entities/Object/ObjectGuid.cpp | 2 +- src/server/game/Scripting/ScriptReloadMgr.cpp | 3 +- src/server/game/Server/WorldSocket.cpp | 2 +- src/server/game/Spells/SpellScript.h | 2 +- src/server/game/Tools/PlayerDump.cpp | 11 +- src/server/scripts/Commands/cs_character.cpp | 4 +- src/server/scripts/Commands/cs_disable.cpp | 163 ++++++++--------------- src/server/scripts/Commands/cs_group.cpp | 44 ++---- src/server/scripts/Commands/cs_guild.cpp | 14 +- src/server/scripts/Commands/cs_misc.cpp | 156 ++++++---------------- src/server/scripts/Commands/cs_modify.cpp | 128 ++++++------------ src/server/scripts/Commands/cs_pet.cpp | 51 +++---- src/server/scripts/Commands/cs_send.cpp | 67 +++------- src/server/scripts/Commands/cs_wp.cpp | 30 ++--- 26 files changed, 286 insertions(+), 593 deletions(-) create mode 100644 sql/updates/world/master/2023_05_13_00_world.sql diff --git a/sql/updates/world/master/2023_05_13_00_world.sql b/sql/updates/world/master/2023_05_13_00_world.sql new file mode 100644 index 00000000000..40387aa66d7 --- /dev/null +++ b/sql/updates/world/master/2023_05_13_00_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `command` WHERE `name`='damage go'; +INSERT INTO `command` (`name`,`help`) VALUES +('damage go','Syntax: .damage go $guid|$link $damage_amount\n\nApply $damage to destructible gameobject.'); diff --git a/src/common/Common.h b/src/common/Common.h index 22cf8ce889b..847b296d1a4 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -21,22 +21,6 @@ #include "Define.h" #include #include -#include - -#if TRINITY_COMPILER == TRINITY_COMPILER_MICROSOFT - -#define atoll _atoi64 -#define llabs _abs64 - -#else - -#define stricmp strcasecmp -#define strnicmp strncasecmp - -#endif - -inline unsigned long atoul(char const* str) { return strtoul(str, nullptr, 10); } -inline unsigned long long atoull(char const* str) { return strtoull(str, nullptr, 10); } #define STRINGIZE(a) #a @@ -127,15 +111,6 @@ struct LocalizedString #pragma pack(pop) -// we always use stdlib std::max/std::min, undefine some not C++ standard defines (Win API and some other platforms) -#ifdef max -#undef max -#endif - -#ifdef min -#undef min -#endif - #ifndef M_PI #define M_PI 3.14159265358979323846 #endif diff --git a/src/common/IPLocation/IPLocation.cpp b/src/common/IPLocation/IPLocation.cpp index 060972fa5b4..d707d366928 100644 --- a/src/common/IPLocation/IPLocation.cpp +++ b/src/common/IPLocation/IPLocation.cpp @@ -16,11 +16,12 @@ */ #include "IPLocation.h" -#include "Common.h" #include "Config.h" #include "Errors.h" #include "IpAddress.h" #include "Log.h" +#include "StringConvert.h" +#include "Util.h" #include IpLocationStore::IpLocationStore() @@ -82,9 +83,17 @@ void IpLocationStore::Load() countryName.erase(std::remove(countryName.begin(), countryName.end(), '"'), countryName.end()); // Convert country code to lowercase - std::transform(countryCode.begin(), countryCode.end(), countryCode.begin(), ::tolower); + strToLower(countryCode); - _ipLocationStore.emplace_back(uint32(atoul(ipFrom.c_str())), uint32(atoul(ipTo.c_str())), std::move(countryCode), std::move(countryName)); + Optional from = Trinity::StringTo(ipFrom); + if (!from) + continue; + + Optional to = Trinity::StringTo(ipTo); + if (!to) + continue; + + _ipLocationStore.emplace_back(*from, *to, std::move(countryCode), std::move(countryName)); } std::sort(_ipLocationStore.begin(), _ipLocationStore.end(), [](IpLocationRecord const& a, IpLocationRecord const& b) { return a.IpFrom < b.IpFrom; }); diff --git a/src/common/Utilities/StringFormat.h b/src/common/Utilities/StringFormat.h index 7c136185f4a..b2248aff6f1 100644 --- a/src/common/Utilities/StringFormat.h +++ b/src/common/Utilities/StringFormat.h @@ -39,6 +39,19 @@ namespace Trinity } } + template + inline OutputIt StringFormatTo(OutputIt out, FormatString fmt, Args&&... args) + { + try + { + return fmt::format_to(out, fmt, std::forward(args)...); + } + catch (std::exception const& formatError) + { + return fmt::format_to(out, "An error occurred formatting string \"{}\" : {}", fmt, formatError.what()); + } + } + /// Returns true if the given char pointer is null. inline bool IsFormatEmptyOrNull(char const* fmt) { diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index fdd49b49855..ac97e724902 100644 --- a/src/common/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp @@ -843,15 +843,13 @@ std::string Trinity::Impl::ByteArrayToHexStr(uint8 const* bytes, size_t arrayLen op = -1; } - std::ostringstream ss; + std::string result; + result.reserve(arrayLen * 2); + auto inserter = std::back_inserter(result); for (int32 i = init; i != end; i += op) - { - char buffer[4]; - sprintf(buffer, "%02X", bytes[i]); - ss << buffer; - } + Trinity::StringFormatTo(inserter, "{:02X}", bytes[i]); - return ss.str(); + return result; } void Trinity::Impl::HexStrToByteArray(std::string_view str, uint8* out, size_t outlen, bool reverse /*= false*/) @@ -871,10 +869,7 @@ void Trinity::Impl::HexStrToByteArray(std::string_view str, uint8* out, size_t o uint32 j = 0; for (int32 i = init; i != end; i += 2 * op) - { - char buffer[3] = { str[i], str[i + 1], '\0' }; - out[j++] = uint8(strtoul(buffer, nullptr, 16)); - } + out[j++] = Trinity::StringTo(str.substr(i, 2), 16).value_or(0); } bool StringEqualI(std::string_view a, std::string_view b) diff --git a/src/server/database/Database/Field.cpp b/src/server/database/Database/Field.cpp index 2ecc22fa989..cdcb32c6508 100644 --- a/src/server/database/Database/Field.cpp +++ b/src/server/database/Database/Field.cpp @@ -18,6 +18,7 @@ #include "Field.h" #include "Errors.h" #include "Log.h" +#include "StringConvert.h" #include Field::Field() @@ -45,7 +46,7 @@ uint8 Field::GetUInt8() const if (data.raw) return *reinterpret_cast(data.value); - return static_cast(strtoul(data.value, nullptr, 10)); + return Trinity::StringTo(data.value, 10).value_or(0); } int8 Field::GetInt8() const @@ -63,7 +64,7 @@ int8 Field::GetInt8() const if (data.raw) return *reinterpret_cast(data.value); - return static_cast(strtol(data.value, nullptr, 10)); + return Trinity::StringTo(data.value, 10).value_or(0); } uint16 Field::GetUInt16() const @@ -81,7 +82,7 @@ uint16 Field::GetUInt16() const if (data.raw) return *reinterpret_cast(data.value); - return static_cast(strtoul(data.value, nullptr, 10)); + return Trinity::StringTo(data.value, 10).value_or(0); } int16 Field::GetInt16() const @@ -99,7 +100,7 @@ int16 Field::GetInt16() const if (data.raw) return *reinterpret_cast(data.value); - return static_cast(strtol(data.value, nullptr, 10)); + return Trinity::StringTo(data.value, 10).value_or(0); } uint32 Field::GetUInt32() const @@ -117,7 +118,7 @@ uint32 Field::GetUInt32() const if (data.raw) return *reinterpret_cast(data.value); - return static_cast(strtoul(data.value, nullptr, 10)); + return Trinity::StringTo(data.value, 10).value_or(0); } int32 Field::GetInt32() const @@ -135,7 +136,7 @@ int32 Field::GetInt32() const if (data.raw) return *reinterpret_cast(data.value); - return static_cast(strtol(data.value, nullptr, 10)); + return Trinity::StringTo(data.value, 10).value_or(0); } uint64 Field::GetUInt64() const @@ -153,7 +154,7 @@ uint64 Field::GetUInt64() const if (data.raw) return *reinterpret_cast(data.value); - return static_cast(strtoull(data.value, nullptr, 10)); + return Trinity::StringTo(data.value, 10).value_or(0); } int64 Field::GetInt64() const @@ -171,7 +172,7 @@ int64 Field::GetInt64() const if (data.raw) return *reinterpret_cast(data.value); - return static_cast(strtoll(data.value, nullptr, 10)); + return Trinity::StringTo(data.value, 10).value_or(0); } float Field::GetFloat() const @@ -189,25 +190,25 @@ float Field::GetFloat() const if (data.raw) return *reinterpret_cast(data.value); - return static_cast(atof(data.value)); + return Trinity::StringTo(data.value, 10).value_or(0); } double Field::GetDouble() const { if (!data.value) - return 0.0f; + return 0.0; #ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Double) && !IsType(DatabaseFieldTypes::Decimal)) { LogWrongType(__FUNCTION__); - return 0.0f; + return 0.0; } #endif if (data.raw && !IsType(DatabaseFieldTypes::Decimal)) return *reinterpret_cast(data.value); - return static_cast(atof(data.value)); + return Trinity::StringTo(data.value, 10).value_or(0); } char const* Field::GetCString() const diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 3398503d270..dc423a55986 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -77,9 +77,16 @@ Channel::Channel(ObjectGuid const& guid, std::string const& name, uint32 team /* for (std::string_view guid : Trinity::Tokenize(banList, ' ', false)) { // legacy db content might not have 0x prefix, account for that - std::string bannedGuidStr(guid.size() > 2 && guid.substr(0, 2) == "0x" ? guid.substr(2) : guid); + if (guid.size() > 2 && guid.substr(0, 2) == "0x") + guid.remove_suffix(2); + + Optional high = Trinity::StringTo(guid.substr(0, 16), 16); + Optional low = Trinity::StringTo(guid.substr(16, 16), 16); + if (!high || !low) + continue; + ObjectGuid banned; - banned.SetRawValue(uint64(strtoull(bannedGuidStr.substr(0, 16).c_str(), nullptr, 16)), uint64(strtoull(bannedGuidStr.substr(16).c_str(), nullptr, 16))); + banned.SetRawValue(*high, *low); if (!banned) continue; diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index b1b1a221c2f..832d14631bc 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -22,18 +22,15 @@ #include "ChatCommand.h" #include "ChatPackets.h" #include "Common.h" -#include "DatabaseEnv.h" -#include "DB2Stores.h" #include "GridNotifiersImpl.h" #include "Group.h" #include "Language.h" -#include "Log.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Optional.h" #include "Player.h" #include "Realm.h" -#include "ScriptMgr.h" +#include "StringConvert.h" #include "World.h" #include "WorldSession.h" #include @@ -413,72 +410,6 @@ Creature* ChatHandler::GetCreatureFromPlayerMapByDbGuid(ObjectGuid::LowType lowg return creature; } -enum SpellLinkType -{ - SPELL_LINK_SPELL = 0, - SPELL_LINK_TALENT = 1, - SPELL_LINK_ENCHANT = 2, - SPELL_LINK_TRADE = 3, - SPELL_LINK_GLYPH = 4 -}; - -static char const* const spellKeys[] = -{ - "Hspell", // normal spell - "Htalent", // talent spell - "Henchant", // enchanting recipe spell - "Htrade", // profession/skill spell - "Hglyph", // glyph - nullptr -}; - -uint32 ChatHandler::extractSpellIdFromLink(char* text) -{ - // number or [name] Shift-click form |color|Henchant:recipe_spell_id|h[prof_name: recipe_name]|h|r - // number or [name] Shift-click form |color|Hglyph:glyph_slot_id:glyph_prop_id|h[%s]|h|r - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r - // number or [name] Shift-click form |color|Htalent:talent_id, rank|h[name]|h|r - // number or [name] Shift-click form |color|Htrade:spell_id, skill_id, max_value, cur_value|h[name]|h|r - int type = 0; - char* param1_str = nullptr; - char* idS = extractKeyFromLink(text, spellKeys, &type, ¶m1_str); - if (!idS) - return 0; - - uint32 id = atoul(idS); - - switch (type) - { - case SPELL_LINK_SPELL: - return id; - case SPELL_LINK_TALENT: - { - // talent - TalentEntry const* talentEntry = sTalentStore.LookupEntry(id); - if (!talentEntry) - return 0; - - return talentEntry->SpellID; - } - case SPELL_LINK_ENCHANT: - case SPELL_LINK_TRADE: - return id; - case SPELL_LINK_GLYPH: - { - uint32 glyph_prop_id = param1_str ? atoul(param1_str) : 0; - - GlyphPropertiesEntry const* glyphPropEntry = sGlyphPropertiesStore.LookupEntry(glyph_prop_id); - if (!glyphPropEntry) - return 0; - - return glyphPropEntry->SpellID; - } - } - - // unknown type? - return 0; -} - enum GuidLinkType { GUID_LINK_PLAYER = 0, // must be first for selection in not link case @@ -526,13 +457,13 @@ ObjectGuid::LowType ChatHandler::extractLowGuidFromLink(char* text, HighGuid& gu case GUID_LINK_CREATURE: { guidHigh = HighGuid::Creature; - ObjectGuid::LowType lowguid = atoull(idS); + ObjectGuid::LowType lowguid = Trinity::StringTo(idS).value_or(UI64LIT(0)); return lowguid; } case GUID_LINK_GAMEOBJECT: { guidHigh = HighGuid::GameObject; - ObjectGuid::LowType lowguid = atoull(idS); + ObjectGuid::LowType lowguid = Trinity::StringTo(idS).value_or(UI64LIT(0)); return lowguid; } } diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 53a49cc058c..2d9b49fb6b5 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -98,7 +98,6 @@ class TC_GAME_API ChatHandler char* extractKeyFromLink(char* text, char const* linkType, char** something1 = nullptr); char* extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1 = nullptr); char* extractQuotedArg(char* args); - uint32 extractSpellIdFromLink(char* text); ObjectGuid::LowType extractLowGuidFromLink(char* text, HighGuid& guidHigh); bool GetPlayerGroupAndGUIDByName(const char* cname, Player*& player, Group*& group, ObjectGuid& guid, bool offline = false); std::string extractPlayerNameFromLink(char* text); diff --git a/src/server/game/Chat/LanguageMgr.cpp b/src/server/game/Chat/LanguageMgr.cpp index d383f152513..9fc877944bc 100644 --- a/src/server/game/Chat/LanguageMgr.cpp +++ b/src/server/game/Chat/LanguageMgr.cpp @@ -237,7 +237,7 @@ std::string LanguageMgr::Translate(std::string const& msg, uint32 language, Loca for (size_t i = 0; i < length; ++i) { if (str[i] >= 'A' && str[i] <= 'Z') - result += char(toupper(replacementWord[i])); + result += charToUpper(replacementWord[i]); else result += replacementWord[i]; } @@ -252,9 +252,9 @@ std::string LanguageMgr::Translate(std::string const& msg, uint32 language, Loca for (size_t i = 0; i < length; ++i) { if (isUpper(wstrSourceWord[i])) - result += char(toupper(replacementWord[i])); + result += charToUpper(replacementWord[i]); else - result += char(tolower(replacementWord[i])); + result += charToLower(replacementWord[i]); } } break; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 6aa2d59b967..05c093d7717 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -2981,7 +2981,7 @@ PowerTypeEntry const* DB2Manager::GetPowerTypeByName(std::string const& name) co for (PowerTypeEntry const* powerType : sPowerTypeStore) { std::string powerName = powerType->NameGlobalStringTag; - std::transform(powerName.begin(), powerName.end(), powerName.begin(), [](char c) { return char(::tolower(c)); }); + strToLower(powerName); if (powerName == name) return powerType; diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp index e164253a084..0d30439c685 100644 --- a/src/server/game/DataStores/GameTables.cpp +++ b/src/server/game/DataStores/GameTables.cpp @@ -19,6 +19,7 @@ #include "ItemTemplate.h" #include "Timer.h" #include "Log.h" +#include "StringConvert.h" #include "Util.h" #include #include @@ -84,14 +85,14 @@ inline uint32 LoadGameTable(std::vector& errors, GameTable& stor ASSERT(std::size_t(std::distance(values.begin(), end)) == columnDefs.size(), SZFMTD " == " SZFMTD, std::size_t(std::distance(values.begin(), end)), columnDefs.size()); // client ignores id column - CombatRatings has copypasted rows for levels > 110 - //ASSERT(strtol(values[0], nullptr, 10) == data.size(), - // "Unexpected row identifier %u at row " SZFMTD " (expected " SZFMTD ")", - // strtol(values[0], nullptr, 10), data.size(), data.size()); + //ASSERT(Trinity::StringTo(values[0], 10) == data.size(), + // "Unexpected row identifier %d at row " SZFMTD " (expected " SZFMTD ")", + // Trinity::StringTo(values[0], 10).value_or(0), data.size(), data.size()); data.emplace_back(); float* row = reinterpret_cast(&data.back()); for (auto itr = values.begin() + 1; itr != end; ++itr) - *row++ = strtof(itr->data(), nullptr); + *row++ = Trinity::StringTo(itr->data(), 10).value_or(0.0f); } storage.SetData(std::move(data)); diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp index 0d6fd328be3..77e9bef5746 100644 --- a/src/server/game/Entities/Object/ObjectGuid.cpp +++ b/src/server/game/Entities/Object/ObjectGuid.cpp @@ -535,7 +535,7 @@ std::string ObjectGuid::ToString() const std::string ObjectGuid::ToHexString() const { - return Trinity::StringFormat("0x%016llX%016llX", _data[1], _data[0]); + return Trinity::StringFormat("0x{:016X}{:016X}", _data[1], _data[0]); } ObjectGuid ObjectGuid::FromString(std::string const& guidString) diff --git a/src/server/game/Scripting/ScriptReloadMgr.cpp b/src/server/game/Scripting/ScriptReloadMgr.cpp index 16d52343119..121cbc2286c 100644 --- a/src/server/game/Scripting/ScriptReloadMgr.cpp +++ b/src/server/game/Scripting/ScriptReloadMgr.cpp @@ -384,8 +384,7 @@ static std::shared_ptr InvokeAsyncCMakeCommand(T&&. static std::string CalculateScriptModuleProjectName(std::string const& module) { std::string module_project = "scripts_" + module; - std::transform(module_project.begin(), module_project.end(), - module_project.begin(), ::tolower); + strToLower(module_project); return module_project; } diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 93991977321..08c972cc12f 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -823,7 +823,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptrsetInt64(0, mutetime); diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 038020536cc..db41de17c8c 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -412,7 +412,7 @@ class TC_GAME_API SpellScript : public _SpellScript class OnCalculateResistAbsorbHandlerFunction : public SpellScript::OnCalculateResistAbsorbHandler { public: explicit OnCalculateResistAbsorbHandlerFunction(SpellOnResistAbsorbCalculateFnType _onCalculateResistAbsorbScript) : SpellScript::OnCalculateResistAbsorbHandler((SpellScript::SpellOnResistAbsorbCalculateFnType)_onCalculateResistAbsorbScript) { } }; \ class ObjectAreaTargetSelectHandlerFunction : public SpellScript::ObjectAreaTargetSelectHandler { public: explicit ObjectAreaTargetSelectHandlerFunction(SpellObjectAreaTargetSelectFnType _pObjectAreaTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectAreaTargetSelectHandler((SpellScript::SpellObjectAreaTargetSelectFnType)_pObjectAreaTargetSelectHandlerScript, _effIndex, _targetType) { } }; \ class ObjectTargetSelectHandlerFunction : public SpellScript::ObjectTargetSelectHandler { public: explicit ObjectTargetSelectHandlerFunction(SpellObjectTargetSelectFnType _pObjectTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectTargetSelectHandler((SpellScript::SpellObjectTargetSelectFnType)_pObjectTargetSelectHandlerScript, _effIndex, _targetType) { } }; \ - class DestinationTargetSelectHandlerFunction : public SpellScript::DestinationTargetSelectHandler { public: explicit DestinationTargetSelectHandlerFunction(SpellDestinationTargetSelectFnType _DestinationTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::DestinationTargetSelectHandler((SpellScript::SpellDestinationTargetSelectFnType)_DestinationTargetSelectHandlerScript, _effIndex, _targetType) { } }; + class DestinationTargetSelectHandlerFunction : public SpellScript::DestinationTargetSelectHandler { public: explicit DestinationTargetSelectHandlerFunction(SpellDestinationTargetSelectFnType _DestinationTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::DestinationTargetSelectHandler((SpellScript::SpellDestinationTargetSelectFnType)_DestinationTargetSelectHandlerScript, _effIndex, _targetType) { } } #define PrepareSpellScript(CLASSNAME) SPELLSCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) SPELLSCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) public: diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 0eabe462431..5fe16403faa 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -23,6 +23,7 @@ #include "Log.h" #include "ObjectMgr.h" #include "Player.h" +#include "StringConvert.h" #include "World.h" #include #include @@ -592,7 +593,7 @@ inline T RegisterNewGuid(T oldGuid, MapType& guidMap, T guidOffse template class MapType, class... Rest> inline bool ChangeGuid(TableStruct const& ts, std::string& str, std::string const& column, MapType& guidMap, T guidOffset, bool allowZero = false) { - T oldGuid(atoull(GetColumn(ts, str, column).c_str())); + T oldGuid = Trinity::StringTo(GetColumn(ts, str, column)).template value_or(0); if (allowZero && !oldGuid) return true; // not an error @@ -1015,10 +1016,10 @@ DumpReturn PlayerDumpReader::LoadDump(std::istream& input, uint32 account, std:: { case DTT_CHARACTER: { - race = uint8(atoul(GetColumn(ts, line, "race").c_str())); - playerClass = uint8(atoul(GetColumn(ts, line, "class").c_str())); - gender = uint8(atoul(GetColumn(ts, line, "gender").c_str())); - level = uint8(atoul(GetColumn(ts, line, "level").c_str())); + race = Trinity::StringTo(GetColumn(ts, line, "race")).value_or(0); + playerClass = Trinity::StringTo(GetColumn(ts, line, "class")).value_or(0); + gender = Trinity::StringTo(GetColumn(ts, line, "gender")).value_or(0); + level = Trinity::StringTo(GetColumn(ts, line, "level")).value_or(0); if (name.empty()) { // generate a temporary name diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 9363b146573..33cdffcd7dc 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -110,10 +110,10 @@ public: if (!searchString.empty()) { // search by GUID - if (isNumeric(searchString.c_str())) + if (Optional guidValue = Trinity::StringTo(searchString)) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID); - stmt->setUInt64(0, strtoull(searchString.c_str(), nullptr, 10)); + stmt->setUInt64(0, *guidValue); result = CharacterDatabase.Query(stmt); } // search by name diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp index da8ca86df59..5ded723950b 100644 --- a/src/server/scripts/Commands/cs_disable.cpp +++ b/src/server/scripts/Commands/cs_disable.cpp @@ -36,10 +36,6 @@ EndScriptData */ #include "RBAC.h" #include "SpellMgr.h" -#if TRINITY_COMPILER == TRINITY_COMPILER_GNU -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - using namespace Trinity::ChatCommands; class disable_commandscript : public CommandScript @@ -83,22 +79,8 @@ public: return commandTable; } - static bool HandleAddDisables(ChatHandler* handler, char const* args, uint8 disableType) + static bool HandleAddDisables(ChatHandler* handler, DisableType disableType, uint32 entry, Optional flags, Tail disableComment) { - char* entryStr = strtok((char*)args, " "); - if (!entryStr || !atoi(entryStr)) - return false; - - char* flagsStr = strtok(nullptr, " "); - uint8 flags = flagsStr ? uint8(atoi(flagsStr)) : 0; - - char* commentStr = strtok(nullptr, ""); - if (!commentStr) - return false; - - std::string disableComment = commentStr; - uint32 entry = atoul(entryStr); - char const* disableTypeStr = ""; switch (disableType) @@ -191,6 +173,17 @@ public: disableTypeStr = "mmap"; break; } + case DISABLE_TYPE_LFG_MAP: + { + if (!sMapStore.LookupEntry(entry)) + { + handler->PSendSysMessage(LANG_COMMAND_NOMAPFOUND); + handler->SetSentErrorMessage(true); + return false; + } + disableTypeStr = "lfg map"; + break; + } default: break; } @@ -209,87 +202,56 @@ public: stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_DISABLES); stmt->setUInt32(0, entry); stmt->setUInt8(1, disableType); - stmt->setUInt16(2, flags); - stmt->setString(3, disableComment); + stmt->setUInt16(2, flags.value_or(0)); + stmt->setStringView(3, disableComment); WorldDatabase.Execute(stmt); - handler->PSendSysMessage("Add Disabled %s (Id: %u) for reason %s", disableTypeStr, entry, disableComment.c_str()); + handler->PSendSysMessage("Add Disabled %s (Id: %u) for reason " STRING_VIEW_FMT, disableTypeStr, entry, STRING_VIEW_FMT_ARG(disableComment)); return true; } - static bool HandleAddDisableSpellCommand(ChatHandler* handler, char const* args) + static bool HandleAddDisableSpellCommand(ChatHandler* handler, uint32 entry, Optional flags, Tail disableComment) { - if (!*args) - return false; - - return HandleAddDisables(handler, args, DISABLE_TYPE_SPELL); + return HandleAddDisables(handler, DISABLE_TYPE_SPELL, entry, flags, disableComment); } - static bool HandleAddDisableQuestCommand(ChatHandler* handler, char const* args) + static bool HandleAddDisableQuestCommand(ChatHandler* handler, uint32 entry, Optional flags, Tail disableComment) { - if (!*args) - return false; - - return HandleAddDisables(handler, args, DISABLE_TYPE_QUEST); + return HandleAddDisables(handler, DISABLE_TYPE_QUEST, entry, flags, disableComment); } - static bool HandleAddDisableMapCommand(ChatHandler* handler, char const* args) + static bool HandleAddDisableMapCommand(ChatHandler* handler, uint32 entry, Optional flags, Tail disableComment) { - if (!*args) - return false; - - return HandleAddDisables(handler, args, DISABLE_TYPE_MAP); + return HandleAddDisables(handler, DISABLE_TYPE_MAP, entry, flags, disableComment); } - static bool HandleAddDisableBattlegroundCommand(ChatHandler* handler, char const* args) + static bool HandleAddDisableBattlegroundCommand(ChatHandler* handler, uint32 entry, Optional flags, Tail disableComment) { - if (!*args) - return false; - - return HandleAddDisables(handler, args, DISABLE_TYPE_BATTLEGROUND); + return HandleAddDisables(handler, DISABLE_TYPE_BATTLEGROUND, entry, flags, disableComment); } - static bool HandleAddDisableCriteriaCommand(ChatHandler* handler, char const* args) + static bool HandleAddDisableCriteriaCommand(ChatHandler* handler, uint32 entry, Optional flags, Tail disableComment) { - if (!*args) - return false; - - return HandleAddDisables(handler, args, DISABLE_TYPE_CRITERIA); + return HandleAddDisables(handler, DISABLE_TYPE_CRITERIA, entry, flags, disableComment); } - static bool HandleAddDisableOutdoorPvPCommand(ChatHandler* handler, char const* args) + static bool HandleAddDisableOutdoorPvPCommand(ChatHandler* handler, uint32 entry, Optional flags, Tail disableComment) { - if (!*args) - return false; - - HandleAddDisables(handler, args, DISABLE_TYPE_OUTDOORPVP); - return true; + return HandleAddDisables(handler, DISABLE_TYPE_OUTDOORPVP, entry, flags, disableComment); } - static bool HandleAddDisableVmapCommand(ChatHandler* handler, char const* args) + static bool HandleAddDisableVmapCommand(ChatHandler* handler, uint32 entry, Optional flags, Tail disableComment) { - if (!*args) - return false; - - return HandleAddDisables(handler, args, DISABLE_TYPE_VMAP); + return HandleAddDisables(handler, DISABLE_TYPE_VMAP, entry, flags, disableComment); } - static bool HandleAddDisableMMapCommand(ChatHandler* handler, char const* args) + static bool HandleAddDisableMMapCommand(ChatHandler* handler, uint32 entry, Optional flags, Tail disableComment) { - if (!*args) - return false; - - return HandleAddDisables(handler, args, DISABLE_TYPE_MMAP); + return HandleAddDisables(handler, DISABLE_TYPE_MMAP, entry, flags, disableComment); } - static bool HandleRemoveDisables(ChatHandler* handler, char const* args, uint8 disableType) + static bool HandleRemoveDisables(ChatHandler* handler, DisableType disableType, uint32 entry) { - char* entryStr = strtok((char*)args, " "); - if (!entryStr || !atoi(entryStr)) - return false; - - uint32 entry = uint32(atoi(entryStr)); - char const* disableTypeStr = ""; switch (disableType) @@ -318,6 +280,11 @@ public: case DISABLE_TYPE_MMAP: disableTypeStr = "mmap"; break; + case DISABLE_TYPE_LFG_MAP: + disableTypeStr = "lfg map"; + break; + default: + break; } WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_DISABLES); @@ -340,68 +307,44 @@ public: return true; } - static bool HandleRemoveDisableSpellCommand(ChatHandler* handler, char const* args) + static bool HandleRemoveDisableSpellCommand(ChatHandler* handler, uint32 entry) { - if (!*args) - return false; - - return HandleRemoveDisables(handler, args, DISABLE_TYPE_SPELL); + return HandleRemoveDisables(handler, DISABLE_TYPE_SPELL, entry); } - static bool HandleRemoveDisableQuestCommand(ChatHandler* handler, char const* args) + static bool HandleRemoveDisableQuestCommand(ChatHandler* handler, uint32 entry) { - if (!*args) - return false; - - return HandleRemoveDisables(handler, args, DISABLE_TYPE_QUEST); + return HandleRemoveDisables(handler, DISABLE_TYPE_QUEST, entry); } - static bool HandleRemoveDisableMapCommand(ChatHandler* handler, char const* args) + static bool HandleRemoveDisableMapCommand(ChatHandler* handler, uint32 entry) { - if (!*args) - return false; - - return HandleRemoveDisables(handler, args, DISABLE_TYPE_MAP); + return HandleRemoveDisables(handler, DISABLE_TYPE_MAP, entry); } - static bool HandleRemoveDisableBattlegroundCommand(ChatHandler* handler, char const* args) + static bool HandleRemoveDisableBattlegroundCommand(ChatHandler* handler, uint32 entry) { - if (!*args) - return false; - - return HandleRemoveDisables(handler, args, DISABLE_TYPE_BATTLEGROUND); + return HandleRemoveDisables(handler, DISABLE_TYPE_BATTLEGROUND, entry); } - static bool HandleRemoveDisableCriteriaCommand(ChatHandler* handler, char const* args) + static bool HandleRemoveDisableCriteriaCommand(ChatHandler* handler, uint32 entry) { - if (!*args) - return false; - - return HandleRemoveDisables(handler, args, DISABLE_TYPE_CRITERIA); + return HandleRemoveDisables(handler, DISABLE_TYPE_CRITERIA, entry); } - static bool HandleRemoveDisableOutdoorPvPCommand(ChatHandler* handler, char const* args) + static bool HandleRemoveDisableOutdoorPvPCommand(ChatHandler* handler, uint32 entry) { - if (!*args) - return false; - - return HandleRemoveDisables(handler, args, DISABLE_TYPE_OUTDOORPVP); + return HandleRemoveDisables(handler, DISABLE_TYPE_OUTDOORPVP, entry); } - static bool HandleRemoveDisableVmapCommand(ChatHandler* handler, char const* args) + static bool HandleRemoveDisableVmapCommand(ChatHandler* handler, uint32 entry) { - if (!*args) - return false; - - return HandleRemoveDisables(handler, args, DISABLE_TYPE_VMAP); + return HandleRemoveDisables(handler, DISABLE_TYPE_VMAP, entry); } - static bool HandleRemoveDisableMMapCommand(ChatHandler* handler, char const* args) + static bool HandleRemoveDisableMMapCommand(ChatHandler* handler, uint32 entry) { - if (!*args) - return false; - - return HandleRemoveDisables(handler, args, DISABLE_TYPE_MMAP); + return HandleRemoveDisables(handler, DISABLE_TYPE_MMAP, entry); } }; diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 64d82dd47a8..d97672aa091 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -431,40 +431,22 @@ public: return true; } - static bool HandleGroupListCommand(ChatHandler* handler, char const* args) + static bool HandleGroupListCommand(ChatHandler* handler, PlayerIdentifier const& target) { - // Get ALL the variables! - Player* playerTarget; - ObjectGuid guidTarget; - std::string nameTarget; - std::string zoneName; - char const* onlineState = ""; - - // Parse the guid to uint32... - ObjectGuid parseGUID = ObjectGuid::Create(strtoull(args, nullptr, 10)); - - // ... and try to extract a player out of it. - if (sCharacterCache->GetCharacterNameByGuid(parseGUID, nameTarget)) - { - playerTarget = ObjectAccessor::FindPlayer(parseGUID); - guidTarget = parseGUID; - } - // If not, we return false and end right away. - else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget)) - return false; + char const* zoneName = ""; + char const* onlineState = "Offline"; // Next, we need a group. So we define a group variable. Group* groupTarget = nullptr; // We try to extract a group from an online player. - if (playerTarget) - groupTarget = playerTarget->GetGroup(); - - // If not, we extract it from the SQL. - if (!groupTarget) + if (target.IsConnected()) + groupTarget = target.GetConnectedPlayer()->GetGroup(); + else { + // If not, we extract it from the SQL. CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER); - stmt->setUInt64(0, guidTarget.GetCounter()); + stmt->setUInt64(0, target.GetGUID().GetCounter()); PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt); if (resultGroup) groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32()); @@ -473,7 +455,7 @@ public: // If both fails, players simply has no party. Return false. if (!groupTarget) { - handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, nameTarget.c_str()); + handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, target.GetName().c_str()); handler->SetSentErrorMessage(true); return false; } @@ -531,16 +513,10 @@ public: zoneName = zone->AreaName[locale]; } } - else - { - // ... else, everything is set to offline or neutral values. - zoneName = ""; - onlineState = "Offline"; - } // Now we can print those informations for every single member of each group! handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, slot.name.c_str(), onlineState, - zoneName.c_str(), phases.c_str(), slot.guid.ToString().c_str(), flags.c_str(), + zoneName, phases.c_str(), slot.guid.ToString().c_str(), flags.c_str(), lfg::GetRolesString(slot.roles).c_str()); } diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp index 2a0185223ec..c824e370632 100644 --- a/src/server/scripts/Commands/cs_guild.cpp +++ b/src/server/scripts/Commands/cs_guild.cpp @@ -263,19 +263,19 @@ public: return true; } - static bool HandleGuildInfoCommand(ChatHandler* handler, char const* args) + static bool HandleGuildInfoCommand(ChatHandler* handler, Optional> const& guildIdentifier) { Guild* guild = nullptr; - if (args && args[0] != '\0') + if (guildIdentifier) { - if (isNumeric(args)) - guild = sGuildMgr->GetGuildById(strtoull(args, nullptr, 10)); + if (ObjectGuid::LowType const* guid = std::get_if(&*guildIdentifier)) + guild = sGuildMgr->GetGuildById(*guid); else - guild = sGuildMgr->GetGuildByName(args); + guild = sGuildMgr->GetGuildByName(guildIdentifier->get()); } - else if (Player* target = handler->getSelectedPlayerOrSelf()) - guild = target->GetGuild(); + else if (Optional target = PlayerIdentifier::FromTargetOrSelf(handler); target && target->IsConnected()) + guild = target->GetConnectedPlayer()->GetGuild(); if (!guild) return false; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 32724dd6824..3f2f8416699 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -81,6 +81,7 @@ public: { "commands", HandleCommandsCommand, rbac::RBAC_PERM_COMMAND_COMMANDS, Console::Yes }, { "cooldown", HandleCooldownCommand, rbac::RBAC_PERM_COMMAND_COOLDOWN, Console::No }, { "damage", HandleDamageCommand, rbac::RBAC_PERM_COMMAND_DAMAGE, Console::No }, + { "damage go", HandleDamageGoCommand, rbac::RBAC_PERM_COMMAND_DAMAGE, Console::No }, { "dev", HandleDevCommand, rbac::RBAC_PERM_COMMAND_DEV, Console::No }, { "die", HandleDieCommand, rbac::RBAC_PERM_COMMAND_DIE, Console::No }, { "dismount", HandleDismountCommand, rbac::RBAC_PERM_COMMAND_DISMOUNT, Console::No }, @@ -1206,7 +1207,8 @@ public: char const* id = handler->extractKeyFromLink((char*)args, "Hitem"); if (!id) return false; - itemId = atoul(id); + + itemId = Trinity::StringTo(id).value_or(0); } char const* ccount = strtok(nullptr, " "); @@ -1233,7 +1235,7 @@ public: ItemContext itemContext = ItemContext::NONE; if (context) { - itemContext = ItemContext(atoul(context)); + itemContext = ItemContext(Trinity::StringTo(context).value_or(0)); if (itemContext != ItemContext::NONE && itemContext < ItemContext::Max) { std::set contextBonuses = sDB2Manager.GetDefaultItemBonusTree(itemId, itemContext); @@ -1370,7 +1372,8 @@ public: char const* id = handler->extractKeyFromLink(tailArgs, "Hitem"); if (!id) return false; - itemId = atoul(id); + + itemId = Trinity::StringTo(id).value_or(0); } char const* ccount = strtok(nullptr, " "); @@ -1397,7 +1400,7 @@ public: ItemContext itemContext = ItemContext::NONE; if (context) { - itemContext = ItemContext(atoul(context)); + itemContext = ItemContext(Trinity::StringTo(context).value_or(0)); if (itemContext != ItemContext::NONE && itemContext < ItemContext::Max) { std::set contextBonuses = sDB2Manager.GetDefaultItemBonusTree(itemId, itemContext); @@ -1634,27 +1637,20 @@ public: * * @return Several pieces of information about the character and the account **/ - static bool HandlePInfoCommand(ChatHandler* handler, char const* args) + static bool HandlePInfoCommand(ChatHandler* handler, Optional arg) { - // Define ALL the player variables! - Player* target; - ObjectGuid targetGuid; - std::string targetName; - CharacterDatabasePreparedStatement* stmt = nullptr; - - // To make sure we get a target, we convert our guid to an omniversal... - ObjectGuid parseGUID = ObjectGuid::Create(strtoull(args, nullptr, 10)); + if (!arg) + arg = PlayerIdentifier::FromTargetOrSelf(handler); - // ... and make sure we get a target, somehow. - if (sCharacterCache->GetCharacterNameByGuid(parseGUID, targetName)) - { - target = ObjectAccessor::FindPlayer(parseGUID); - targetGuid = parseGUID; - } - // if not, then return false. Which shouldn't happen, now should it ? - else if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) + if (!arg) return false; + // Define ALL the player variables! + Player* target = arg->GetConnectedPlayer(); + ObjectGuid targetGuid = arg->GetGUID(); + std::string targetName = arg->GetName(); + CharacterDatabasePreparedStatement* stmt = nullptr; + /* The variables we extract for the command. They are * default as "does not exist" to prevent problems * The output is printed in the follow manner: @@ -2319,71 +2315,8 @@ public: return true; } - static bool HandleDamageCommand(ChatHandler* handler, char const* args) + static bool HandleDamageCommand(ChatHandler* handler, uint32 damage, Optional school, Optional spellInfo) { - if (!*args) - return false; - - char* str = strtok((char*)args, " "); - - if (strcmp(str, "go") == 0) - { - char* guidStr = strtok(nullptr, " "); - if (!guidStr) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - - ObjectGuid::LowType guidLow = atoull(guidStr); - if (!guidLow) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - - char* damageStr = strtok(nullptr, " "); - if (!damageStr) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - - int32 damage = atoi(damageStr); - if (!damage) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } - - if (Player* player = handler->GetSession()->GetPlayer()) - { - GameObject* go = handler->GetObjectFromPlayerMapByDbGuid(guidLow); - if (!go) - { - handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, std::to_string(guidLow).c_str()); - handler->SetSentErrorMessage(true); - return false; - } - - if (!go->IsDestructibleBuilding()) - { - handler->SendSysMessage(LANG_INVALID_GAMEOBJECT_TYPE); - handler->SetSentErrorMessage(true); - return false; - } - - go->ModifyHealth(-damage, player); - handler->PSendSysMessage(LANG_GAMEOBJECT_DAMAGED, go->GetName().c_str(), std::to_string(guidLow).c_str(), -damage, go->GetGOValue()->Building.Health); - } - - return true; - } - Unit* target = handler->getSelectedUnit(); if (!target || !handler->GetSession()->GetPlayer()->GetTarget()) { @@ -2399,16 +2332,8 @@ public: if (!target->IsAlive()) return true; - int32 damage_int = atoi((char*)str); - if (damage_int <= 0) - return true; - - uint32 damage = damage_int; - - char* schoolStr = strtok((char*)nullptr, " "); - // flat melee damage without resistence/etc reduction - if (!schoolStr) + if (!school) { Unit::DealDamage(handler->GetSession()->GetPlayer(), target, damage, nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); if (target != handler->GetSession()->GetPlayer()) @@ -2416,21 +2341,15 @@ public: return true; } - uint32 school = atoi((char*)schoolStr); - if (school >= MAX_SPELL_SCHOOL) - return false; - - SpellSchoolMask schoolmask = SpellSchoolMask(1 << school); + SpellSchoolMask schoolmask = SpellSchoolMask(1 << *school); if (Unit::IsDamageReducedByArmor(schoolmask)) damage = Unit::CalcArmorReducedDamage(handler->GetSession()->GetPlayer(), target, damage, nullptr, BASE_ATTACK); - char* spellStr = strtok((char*)nullptr, " "); - Player* attacker = handler->GetSession()->GetPlayer(); // melee damage by specific school - if (!spellStr) + if (!spellInfo) { DamageInfo dmgInfo(attacker, target, damage, nullptr, schoolmask, SPELL_DIRECT_DAMAGE, BASE_ATTACK); Unit::CalcAbsorbResist(dmgInfo); @@ -2450,16 +2369,7 @@ public: // non-melee damage - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellid = handler->extractSpellIdFromLink((char*)args); - if (!spellid) - return false; - - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid, attacker->GetMap()->GetDifficultyID()); - if (!spellInfo) - return false; - - SpellNonMeleeDamage damageInfo(attacker, target, spellInfo, { spellInfo->GetSpellXSpellVisualId(handler->GetSession()->GetPlayer()), 0 }, spellInfo->SchoolMask); + SpellNonMeleeDamage damageInfo(attacker, target, *spellInfo, { (*spellInfo)->GetSpellXSpellVisualId(handler->GetSession()->GetPlayer()), 0 }, (*spellInfo)->SchoolMask); damageInfo.damage = damage; Unit::DealDamageMods(damageInfo.attacker, damageInfo.target, damageInfo.damage, &damageInfo.absorb); target->DealSpellDamage(&damageInfo, true); @@ -2467,6 +2377,28 @@ public: return true; } + static bool HandleDamageGoCommand(ChatHandler* handler, Variant, ObjectGuid::LowType> spawnId, int32 damage) + { + GameObject* go = handler->GetObjectFromPlayerMapByDbGuid(*spawnId); + if (!go) + { + handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, std::to_string(*spawnId).c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + if (!go->IsDestructibleBuilding()) + { + handler->SendSysMessage(LANG_INVALID_GAMEOBJECT_TYPE); + handler->SetSentErrorMessage(true); + return false; + } + + go->ModifyHealth(-damage, handler->GetSession()->GetPlayer()); + handler->PSendSysMessage(LANG_GAMEOBJECT_DAMAGED, go->GetName().c_str(), std::to_string(*spawnId).c_str(), -damage, go->GetGOValue()->Building.Health); + return true; + } + static bool HandleCombatStopCommand(ChatHandler* handler, char const* args) { Player* target = nullptr; diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 49f04af4593..da8e3d28d5e 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -36,6 +36,7 @@ EndScriptData */ #include "ReputationMgr.h" #include "SpellPackets.h" #include "UpdateFields.h" +#include "Util.h" #include "WorldSession.h" #if TRINITY_COMPILER == TRINITY_COMPILER_GNU @@ -210,10 +211,8 @@ public: } //Edit Player Faction - static bool HandleModifyFactionCommand(ChatHandler* handler, char const* args) + static bool HandleModifyFactionCommand(ChatHandler* handler, Optional factionid, Optional flag, Optional npcflag, Optional dyflag) { - char* pfactionid = handler->extractKeyFromLink((char*)args, "Hfaction"); - Creature* target = handler->getSelectedCreature(); if (!target) { @@ -222,56 +221,35 @@ public: return false; } - if (!pfactionid) - { - uint32 factionid = target->GetFaction(); - uint32 flag = target->m_unitData->Flags; - uint64 npcflag; - memcpy(&npcflag, target->m_unitData->NpcFlags.begin(), sizeof(uint64)); - uint32 dyflag = target->m_objectData->DynamicFlags; - handler->PSendSysMessage(LANG_CURRENT_FACTION, target->GetGUID().ToString().c_str(), factionid, flag, std::to_string(npcflag).c_str(), dyflag); - return true; - } - - uint32 factionid = atoul(pfactionid); - uint32 flag; - - char *pflag = strtok(nullptr, " "); - if (!pflag) + if (!flag) flag = target->m_unitData->Flags; - else - flag = atoul(pflag); - - char* pnpcflag = strtok(nullptr, " "); - - uint64 npcflag; - if (!pnpcflag) - memcpy(&npcflag, target->m_unitData->NpcFlags.begin(), sizeof(uint64)); - else - npcflag = atoull(pnpcflag); - char* pdyflag = strtok(nullptr, " "); + if (!npcflag) + memcpy(&npcflag.emplace(), target->m_unitData->NpcFlags.begin(), sizeof(uint64)); - uint32 dyflag; - if (!pdyflag) + if (!dyflag) dyflag = target->m_objectData->DynamicFlags; - else - dyflag = atoul(pdyflag); - if (!sFactionTemplateStore.LookupEntry(factionid)) + if (!factionid) { - handler->PSendSysMessage(LANG_WRONG_FACTION, factionid); + handler->PSendSysMessage(LANG_CURRENT_FACTION, target->GetGUID().ToString().c_str(), *factionid, *flag, std::to_string(*npcflag).c_str(), *dyflag); + return true; + } + + if (!sFactionTemplateStore.LookupEntry(*factionid)) + { + handler->PSendSysMessage(LANG_WRONG_FACTION, *factionid); handler->SetSentErrorMessage(true); return false; } - handler->PSendSysMessage(LANG_YOU_CHANGE_FACTION, target->GetGUID().ToString().c_str(), factionid, flag, std::to_string(npcflag).c_str(), dyflag); + handler->PSendSysMessage(LANG_YOU_CHANGE_FACTION, target->GetGUID().ToString().c_str(), *factionid, *flag, std::to_string(*npcflag).c_str(), *dyflag); - target->SetFaction(factionid); - target->ReplaceAllUnitFlags(UnitFlags(flag)); - target->ReplaceAllNpcFlags(NPCFlags(npcflag & 0xFFFFFFFF)); - target->ReplaceAllNpcFlags2(NPCFlags2(npcflag >> 32)); - target->ReplaceAllDynamicFlags(dyflag); + target->SetFaction(*factionid); + target->ReplaceAllUnitFlags(UnitFlags(*flag)); + target->ReplaceAllNpcFlags(NPCFlags(*npcflag & 0xFFFFFFFF)); + target->ReplaceAllNpcFlags2(NPCFlags2(*npcflag >> 32)); + target->ReplaceAllDynamicFlags(*dyflag); return true; } @@ -382,13 +360,8 @@ public: return false; } - static bool CheckModifySpeed(ChatHandler* handler, char const* args, Unit* target, float& speed, float minimumBound, float maximumBound, bool checkInFlight = true) + static bool CheckModifySpeed(ChatHandler* handler, Unit* target, float speed, float minimumBound, float maximumBound, bool checkInFlight = true) { - if (!*args) - return false; - - speed = (float)atof((char*)args); - if (speed > maximumBound || speed < minimumBound) { handler->SendSysMessage(LANG_BAD_VALUE); @@ -419,6 +392,15 @@ public: return true; } + static bool CheckModifySpeed(ChatHandler* handler, char const* args, Unit* target, float& speed, float minimumBound, float maximumBound, bool checkInFlight = true) + { + if (!*args) + return false; + + speed = (float)atof((char*)args); + return CheckModifySpeed(handler, target, speed, minimumBound, maximumBound, checkInFlight); + } + //Edit Player Aspeed static bool HandleModifyASpeedCommand(ChatHandler* handler, char const* args) { @@ -507,18 +489,8 @@ public: } //Enable Player mount - static bool HandleModifyMountCommand(ChatHandler* handler, char const* args) + static bool HandleModifyMountCommand(ChatHandler* handler, uint32 mount, float speed) { - if (!*args) - return false; - - char const* mount_cstr = strtok(const_cast(args), " "); - char const* speed_cstr = strtok(nullptr, " "); - - if (!mount_cstr || !speed_cstr) - return false; - - uint32 mount = atoul(mount_cstr); if (!sCreatureDisplayInfoStore.HasRecord(mount)) { handler->SendSysMessage(LANG_NO_MOUNT); @@ -538,8 +510,7 @@ public: if (handler->HasLowerSecurity(target, ObjectGuid::Empty)) return false; - float speed; - if (!CheckModifySpeed(handler, speed_cstr, target, speed, 0.1f, 50.0f)) + if (!CheckModifySpeed(handler, target, speed, 0.1f, 50.0f)) return false; NotifyModification(handler, target, LANG_YOU_GIVE_MOUNT, LANG_MOUNT_GIVED); @@ -775,13 +746,8 @@ public: } //morph creature or player - static bool HandleModifyMorphCommand(ChatHandler* handler, char const* args) + static bool HandleModifyMorphCommand(ChatHandler* handler, uint32 display_id) { - if (!*args) - return false; - - uint32 display_id = atoul(args); - Unit* target = handler->getSelectedUnit(); if (!target) target = handler->GetSession()->GetPlayer(); @@ -796,22 +762,8 @@ public: } // Toggles a phaseid on a player - static bool HandleModifyPhaseCommand(ChatHandler* handler, char const* args) + static bool HandleModifyPhaseCommand(ChatHandler* handler, uint32 phaseId, Optional visibleMapId) { - if (!*args) - return false; - - char* phaseText = strtok((char*)args, " "); - if (!phaseText) - return false; - - uint32 phaseId = uint32(strtoul(phaseText, nullptr, 10)); - uint32 visibleMapId = 0; - - char* visibleMapIdText = strtok(nullptr, " "); - if (visibleMapIdText) - visibleMapId = uint32(strtoul(visibleMapIdText, nullptr, 10)); - if (phaseId && !sPhaseStore.LookupEntry(phaseId)) { handler->SendSysMessage(LANG_PHASE_NOTFOUND); @@ -823,7 +775,7 @@ public: if (visibleMapId) { - MapEntry const* visibleMap = sMapStore.LookupEntry(visibleMapId); + MapEntry const* visibleMap = sMapStore.LookupEntry(*visibleMapId); if (!visibleMap || visibleMap->ParentMapID != int32(target->GetMapId())) { handler->SendSysMessage(LANG_PHASE_NOTFOUND); @@ -831,10 +783,10 @@ public: return false; } - if (!target->GetPhaseShift().HasVisibleMapId(visibleMapId)) - PhasingHandler::AddVisibleMapId(target, visibleMapId); + if (!target->GetPhaseShift().HasVisibleMapId(*visibleMapId)) + PhasingHandler::AddVisibleMapId(target, *visibleMapId); else - PhasingHandler::RemoveVisibleMapId(target, visibleMapId); + PhasingHandler::RemoveVisibleMapId(target, *visibleMapId); } if (phaseId) @@ -1076,11 +1028,11 @@ public: { if (upperCase) { - c = char(::toupper(c)); + c = charToUpper(c); upperCase = false; } else - c = char(::tolower(c)); + c = charToLower(c); if (c == '_') { diff --git a/src/server/scripts/Commands/cs_pet.cpp b/src/server/scripts/Commands/cs_pet.cpp index d6f2a39e59e..b75789ecae2 100644 --- a/src/server/scripts/Commands/cs_pet.cpp +++ b/src/server/scripts/Commands/cs_pet.cpp @@ -23,12 +23,11 @@ #include "Pet.h" #include "Player.h" #include "RBAC.h" +#include "SpellInfo.h" #include "SpellMgr.h" #include "WorldSession.h" -#if TRINITY_COMPILER == TRINITY_COMPILER_GNU -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif +using namespace Trinity::ChatCommands; inline Pet* GetSelectedPlayerPetOrOwn(ChatHandler* handler) { @@ -49,23 +48,23 @@ class pet_commandscript : public CommandScript public: pet_commandscript() : CommandScript("pet_commandscript") { } - std::vector GetCommands() const override + ChatCommandTable GetCommands() const override { - static std::vector petCommandTable = + static ChatCommandTable petCommandTable = { - { "create", rbac::RBAC_PERM_COMMAND_PET_CREATE, false, &HandlePetCreateCommand, "" }, - { "learn", rbac::RBAC_PERM_COMMAND_PET_LEARN, false, &HandlePetLearnCommand, "" }, - { "unlearn", rbac::RBAC_PERM_COMMAND_PET_UNLEARN, false, &HandlePetUnlearnCommand, "" }, - { "level", rbac::RBAC_PERM_COMMAND_PET_LEVEL, false, &HandlePetLevelCommand, "" }, + { "create", HandlePetCreateCommand, rbac::RBAC_PERM_COMMAND_PET_CREATE, Console::No }, + { "learn", HandlePetLearnCommand, rbac::RBAC_PERM_COMMAND_PET_LEARN, Console::No }, + { "unlearn", HandlePetUnlearnCommand, rbac::RBAC_PERM_COMMAND_PET_UNLEARN, Console::No }, + { "level", HandlePetLevelCommand, rbac::RBAC_PERM_COMMAND_PET_LEVEL, Console::No }, }; - static std::vector commandTable = + static ChatCommandTable commandTable = { - { "pet", rbac::RBAC_PERM_COMMAND_PET, false, nullptr, "", petCommandTable }, + { "pet", petCommandTable }, }; return commandTable; } - static bool HandlePetCreateCommand(ChatHandler* handler, char const* /*args*/) + static bool HandlePetCreateCommand(ChatHandler* handler) { Player* player = handler->GetSession()->GetPlayer(); Creature* creatureTarget = handler->getSelectedCreature(); @@ -117,11 +116,8 @@ public: return true; } - static bool HandlePetLearnCommand(ChatHandler* handler, char const* args) + static bool HandlePetLearnCommand(ChatHandler* handler, SpellInfo const* spellInfo) { - if (!*args) - return false; - Pet* pet = GetSelectedPlayerPetOrOwn(handler); if (!pet) @@ -131,10 +127,7 @@ public: return false; } - uint32 spellId = handler->extractSpellIdFromLink((char*)args); - - if (!spellId || !sSpellMgr->GetSpellInfo(spellId, DIFFICULTY_NONE)) - return false; + uint32 spellId = spellInfo->Id; // Check if pet already has it if (pet->HasSpell(spellId)) @@ -145,8 +138,7 @@ public: } // Check if spell is valid - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, DIFFICULTY_NONE); - if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo)) + if (!SpellMgr::IsSpellValid(spellInfo)) { handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); handler->SetSentErrorMessage(true); @@ -159,11 +151,8 @@ public: return true; } - static bool HandlePetUnlearnCommand(ChatHandler* handler, char const* args) + static bool HandlePetUnlearnCommand(ChatHandler* handler, SpellInfo const* spellInfo) { - if (!*args) - return false; - Pet* pet = GetSelectedPlayerPetOrOwn(handler); if (!pet) { @@ -172,7 +161,7 @@ public: return false; } - uint32 spellId = handler->extractSpellIdFromLink((char*)args); + uint32 spellId = spellInfo->Id; if (pet->HasSpell(spellId)) pet->removeSpell(spellId, false); @@ -182,7 +171,7 @@ public: return true; } - static bool HandlePetLevelCommand(ChatHandler* handler, char const* args) + static bool HandlePetLevelCommand(ChatHandler* handler, Optional level) { Pet* pet = GetSelectedPlayerPetOrOwn(handler); Player* owner = pet ? pet->GetOwner() : nullptr; @@ -193,9 +182,9 @@ public: return false; } - int32 level = args ? atoi(args) : 0; - if (level == 0) + if (!level) level = owner->GetLevel() - pet->GetLevel(); + if (level == 0 || level < -STRONG_MAX_LEVEL || level > STRONG_MAX_LEVEL) { handler->SendSysMessage(LANG_BAD_VALUE); @@ -203,7 +192,7 @@ public: return false; } - int32 newLevel = pet->GetLevel() + level; + int32 newLevel = pet->GetLevel() + *level; if (newLevel < 1) newLevel = 1; else if (newLevel > owner->GetLevel()) diff --git a/src/server/scripts/Commands/cs_send.cpp b/src/server/scripts/Commands/cs_send.cpp index d4f42b6c5f5..f9ee8c114f7 100644 --- a/src/server/scripts/Commands/cs_send.cpp +++ b/src/server/scripts/Commands/cs_send.cpp @@ -31,24 +31,26 @@ #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif +using namespace Trinity::ChatCommands; + class send_commandscript : public CommandScript { public: send_commandscript() : CommandScript("send_commandscript") { } - std::vector GetCommands() const override + ChatCommandTable GetCommands() const override { - static std::vector sendCommandTable = + static ChatCommandTable sendCommandTable = { - { "items", rbac::RBAC_PERM_COMMAND_SEND_ITEMS, true, &HandleSendItemsCommand, "" }, - { "mail", rbac::RBAC_PERM_COMMAND_SEND_MAIL, true, &HandleSendMailCommand, "" }, - { "message", rbac::RBAC_PERM_COMMAND_SEND_MESSAGE, true, &HandleSendMessageCommand, "" }, - { "money", rbac::RBAC_PERM_COMMAND_SEND_MONEY, true, &HandleSendMoneyCommand, "" }, + { "items", HandleSendItemsCommand, rbac::RBAC_PERM_COMMAND_SEND_ITEMS, Console::Yes }, + { "mail", HandleSendMailCommand, rbac::RBAC_PERM_COMMAND_SEND_MAIL, Console::Yes }, + { "message", HandleSendMessageCommand, rbac::RBAC_PERM_COMMAND_SEND_MESSAGE, Console::Yes }, + { "money", HandleSendMoneyCommand, rbac::RBAC_PERM_COMMAND_SEND_MONEY, Console::Yes }, }; - static std::vector commandTable = + static ChatCommandTable commandTable = { - { "send", rbac::RBAC_PERM_COMMAND_SEND, false, nullptr, "", sendCommandTable }, + { "send", sendCommandTable }, }; return commandTable; } @@ -146,14 +148,14 @@ public: char const* itemIdStr = strtok(itemStr, ":"); char const* itemCountStr = strtok(nullptr, " "); - uint32 itemId = atoul(itemIdStr); + Optional itemId = Trinity::StringTo(itemIdStr); if (!itemId) return false; - ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(itemId); + ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(*itemId); if (!item_proto) { - handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); + handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, *itemId); handler->SetSentErrorMessage(true); return false; } @@ -161,18 +163,18 @@ public: uint32 itemCount = itemCountStr ? atoi(itemCountStr) : 1; if (itemCount < 1 || (item_proto->GetMaxCount() > 0 && itemCount > uint32(item_proto->GetMaxCount()))) { - handler->PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, itemCount, itemId); + handler->PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, itemCount, *itemId); handler->SetSentErrorMessage(true); return false; } while (itemCount > item_proto->GetMaxStackSize()) { - items.push_back(ItemPair(itemId, item_proto->GetMaxStackSize())); + items.push_back(ItemPair(*itemId, item_proto->GetMaxStackSize())); itemCount -= item_proto->GetMaxStackSize(); } - items.push_back(ItemPair(itemId, itemCount)); + items.push_back(ItemPair(*itemId, itemCount)); if (items.size() > MAX_MAIL_ITEMS) { @@ -207,41 +209,10 @@ public: return true; } /// Send money by mail - static bool HandleSendMoneyCommand(ChatHandler* handler, char const* args) + static bool HandleSendMoneyCommand(ChatHandler* handler, PlayerIdentifier const& receiver, QuotedString const& subject, QuotedString const& text, int64 money) { /// format: name "subject text" "mail text" money - Player* receiver; - ObjectGuid receiverGuid; - std::string receiverName; - if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName)) - return false; - - char* tail1 = strtok(nullptr, ""); - if (!tail1) - return false; - - char* msgSubject = handler->extractQuotedArg(tail1); - if (!msgSubject) - return false; - - char* tail2 = strtok(nullptr, ""); - if (!tail2) - return false; - - char* msgText = handler->extractQuotedArg(tail2); - if (!msgText) - return false; - - char* moneyStr = strtok(nullptr, ""); - int64 money = moneyStr ? atoll(moneyStr) : 0; - if (money <= 0) - return false; - - // msgSubject, msgText isn't NUL after prev. check - std::string subject = msgSubject; - std::string text = msgText; - // from console show nonexisting sender MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : UI64LIT(0), MAIL_STATIONERY_GM); @@ -249,11 +220,11 @@ public: MailDraft(subject, text) .AddMoney(money) - .SendMailTo(trans, MailReceiver(receiver, receiverGuid.GetCounter()), sender); + .SendMailTo(trans, MailReceiver(receiver.GetConnectedPlayer(), receiver.GetGUID().GetCounter()), sender); CharacterDatabase.CommitTransaction(trans); - std::string nameLink = handler->playerLink(receiverName); + std::string nameLink = handler->playerLink(receiver.GetName()); handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); return true; } diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index d70d97746fc..851bb6cb43a 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -304,29 +304,25 @@ public: return false; char* arg_id = strtok(nullptr, " "); - uint32 id = 0; if (show == "add") { - if (arg_id) - id = atoul(arg_id); - - if (id) + if (Optional id = Trinity::StringTo(arg_id)) { stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID); - stmt->setUInt32(0, id); + stmt->setUInt32(0, *id); PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) { stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_WAYPOINT_SCRIPT); - stmt->setUInt32(0, id); + stmt->setUInt32(0, *id); WorldDatabase.Execute(stmt); - handler->PSendSysMessage("%s%s%u|r", "|cff00ff00", "Wp Event: New waypoint event added: ", id); + handler->PSendSysMessage("%s%s%u|r", "|cff00ff00", "Wp Event: New waypoint event added: ", *id); } else - handler->PSendSysMessage("|cff00ff00Wp Event: You have choosed an existing waypoint script guid: %u|r", id); + handler->PSendSysMessage("|cff00ff00Wp Event: You have choosed an existing waypoint script guid: %u|r", *id); } else { @@ -334,10 +330,10 @@ public: PreparedQueryResult result = WorldDatabase.Query(stmt); id = result->Fetch()->GetUInt32(); stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_WAYPOINT_SCRIPT); - stmt->setUInt32(0, id + 1); + stmt->setUInt32(0, *id + 1); WorldDatabase.Execute(stmt); - handler->PSendSysMessage("%s%s%u|r", "|cff00ff00", "Wp Event: New waypoint event added: |r|cff00ffff", id+1); + handler->PSendSysMessage("%s%s%u|r", "|cff00ff00", "Wp Event: New waypoint event added: |r|cff00ffff", *id+1); } return true; @@ -351,7 +347,7 @@ public: return true; } - id = atoul(arg_id); + uint32 id = Trinity::StringTo(arg_id).value_or(0); uint32 a2, a3, a4, a5, a6; float a8, a9, a10, a11; @@ -396,7 +392,7 @@ public: return true; } - id = atoul(arg_id); + uint32 id = Trinity::StringTo(arg_id).value_or(0); stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID); stmt->setUInt32(0, id); @@ -424,7 +420,7 @@ public: return true; } - id = atoul(arg_id); + uint32 id = Trinity::StringTo(arg_id).value_or(0); if (!id) { @@ -462,7 +458,7 @@ public: if (arg_str_2 == "setid") { - uint32 newid = atoul(arg_3); + uint32 newid = Trinity::StringTo(arg_3).value_or(0); handler->PSendSysMessage("%s%s|r|cff00ffff%u|r|cff00ff00%s|r|cff00ffff%u|r", "|cff00ff00", "Wp Event: Waypoint script guid: ", newid, " id changed: ", id); stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_SCRIPT_ID); @@ -530,7 +526,7 @@ public: } else if (arg_str_2 == "dataint") { - WorldDatabase.PExecute("UPDATE waypoint_scripts SET {}='{}' WHERE guid='{}'", arg_2, atoul(arg_3), id); // Query can't be a prepared statement + WorldDatabase.PExecute("UPDATE waypoint_scripts SET {}='{}' WHERE guid='{}'", arg_2, arg_3, id); // Query can't be a prepared statement handler->PSendSysMessage("|cff00ff00Waypoint script: |r|cff00ffff%u|r|cff00ff00 dataint updated.|r", id); return true; @@ -779,7 +775,7 @@ public: if (target) handler->SendSysMessage(LANG_WAYPOINT_CREATSELECTED); - pathid = atoul(guid_str); + pathid = Trinity::StringTo(guid_str).value_or(0); } std::string show = show_str; -- cgit v1.2.3