aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-05-13 15:46:27 +0200
committerShauren <shauren.trinity@gmail.com>2023-05-13 15:46:27 +0200
commit3260b94dd627b7b0c7114f94bb97d108b005af3e (patch)
tree980d58d6db4a3d20785f8bca881d36f79d0f5755
parentc4d40085964109893c76d301b6f7d99f03838fa0 (diff)
Core/Misc: Replace string to int conversion functions from Common.h with c++17 std::from_chars based ones Trinity::StringTo
-rw-r--r--sql/updates/world/master/2023_05_13_00_world.sql3
-rw-r--r--src/common/Common.h25
-rw-r--r--src/common/IPLocation/IPLocation.cpp15
-rw-r--r--src/common/Utilities/StringFormat.h13
-rw-r--r--src/common/Utilities/Util.cpp17
-rw-r--r--src/server/database/Database/Field.cpp25
-rw-r--r--src/server/game/Chat/Channels/Channel.cpp11
-rw-r--r--src/server/game/Chat/Chat.cpp75
-rw-r--r--src/server/game/Chat/Chat.h1
-rw-r--r--src/server/game/Chat/LanguageMgr.cpp6
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp2
-rw-r--r--src/server/game/DataStores/GameTables.cpp9
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.cpp2
-rw-r--r--src/server/game/Scripting/ScriptReloadMgr.cpp3
-rw-r--r--src/server/game/Server/WorldSocket.cpp2
-rw-r--r--src/server/game/Spells/SpellScript.h2
-rw-r--r--src/server/game/Tools/PlayerDump.cpp11
-rw-r--r--src/server/scripts/Commands/cs_character.cpp4
-rw-r--r--src/server/scripts/Commands/cs_disable.cpp163
-rw-r--r--src/server/scripts/Commands/cs_group.cpp44
-rw-r--r--src/server/scripts/Commands/cs_guild.cpp14
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp156
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp128
-rw-r--r--src/server/scripts/Commands/cs_pet.cpp51
-rw-r--r--src/server/scripts/Commands/cs_send.cpp67
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp30
26 files changed, 286 insertions, 593 deletions
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 <array>
#include <string>
-#include <cstdlib>
-
-#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 <fstream>
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<uint32> from = Trinity::StringTo<uint32>(ipFrom);
+ if (!from)
+ continue;
+
+ Optional<uint32> to = Trinity::StringTo<uint32>(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<typename OutputIt, typename... Args>
+ inline OutputIt StringFormatTo(OutputIt out, FormatString<Args...> fmt, Args&&... args)
+ {
+ try
+ {
+ return fmt::format_to(out, fmt, std::forward<Args>(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<uint8>(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 <cstring>
Field::Field()
@@ -45,7 +46,7 @@ uint8 Field::GetUInt8() const
if (data.raw)
return *reinterpret_cast<uint8 const*>(data.value);
- return static_cast<uint8>(strtoul(data.value, nullptr, 10));
+ return Trinity::StringTo<uint8>(data.value, 10).value_or(0);
}
int8 Field::GetInt8() const
@@ -63,7 +64,7 @@ int8 Field::GetInt8() const
if (data.raw)
return *reinterpret_cast<int8 const*>(data.value);
- return static_cast<int8>(strtol(data.value, nullptr, 10));
+ return Trinity::StringTo<int8>(data.value, 10).value_or(0);
}
uint16 Field::GetUInt16() const
@@ -81,7 +82,7 @@ uint16 Field::GetUInt16() const
if (data.raw)
return *reinterpret_cast<uint16 const*>(data.value);
- return static_cast<uint16>(strtoul(data.value, nullptr, 10));
+ return Trinity::StringTo<uint16>(data.value, 10).value_or(0);
}
int16 Field::GetInt16() const
@@ -99,7 +100,7 @@ int16 Field::GetInt16() const
if (data.raw)
return *reinterpret_cast<int16 const*>(data.value);
- return static_cast<int16>(strtol(data.value, nullptr, 10));
+ return Trinity::StringTo<int16>(data.value, 10).value_or(0);
}
uint32 Field::GetUInt32() const
@@ -117,7 +118,7 @@ uint32 Field::GetUInt32() const
if (data.raw)
return *reinterpret_cast<uint32 const*>(data.value);
- return static_cast<uint32>(strtoul(data.value, nullptr, 10));
+ return Trinity::StringTo<uint32>(data.value, 10).value_or(0);
}
int32 Field::GetInt32() const
@@ -135,7 +136,7 @@ int32 Field::GetInt32() const
if (data.raw)
return *reinterpret_cast<int32 const*>(data.value);
- return static_cast<int32>(strtol(data.value, nullptr, 10));
+ return Trinity::StringTo<int32>(data.value, 10).value_or(0);
}
uint64 Field::GetUInt64() const
@@ -153,7 +154,7 @@ uint64 Field::GetUInt64() const
if (data.raw)
return *reinterpret_cast<uint64 const*>(data.value);
- return static_cast<uint64>(strtoull(data.value, nullptr, 10));
+ return Trinity::StringTo<uint64>(data.value, 10).value_or(0);
}
int64 Field::GetInt64() const
@@ -171,7 +172,7 @@ int64 Field::GetInt64() const
if (data.raw)
return *reinterpret_cast<int64 const*>(data.value);
- return static_cast<int64>(strtoll(data.value, nullptr, 10));
+ return Trinity::StringTo<int64>(data.value, 10).value_or(0);
}
float Field::GetFloat() const
@@ -189,25 +190,25 @@ float Field::GetFloat() const
if (data.raw)
return *reinterpret_cast<float const*>(data.value);
- return static_cast<float>(atof(data.value));
+ return Trinity::StringTo<float>(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<double const*>(data.value);
- return static_cast<double>(atof(data.value));
+ return Trinity::StringTo<double>(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<uint64> high = Trinity::StringTo<uint64>(guid.substr(0, 16), 16);
+ Optional<uint64> low = Trinity::StringTo<uint64>(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 <boost/algorithm/string/replace.hpp>
@@ -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, &param1_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<ObjectGuid::LowType>(idS).value_or(UI64LIT(0));
return lowguid;
}
case GUID_LINK_GAMEOBJECT:
{
guidHigh = HighGuid::GameObject;
- ObjectGuid::LowType lowguid = atoull(idS);
+ ObjectGuid::LowType lowguid = Trinity::StringTo<ObjectGuid::LowType>(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 <boost/filesystem/path.hpp>
#include <fstream>
@@ -84,14 +85,14 @@ inline uint32 LoadGameTable(std::vector<std::string>& errors, GameTable<T>& 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<int32>(values[0], 10) == data.size(),
+ // "Unexpected row identifier %d at row " SZFMTD " (expected " SZFMTD ")",
+ // Trinity::StringTo<int32>(values[0], 10).value_or(0), data.size(), data.size());
data.emplace_back();
float* row = reinterpret_cast<float*>(&data.back());
for (auto itr = values.begin() + 1; itr != end; ++itr)
- *row++ = strtof(itr->data(), nullptr);
+ *row++ = Trinity::StringTo<float>(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<Trinity::AsyncProcessResult> 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_ptr<WorldPackets::Auth::
//! Negative mutetime indicates amount of seconds to be muted effective on next login - which is now.
if (mutetime < 0)
{
- mutetime = GameTime::GetGameTime() + llabs(mutetime);
+ mutetime = GameTime::GetGameTime() + std::llabs(mutetime);
stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME_LOGIN);
stmt->setInt64(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 <boost/algorithm/string/find.hpp>
#include <fstream>
@@ -592,7 +593,7 @@ inline T RegisterNewGuid(T oldGuid, MapType<T, T, Rest...>& guidMap, T guidOffse
template <typename T, template<class, class, class...> class MapType, class... Rest>
inline bool ChangeGuid(TableStruct const& ts, std::string& str, std::string const& column, MapType<T, T, Rest...>& guidMap, T guidOffset, bool allowZero = false)
{
- T oldGuid(atoull(GetColumn(ts, str, column).c_str()));
+ T oldGuid = Trinity::StringTo<T>(GetColumn(ts, str, column)).template value_or<T>(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<uint8>(GetColumn(ts, line, "race")).value_or<uint8>(0);
+ playerClass = Trinity::StringTo<uint8>(GetColumn(ts, line, "class")).value_or<uint8>(0);
+ gender = Trinity::StringTo<uint8>(GetColumn(ts, line, "gender")).value_or<uint8>(0);
+ level = Trinity::StringTo<uint8>(GetColumn(ts, line, "level")).value_or<uint8>(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<uint64> guidValue = Trinity::StringTo<uint64>(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<uint16> 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<uint16>(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<uint16> 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<uint16> 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<uint16> 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<uint16> 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<uint16> 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<uint16> 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<uint16> 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<uint16> 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<HighGuid::Player>(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 = "<ERROR>";
+ 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 = "<ERROR>";
- 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<Variant<ObjectGuid::LowType, std::string_view>> 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<ObjectGuid::LowType>(&*guildIdentifier))
+ guild = sGuildMgr->GetGuildById(*guid);
else
- guild = sGuildMgr->GetGuildByName(args);
+ guild = sGuildMgr->GetGuildByName(guildIdentifier->get<std::string_view>());
}
- else if (Player* target = handler->getSelectedPlayerOrSelf())
- guild = target->GetGuild();
+ else if (Optional<PlayerIdentifier> 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<uint32>(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<uint8>(context).value_or(0));
if (itemContext != ItemContext::NONE && itemContext < ItemContext::Max)
{
std::set<uint32> 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<uint32>(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<uint8>(context).value_or(0));
if (itemContext != ItemContext::NONE && itemContext < ItemContext::Max)
{
std::set<uint32> 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<PlayerIdentifier> 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<HighGuid::Player>(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<SpellSchools> school, Optional<SpellInfo const*> 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<Hyperlink<gameobject>, 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<uint32> factionid, Optional<uint32> flag, Optional<uint64> npcflag, Optional<uint32> 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<char*>(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<uint32> 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<ChatCommand> GetCommands() const override
+ ChatCommandTable GetCommands() const override
{
- static std::vector<ChatCommand> 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<ChatCommand> 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<int32> 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<ChatCommand> GetCommands() const override
+ ChatCommandTable GetCommands() const override
{
- static std::vector<ChatCommand> 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<ChatCommand> 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<uint32> itemId = Trinity::StringTo<uint32>(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<uint32> id = Trinity::StringTo<uint32>(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<uint32>(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<uint32>(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<uint32>(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<uint32>(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<uint32>(guid_str).value_or(0);
}
std::string show = show_str;