Core/Misc: Replace string to int conversion functions from Common.h with c++17 std::from_chars based ones Trinity::StringTo

This commit is contained in:
Shauren
2023-05-13 15:46:27 +02:00
parent c4d4008596
commit 3260b94dd6
26 changed files with 287 additions and 594 deletions

View File

@@ -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.');

View File

@@ -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

View File

@@ -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; });

View File

@@ -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)
{

View File

@@ -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)

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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));

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}
};

View File

@@ -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());
}

View File

@@ -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;

View File

@@ -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;
if (!arg)
arg = PlayerIdentifier::FromTargetOrSelf(handler);
// To make sure we get a target, we convert our guid to an omniversal...
ObjectGuid parseGUID = ObjectGuid::Create<HighGuid::Player>(strtoull(args, nullptr, 10));
// ... 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;

View File

@@ -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)
if (!flag)
flag = target->m_unitData->Flags;
if (!npcflag)
memcpy(&npcflag.emplace(), target->m_unitData->NpcFlags.begin(), sizeof(uint64));
if (!dyflag)
dyflag = target->m_objectData->DynamicFlags;
if (!factionid)
{
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);
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)
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, " ");
uint32 dyflag;
if (!pdyflag)
dyflag = target->m_objectData->DynamicFlags;
else
dyflag = atoul(pdyflag);
if (!sFactionTemplateStore.LookupEntry(factionid))
if (!sFactionTemplateStore.LookupEntry(*factionid))
{
handler->PSendSysMessage(LANG_WRONG_FACTION, 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 == '_')
{

View File

@@ -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())

View File

@@ -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;
}

View File

@@ -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;