diff --git a/.github/workflows/codestyle.yml b/.github/workflows/codestyle.yml index f1658fb24..486b3a952 100644 --- a/.github/workflows/codestyle.yml +++ b/.github/workflows/codestyle.yml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Setup python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.10' - name: AzerothCore codestyle diff --git a/apps/Fmt/FormatReplace.py b/apps/Fmt/FormatReplace.py index a25a02ed5..a9d553f14 100644 --- a/apps/Fmt/FormatReplace.py +++ b/apps/Fmt/FormatReplace.py @@ -62,12 +62,12 @@ def isPAppend(line): else : return False -# def isStringFormat(line): -# substring = 'StringFormat' -# if substring in line: -# return True -# else : -# return False +def isStringFormat(line): + substring = 'StringFormat' + if substring in line: + return True + else : + return False def haveDelimeter(line): if ';' in line: @@ -96,8 +96,8 @@ def checkSoloLine(line): # return handleCleanup(line), False # elif isPSendSysMessage(line): # return handleCleanup(line), False - # elif isStringFormat(line): - # return handleCleanup(line), False + elif isStringFormat(line): + return handleCleanup(line), False else: return line, False @@ -122,8 +122,8 @@ def startMultiLine(line): elif isPAppend(line): line = line.replace("PAppend", "Append"); return handleCleanup(line), True - # elif isStringFormat(line): - # return handleCleanup(line), True + elif isStringFormat(line): + return handleCleanup(line), True else : return line, False diff --git a/apps/codestyle/codestyle.py b/apps/codestyle/codestyle.py index 8c595d704..bad3aee1f 100644 --- a/apps/codestyle/codestyle.py +++ b/apps/codestyle/codestyle.py @@ -1,6 +1,7 @@ import io import os import sys +import re # Get the src directory of the project src_directory = os.path.join(os.getcwd(), 'src') @@ -11,8 +12,11 @@ results = { "Multiple blank lines check": "Passed", "Trailing whitespace check": "Passed", "GetCounter() check": "Passed", + "Misc codestyle check": "Passed", "GetTypeId() check": "Passed", - "NpcFlagHelpers check": "Passed" + "NpcFlagHelpers check": "Passed", + "ItemFlagHelpers check": "Passed", + "ItemTemplateFlagHelpers check": "Passed" } # Main function to parse all the files of the project @@ -27,10 +31,15 @@ def parsing_file(directory: str) -> None: multiple_blank_lines_check(file, file_path) trailing_whitespace_check(file, file_path) get_counter_check(file, file_path) + misc_codestyle_check(file, file_path) if file_name != 'Object.h': get_typeid_check(file, file_path) if file_name != 'Unit.h': npcflags_helpers_check(file, file_path) + if file_name != 'Item.h': + itemflag_helpers_check(file, file_path) + if file_name != 'ItemTemplate.h': + itemtemplateflag_helpers_check(file, file_path) except UnicodeDecodeError: print(f"\nCould not decode file {file_path}") sys.exit(1) @@ -99,14 +108,20 @@ def get_typeid_check(file: io, file_path: str) -> None: check_failed = False # Parse all the file for line_number, line in enumerate(file, start = 1): - if 'GetTypeId() == TYPEID_PLAYER' in line: - print(f"Please use IsPlayer() instead GetTypeId(): {file_path} at line {line_number}") + if 'GetTypeId() == TYPEID_ITEM' in line or 'GetTypeId() != TYPEID_ITEM' in line: + print(f"Please use IsItem() instead of GetTypeId(): {file_path} at line {line_number}") check_failed = True - if 'GetTypeId() == TYPEID_ITEM' in line: - print(f"Please use IsItem() instead GetTypeId(): {file_path} at line {line_number}") + if 'GetTypeId() == TYPEID_UNIT' in line or 'GetTypeId() != TYPEID_UNIT' in line: + print(f"Please use IsCreature() instead of GetTypeId(): {file_path} at line {line_number}") check_failed = True - if 'GetTypeId() == TYPEID_DYNOBJECT' in line: - print(f"Please use IsDynamicObject() instead GetTypeId(): {file_path} at line {line_number}") + if 'GetTypeId() == TYPEID_PLAYER' in line or 'GetTypeId() != TYPEID_PLAYER' in line: + print(f"Please use IsPlayer() instead of GetTypeId(): {file_path} at line {line_number}") + check_failed = True + if 'GetTypeId() == TYPEID_GAMEOBJECT' in line or 'GetTypeId() != TYPEID_GAMEOBJECT' in line: + print(f"Please use IsGameObject() instead of GetTypeId(): {file_path} at line {line_number}") + check_failed = True + if 'GetTypeId() == TYPEID_DYNOBJECT' in line or 'GetTypeId() != TYPEID_DYNOBJECT' in line: + print(f"Please use IsDynamicObject() instead of GetTypeId(): {file_path} at line {line_number}") check_failed = True # Handle the script error and update the result output if check_failed: @@ -139,10 +154,79 @@ def npcflags_helpers_check(file: io, file_path: str) -> None: if 'RemoveFlag(UNIT_NPC_FLAGS,' in line: print( f"Please use RemoveNpcFlag() instead RemoveFlag(UNIT_NPC_FLAGS, ...): {file_path} at line {line_number}") + check_failed = True # Handle the script error and update the result output if check_failed: error_handler = True results["NpcFlagHelpers check"] = "Failed" +# Codestyle patterns checking for ItemFlag helpers +def itemflag_helpers_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)' in line: + print( + f"Please use IsRefundable() instead of HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE): {file_path} at line {line_number}") + check_failed = True + if 'HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)' in line: + print( + f"Please use IsBOPTradable() instead of HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE): {file_path} at line {line_number}") + check_failed = True + if 'HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)' in line: + print( + f"Please use IsWrapped() instead of HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED): {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["ItemFlagHelpers check"] = "Failed" + +# Codestyle patterns checking for ItemTemplate helpers +def itemtemplateflag_helpers_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'Flags & ITEM_FLAG' in line: + print( + f"Please use HasFlag(ItemFlag) instead of 'Flags & ITEM_FLAG_': {file_path} at line {line_number}") + check_failed = True + if 'Flags2 & ITEM_FLAG2' in line: + print( + f"Please use HasFlag2(ItemFlag2) instead of 'Flags2 & ITEM_FLAG2_': {file_path} at line {line_number}") + check_failed = True + if 'FlagsCu & ITEM_FLAGS_CU' in line: + print( + f"Please use HasFlagCu(ItemFlagsCustom) instead of 'FlagsCu & ITEM_FLAGS_CU_': {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["ItemTemplateFlagHelpers check"] = "Failed" + +# Codestyle patterns checking for various codestyle issues +def misc_codestyle_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'const auto&' in line: + print( + f"Please use 'auto const&' syntax instead of 'const auto&': {file_path} at line {line_number}") + check_failed = True + if re.search(r'\bconst\s+\w+\s*\*\b', line): + print( + f"Please use the syntax 'Class/ObjectType const*' instead of 'const Class/ObjectType*': {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["Misc codestyle check"] = "Failed" + # Main function parsing_file(src_directory) diff --git a/data/sql/updates/db_characters/2024_09_03_00.sql b/data/sql/updates/db_characters/2024_09_03_00.sql new file mode 100644 index 000000000..b61491e17 --- /dev/null +++ b/data/sql/updates/db_characters/2024_09_03_00.sql @@ -0,0 +1,11 @@ +-- DB update 2024_07_05_00 -> 2024_09_03_00 +DROP TABLE IF EXISTS `character_achievement_offline_updates`; +CREATE TABLE `character_achievement_offline_updates` ( + `guid` BIGINT UNSIGNED NOT NULL COMMENT 'Character\'s GUID', + `update_type` TINYINT UNSIGNED NOT NULL COMMENT 'Supported types: 1 - COMPLETE_ACHIEVEMENT; 2 - UPDATE_CRITERIA', + `arg1` INT UNSIGNED NOT NULL COMMENT 'For type 1: achievement ID; for type 2: ACHIEVEMENT_CRITERIA_TYPE', + `arg2` INT UNSIGNED DEFAULT NULL COMMENT 'For type 2: miscValue1 for updating achievement criteria', + `arg3` INT UNSIGNED DEFAULT NULL COMMENT 'For type 2: miscValue2 for updating achievement criteria', + INDEX `idx_guid` (`guid`) +) +COMMENT = 'Stores updates to character achievements when the character was offline'; diff --git a/data/sql/updates/db_world/2024_08_30_01.sql b/data/sql/updates/db_world/2024_08_30_01.sql new file mode 100644 index 000000000..c5c976623 --- /dev/null +++ b/data/sql/updates/db_world/2024_08_30_01.sql @@ -0,0 +1,2 @@ +-- DB update 2024_08_30_00 -> 2024_08_30_01 +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|256 WHERE `entry` = 22948; diff --git a/data/sql/updates/db_world/2024_08_30_02.sql b/data/sql/updates/db_world/2024_08_30_02.sql new file mode 100644 index 000000000..d4bf5ae6f --- /dev/null +++ b/data/sql/updates/db_world/2024_08_30_02.sql @@ -0,0 +1,4 @@ +-- DB update 2024_08_30_01 -> 2024_08_30_02 +-- +DELETE FROM `spell_script_names` WHERE `spell_id`=39497; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES(39497, 'spell_kaelthas_remove_enchanted_weapons'); diff --git a/data/sql/updates/db_world/2024_08_31_00.sql b/data/sql/updates/db_world/2024_08_31_00.sql new file mode 100644 index 000000000..d48d0d27b --- /dev/null +++ b/data/sql/updates/db_world/2024_08_31_00.sql @@ -0,0 +1,6 @@ +-- DB update 2024_08_30_02 -> 2024_08_31_00 +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 21806; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 21806) AND (`source_type` = 0) AND (`id` IN (5)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(21806, 0, 5, 0, 0, 0, 23, 0, 10000, 30000, 10000, 30000, 0, 0, 11, 37527, 0, 0, 0, 0, 0, 5, 40, 0, 0, 0, 0, 0, 0, 0, 'Greyheart Spellbinder - In Combat - Cast Banish'); diff --git a/data/sql/updates/db_world/2024_08_31_01.sql b/data/sql/updates/db_world/2024_08_31_01.sql new file mode 100644 index 000000000..ddec84ad4 --- /dev/null +++ b/data/sql/updates/db_world/2024_08_31_01.sql @@ -0,0 +1,10 @@ +-- DB update 2024_08_31_00 -> 2024_08_31_01 +UPDATE `item_template` +SET `stat_type1` = 5, +`stat_value1` = 20, +`stat_type2` = 7, +`stat_value2` = 13, +`stat_type3` = 42, +`stat_value3` = 25, +`StatsCount` = 3 +WHERE (`entry` = 13113); diff --git a/data/sql/updates/db_world/2024_09_01_00.sql b/data/sql/updates/db_world/2024_09_01_00.sql new file mode 100644 index 000000000..ad9aea5f6 --- /dev/null +++ b/data/sql/updates/db_world/2024_09_01_00.sql @@ -0,0 +1,3 @@ +-- DB update 2024_08_31_01 -> 2024_09_01_00 +-- +UPDATE `creature_template` SET `unit_flags` = 33554432 WHERE `entry` = 23429; diff --git a/data/sql/updates/db_world/2024_09_02_00.sql b/data/sql/updates/db_world/2024_09_02_00.sql new file mode 100644 index 000000000..3b2716bc1 --- /dev/null +++ b/data/sql/updates/db_world/2024_09_02_00.sql @@ -0,0 +1,2 @@ +-- DB update 2024_09_01_00 -> 2024_09_02_00 +UPDATE `creature_template` SET `speed_run` = 0.785714 WHERE `entry` = 23111; diff --git a/data/sql/updates/db_world/2024_09_02_01.sql b/data/sql/updates/db_world/2024_09_02_01.sql new file mode 100644 index 000000000..c36605f69 --- /dev/null +++ b/data/sql/updates/db_world/2024_09_02_01.sql @@ -0,0 +1,3 @@ +-- DB update 2024_09_02_00 -> 2024_09_02_01 +DELETE FROM `spell_custom_attr` WHERE `spell_id` = 40253; +INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES (40253, 536870912); diff --git a/data/sql/updates/db_world/2024_09_03_00.sql b/data/sql/updates/db_world/2024_09_03_00.sql new file mode 100644 index 000000000..9c2a766a9 --- /dev/null +++ b/data/sql/updates/db_world/2024_09_03_00.sql @@ -0,0 +1,4 @@ +-- DB update 2024_09_02_01 -> 2024_09_03_00 +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 22960) AND (`source_type` = 0) AND (`id` IN (0)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(22960, 0, 0, 0, 0, 0, 40, 0, 0, 10000, 0, 10000, 0, 0, 11, 40895, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Wyrmcaller - In Combat - Cast \'Jab\''); diff --git a/data/sql/updates/db_world/2024_09_03_01.sql b/data/sql/updates/db_world/2024_09_03_01.sql new file mode 100644 index 000000000..6302e6580 --- /dev/null +++ b/data/sql/updates/db_world/2024_09_03_01.sql @@ -0,0 +1,7 @@ +-- DB update 2024_09_03_00 -> 2024_09_03_01 +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 17803; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17803) AND (`source_type` = 0) AND (`id` IN (0, 1)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17803, 0, 0, 0, 0, 0, 100, 2, 5000, 8000, 13000, 16000, 0, 0, 11, 22582, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Oracle - In Combat - Cast \'Frost Shock\' (Normal Dungeon)'), +(17803, 0, 1, 0, 0, 0, 100, 4, 5000, 8000, 13000, 16000, 0, 0, 11, 37865, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Oracle - In Combat - Cast \'Frost Shock\' (Heroic Dungeon)'); diff --git a/src/common/Banner.cpp b/src/common/Banner.cpp index f77c9abee..65f5ab577 100644 --- a/src/common/Banner.cpp +++ b/src/common/Banner.cpp @@ -21,7 +21,7 @@ void Acore::Banner::Show(std::string_view applicationName, void(*log)(std::string_view text), void(*logExtraInfo)()) { - log(Acore::StringFormatFmt("{} ({})", GitRevision::GetFullVersion(), applicationName)); + log(Acore::StringFormat("{} ({})", GitRevision::GetFullVersion(), applicationName)); log(" to stop.\n"); log(" █████╗ ███████╗███████╗██████╗ ██████╗ ████████╗██╗ ██╗"); log(" ██╔══██╗╚══███╔╝██╔════╝██╔══██╗██╔═══██╗╚══██╔══╝██║ ██║"); diff --git a/src/common/Collision/Management/MMapMgr.cpp b/src/common/Collision/Management/MMapMgr.cpp index 732cf3684..4733712aa 100644 --- a/src/common/Collision/Management/MMapMgr.cpp +++ b/src/common/Collision/Management/MMapMgr.cpp @@ -85,7 +85,7 @@ namespace MMAP } // load and init dtNavMesh - read parameters from file - std::string fileName = Acore::StringFormat(MAP_FILE_NAME_FORMAT, sConfigMgr->GetOption("DataDir", ".").c_str(), mapId); + std::string fileName = Acore::StringFormat(MAP_FILE_NAME_FORMAT, sConfigMgr->GetOption("DataDir", "."), mapId); FILE* file = fopen(fileName.c_str(), "rb"); if (!file) @@ -147,7 +147,7 @@ namespace MMAP } // load this tile :: mmaps/MMMXXYY.mmtile - std::string fileName = Acore::StringFormat(TILE_FILE_NAME_FORMAT, sConfigMgr->GetOption("DataDir", ".").c_str(), mapId, x, y); + std::string fileName = Acore::StringFormat(TILE_FILE_NAME_FORMAT, sConfigMgr->GetOption("DataDir", "."), mapId, x, y); FILE* file = fopen(fileName.c_str(), "rb"); if (!file) { diff --git a/src/common/Common.h b/src/common/Common.h index cd50104c8..9baec924e 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -43,7 +43,8 @@ #define MAX_NETCLIENT_PACKET_SIZE (32767 - 1) // Client hardcap: int16 with trailing zero space otherwise crash on memory free // TimeConstants -constexpr auto MINUTE = 60; +constexpr auto SECOND = 1; +constexpr auto MINUTE = SECOND * 60; constexpr auto HOUR = MINUTE * 60; constexpr auto DAY = HOUR * 24; constexpr auto WEEK = DAY * 7; diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp index 2261c14b1..5f653fa96 100644 --- a/src/common/Configuration/Config.cpp +++ b/src/common/Configuration/Config.cpp @@ -65,7 +65,7 @@ namespace template inline void PrintError(std::string_view filename, Format&& fmt, Args&& ... args) { - std::string message = Acore::StringFormatFmt(std::forward(fmt), std::forward(args)...); + std::string message = Acore::StringFormat(std::forward(fmt), std::forward(args)...); if (IsAppConfig(filename)) { @@ -117,7 +117,7 @@ namespace return false; } - throw ConfigException(Acore::StringFormatFmt("Config::LoadFile: Failed open {}file '{}'", isOptional ? "optional " : "", file)); + throw ConfigException(Acore::StringFormat("Config::LoadFile: Failed open {}file '{}'", isOptional ? "optional " : "", file)); } uint32 count = 0; @@ -144,7 +144,7 @@ namespace // read line error if (!in.good() && !in.eof()) - throw ConfigException(Acore::StringFormatFmt("> Config::LoadFile: Failure to read line number {} in file '{}'", lineNumber, file)); + throw ConfigException(Acore::StringFormat("> Config::LoadFile: Failure to read line number {} in file '{}'", lineNumber, file)); // remove whitespace in line line = Acore::String::Trim(line, in.getloc()); @@ -187,7 +187,7 @@ namespace return false; } - throw ConfigException(Acore::StringFormatFmt("Config::LoadFile: Empty file '{}'", file)); + throw ConfigException(Acore::StringFormat("Config::LoadFile: Empty file '{}'", file)); } // Add correct keys if file load without errors diff --git a/src/common/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp index 9ca5f8c29..b42b34a18 100644 --- a/src/common/Debugging/Errors.cpp +++ b/src/common/Debugging/Errors.cpp @@ -62,19 +62,19 @@ namespace inline std::string MakeMessage(std::string_view messageType, std::string_view file, uint32 line, std::string_view function, std::string_view message, std::string_view fmtMessage = {}, std::string_view debugInfo = {}) { - std::string msg = Acore::StringFormatFmt("\n>> {}\n\n# Location: {}:{}\n# Function: {}\n# Condition: {}\n", messageType, file, line, function, message); + std::string msg = Acore::StringFormat("\n>> {}\n\n# Location: {}:{}\n# Function: {}\n# Condition: {}\n", messageType, file, line, function, message); if (!fmtMessage.empty()) { - msg.append(Acore::StringFormatFmt("# Message: {}\n", fmtMessage)); + msg.append(Acore::StringFormat("# Message: {}\n", fmtMessage)); } if (!debugInfo.empty()) { - msg.append(Acore::StringFormatFmt("\n# Debug info: {}\n", debugInfo)); + msg.append(Acore::StringFormat("\n# Debug info: {}\n", debugInfo)); } - return Acore::StringFormatFmt( + return Acore::StringFormat( "#{0:-^{2}}#\n" " {1: ^{2}} \n" "#{0:-^{2}}#\n", "", msg, 70); @@ -90,14 +90,14 @@ namespace */ inline std::string MakeAbortMessage(std::string_view file, uint32 line, std::string_view function, std::string_view fmtMessage = {}) { - std::string msg = Acore::StringFormatFmt("\n>> ABORTED\n\n# Location '{}:{}'\n# Function '{}'\n", file, line, function); + std::string msg = Acore::StringFormat("\n>> ABORTED\n\n# Location '{}:{}'\n# Function '{}'\n", file, line, function); if (!fmtMessage.empty()) { - msg.append(Acore::StringFormatFmt("# Message '{}'\n", fmtMessage)); + msg.append(Acore::StringFormat("# Message '{}'\n", fmtMessage)); } - return Acore::StringFormatFmt( + return Acore::StringFormat( "\n#{0:-^{2}}#\n" " {1: ^{2}} \n" "#{0:-^{2}}#\n", "", msg, 70); @@ -148,7 +148,7 @@ void Acore::Abort(std::string_view file, uint32 line, std::string_view function, void Acore::AbortHandler(int sigval) { // nothing useful to log here, no way to pass args - std::string formattedMessage = StringFormatFmt("Caught signal {}\n", sigval); + std::string formattedMessage = StringFormat("Caught signal {}\n", sigval); fmt::print(stderr, "{}", formattedMessage); fflush(stderr); Crash(formattedMessage.c_str()); diff --git a/src/common/Debugging/Errors.h b/src/common/Debugging/Errors.h index 0155d0ddb..24a36f1e8 100644 --- a/src/common/Debugging/Errors.h +++ b/src/common/Debugging/Errors.h @@ -31,19 +31,19 @@ namespace Acore template AC_COMMON_API inline void Assert(std::string_view file, uint32 line, std::string_view function, std::string_view debugInfo, std::string_view message, std::string_view fmt, Args&&... args) { - Assert(file, line, function, debugInfo, message, StringFormatFmt(fmt, std::forward(args)...)); + Assert(file, line, function, debugInfo, message, StringFormat(fmt, std::forward(args)...)); } template AC_COMMON_API inline void Fatal(std::string_view file, uint32 line, std::string_view function, std::string_view message, std::string_view fmt, Args&&... args) { - Fatal(file, line, function, message, StringFormatFmt(fmt, std::forward(args)...)); + Fatal(file, line, function, message, StringFormat(fmt, std::forward(args)...)); } template AC_COMMON_API inline void Abort(std::string_view file, uint32 line, std::string_view function, std::string_view fmt, Args&&... args) { - Abort(file, line, function, StringFormatFmt(fmt, std::forward(args)...)); + Abort(file, line, function, StringFormat(fmt, std::forward(args)...)); } AC_COMMON_API void Warning(std::string_view file, uint32 line, std::string_view function, std::string_view message); diff --git a/src/common/Logging/AppenderConsole.cpp b/src/common/Logging/AppenderConsole.cpp index e7c63eadb..db5a47336 100644 --- a/src/common/Logging/AppenderConsole.cpp +++ b/src/common/Logging/AppenderConsole.cpp @@ -52,7 +52,7 @@ void AppenderConsole::InitColors(std::string const& name, std::string_view str) std::vector colorStrs = Acore::Tokenize(str, ' ', false); if (colorStrs.size() != NUM_ENABLED_LOG_LEVELS) { - throw InvalidAppenderArgsException(Acore::StringFormatFmt("Log::CreateAppenderFromConfig: Invalid color data '{}' for console appender {} (expected {} entries, got {})", + throw InvalidAppenderArgsException(Acore::StringFormat("Log::CreateAppenderFromConfig: Invalid color data '{}' for console appender {} (expected {} entries, got {})", str, name, NUM_ENABLED_LOG_LEVELS, colorStrs.size())); } @@ -64,7 +64,7 @@ void AppenderConsole::InitColors(std::string const& name, std::string_view str) } else { - throw InvalidAppenderArgsException(Acore::StringFormatFmt("Log::CreateAppenderFromConfig: Invalid color '{}' for log level {} on console appender {}", + throw InvalidAppenderArgsException(Acore::StringFormat("Log::CreateAppenderFromConfig: Invalid color '{}' for log level {} on console appender {}", colorStrs[i], EnumUtils::ToTitle(static_cast(i)), name)); } } diff --git a/src/common/Logging/AppenderFile.cpp b/src/common/Logging/AppenderFile.cpp index 81b84cb98..9b4aa53ca 100644 --- a/src/common/Logging/AppenderFile.cpp +++ b/src/common/Logging/AppenderFile.cpp @@ -31,7 +31,7 @@ AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, Ap { if (args.size() < 4) { - throw InvalidAppenderArgsException(Acore::StringFormatFmt("Log::CreateAppenderFromConfig: Missing file name for appender {}", name)); + throw InvalidAppenderArgsException(Acore::StringFormat("Log::CreateAppenderFromConfig: Missing file name for appender {}", name)); } _fileName.assign(args[3]); @@ -63,7 +63,7 @@ AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, Ap } else { - throw InvalidAppenderArgsException(Acore::StringFormatFmt("Log::CreateAppenderFromConfig: Invalid size '{}' for appender {}", args[5], name)); + throw InvalidAppenderArgsException(Acore::StringFormat("Log::CreateAppenderFromConfig: Invalid size '{}' for appender {}", args[5], name)); } } diff --git a/src/common/Logging/Log.h b/src/common/Logging/Log.h index f60bb0367..e4b6d6142 100644 --- a/src/common/Logging/Log.h +++ b/src/common/Logging/Log.h @@ -69,7 +69,7 @@ public: template inline void outMessage(std::string const& filter, LogLevel const level, Acore::FormatString fmt, Args&&... args) { - _outMessage(filter, level, Acore::StringFormatFmt(fmt, std::forward(args)...)); + _outMessage(filter, level, Acore::StringFormat(fmt, std::forward(args)...)); } template @@ -80,7 +80,7 @@ public: return; } - _outCommand(Acore::StringFormatFmt(fmt, std::forward(args)...), std::to_string(account)); + _outCommand(Acore::StringFormat(fmt, std::forward(args)...), std::to_string(account)); } void SetRealmId(uint32 id); diff --git a/src/common/Utilities/StringFormat.h b/src/common/Utilities/StringFormat.h index fa5aeb461..d4d93f232 100644 --- a/src/common/Utilities/StringFormat.h +++ b/src/common/Utilities/StringFormat.h @@ -26,27 +26,12 @@ namespace Acore { - /// Default AC string format function. - template - inline std::string StringFormat(Format&& fmt, Args&& ... args) - { - try - { - return fmt::sprintf(std::forward(fmt), std::forward(args)...); - } - catch (const fmt::format_error& formatError) - { - std::string error = "An error occurred formatting string \"" + std::string(fmt) + "\" : " + std::string(formatError.what()); - return error; - } - } - template using FormatString = fmt::format_string; - // Default string format function. + /// Default AC string format function. template - inline std::string StringFormatFmt(FormatString fmt, Args&&... args) + inline std::string StringFormat(FormatString fmt, Args&&... args) { try { diff --git a/src/common/Utilities/Timer.cpp b/src/common/Utilities/Timer.cpp index e7cb691a1..54913163f 100644 --- a/src/common/Utilities/Timer.cpp +++ b/src/common/Utilities/Timer.cpp @@ -86,27 +86,27 @@ AC_COMMON_API std::string Acore::Time::ToTimeString(uint64 duratio { if (days) { - return Acore::StringFormatFmt("{}:{:02}:{:02}:{:02}:{:02}:{:02}", days, hours, minutes, secs, millisecs); + return Acore::StringFormat("{}:{:02}:{:02}:{:02}:{:02}:{:02}", days, hours, minutes, secs, millisecs); } else if (hours) { - return Acore::StringFormatFmt("{}:{:02}:{:02}:{:02}:{:02}", hours, minutes, secs, millisecs); + return Acore::StringFormat("{}:{:02}:{:02}:{:02}:{:02}", hours, minutes, secs, millisecs); } else if (minutes) { - return Acore::StringFormatFmt("{}:{:02}:{:02}:{:02}", minutes, secs, millisecs); + return Acore::StringFormat("{}:{:02}:{:02}:{:02}", minutes, secs, millisecs); } else if (secs) { - return Acore::StringFormatFmt("{}:{:02}:{:02}", secs, millisecs); + return Acore::StringFormat("{}:{:02}:{:02}", secs, millisecs); } else if (millisecs) { - return Acore::StringFormatFmt("{}:{:02}", millisecs); + return Acore::StringFormat("{}:{:02}", millisecs); } else // microsecs { - return Acore::StringFormatFmt("{}", microsecs); + return Acore::StringFormat("{}", microsecs); } } diff --git a/src/server/apps/worldserver/Main.cpp b/src/server/apps/worldserver/Main.cpp index a7d13cad8..ad8bf3a22 100644 --- a/src/server/apps/worldserver/Main.cpp +++ b/src/server/apps/worldserver/Main.cpp @@ -233,7 +233,7 @@ int main(int argc, char** argv) signals.async_wait(SignalHandler); // Start the Boost based thread pool - int numThreads = sConfigMgr->GetOption("ThreadPool", 1); + int numThreads = sConfigMgr->GetOption("ThreadPool", 2); std::shared_ptr> threadPool(new std::vector(), [ioContext](std::vector* del) { ioContext->stop(); @@ -257,7 +257,7 @@ int main(int argc, char** argv) } // Set process priority according to configuration settings - SetProcessPriority("server.worldserver", sConfigMgr->GetOption(CONFIG_PROCESSOR_AFFINITY, 0), sConfigMgr->GetOption(CONFIG_HIGH_PRIORITY, false)); + SetProcessPriority("server.worldserver", sConfigMgr->GetOption(CONFIG_PROCESSOR_AFFINITY, 0), sConfigMgr->GetOption(CONFIG_HIGH_PRIORITY, true)); // Loading modules configs before scripts sConfigMgr->LoadModulesConfigs(); diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 321738c7f..c2c35da7e 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -139,13 +139,13 @@ CharacterDatabase.WorkerThreads = 1 # WorldDatabase.SynchThreads # CharacterDatabase.SynchThreads # Description: The amount of MySQL connections spawned to handle. -# Default: 1 - (LoginDatabase.WorkerThreads) -# 1 - (WorldDatabase.WorkerThreads) -# 2 - (CharacterDatabase.WorkerThreads) +# Default: 1 - (LoginDatabase.SynchThreads) +# 1 - (WorldDatabase.SynchThreads) +# 1 - (CharacterDatabase.SynchThreads) LoginDatabase.SynchThreads = 1 WorldDatabase.SynchThreads = 1 -CharacterDatabase.SynchThreads = 2 +CharacterDatabase.SynchThreads = 1 # # MaxPingTime @@ -1040,7 +1040,7 @@ MinWorldUpdateTime = 1 # Default: 10 - (10 minutes) # 1+ -UpdateUptimeInterval = 1 +UpdateUptimeInterval = 10 # # MaxCoreStuckTime @@ -1219,7 +1219,7 @@ Warden.ClientCheckFailAction = 0 # Default: 86400 - (24 hours) # 0 - (Permanent ban) -Warden.BanDuration = 259200 +Warden.BanDuration = 86400 # ################################################################################################### @@ -1277,17 +1277,17 @@ Visibility.GroupMode = 1 # Visibility.Distance.Instances # Visibility.Distance.BGArenas # Description: Visibility distance to see other players or gameobjects. -# Visibility on continents on retail ~90 yards. In BG/Arenas ~180. -# For instances default ~120. +# Visibility on continents on retail ~100 yards. In BG/Arenas ~533. +# For instances default ~170. # Max limited by active player zone: ~ 333 # Min limit is max aggro radius (45) * Rate.Creature.Aggro -# Default: 90 - (Visibility.Distance.Continents) -# 120 - (Visibility.Distance.Instances) -# 180 - (Visibility.Distance.BGArenas) +# Default: 100 - (Visibility.Distance.Continents) +# 170 - (Visibility.Distance.Instances) +# 533 - (Visibility.Distance.BGArenas) -Visibility.Distance.Continents = 90 -Visibility.Distance.Instances = 120 -Visibility.Distance.BGArenas = 180 +Visibility.Distance.Continents = 100 +Visibility.Distance.Instances = 170 +Visibility.Distance.BGArenas = 533 # # Visibility.ObjectSparkles @@ -2540,7 +2540,7 @@ Death.SicknessLevel = 11 # 0 - (Disabled) Death.CorpseReclaimDelay.PvP = 1 -Death.CorpseReclaimDelay.PvE = 0 +Death.CorpseReclaimDelay.PvE = 1 # # Death.Bones.World @@ -3415,7 +3415,7 @@ Wintergrasp.Enable = 1 # Description: Maximum number of players allowed in Wintergrasp. # Default: 100 -Wintergrasp.PlayerMax = 120 +Wintergrasp.PlayerMax = 100 # # Wintergrasp.PlayerMin @@ -3566,14 +3566,14 @@ Battleground.Random.ResetHour = 6 # Default: 0 - (Disabled) # 1 - (Enabled) -Battleground.StoreStatistics.Enable = 1 +Battleground.StoreStatistics.Enable = 0 # Battleground.TrackDeserters.Enable # Description: Track deserters of Battlegrounds. # Default: 0 - (Disabled) # 1 - (Enabled) -Battleground.TrackDeserters.Enable = 1 +Battleground.TrackDeserters.Enable = 0 # # Battleground.InvitationType @@ -4064,7 +4064,7 @@ PartyLevelReq = 1 # Default: 0 - (Disabled, Blizzlike, Channel settings are lost if last person left) # 1 - (Enabled) -PreserveCustomChannels = 1 +PreserveCustomChannels = 0 # # PreserveCustomChannelDuration diff --git a/src/server/database/Database/DatabaseLoader.h b/src/server/database/Database/DatabaseLoader.h index 094b13cf4..08e66633f 100644 --- a/src/server/database/Database/DatabaseLoader.h +++ b/src/server/database/Database/DatabaseLoader.h @@ -32,7 +32,7 @@ class DatabaseWorkerPool; class AC_DATABASE_API DatabaseLoader { public: - DatabaseLoader(std::string const& logger, uint32 const defaultUpdateMask = 0, std::string_view modulesList = {}); + DatabaseLoader(std::string const& logger, uint32 const defaultUpdateMask = 7, std::string_view modulesList = {}); // Register a database to the loader (lazy implemented) template diff --git a/src/server/database/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h index 181dd7f58..233fd5cf2 100644 --- a/src/server/database/Database/DatabaseWorkerPool.h +++ b/src/server/database/Database/DatabaseWorkerPool.h @@ -103,7 +103,7 @@ public: if (sql.empty()) return; - Execute(Acore::StringFormatFmt(sql, std::forward(args)...)); + Execute(Acore::StringFormat(sql, std::forward(args)...)); } //! Enqueues a one-way SQL operation in prepared statement format that will be executed asynchronously. @@ -126,7 +126,7 @@ public: if (sql.empty()) return; - DirectExecute(Acore::StringFormatFmt(sql, std::forward(args)...)); + DirectExecute(Acore::StringFormat(sql, std::forward(args)...)); } //! Directly executes a one-way SQL operation in prepared statement format, that will block the calling thread until finished. @@ -149,7 +149,7 @@ public: if (sql.empty()) return QueryResult(nullptr); - return Query(Acore::StringFormatFmt(sql, std::forward(args)...)); + return Query(Acore::StringFormat(sql, std::forward(args)...)); } //! Directly executes an SQL query in prepared format that will block the calling thread until finished. diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index f21af3aa9..6e777a278 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -441,6 +441,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT, "INSERT INTO character_achievement (guid, achievement, date) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, "DELETE FROM character_achievement_progress WHERE guid = ? AND criteria = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, "INSERT INTO character_achievement_offline_updates (guid, update_type, arg1, arg2, arg3) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, "SELECT update_type, arg1, arg2, arg3 FROM character_achievement_offline_updates WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, "DELETE FROM character_achievement_offline_updates WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index ede962b49..c2c906936 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -365,6 +365,9 @@ enum CharacterDatabaseStatements : uint32 CHAR_INS_CHAR_ACHIEVEMENT, CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, + CHAR_INS_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, + CHAR_SEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, + CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, CHAR_DEL_CHAR_REPUTATION_BY_FACTION, CHAR_INS_CHAR_REPUTATION_BY_FACTION, CHAR_UPD_CHAR_ARENA_POINTS, diff --git a/src/server/database/Database/PreparedStatement.cpp b/src/server/database/Database/PreparedStatement.cpp index 4059509dc..4b8f870ea 100644 --- a/src/server/database/Database/PreparedStatement.cpp +++ b/src/server/database/Database/PreparedStatement.cpp @@ -104,7 +104,7 @@ bool PreparedStatementTask::Execute() template std::string PreparedStatementData::ToString(T value) { - return Acore::StringFormatFmt("{}", value); + return Acore::StringFormat("{}", value); } template<> diff --git a/src/server/database/Database/Transaction.h b/src/server/database/Database/Transaction.h index 5d82703ae..448925053 100644 --- a/src/server/database/Database/Transaction.h +++ b/src/server/database/Database/Transaction.h @@ -45,7 +45,7 @@ public: template void Append(std::string_view sql, Args&&... args) { - Append(Acore::StringFormatFmt(sql, std::forward(args)...)); + Append(Acore::StringFormat(sql, std::forward(args)...)); } [[nodiscard]] std::size_t GetSize() const { return m_queries.size(); } diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index 7b0da6bdd..287368b2b 100644 --- a/src/server/database/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -293,7 +293,7 @@ bool DBUpdater::Update(DatabaseWorkerPool& pool, std::string_view modulesL auto CheckUpdateTable = [&](std::string const& tableName) { - auto checkTable = DBUpdater::Retrieve(pool, Acore::StringFormatFmt("SHOW TABLES LIKE '{}'", tableName)); + auto checkTable = DBUpdater::Retrieve(pool, Acore::StringFormat("SHOW TABLES LIKE '{}'", tableName)); if (!checkTable) { LOG_WARN("sql.updates", "> Table '{}' not exist! Try add based table", tableName); @@ -337,7 +337,7 @@ bool DBUpdater::Update(DatabaseWorkerPool& pool, std::string_view modulesL return false; } - std::string const info = Acore::StringFormatFmt("Containing {} new and {} archived updates.", result.recent, result.archived); + std::string const info = Acore::StringFormat("Containing {} new and {} archived updates.", result.recent, result.archived); if (!result.updated) LOG_INFO("sql.updates", ">> {} database is up-to-date! {}", DBUpdater::GetTableName(), info); @@ -365,7 +365,7 @@ bool DBUpdater::Update(DatabaseWorkerPool& pool, std::vector auto CheckUpdateTable = [&](std::string const& tableName) { - auto checkTable = DBUpdater::Retrieve(pool, Acore::StringFormatFmt("SHOW TABLES LIKE '{}'", tableName)); + auto checkTable = DBUpdater::Retrieve(pool, Acore::StringFormat("SHOW TABLES LIKE '{}'", tableName)); if (!checkTable) { Path const temp(GetBaseFilesDirectory() + tableName + ".sql"); @@ -565,7 +565,7 @@ void DBUpdater::ApplyFile(DatabaseWorkerPool& pool, std::string const& hos // Execute sql file args.emplace_back("-e"); - args.emplace_back(Acore::StringFormat("BEGIN; SOURCE %s; COMMIT;", path.generic_string().c_str())); + args.emplace_back(Acore::StringFormat("BEGIN; SOURCE {}; COMMIT;", path.generic_string())); // Database if (!database.empty()) diff --git a/src/server/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp index 796231e41..a34ce30d8 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.cpp +++ b/src/server/game/AI/CoreAI/PassiveAI.cpp @@ -65,7 +65,7 @@ void PossessedAI::JustDied(Unit* /*u*/) void PossessedAI::KilledUnit(Unit* /*victim*/) { // We killed a creature, disable victim's loot - //if (victim->GetTypeId() == TYPEID_UNIT) + //if (victim->IsCreature()) // victim->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE); } diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 6d1892b0f..3803e815a 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -613,7 +613,7 @@ void PetAI::DoAttack(Unit* target, bool chase) if (_canMeleeAttack()) { - float angle = combatRange == 0.f && target->GetTypeId() != TYPEID_PLAYER && !target->IsPet() ? float(M_PI) : 0.f; + float angle = combatRange == 0.f && !target->IsPlayer() && !target->IsPet() ? float(M_PI) : 0.f; float tolerance = combatRange == 0.f ? float(M_PI_4) : float(M_PI * 2); me->GetMotionMaster()->MoveChase(target, ChaseRange(0.f, combatRange), ChaseAngle(angle, tolerance)); } diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 5240c88e5..710f4a453 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -427,7 +427,7 @@ bool NonTankTargetSelector::operator()(Unit const* target) const if (!target) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (Unit* currentVictim = _source->GetThreatMgr().GetCurrentVictim()) diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 0f7c50163..aefb6a673 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -76,7 +76,7 @@ struct DefaultTargetSelector : public Acore::unary_function if (target == except) return false; - if (m_playerOnly && (target->GetTypeId() != TYPEID_PLAYER)) + if (m_playerOnly && (!target->IsPlayer())) return false; if (m_dist > 0.0f && !me->IsWithinCombatRange(target, m_dist)) @@ -148,7 +148,7 @@ struct PowerUsersSelector : public Acore::unary_function if (target->getPowerType() != _power) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (_dist > 0.0f && !_me->IsWithinCombatRange(target, _dist)) @@ -170,7 +170,7 @@ struct FarthestTargetSelector : public Acore::unary_function if (!_me || !target) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (_maxDist > 0.0f && !_me->IsInRange(target, _minDist, _maxDist)) diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 1f97131cb..17daed82d 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -107,7 +107,7 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= nullptr*/, float maxRange Map* map = creature->GetMap(); if (!map->IsDungeon()) //use IsDungeon instead of Instanceable, in case battlegrounds will be instantiated { - LOG_ERROR("entities.unit.ai", "DoZoneInCombat call for map {} that isn't a dungeon (creature entry = {})", map->GetId(), creature->GetTypeId() == TYPEID_UNIT ? creature->ToCreature()->GetEntry() : 0); + LOG_ERROR("entities.unit.ai", "DoZoneInCombat call for map {} that isn't a dungeon (creature entry = {})", map->GetId(), creature->IsCreature() ? creature->ToCreature()->GetEntry() : 0); return; } @@ -175,10 +175,10 @@ void CreatureAI::MoveInLineOfSight(Unit* who) void CreatureAI::TriggerAlert(Unit const* who) const { // If there's no target, or target isn't a player do nothing - if (!who || who->GetTypeId() != TYPEID_PLAYER) + if (!who || !who->IsPlayer()) return; // If this unit isn't an NPC, is already distracted, is in combat, is confused, stunned or fleeing, do nothing - if (me->GetTypeId() != TYPEID_UNIT || me->IsEngaged() || me->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED)) + if (!me->IsCreature() || me->IsEngaged() || me->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED)) return; // Only alert for hostiles! if (me->IsCivilian() || me->HasReactState(REACT_PASSIVE) || !me->IsHostileTo(who) || !me->_IsTargetAcceptable(who)) @@ -307,7 +307,7 @@ bool CreatureAI::_EnterEvadeMode(EvadeReason /*why*/) me->LoadCreaturesAddon(true); me->SetLootRecipient(nullptr); me->ResetPlayerDamageReq(); - me->SetLastDamagedTime(0); + me->ClearLastLeashExtensionTimePtr(); me->SetCannotReachTarget(); if (ZoneScript* zoneScript = me->GetZoneScript() ? me->GetZoneScript() : (ZoneScript*)me->GetInstanceScript()) diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 94478d15e..a354b603b 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -220,6 +220,9 @@ public: virtual bool OnTeleportUnreacheablePlayer(Player* /*player*/) { return false; } + // Called when an aura is removed or expires. + virtual void OnAuraRemove(AuraApplication* /*aurApp*/, AuraRemoveMode /*mode*/) { } + protected: virtual void MoveInLineOfSight(Unit* /*who*/); diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 63d63c925..81211529b 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -190,8 +190,7 @@ bool SummonList::IsAnyCreatureInCombat() const } ScriptedAI::ScriptedAI(Creature* creature) : CreatureAI(creature), - me(creature), - IsFleeing(false) + me(creature) { _isHeroic = me->GetMap()->IsHeroic(); _difficulty = Difficulty(me->GetMap()->GetSpawnMode()); diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 709d6698b..69830d815 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -178,7 +178,7 @@ class PlayerOrPetCheck public: bool operator() (WorldObject* unit) const { - if (unit->GetTypeId() != TYPEID_PLAYER) + if (!unit->IsPlayer()) if (!unit->ToUnit()->GetOwnerGUID().IsPlayer()) return true; @@ -279,9 +279,6 @@ struct ScriptedAI : public CreatureAI //Pointer to creature we are manipulating Creature* me; - //For fleeing - bool IsFleeing; - // ************* //Pure virtual functions // ************* diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 0319ed5c7..c6aa04a39 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -111,7 +111,7 @@ bool npc_escortAI::AssistPlayerInCombatAgainst(Unit* who) } // or if enemy is in evade mode - if (who->GetTypeId() == TYPEID_UNIT && who->ToCreature()->IsInEvadeMode()) + if (who->IsCreature() && who->ToCreature()->IsInEvadeMode()) { return false; } diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 01bab2e9d..97e6ea164 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -4217,7 +4217,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui { if (!me || !unit) return; - if (e.event.kill.playerOnly && unit->GetTypeId() != TYPEID_PLAYER) + if (e.event.kill.playerOnly && !unit->IsPlayer()) return; if (e.event.kill.creature && unit->GetEntry() != e.event.kill.creature) return; @@ -4254,7 +4254,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui (hostilityMode == SmartEvent::LOSHostilityMode::NotHostile && !me->IsHostileTo(unit)) || (hostilityMode == SmartEvent::LOSHostilityMode::Hostile && me->IsHostileTo(unit))) { - if (e.event.los.playerOnly && unit->GetTypeId() != TYPEID_PLAYER) + if (e.event.los.playerOnly && !unit->IsPlayer()) return; RecalcTimer(e, e.event.los.cooldownMin, e.event.los.cooldownMax); ProcessAction(e, unit); @@ -4278,7 +4278,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui (hostilityMode == SmartEvent::LOSHostilityMode::NotHostile && !me->IsHostileTo(unit)) || (hostilityMode == SmartEvent::LOSHostilityMode::Hostile && me->IsHostileTo(unit))) { - if (e.event.los.playerOnly && unit->GetTypeId() != TYPEID_PLAYER) + if (e.event.los.playerOnly && !unit->IsPlayer()) return; RecalcTimer(e, e.event.los.cooldownMin, e.event.los.cooldownMax); ProcessAction(e, unit); @@ -5269,7 +5269,7 @@ WorldObject* SmartScript::GetLastInvoker(WorldObject* invoker) const bool SmartScript::IsUnit(WorldObject* obj) { - return obj && (obj->GetTypeId() == TYPEID_UNIT || obj->IsPlayer()); + return obj && (obj->IsCreature() || obj->IsPlayer()); } bool SmartScript::IsPlayer(WorldObject* obj) @@ -5279,7 +5279,7 @@ bool SmartScript::IsPlayer(WorldObject* obj) bool SmartScript::IsCreature(WorldObject* obj) { - return obj && obj->GetTypeId() == TYPEID_UNIT; + return obj && obj->IsCreature(); } bool SmartScript::IsCharmedCreature(WorldObject* obj) @@ -5295,7 +5295,7 @@ bool SmartScript::IsCharmedCreature(WorldObject* obj) bool SmartScript::IsGameObject(WorldObject* obj) { - return obj && obj->GetTypeId() == TYPEID_GAMEOBJECT; + return obj && obj->IsGameObject(); } void SmartScript::IncPhase(uint32 p) diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 37ed221ee..9d3626e3d 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -244,11 +244,11 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE: case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_TEAMS_SCORES: return true; // not check correctness node indexes - case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM: + case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM: case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY: if (equipped_item.item_quality >= MAX_ITEM_QUALITY) { - LOG_ERROR("sql.sql", "Table `achievement_criteria_requirement` (Entry: {} Type: {}) for requirement ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPED_ITEM ({}) has unknown quality state in value1 ({}), ignored.", + LOG_ERROR("sql.sql", "Table `achievement_criteria_requirement` (Entry: {} Type: {}) for requirement ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPPED_ITEM ({}) has unknown quality state in value1 ({}), ignored.", criteria->ID, criteria->requiredType, dataType, equipped_item.item_quality); return false; } @@ -304,11 +304,11 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un case ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE: return true; case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE: - if (!target || target->GetTypeId() != TYPEID_UNIT) + if (!target || !target->IsCreature()) return false; return target->GetEntry() == creature.id; case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE: - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return false; if (classRace.class_id && classRace.class_id != target->ToPlayer()->getClass()) return false; @@ -316,7 +316,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un return false; return true; case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE: - if (!source || source->GetTypeId() != TYPEID_PLAYER) + if (!source || !source->IsPlayer()) return false; if (classRace.class_id && classRace.class_id != source->ToPlayer()->getClass()) return false; @@ -324,7 +324,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un return false; return true; case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH: - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return false; return !target->HealthAbovePct(health.percent); case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD: @@ -371,7 +371,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un return source->GetMap()->GetPlayersCountExceptGMs() <= map_players.maxcount; case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM: { - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return false; // DB data compatibility... @@ -411,7 +411,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un } return instance->CheckAchievementCriteriaMeet(criteria_id, source, target, miscvalue1); } - case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM: + case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM: { ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscvalue1); if (!pProto) @@ -481,6 +481,7 @@ bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target, AchievementMgr::AchievementMgr(Player* player) { _player = player; + _offlineUpdatesDelayTimer = 0; } AchievementMgr::~AchievementMgr() @@ -550,6 +551,10 @@ void AchievementMgr::DeleteFromDB(ObjectGuid::LowType lowguid) stmt->SetData(0, lowguid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, lowguid); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); } @@ -609,7 +614,7 @@ void AchievementMgr::SaveToDB(CharacterDatabaseTransaction trans) } } -void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult) +void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult, PreparedQueryResult offlineUpdatesResult) { if (achievementResult) { @@ -669,6 +674,28 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ progress.changed = false; } while (criteriaResult->NextRow()); } + + if (offlineUpdatesResult) + { + uint32 count = 0; + do + { + Field* fields = offlineUpdatesResult->Fetch(); + + AchievementOfflinePlayerUpdate update; + update.updateType = static_cast(fields[0].Get()); + update.arg1 = fields[1].Get(); + update.arg2 = fields[2].Get(); + update.arg3 = fields[3].Get(); + + _offlineUpdatesQueue.push_back(update); + + ++count; + } while (offlineUpdatesResult->NextRow()); + + if (count > 0) + _offlineUpdatesDelayTimer = 5 * SECOND * IN_MILLISECONDS; + } } void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) const @@ -884,7 +911,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS: case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL: case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION: - case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: /* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_DISENCHANT: @@ -904,7 +931,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY: - case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS:/* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS: case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED: case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED: case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: @@ -915,7 +942,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; // std case: high value at miscvalue1 case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: - case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: /* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED: @@ -1474,7 +1501,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; // map specific case (BG in fact) expected player targeted damage/heal - if (!unit || unit->GetTypeId() != TYPEID_PLAYER) + if (!unit || !unit->IsPlayer()) continue; } @@ -2158,6 +2185,22 @@ void AchievementMgr::RemoveCriteriaProgress(const AchievementCriteriaEntry* entr _criteriaProgress.erase(criteriaProgress); } +void AchievementMgr::Update(uint32 timeDiff) +{ + if (_offlineUpdatesDelayTimer > 0) + { + if (timeDiff >= _offlineUpdatesDelayTimer) + { + _offlineUpdatesDelayTimer = 0; + ProcessOfflineUpdatesQueue(); + } + else + _offlineUpdatesDelayTimer -= timeDiff; + } + + UpdateTimedAchievements(timeDiff); +} + void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) { if (!_timedAchievements.empty()) @@ -2437,6 +2480,46 @@ CompletedAchievementMap const& AchievementMgr::GetCompletedAchievements() return _completedAchievements; } +void AchievementMgr::ProcessOfflineUpdatesQueue() +{ + if (_offlineUpdatesQueue.empty()) + return; + + for (auto const& update : _offlineUpdatesQueue) + ProcessOfflineUpdate(update); + + _offlineUpdatesQueue.clear(); + + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, GetPlayer()->GetGUID().GetCounter()); + CharacterDatabase.Execute(stmt); +} + +void AchievementMgr::ProcessOfflineUpdate(AchievementOfflinePlayerUpdate const& update) +{ + switch (update.updateType) + { + case ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_COMPLETE_ACHIEVEMENT: + { + AchievementEntry const* achievement = sAchievementStore.LookupEntry(update.arg1); + + ASSERT(achievement != NULL, "Not found achievement to complete for offline achievements update. Wrong arg1 ({}) value?", update.arg1); + + CompletedAchievement(achievement); + break; + } + case ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_UPDATE_CRITERIA: + { + AchievementCriteriaTypes criteriaType = static_cast(update.arg1); + UpdateAchievementCriteria(criteriaType, update.arg2, update.arg3); + break; + } + default: + ASSERT(false, "Unknown offline achievement update type ({}) for player - {}", update.updateType, GetPlayer()->GetGUID().GetCounter()); + break; + } +} + AchievementGlobalMgr* AchievementGlobalMgr::instance() { static AchievementGlobalMgr instance; @@ -3054,3 +3137,25 @@ AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementI { return sAchievementStore.LookupEntry(achievementId); } + +void AchievementGlobalMgr::CompletedAchievementForOfflinePlayer(ObjectGuid::LowType playerLowGuid, AchievementEntry const* entry) +{ + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, playerLowGuid); + stmt->SetData(1, uint32(ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_COMPLETE_ACHIEVEMENT)); + stmt->SetData(2, entry->ID); + stmt->SetData(3, 0); + stmt->SetData(4, 0); + CharacterDatabase.Execute(stmt); +} + +void AchievementGlobalMgr::UpdateAchievementCriteriaForOfflinePlayer(ObjectGuid::LowType playerLowGuid, AchievementCriteriaTypes type, uint32 miscValue1, uint32 miscValue2) +{ + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, playerLowGuid); + stmt->SetData(1, uint32(ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_UPDATE_CRITERIA)); + stmt->SetData(2, type); + stmt->SetData(3, miscValue1); + stmt->SetData(4, miscValue2); + CharacterDatabase.Execute(stmt); +} diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index c82cc6f4e..34e79ac4c 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -33,6 +33,20 @@ typedef std::list AchievementEntryList; typedef std::unordered_map AchievementCriteriaListByAchievement; typedef std::map AchievementListByReferencedId; +enum AchievementOfflinePlayerUpdateType +{ + ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_COMPLETE_ACHIEVEMENT = 1, + ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_UPDATE_CRITERIA = 2 +}; + +struct AchievementOfflinePlayerUpdate +{ + AchievementOfflinePlayerUpdateType updateType; + uint32 arg1; + uint32 arg2; + uint32 arg3; +}; + struct CriteriaProgress { uint32 counter; @@ -62,7 +76,7 @@ enum AchievementCriteriaDataType ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16, // holiday_id 0 event in holiday time ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE = 17, // min_score max_score player's team win bg and opposition team have team score in range ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit - ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM = 19, // item_level item_quality for equipped item in slot to check item level and quality + ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19, // item_level item_quality for equipped item in slot to check item level and quality ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID = 20, // map_id 0 player must be on map with id in map_id ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21, // class_id race_id ACHIEVEMENT_CRITERIA_DATA_TYPE_NTH_BIRTHDAY = 22, // N login on day of N-th Birthday @@ -170,7 +184,7 @@ struct AchievementCriteriaData uint32 max_score; } bg_loss_team_score; // ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18 (no data) - // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM = 19 + // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19 struct { uint32 item_level; @@ -284,7 +298,7 @@ public: void Reset(); static void DeleteFromDB(ObjectGuid::LowType lowguid); - void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult); + void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult, PreparedQueryResult offlineUpdatesResult); void SaveToDB(CharacterDatabaseTransaction trans); void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete = false); void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = nullptr); @@ -294,7 +308,8 @@ public: void SendRespondInspectAchievements(Player* player) const; [[nodiscard]] bool HasAchieved(uint32 achievementId) const; [[nodiscard]] Player* GetPlayer() const { return _player; } - void UpdateTimedAchievements(uint32 timeDiff); + + void Update(uint32 timeDiff); void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0); void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); // used for quest and scripted timed achievements @@ -313,11 +328,23 @@ private: bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement); void BuildAllDataPacket(WorldPacket* data) const; + void UpdateTimedAchievements(uint32 timeDiff); + + // Handles updates when character was offline. + void ProcessOfflineUpdate(AchievementOfflinePlayerUpdate const& update); + void ProcessOfflineUpdatesQueue(); + Player* _player; CriteriaProgressMap _criteriaProgress; CompletedAchievementMap _completedAchievements; typedef std::map TimedAchievementMap; TimedAchievementMap _timedAchievements; // Criteria id/time left in MS + + // Offline updates cannot be processed while players are loading, + // as the player will not be notified of the changes. + // To ensure proper notification, introduce a delay before processing. + uint32 _offlineUpdatesDelayTimer; + std::vector _offlineUpdatesQueue; }; class AchievementGlobalMgr @@ -398,6 +425,8 @@ public: [[nodiscard]] AchievementEntry const* GetAchievement(uint32 achievementId) const; + void CompletedAchievementForOfflinePlayer(ObjectGuid::LowType playerLowGuid, AchievementEntry const* entry); + void UpdateAchievementCriteriaForOfflinePlayer(ObjectGuid::LowType playerLowGuid, AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0); private: AchievementCriteriaDataMap _criteriaDataMap; diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index bdda9b37e..e7cf7ab95 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -318,10 +318,14 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, CharacterDatabas { if (sendNotification) // can be changed in the hook bidder->GetSession()->SendAuctionBidderNotification(auction->GetHouseId(), auction->Id, auction->bidder, 0, 0, auction->item_template); - // FIXME: for offline player need also + if (updateAchievementCriteria) // can be changed in the hook bidder->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, 1); } + else if (updateAchievementCriteria) + { + sAchievementMgr->UpdateAchievementCriteriaForOfflinePlayer(auction->bidder.GetCounter(), ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, 1); + } if (sendMail) // can be changed in the hook MailDraft(auction->BuildAuctionMailSubject(AUCTION_WON), AuctionEntry::BuildAuctionMailBody(auction->owner, auction->bid, auction->buyout)) @@ -375,6 +379,11 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, Character if (sendNotification) // can be changed in the hook owner->GetSession()->SendAuctionOwnerNotification(auction); } + else if (updateAchievementCriteria) + { + sAchievementMgr->UpdateAchievementCriteriaForOfflinePlayer(auction->owner.GetCounter(), ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS, profit); + sAchievementMgr->UpdateAchievementCriteriaForOfflinePlayer(auction->owner.GetCounter(), ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD, auction->bid); + } if (sendMail) // can be changed in the hook MailDraft(auction->BuildAuctionMailSubject(AUCTION_SUCCESSFUL), AuctionEntry::BuildAuctionMailBody(auction->bidder, auction->bid, auction->buyout, auction->deposit, auction->GetAuctionCut())) diff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp index 1c58679fb..b0ecc3ab5 100644 --- a/src/server/game/Battlegrounds/Arena.cpp +++ b/src/server/game/Battlegrounds/Arena.cpp @@ -192,6 +192,9 @@ void Arena::RemovePlayerAtLeave(Player* player) void Arena::CheckWinConditions() { + if (!sScriptMgr->OnBeforeArenaCheckWinConditions(this)) + return; + if (!GetAlivePlayersCountByTeam(TEAM_ALLIANCE) && GetPlayersCountByTeam(TEAM_HORDE)) EndBattleground(TEAM_HORDE); else if (GetPlayersCountByTeam(TEAM_ALLIANCE) && !GetAlivePlayersCountByTeam(TEAM_HORDE)) diff --git a/src/server/game/Battlegrounds/ArenaScore.h b/src/server/game/Battlegrounds/ArenaScore.h index d29c1487c..3363c60f6 100644 --- a/src/server/game/Battlegrounds/ArenaScore.h +++ b/src/server/game/Battlegrounds/ArenaScore.h @@ -35,7 +35,7 @@ protected: // For Logging purpose std::string ToString() const override { - return Acore::StringFormatFmt("Damage done: {}, Healing done: {}, Killing blows: {}", DamageDone, HealingDone, KillingBlows); + return Acore::StringFormat("Damage done: {}, Healing done: {}, Killing blows: {}", DamageDone, HealingDone, KillingBlows); } uint8 PvPTeamId; diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index cef257d0f..1d602967d 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -1107,7 +1107,7 @@ void BattlegroundQueue::SendJoinMessageArenaQueue(Player* leader, GroupQueueInfo BattlegroundBracketId bracketId = bracketEntry->GetBracketId(); auto bgName = bg->GetName(); - auto arenatype = Acore::StringFormat("%uv%u", ginfo->ArenaType, ginfo->ArenaType); + auto arenatype = Acore::StringFormat("{}v{}", ginfo->ArenaType, ginfo->ArenaType); uint32 playersNeed = ArenaTeam::GetReqPlayersForType(ginfo->ArenaType); uint32 q_min_level = std::min(bracketEntry->minLevel, (uint32)80); uint32 q_max_level = std::min(bracketEntry->maxLevel, (uint32)80); diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 199e575b9..42b0142e8 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -74,13 +74,13 @@ public: void SendNotification(uint32 strId, Args&&... args) { if (HasSession()) - SendNotification(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...)); + SendNotification(Acore::StringFormat(GetAcoreString(strId), std::forward(args)...)); } template void SendNotification(char const* fmt, Args&&... args) { if (HasSession()) - SendNotification(Acore::StringFormatFmt(fmt, std::forward(args)...)); + SendNotification(Acore::StringFormat(fmt, std::forward(args)...)); } void SendGMText(std::string_view str); @@ -91,7 +91,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendGMText(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...)); + SendGMText(Acore::StringFormat(GetAcoreString(strId), std::forward(args)...)); }); } template @@ -101,7 +101,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendGMText(Acore::StringFormatFmt(fmt, std::forward(args)...)); + SendGMText(Acore::StringFormat(fmt, std::forward(args)...)); }); } @@ -113,7 +113,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendWorldText(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...)); + SendWorldText(Acore::StringFormat(GetAcoreString(strId), std::forward(args)...)); }); } template @@ -123,7 +123,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendWorldText(Acore::StringFormatFmt(fmt, std::forward(args)...)); + SendWorldText(Acore::StringFormat(fmt, std::forward(args)...)); }); } @@ -135,7 +135,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendWorldTextOptional(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...), flag); + SendWorldTextOptional(Acore::StringFormat(GetAcoreString(strId), std::forward(args)...), flag); }); } template @@ -145,7 +145,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendWorldTextOptional(Acore::StringFormatFmt(fmt, std::forward(args)...), flag); + SendWorldTextOptional(Acore::StringFormat(fmt, std::forward(args)...), flag); }); } @@ -160,7 +160,7 @@ public: void PSendSysMessage(char const* fmt, Args&&... args) { if (HasSession()) - SendSysMessage(Acore::StringFormatFmt(fmt, std::forward(args)...)); + SendSysMessage(Acore::StringFormat(fmt, std::forward(args)...)); } template @@ -173,7 +173,7 @@ public: template std::string PGetParseString(uint32 entry, Args&&... args) const { - return Acore::StringFormatFmt(GetAcoreString(entry), std::forward(args)...); + return Acore::StringFormat(GetAcoreString(entry), std::forward(args)...); } std::string const* GetModuleString(std::string module, uint32 id) const; @@ -188,7 +188,7 @@ public: template std::string PGetParseModuleString(std::string module, uint32 id, Args&&... args) const { - return Acore::StringFormatFmt(GetModuleString(module, id)->c_str(), std::forward(args)...); + return Acore::StringFormat(GetModuleString(module, id)->c_str(), std::forward(args)...); } void SendErrorMessage(uint32 entry); diff --git a/src/server/game/Chat/ChatCommands/ChatCommand.cpp b/src/server/game/Chat/ChatCommands/ChatCommand.cpp index 916b83919..93bcd25f4 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommand.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommand.cpp @@ -175,7 +175,7 @@ static void LogCommandUsage(WorldSession const& session, std::string_view cmdStr zoneName = zone->area_name[locale]; } - std::string logMessage = Acore::StringFormatFmt("Command: {} [Player: {} ({}) (Account: {}) X: {} Y: {} Z: {} Map: {} ({}) Area: {} ({}) Zone: {} ({}) Selected: {} ({})]", + std::string logMessage = Acore::StringFormat("Command: {} [Player: {} ({}) (Account: {}) X: {} Y: {} Z: {} Map: {} ({}) Area: {} ({}) Zone: {} ({}) Selected: {} ({})]", cmdStr, player->GetName(), player->GetGUID().ToString(), session.GetAccountId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), @@ -443,11 +443,11 @@ namespace Acore::Impl::ChatCommands { if (prefix.empty()) { - return Acore::StringFormatFmt("{}{}{}", match, COMMAND_DELIMITER, suffix); + return Acore::StringFormat("{}{}{}", match, COMMAND_DELIMITER, suffix); } else { - return Acore::StringFormatFmt("{}{}{}{}{}", prefix, COMMAND_DELIMITER, match, COMMAND_DELIMITER, suffix); + return Acore::StringFormat("{}{}{}{}{}", prefix, COMMAND_DELIMITER, match, COMMAND_DELIMITER, suffix); } }); @@ -465,7 +465,7 @@ namespace Acore::Impl::ChatCommands path.assign(it1->first); else { - path = Acore::StringFormatFmt("{}{}{}", path, COMMAND_DELIMITER, it1->first); + path = Acore::StringFormat("{}{}{}", path, COMMAND_DELIMITER, it1->first); } cmd = &it1->second; map = &cmd->_subCommands; @@ -477,7 +477,7 @@ namespace Acore::Impl::ChatCommands { /* there is some trailing text, leave it as is */ if (cmd) { /* if we matched a command at some point, auto-complete it */ - return { Acore::StringFormatFmt("{}{}{}", path, COMMAND_DELIMITER, oldTail) }; + return { Acore::StringFormat("{}{}{}", path, COMMAND_DELIMITER, oldTail) }; } else return {}; @@ -490,7 +490,7 @@ namespace Acore::Impl::ChatCommands return std::string(match); else { - return Acore::StringFormatFmt("{}{}{}", prefix, COMMAND_DELIMITER, match); + return Acore::StringFormat("{}{}{}", prefix, COMMAND_DELIMITER, match); } }); diff --git a/src/server/game/Chat/ChatCommands/ChatCommand.h b/src/server/game/Chat/ChatCommands/ChatCommand.h index 079f40a50..ce1ead8b5 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommand.h +++ b/src/server/game/Chat/ChatCommands/ChatCommand.h @@ -91,7 +91,7 @@ namespace Acore::Impl::ChatCommands return result2; if (result1.HasErrorMessage() && result2.HasErrorMessage()) { - return Acore::StringFormatFmt("{} \"{}\"\n{} \"{}\"", + return Acore::StringFormat("{} \"{}\"\n{} \"{}\"", GetAcoreString(handler, LANG_CMDPARSER_EITHER), result2.GetErrorMessage(), GetAcoreString(handler, LANG_CMDPARSER_OR), result1.GetErrorMessage()); } diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h index 524cc608e..af1b0b3e8 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h @@ -273,9 +273,9 @@ namespace Acore::Impl::ChatCommands if (!nestedResult.HasErrorMessage()) return thisResult; if (StringStartsWith(nestedResult.GetErrorMessage(), "\"")) - return Acore::StringFormat("\"%s\"\n%s %s", thisResult.GetErrorMessage().c_str(), GetAcoreString(handler, LANG_CMDPARSER_OR), nestedResult.GetErrorMessage().c_str()); + return Acore::StringFormat("\"{}\"\n{} {}", thisResult.GetErrorMessage(), GetAcoreString(handler, LANG_CMDPARSER_OR), nestedResult.GetErrorMessage()); else - return Acore::StringFormat("\"%s\"\n%s \"%s\"", thisResult.GetErrorMessage().c_str(), GetAcoreString(handler, LANG_CMDPARSER_OR), nestedResult.GetErrorMessage().c_str()); + return Acore::StringFormat("\"{}\"\n{} \"{}\"", thisResult.GetErrorMessage(), GetAcoreString(handler, LANG_CMDPARSER_OR), nestedResult.GetErrorMessage()); } } else @@ -286,7 +286,7 @@ namespace Acore::Impl::ChatCommands { ChatCommandResult result = TryAtIndex<0>(val, handler, args); if (result.HasErrorMessage() && (result.GetErrorMessage().find('\n') != std::string::npos)) - return Acore::StringFormat("%s %s", GetAcoreString(handler, LANG_CMDPARSER_EITHER), result.GetErrorMessage().c_str()); + return Acore::StringFormat("{} {}", GetAcoreString(handler, LANG_CMDPARSER_EITHER), result.GetErrorMessage()); return result; } }; diff --git a/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h b/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h index f5b4cf5af..e7e803a5e 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h @@ -125,7 +125,7 @@ namespace Acore::Impl::ChatCommands template std::string FormatAcoreString(ChatHandler const* handler, AcoreStrings which, Ts&&... args) { - return Acore::StringFormatFmt(GetAcoreString(handler, which), std::forward(args)...); + return Acore::StringFormat(GetAcoreString(handler, which), std::forward(args)...); } } diff --git a/src/server/game/Combat/ThreatMgr.cpp b/src/server/game/Combat/ThreatMgr.cpp index 92ca0c049..185ad3f9d 100644 --- a/src/server/game/Combat/ThreatMgr.cpp +++ b/src/server/game/Combat/ThreatMgr.cpp @@ -81,7 +81,7 @@ bool ThreatCalcHelper::isValidProcess(Unit* hatedUnit, Unit* hatingUnit, SpellIn if (threatSpell && threatSpell->HasAttribute(SPELL_ATTR1_NO_THREAT)) return false; - ASSERT(hatingUnit->GetTypeId() == TYPEID_UNIT); + ASSERT(hatingUnit->IsCreature()); return true; } @@ -190,7 +190,7 @@ void HostileReference::updateOnlineStatus() // target is no player or not gamemaster // target is not in flight if (isValid() - && (getTarget()->GetTypeId() != TYPEID_PLAYER || !getTarget()->ToPlayer()->IsGameMaster()) + && (!getTarget()->IsPlayer() || !getTarget()->ToPlayer()->IsGameMaster()) && !getTarget()->IsInFlight() && getTarget()->IsInMap(GetSourceUnit()) && getTarget()->InSamePhase(GetSourceUnit()) diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 5385612ff..0ebcefcee 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -326,7 +326,7 @@ namespace DisableMgr if (unit) { if ((spellFlags & SPELL_DISABLE_PLAYER && unit->IsPlayer()) || - (unit->GetTypeId() == TYPEID_UNIT && ((unit->IsPet() && spellFlags & SPELL_DISABLE_PET) || spellFlags & SPELL_DISABLE_CREATURE))) + (unit->IsCreature() && ((unit->IsPet() && spellFlags & SPELL_DISABLE_PET) || spellFlags & SPELL_DISABLE_CREATURE))) { if (spellFlags & SPELL_DISABLE_MAP) { diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index ca1be0ccf..b036ec3ca 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -220,9 +220,6 @@ bool AssistDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { if (Unit* victim = ObjectAccessor::GetUnit(*m_owner, m_victim)) { - // Initialize last damage timer if it doesn't exist - m_owner->SetLastDamagedTime(GameTime::GetGameTime().count() + MAX_AGGRO_RESET_TIME); - while (!m_assistants.empty()) { Creature* assistant = ObjectAccessor::GetCreature(*m_owner, *m_assistants.begin()); @@ -233,9 +230,14 @@ bool AssistDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) assistant->SetNoCallAssistance(true); assistant->CombatStart(victim); if (assistant->IsAIEnabled) + { assistant->AI()->AttackStart(victim); - assistant->SetLastDamagedTimePtr(m_owner->GetLastDamagedTimePtr()); + // When nearby mobs aggro from another mob's initial call for assistance + // their leash timers become linked and attacking one will keep the rest from evading. + if (assistant->GetVictim()) + assistant->SetLastLeashExtensionTimePtr(m_owner->GetLastLeashExtensionTimePtr()); + } } } } @@ -272,7 +274,7 @@ Creature::Creature(bool isWorldObject): Unit(isWorldObject), MovableMapObject(), m_transportCheckTimer(1000), lootPickPocketRestoreTime(0), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_regenHealth(true), m_regenPower(true), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_moveInLineOfSightDisabled(false), m_moveInLineOfSightStrictlyDisabled(false), - m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_detectionDistance(20.0f), m_waypointID(0), m_path_id(0), m_formation(nullptr), _lastDamagedTime(nullptr), m_cannotReachTimer(0), + m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_detectionDistance(20.0f), m_waypointID(0), m_path_id(0), m_formation(nullptr), m_lastLeashExtensionTime(nullptr), m_cannotReachTimer(0), _isMissingSwimmingFlagOutOfCombat(false), m_assistanceTimer(0), _playerDamageReq(0), _damagedByPlayer(false), _isCombatMovementAllowed(true) { m_regenTimer = CREATURE_REGEN_INTERVAL; @@ -1905,7 +1907,7 @@ bool Creature::CanStartAttack(Unit const* who) const return false; // This set of checks is should be done only for creatures - if ((IsImmuneToNPC() && who->GetTypeId() != TYPEID_PLAYER) || // flag is valid only for non player characters + if ((IsImmuneToNPC() && !who->IsPlayer()) || // flag is valid only for non player characters (IsImmuneToPC() && who->IsPlayer())) // immune to PC and target is a player, return false { return false; @@ -1916,7 +1918,7 @@ bool Creature::CanStartAttack(Unit const* who) const return false; // Do not attack non-combat pets - if (who->GetTypeId() == TYPEID_UNIT && who->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET) + if (who->IsCreature() && who->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET) return false; if (!CanFly() && (GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE + m_CombatDistance)) // too much Z difference, skip very costy vmap calculations here @@ -1962,8 +1964,6 @@ void Creature::setDeathState(DeathState state, bool despawn) if (state == DeathState::JustDied) { - _lastDamagedTime.reset(); - m_corpseRemoveTime = GameTime::GetGameTime().count() + m_corpseDelay; m_respawnTime = GameTime::GetGameTime().count() + m_respawnDelay + m_corpseDelay; @@ -2499,7 +2499,7 @@ bool Creature::CanAssistTo(Unit const* u, Unit const* enemy, bool checkfaction / return false; // pussywizard: or if enemy is in evade mode - if (enemy && enemy->GetTypeId() == TYPEID_UNIT && enemy->ToCreature()->IsInEvadeMode()) + if (enemy && enemy->IsCreature() && enemy->ToCreature()->IsInEvadeMode()) return false; // we don't need help from non-combatant ;) @@ -2637,11 +2637,11 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool skipDistCheck) const return false; // pussywizard: or if enemy is in evade mode - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode()) + if (victim->IsCreature() && victim->ToCreature()->IsInEvadeMode()) return false; // cannot attack if is during 5 second grace period, unless being attacked - if (m_respawnedTime && (GameTime::GetGameTime().count() - m_respawnedTime) < 5 && !GetLastDamagedTime()) + if (m_respawnedTime && (GameTime::GetGameTime().count() - m_respawnedTime) < 5 && !IsEngagedBy(victim)) { return false; } @@ -2657,9 +2657,15 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool skipDistCheck) const if (GetMap()->IsDungeon()) return true; + float visibility = std::max(GetVisibilityRange(), victim->GetVisibilityRange()); + + // if outside visibility + if (!IsWithinDist(victim, visibility)) + return false; + // pussywizard: don't check distance to home position if recently damaged (allow kiting away from spawnpoint!) // xinef: this should include taunt auras - if (!isWorldBoss() && (GetLastDamagedTime() > GameTime::GetGameTime().count() || HasAuraType(SPELL_AURA_MOD_TAUNT))) + if (!isWorldBoss() && (GetLastLeashExtensionTime() + 12 > GameTime::GetGameTime().count() || HasAuraType(SPELL_AURA_MOD_TAUNT))) return true; } @@ -2667,10 +2673,13 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool skipDistCheck) const return true; // xinef: added size factor for huge npcs - float dist = std::min(GetMap()->GetVisibilityRange() + GetObjectSize() * 2, 150.0f); + float dist = std::min(GetDetectionRange() + GetObjectSize() * 2, 150.0f); if (Unit* unit = GetCharmerOrOwner()) + { + dist = std::min(GetMap()->GetVisibilityRange() + GetObjectSize() * 2, 150.0f); return victim->IsWithinDist(unit, dist); + } else { // to prevent creatures in air ignore attacks because distance is already too high... @@ -3030,8 +3039,11 @@ std::string Creature::GetScriptName() const uint32 Creature::GetScriptId() const { if (CreatureData const* creatureData = GetCreatureData()) - if (uint32 scriptId = creatureData->ScriptId) + { + uint32 scriptId = creatureData->ScriptId; + if (scriptId && GetEntry() == creatureData->id1) return scriptId; + } return sObjectMgr->GetCreatureTemplate(GetEntry())->ScriptID; } @@ -3664,35 +3676,31 @@ bool Creature::IsNotReachableAndNeedRegen() const return false; } -time_t Creature::GetLastDamagedTime() const +std::shared_ptr const& Creature::GetLastLeashExtensionTimePtr() const { - if (!_lastDamagedTime) - return time_t(0); - - return *_lastDamagedTime; + if (m_lastLeashExtensionTime == nullptr) + m_lastLeashExtensionTime = std::make_shared(time(nullptr)); + return m_lastLeashExtensionTime; } -std::shared_ptr const& Creature::GetLastDamagedTimePtr() const +void Creature::SetLastLeashExtensionTimePtr(std::shared_ptr const& timer) { - return _lastDamagedTime; + m_lastLeashExtensionTime = timer; } -void Creature::SetLastDamagedTime(time_t val) +void Creature::ClearLastLeashExtensionTimePtr() { - if (val > 0) - { - if (_lastDamagedTime) - *_lastDamagedTime = val; - else - _lastDamagedTime = std::make_shared(val); - } - else - _lastDamagedTime.reset(); + m_lastLeashExtensionTime.reset(); } -void Creature::SetLastDamagedTimePtr(std::shared_ptr const& val) +time_t Creature::GetLastLeashExtensionTime() const { - _lastDamagedTime = val; + return *GetLastLeashExtensionTimePtr(); +} + +void Creature::UpdateLeashExtensionTime() +{ + (*GetLastLeashExtensionTimePtr()) = time(nullptr); } bool Creature::CanPeriodicallyCallForAssistance() const diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 52f51dcdb..1c1aa3321 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -381,10 +381,11 @@ public: [[nodiscard]] bool IsMovementPreventedByCasting() const override; // Part of Evade mechanics - [[nodiscard]] time_t GetLastDamagedTime() const; - [[nodiscard]] std::shared_ptr const& GetLastDamagedTimePtr() const; - void SetLastDamagedTime(time_t val); - void SetLastDamagedTimePtr(std::shared_ptr const& val); + std::shared_ptr const& GetLastLeashExtensionTimePtr() const; + void SetLastLeashExtensionTimePtr(std::shared_ptr const& timer); + void ClearLastLeashExtensionTimePtr(); + time_t GetLastLeashExtensionTime() const; + void UpdateLeashExtensionTime(); bool IsFreeToMove(); static constexpr uint32 MOVE_CIRCLE_CHECK_INTERVAL = 3000; @@ -500,7 +501,9 @@ private: CreatureGroup* m_formation; bool TriggerJustRespawned; - mutable std::shared_ptr _lastDamagedTime; // Part of Evade mechanics + // Shared timer between mobs who assist another. + // Damaging one extends leash range on all of them. + mutable std::shared_ptr m_lastLeashExtensionTime; ObjectGuid m_cannotReachTarget; uint32 m_cannotReachTimer; diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 4a19f67bc..1f688348e 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -465,7 +465,7 @@ struct VendorItem uint32 ExtendedCost; //helpers - bool IsGoldRequired(ItemTemplate const* pProto) const { return pProto->Flags2 & ITEM_FLAGS_EXTRA_EXT_COST_REQUIRES_GOLD || !ExtendedCost; } + bool IsGoldRequired(ItemTemplate const* pProto) const { return pProto->HasFlag2(ITEM_FLAG2_DONT_IGNORE_BUY_PRICE) || !ExtendedCost; } }; typedef std::vector VendorItemList; diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index b080b772e..86ea77673 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -254,14 +254,14 @@ void TempSummon::InitSummon() WorldObject* owner = GetSummoner(); if (owner) { - if (owner->GetTypeId() == TYPEID_UNIT) + if (owner->IsCreature()) { if (owner->ToCreature()->IsAIEnabled) { owner->ToCreature()->AI()->JustSummoned(this); } } - else if (owner->GetTypeId() == TYPEID_GAMEOBJECT) + else if (owner->IsGameObject()) { if (owner->ToGameObject()->AI()) { @@ -304,11 +304,11 @@ void TempSummon::UnSummon(uint32 msTime) if (WorldObject* owner = GetSummoner()) { - if (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->IsAIEnabled) + if (owner->IsCreature() && owner->ToCreature()->IsAIEnabled) { owner->ToCreature()->AI()->SummonedCreatureDespawn(this); } - else if (owner->GetTypeId() == TYPEID_GAMEOBJECT && owner->ToGameObject()->AI()) + else if (owner->IsGameObject() && owner->ToGameObject()->AI()) { owner->ToGameObject()->AI()->SummonedCreatureDespawn(this); } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 3259ec0e1..5cf90d71a 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1280,7 +1280,7 @@ bool GameObject::IsAlwaysVisibleFor(WorldObject const* seer) const Unit* owner = GetOwner(); if (owner) { - if (seer->isType(TYPEMASK_UNIT) && owner->IsFriendlyTo(seer->ToUnit())) + if (seer->IsUnit() && owner->IsFriendlyTo(seer->ToUnit())) return true; } } @@ -1521,7 +1521,7 @@ void GameObject::Use(Unit* user) return; case GAMEOBJECT_TYPE_QUESTGIVER: //2 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1550,7 +1550,7 @@ void GameObject::Use(Unit* user) if (!info) return; - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; if (ChairListSlots.empty()) // this is called once at first chair use to make list of available slots @@ -1717,7 +1717,7 @@ void GameObject::Use(Unit* user) if (!info) return; - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1818,7 +1818,7 @@ void GameObject::Use(Unit* user) case GAMEOBJECT_TYPE_SUMMONING_RITUAL: //18 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1831,7 +1831,7 @@ void GameObject::Use(Unit* user) if (owner) { - if (owner->GetTypeId() != TYPEID_PLAYER) + if (!owner->IsPlayer()) return; // accept only use by player from same group as owner, excluding owner itself (unique use already added in spell effect) @@ -1885,21 +1885,30 @@ void GameObject::Use(Unit* user) if (info->spellcaster.partyOnly) { - Player const* caster = ObjectAccessor::FindConnectedPlayer(GetOwnerGUID()); - if (!caster || user->GetTypeId() != TYPEID_PLAYER || !user->ToPlayer()->IsInSameRaidWith(caster)) + if (!user->IsPlayer()) return; + if (ObjectGuid ownerGuid = GetOwnerGUID()) + { + if (user->GetGUID() != ownerGuid) + { + Group* group = user->ToPlayer()->GetGroup(); + if (!group) + return; + if (!group->IsMember(ownerGuid)) + return; + } + } } user->RemoveAurasByType(SPELL_AURA_MOUNTED); spellId = info->spellcaster.spellId; - break; } case GAMEOBJECT_TYPE_MEETINGSTONE: //23 { GameObjectTemplate const* info = GetGOInfo(); - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1925,7 +1934,7 @@ void GameObject::Use(Unit* user) case GAMEOBJECT_TYPE_FLAGSTAND: // 24 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1957,7 +1966,7 @@ void GameObject::Use(Unit* user) case GAMEOBJECT_TYPE_FISHINGHOLE: // 25 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1969,7 +1978,7 @@ void GameObject::Use(Unit* user) case GAMEOBJECT_TYPE_FLAGDROP: // 26 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -2027,7 +2036,7 @@ void GameObject::Use(Unit* user) if (!info) return; - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -2054,7 +2063,7 @@ void GameObject::Use(Unit* user) SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (!spellInfo) { - if (user->GetTypeId() != TYPEID_PLAYER || !sOutdoorPvPMgr->HandleCustomSpell(user->ToPlayer(), spellId, this)) + if (!user->IsPlayer() || !sOutdoorPvPMgr->HandleCustomSpell(user->ToPlayer(), spellId, this)) LOG_ERROR("entities.gameobject", "WORLD: unknown spell id {} at use action for gameobject (Entry: {} GoType: {})", spellId, GetEntry(), GetGoType()); else LOG_DEBUG("outdoorpvp", "WORLD: {} non-dbc spell was handled by OutdoorPvP", spellId); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 3d4af7648..9c3d51dcf 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -379,7 +379,7 @@ void Item::SaveToDB(CharacterDatabaseTransaction trans) trans->Append(stmt); - if ((uState == ITEM_CHANGED) && HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if ((uState == ITEM_CHANGED) && IsWrapped()) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GIFT_OWNER); stmt->SetData(0, GetOwnerGUID().GetCounter()); @@ -394,7 +394,7 @@ void Item::SaveToDB(CharacterDatabaseTransaction trans) stmt->SetData(0, guid); trans->Append(stmt); - if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (IsWrapped()) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); stmt->SetData(0, guid); @@ -493,7 +493,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fi // update max durability (and durability) if need // xinef: do not overwrite durability for wrapped items!! SetUInt32Value(ITEM_FIELD_MAXDURABILITY, proto->MaxDurability); - if (durability > proto->MaxDurability && !HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (durability > proto->MaxDurability && !IsWrapped()) { SetUInt32Value(ITEM_FIELD_DURABILITY, proto->MaxDurability); need_save = true; @@ -794,7 +794,7 @@ bool Item::IsEquipped() const bool Item::CanBeTraded(bool mail, bool trade) const { - if ((!mail || !IsBoundAccountWide()) && (IsSoulBound() && (!HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE) || !trade))) + if ((!mail || !IsBoundAccountWide()) && (IsSoulBound() && (!IsBOPTradable() || !trade))) return false; if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty())) @@ -1141,7 +1141,7 @@ bool Item::IsBindedNotWith(Player const* player) const if (GetOwnerGUID() == player->GetGUID()) return false; - if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + if (IsBOPTradable()) if (allowedGUIDs.find(player->GetGUID()) != allowedGUIDs.end()) return false; @@ -1201,7 +1201,7 @@ void Item::DeleteRefundDataFromDB(CharacterDatabaseTransaction* trans) void Item::SetNotRefundable(Player* owner, bool changestate /*=true*/, CharacterDatabaseTransaction* trans /*=nullptr*/) { - if (!HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + if (!IsRefundable()) return; RemoveFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE); diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index fe7d89bba..fa0bb2ce1 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -234,7 +234,7 @@ public: void SetBinding(bool val) { ApplyModFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_SOULBOUND, val); } [[nodiscard]] bool IsSoulBound() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_SOULBOUND); } - [[nodiscard]] bool IsBoundAccountWide() const { return (GetTemplate()->Flags & ITEM_FLAG_IS_BOUND_TO_ACCOUNT) != 0; } + [[nodiscard]] bool IsBoundAccountWide() const { return GetTemplate()->HasFlag(ITEM_FLAG_IS_BOUND_TO_ACCOUNT) != 0; } bool IsBindedNotWith(Player const* player) const; [[nodiscard]] bool IsBoundByEnchant() const; [[nodiscard]] bool IsBoundByTempEnchant() const; @@ -258,6 +258,9 @@ public: [[nodiscard]] bool CanBeTraded(bool mail = false, bool trade = false) const; void SetInTrade(bool b = true) { mb_in_trade = b; } [[nodiscard]] bool IsInTrade() const { return mb_in_trade; } + [[nodiscard]] bool IsRefundable() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE); } + [[nodiscard]] bool IsBOPTradable() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE); } + [[nodiscard]] bool IsWrapped() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED); } bool HasEnchantRequiredSkill(Player const* player) const; [[nodiscard]] uint32 GetEnchantRequiredLevel() const; diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index 6696e66b9..b7c0fccd2 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp @@ -21,6 +21,7 @@ #include "Log.h" #include "ObjectMgr.h" #include "Util.h" +#include #include #include @@ -105,7 +106,7 @@ uint32 GetItemEnchantMod(int32 entry) } //we could get here only if sum of all enchantment chances is lower than 100% - dRoll = (irand(0, (int)floor(fCount * 100) + 1)) / 100; + dRoll = (irand(0, (int)std::floor(fCount * 100) + 1)) / 100; fCount = 0; for (EnchStoreList::const_iterator ench_iter = tab->second.begin(); ench_iter != tab->second.end(); ++ench_iter) diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 47ec72fba..76a8ba4ef 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -94,7 +94,7 @@ enum ItemBondingType { NO_BIND = 0, BIND_WHEN_PICKED_UP = 1, - BIND_WHEN_EQUIPED = 2, + BIND_WHEN_EQUIPPED = 2, BIND_WHEN_USE = 3, BIND_QUEST_ITEM = 4, BIND_QUEST_ITEM1 = 5 // not used in game @@ -152,30 +152,30 @@ enum ItemFlags : uint32 ITEM_FLAG_NO_USER_DESTROY = 0x00000020, // Item can not be destroyed, except by using spell (item can be reagent for spell) ITEM_FLAG_PLAYERCAST = 0x00000040, // Item's spells are castable by players ITEM_FLAG_NO_EQUIP_COOLDOWN = 0x00000080, // No default 30 seconds cooldown when equipped - ITEM_FLAG_MULTI_LOOT_QUEST = 0x00000100, + ITEM_FLAG_MULTI_LOOT_QUEST = 0x00000100, // NYI ITEM_FLAG_IS_WRAPPER = 0x00000200, // Item can wrap other items - ITEM_FLAG_USES_RESOURCES = 0x00000400, + ITEM_FLAG_USES_RESOURCES = 0x00000400, // NYI ITEM_FLAG_MULTI_DROP = 0x00000800, // Looting this item does not remove it from available loot ITEM_FLAG_ITEM_PURCHASE_RECORD = 0x00001000, // Item can be returned to vendor for its original cost (extended cost) ITEM_FLAG_PETITION = 0x00002000, // Item is guild or arena charter ITEM_FLAG_HAS_TEXT = 0x00004000, // Only readable items have this (but not all) - ITEM_FLAG_NO_DISENCHANT = 0x00008000, - ITEM_FLAG_REAL_DURATION = 0x00010000, + ITEM_FLAG_NO_DISENCHANT = 0x00008000, // NYI + ITEM_FLAG_REAL_DURATION = 0x00010000, // NYI ITEM_FLAG_NO_CREATOR = 0x00020000, ITEM_FLAG_IS_PROSPECTABLE = 0x00040000, // Item can be prospected ITEM_FLAG_UNIQUE_EQUIPPABLE = 0x00080000, // You can only equip one of these - ITEM_FLAG_IGNORE_FOR_AURAS = 0x00100000, + ITEM_FLAG_IGNORE_FOR_AURAS = 0x00100000, // NYI ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS = 0x00200000, // Item can be used during arena match ITEM_FLAG_NO_DURABILITY_LOSS = 0x00400000, // Some Thrown weapons have it (and only Thrown) but not all ITEM_FLAG_USE_WHEN_SHAPESHIFTED = 0x00800000, // Item can be used in shapeshift forms - ITEM_FLAG_HAS_QUEST_GLOW = 0x01000000, + ITEM_FLAG_HAS_QUEST_GLOW = 0x01000000, // NYI ITEM_FLAG_HIDE_UNUSABLE_RECIPE = 0x02000000, // Profession recipes: can only be looted if you meet requirements and don't already know it ITEM_FLAG_NOT_USEABLE_IN_ARENA = 0x04000000, // Item cannot be used in arena ITEM_FLAG_IS_BOUND_TO_ACCOUNT = 0x08000000, // Item binds to account and can be sent only to your own characters ITEM_FLAG_NO_REAGENT_COST = 0x10000000, // Spell is cast ignoring reagents ITEM_FLAG_IS_MILLABLE = 0x20000000, // Item can be milled - ITEM_FLAG_REPORT_TO_GUILD_CHAT = 0x40000000, - ITEM_FLAG_NO_PROGRESSIVE_LOOT = 0x80000000 + ITEM_FLAG_REPORT_TO_GUILD_CHAT = 0x40000000, // NYI + ITEM_FLAG_NO_PROGRESSIVE_LOOT = 0x80000000 // NYI }; enum ItemFlags2 : uint32 @@ -183,46 +183,38 @@ enum ItemFlags2 : uint32 ITEM_FLAG2_FACTION_HORDE = 0x00000001, ITEM_FLAG2_FACTION_ALLIANCE = 0x00000002, ITEM_FLAG2_DONT_IGNORE_BUY_PRICE = 0x00000004, // when item uses extended cost, gold is also required - ITEM_FLAG2_CLASSIFY_AS_CASTER = 0x00000008, - ITEM_FLAG2_CLASSIFY_AS_PHYSICAL = 0x00000010, - ITEM_FLAG2_EVERYONE_CAN_ROLL_NEED = 0x00000020, - ITEM_FLAG2_NO_TRADE_BIND_ON_ACQUIRE = 0x00000040, - ITEM_FLAG2_CAN_TRADE_BIND_ON_ACQUIRE = 0x00000080, + ITEM_FLAG2_CLASSIFY_AS_CASTER = 0x00000008, // NYI + ITEM_FLAG2_CLASSIFY_AS_PHYSICAL = 0x00000010, // NYI + ITEM_FLAG2_EVERYONE_CAN_ROLL_NEED = 0x00000020, // NYI + ITEM_FLAG2_NO_TRADE_BIND_ON_ACQUIRE = 0x00000040, // NYI + ITEM_FLAG2_CAN_TRADE_BIND_ON_ACQUIRE = 0x00000080, // NYI ITEM_FLAG2_CAN_ONLY_ROLL_GREED = 0x00000100, - ITEM_FLAG2_CASTER_WEAPON = 0x00000200, - ITEM_FLAG2_DELETE_ON_LOGIN = 0x00000400, - ITEM_FLAG2_INTERNAL_ITEM = 0x00000800, - ITEM_FLAG2_NO_VENDOR_VALUE = 0x00001000, - ITEM_FLAG2_SHOW_BEFORE_DISCOVERED = 0x00002000, - ITEM_FLAG2_OVERRIDE_GOLD_COST = 0x00004000, - ITEM_FLAG2_IGNORE_DEFAULT_RATED_BG_RESTRICTIONS = 0x00008000, - ITEM_FLAG2_NOT_USABLE_IN_RATED_BG = 0x00010000, - ITEM_FLAG2_BNET_ACCOUNT_TRADE_OK = 0x00020000, - ITEM_FLAG2_CONFIRM_BEFORE_USE = 0x00040000, - ITEM_FLAG2_REEVALUATE_BONDING_ON_TRANSFORM = 0x00080000, - ITEM_FLAG2_NO_TRANSFORM_ON_CHARGE_DEPLETION = 0x00100000, - ITEM_FLAG2_NO_ALTER_ITEM_VISUAL = 0x00200000, - ITEM_FLAG2_NO_SOURCE_FOR_ITEM_VISUAL = 0x00400000, - ITEM_FLAG2_IGNORE_QUALITY_FOR_ITEM_VISUAL_SOURCE = 0x00800000, - ITEM_FLAG2_NO_DURABILITY = 0x01000000, - ITEM_FLAG2_ROLE_TANK = 0x02000000, - ITEM_FLAG2_ROLE_HEALER = 0x04000000, - ITEM_FLAG2_ROLE_DAMAGE = 0x08000000, - ITEM_FLAG2_CAN_DROP_IN_CHALLENGE_MODE = 0x10000000, - ITEM_FLAG2_NEVER_STACK_IN_LOOT_UI = 0x20000000, - ITEM_FLAG2_DISENCHANT_TO_LOOT_TABLE = 0x40000000, - ITEM_FLAG2_USED_IN_A_TRADESKILL = 0x80000000 + ITEM_FLAG2_CASTER_WEAPON = 0x00000200, // NYI + ITEM_FLAG2_DELETE_ON_LOGIN = 0x00000400, // NYI + ITEM_FLAG2_INTERNAL_ITEM = 0x00000800, // NYI + ITEM_FLAG2_NO_VENDOR_VALUE = 0x00001000, // NYI + ITEM_FLAG2_SHOW_BEFORE_DISCOVERED = 0x00002000, // NYI + ITEM_FLAG2_OVERRIDE_GOLD_COST = 0x00004000, // NYI + ITEM_FLAG2_IGNORE_DEFAULT_RATED_BG_RESTRICTIONS = 0x00008000, // NYI + ITEM_FLAG2_NOT_USABLE_IN_RATED_BG = 0x00010000, // NYI + ITEM_FLAG2_BNET_ACCOUNT_TRADE_OK = 0x00020000, // NYI + ITEM_FLAG2_CONFIRM_BEFORE_USE = 0x00040000, // NYI + ITEM_FLAG2_REEVALUATE_BONDING_ON_TRANSFORM = 0x00080000, // NYI + ITEM_FLAG2_NO_TRANSFORM_ON_CHARGE_DEPLETION = 0x00100000, // NYI + ITEM_FLAG2_NO_ALTER_ITEM_VISUAL = 0x00200000, // NYI + ITEM_FLAG2_NO_SOURCE_FOR_ITEM_VISUAL = 0x00400000, // NYI + ITEM_FLAG2_IGNORE_QUALITY_FOR_ITEM_VISUAL_SOURCE = 0x00800000, // NYI + ITEM_FLAG2_NO_DURABILITY = 0x01000000, // NYI + ITEM_FLAG2_ROLE_TANK = 0x02000000, // NYI + ITEM_FLAG2_ROLE_HEALER = 0x04000000, // NYI + ITEM_FLAG2_ROLE_DAMAGE = 0x08000000, // NYI + ITEM_FLAG2_CAN_DROP_IN_CHALLENGE_MODE = 0x10000000, // NYI + ITEM_FLAG2_NEVER_STACK_IN_LOOT_UI = 0x20000000, // NYI + ITEM_FLAG2_DISENCHANT_TO_LOOT_TABLE = 0x40000000, // NYI + ITEM_FLAG2_USED_IN_A_TRADESKILL = 0x80000000 // NYI }; -enum ItemFlagsExtra -{ - ITEM_FLAGS_EXTRA_HORDE_ONLY = 0x00000001, - ITEM_FLAGS_EXTRA_ALLIANCE_ONLY = 0x00000002, - ITEM_FLAGS_EXTRA_EXT_COST_REQUIRES_GOLD = 0x00000004, // when item uses extended cost, gold is also required - ITEM_FLAGS_EXTRA_NEED_ROLL_DISABLED = 0x00000100 -}; - -enum ItemFlagsCustom +enum ItemFlagsCustom : uint32 { ITEM_FLAGS_CU_DURATION_REAL_TIME = 0x0001, // Item duration will tick even if player is offline ITEM_FLAGS_CU_IGNORE_QUEST_STATUS = 0x0002, // No quest status will be checked when this item drops @@ -632,8 +624,8 @@ struct ItemTemplate std::string Name1; uint32 DisplayInfoID; // id from ItemDisplayInfo.dbc uint32 Quality; - uint32 Flags; - uint32 Flags2; + ItemFlags Flags; + ItemFlags2 Flags2; uint32 BuyCount; int32 BuyPrice; uint32 SellPrice; @@ -699,7 +691,7 @@ struct ItemTemplate uint32 FoodType; uint32 MinMoneyLoot; uint32 MaxMoneyLoot; - uint32 FlagsCu; + ItemFlagsCustom FlagsCu; WorldPacket queryData; // pussywizard // helpers @@ -708,7 +700,7 @@ struct ItemTemplate return GetMaxStackSize() == 1 && Class != ITEM_CLASS_CONSUMABLE && Class != ITEM_CLASS_QUEST && - (Flags & ITEM_FLAG_NO_CREATOR) == 0 && + !HasFlag(ITEM_FLAG_NO_CREATOR) && ItemId != 6948; /*Hearthstone*/ } @@ -827,13 +819,17 @@ struct ItemTemplate [[nodiscard]] bool IsPotion() const { return Class == ITEM_CLASS_CONSUMABLE && SubClass == ITEM_SUBCLASS_POTION; } [[nodiscard]] bool IsWeaponVellum() const { return Class == ITEM_CLASS_TRADE_GOODS && SubClass == ITEM_SUBCLASS_WEAPON_ENCHANTMENT; } [[nodiscard]] bool IsArmorVellum() const { return Class == ITEM_CLASS_TRADE_GOODS && SubClass == ITEM_SUBCLASS_ARMOR_ENCHANTMENT; } - [[nodiscard]] bool IsConjuredConsumable() const { return Class == ITEM_CLASS_CONSUMABLE && (Flags & ITEM_FLAG_CONJURED); } + [[nodiscard]] bool IsConjuredConsumable() const { return Class == ITEM_CLASS_CONSUMABLE && HasFlag(ITEM_FLAG_CONJURED); } [[nodiscard]] bool IsWeapon() const { return Class == ITEM_CLASS_WEAPON; } [[nodiscard]] bool IsRangedWeapon() const { return IsWeapon() && (InventoryType == INVTYPE_RANGED || InventoryType == INVTYPE_THROWN || InventoryType == INVTYPE_RANGEDRIGHT); } [[nodiscard]] bool HasStat(ItemModType stat) const; [[nodiscard]] bool HasSpellPowerStat() const; + [[nodiscard]] bool HasFlag(ItemFlags flag) const { return (Flags & flag) != 0; } + [[nodiscard]] bool HasFlag2(ItemFlags2 flag) const { return (Flags2 & flag) != 0; } + [[nodiscard]] bool HasFlagCu(ItemFlagsCustom flag) const { return (FlagsCu & flag) != 0; } + void InitializeQueryData(); }; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index d494cd8da..371a776aa 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -226,7 +226,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) } } - if (isType(TYPEMASK_UNIT)) + if (IsUnit()) { if (((Unit*)this)->GetVictim()) flags |= UPDATEFLAG_HAS_TARGET; @@ -275,7 +275,7 @@ void Object::DestroyForPlayer(Player* target, bool onDeath) const { ASSERT(target); - if (isType(TYPEMASK_UNIT) || isType(TYPEMASK_PLAYER)) + if (IsUnit() || isType(TYPEMASK_PLAYER)) { if (Battleground* bg = target->GetBattleground()) { @@ -345,7 +345,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const Unit const* unit = nullptr; WorldObject const* object = nullptr; - if (isType(TYPEMASK_UNIT)) + if (IsUnit()) unit = ToUnit(); else object = ((WorldObject*)this); @@ -1101,20 +1101,20 @@ void WorldObject::setActive(bool on) if (on) { - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) map->AddToActive(this->ToCreature()); else if (IsDynamicObject()) map->AddToActive((DynamicObject*)this); - else if (GetTypeId() == TYPEID_GAMEOBJECT) + else if (IsGameObject()) map->AddToActive((GameObject*)this); } else { - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) map->RemoveFromActive(this->ToCreature()); else if (IsDynamicObject()) map->RemoveFromActive((DynamicObject*)this); - else if (GetTypeId() == TYPEID_GAMEOBJECT) + else if (IsGameObject()) map->RemoveFromActive((GameObject*)this); } } @@ -1147,7 +1147,7 @@ void WorldObject::SetPositionDataUpdate() _updatePositionData = true; // Calls immediately for charmed units - if (GetTypeId() == TYPEID_UNIT && ToUnit()->IsCharmedOwnedByPlayerOrPlayer()) + if (IsCreature() && ToUnit()->IsCharmedOwnedByPlayerOrPlayer()) UpdatePositionData(); } @@ -1531,7 +1531,7 @@ void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const { float new_z = GetMapHeight(x, y, z); if (new_z > INVALID_HEIGHT) - z = new_z + (isType(TYPEMASK_UNIT) ? static_cast(this)->GetHoverHeight() : 0.0f); + z = new_z + (IsUnit() ? static_cast(this)->GetHoverHeight() : 0.0f); } /** @@ -1634,7 +1634,7 @@ float WorldObject::GetGridActivationRange() const { return ToCreature()->m_SightDistance; } - else if (((GetTypeId() == TYPEID_GAMEOBJECT && ToGameObject()->IsTransport()) || IsDynamicObject()) && isActiveObject()) + else if (((IsGameObject() && ToGameObject()->IsTransport()) || IsDynamicObject()) && isActiveObject()) { return GetMap()->GetVisibilityRange(); } @@ -1644,11 +1644,11 @@ float WorldObject::GetGridActivationRange() const float WorldObject::GetVisibilityRange() const { - if (IsVisibilityOverridden() && GetTypeId() == TYPEID_UNIT) + if (IsVisibilityOverridden() && IsCreature()) { return *m_visibilityDistanceOverride; } - else if (GetTypeId() == TYPEID_GAMEOBJECT) + else if (IsGameObject()) { { if (IsInWintergrasp()) @@ -1677,11 +1677,11 @@ float WorldObject::GetSightRange(WorldObject const* target) const { if (target) { - if (target->IsVisibilityOverridden() && target->GetTypeId() == TYPEID_UNIT) + if (target->IsVisibilityOverridden() && target->IsCreature()) { return *target->m_visibilityDistanceOverride; } - else if (target->GetTypeId() == TYPEID_GAMEOBJECT) + else if (target->IsGameObject()) { if (IsInWintergrasp() && target->IsInWintergrasp()) { @@ -1872,7 +1872,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo bool WorldObject::CanNeverSee(WorldObject const* obj) const { - if (GetTypeId() == TYPEID_UNIT && obj->GetTypeId() == TYPEID_UNIT) + if (IsCreature() && obj->IsCreature()) return GetMap() != obj->GetMap() || (!InSamePhase(obj) && ToUnit()->GetVehicleBase() != obj && this != obj->ToUnit()->GetVehicleBase()); return GetMap() != obj->GetMap() || !InSamePhase(obj); } @@ -1901,7 +1901,7 @@ bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth, bool che // xinef: ignore units players have at client, this cant be cheated! if (checkClient) { - if (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->HaveAtClient(obj)) + if (!IsPlayer() || !ToPlayer()->HaveAtClient(obj)) return false; } else @@ -1992,7 +1992,7 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj, bool checkAlert) co float distance = GetExactDist(obj); float combatReach = 0.0f; - if (isType(TYPEMASK_UNIT)) + if (IsUnit()) combatReach = ((Unit*)this)->GetCombatReach(); if (distance < combatReach) @@ -2006,7 +2006,7 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj, bool checkAlert) co if (!(obj->m_stealth.GetFlags() & (1 << i))) continue; - if (isType(TYPEMASK_UNIT)) + if (IsUnit()) if (((Unit*)this)->HasAuraTypeWithMiscvalue(SPELL_AURA_DETECT_STEALTH, i)) return true; @@ -2389,7 +2389,7 @@ GameObject* WorldObject::SummonGameObject(uint32 entry, float x, float y, float if (respawnTime) go->SetSpellId(1); - if (IsPlayer() || (GetTypeId() == TYPEID_UNIT && summonType == GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)) //not sure how to handle this + if (IsPlayer() || (IsCreature() && summonType == GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)) //not sure how to handle this ToUnit()->AddGameObject(go); else go->SetSpawnedByDefault(false); @@ -2406,7 +2406,7 @@ Creature* WorldObject::SummonTrigger(float x, float y, float z, float ang, uint3 return nullptr; //summon->SetName(GetName()); - if (setLevel && (IsPlayer() || GetTypeId() == TYPEID_UNIT)) + if (setLevel && (IsPlayer() || IsCreature())) { summon->SetFaction(((Unit*)this)->GetFaction()); summon->SetLevel(((Unit*)this)->GetLevel()); @@ -2428,9 +2428,9 @@ Creature* WorldObject::SummonTrigger(float x, float y, float z, float ang, uint3 */ void WorldObject::SummonCreatureGroup(uint8 group, std::list* list /*= nullptr*/) { - ASSERT((GetTypeId() == TYPEID_GAMEOBJECT || GetTypeId() == TYPEID_UNIT) && "Only GOs and creatures can summon npc groups!"); + ASSERT((IsGameObject() || IsCreature()) && "Only GOs and creatures can summon npc groups!"); - std::vector const* data = sObjectMgr->GetSummonGroup(GetEntry(), GetTypeId() == TYPEID_GAMEOBJECT ? SUMMONER_TYPE_GAMEOBJECT : SUMMONER_TYPE_CREATURE, group); + std::vector const* data = sObjectMgr->GetSummonGroup(GetEntry(), IsGameObject() ? SUMMONER_TYPE_GAMEOBJECT : SUMMONER_TYPE_CREATURE, group); if (!data) return; @@ -2742,7 +2742,7 @@ void WorldObject::GetContactPoint(WorldObject const* obj, float& x, float& y, fl GetNearPoint(obj, x, y, z, obj->GetObjectSize(), distance2d, GetAngle(obj)); // Exclude gameobjects from LoS calculations - if (std::fabs(this->GetPositionZ() - z) > 3.0f || (GetTypeId() != TYPEID_GAMEOBJECT && !IsWithinLOS(x, y, z))) + if (std::fabs(this->GetPositionZ() - z) > 3.0f || (!IsGameObject() && !IsWithinLOS(x, y, z))) { x = this->GetPositionX(); y = this->GetPositionY(); @@ -2955,7 +2955,7 @@ void WorldObject::DestroyForNearbyPlayers() if (!player->HaveAtClient(this)) continue; - if (isType(TYPEMASK_UNIT) && ((Unit*)this)->GetCharmerGUID() == player->GetGUID()) /// @todo: this is for puppet + if (IsUnit() && ((Unit*)this)->GetCharmerGUID() == player->GetGUID()) /// @todo: this is for puppet continue; DestroyForPlayer(player); @@ -3123,7 +3123,7 @@ float WorldObject::GetMapHeight(float x, float y, float z, bool vmap/* = true*/, float WorldObject::GetMapWaterOrGroundLevel(float x, float y, float z, float* ground/* = nullptr*/) const { return GetMap()->GetWaterOrGroundLevel(GetPhaseMask(), x, y, z, ground, - isType(TYPEMASK_UNIT) ? !static_cast(this)->HasAuraType(SPELL_AURA_WATER_WALK) : false, + IsUnit() ? !static_cast(this)->HasAuraType(SPELL_AURA_WATER_WALK) : false, std::max(GetCollisionHeight(), Z_OFFSET_FIND_HEIGHT)); } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 6b439663c..d9d168ed4 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -198,11 +198,13 @@ public: Player* ToPlayer() { if (IsPlayer()) return reinterpret_cast(this); else return nullptr; } [[nodiscard]] Player const* ToPlayer() const { if (IsPlayer()) return reinterpret_cast(this); else return nullptr; } - Creature* ToCreature() { if (GetTypeId() == TYPEID_UNIT) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] Creature const* ToCreature() const { if (GetTypeId() == TYPEID_UNIT) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] inline bool IsCreature() const { return GetTypeId() == TYPEID_UNIT; } + Creature* ToCreature() { if (IsCreature()) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] Creature const* ToCreature() const { if (IsCreature()) return reinterpret_cast(this); else return nullptr; } - Unit* ToUnit() { if (GetTypeId() == TYPEID_UNIT || IsPlayer()) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] Unit const* ToUnit() const { if (GetTypeId() == TYPEID_UNIT || IsPlayer()) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] inline bool IsUnit() const { return isType(TYPEMASK_UNIT); } + Unit* ToUnit() { if (IsCreature() || IsPlayer()) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] Unit const* ToUnit() const { if (IsCreature() || IsPlayer()) return reinterpret_cast(this); else return nullptr; } [[nodiscard]] inline bool IsGameObject() const { return GetTypeId() == TYPEID_GAMEOBJECT; } GameObject* ToGameObject() { if (IsGameObject()) return reinterpret_cast(this); else return nullptr; } diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index eb69c7d12..a8d99fe80 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -181,20 +181,20 @@ class ObjectGuid { switch (high) { - case HighGuid::Item: return TYPEID_ITEM; - //case HighGuid::Container: return TYPEID_CONTAINER; HighGuid::Container == HighGuid::Item currently - case HighGuid::Unit: return TYPEID_UNIT; - case HighGuid::Pet: return TYPEID_UNIT; - case HighGuid::Player: return TYPEID_PLAYER; - case HighGuid::GameObject: return TYPEID_GAMEOBJECT; + case HighGuid::Item: return TYPEID_ITEM; + //case HighGuid::Container: return TYPEID_CONTAINER; HighGuid::Container == HighGuid::Item currently + case HighGuid::Unit: return TYPEID_UNIT; + case HighGuid::Pet: return TYPEID_UNIT; + case HighGuid::Player: return TYPEID_PLAYER; + case HighGuid::GameObject: return TYPEID_GAMEOBJECT; case HighGuid::DynamicObject: return TYPEID_DYNAMICOBJECT; - case HighGuid::Corpse: return TYPEID_CORPSE; - case HighGuid::Mo_Transport: return TYPEID_GAMEOBJECT; - case HighGuid::Vehicle: return TYPEID_UNIT; + case HighGuid::Corpse: return TYPEID_CORPSE; + case HighGuid::Mo_Transport: return TYPEID_GAMEOBJECT; + case HighGuid::Vehicle: return TYPEID_UNIT; // unknown case HighGuid::Instance: case HighGuid::Group: - default: return TYPEID_OBJECT; + default: return TYPEID_OBJECT; } } diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index f3228f3cd..c3fa426a5 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -2060,7 +2060,7 @@ void Pet::InitPetCreateSpells() bool Pet::resetTalents() { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return false; if (!sScriptMgr->CanResetTalents(this)) @@ -2228,7 +2228,7 @@ void Pet::InitTalentForLevel() uint32 talentPointsForLevel = GetMaxTalentPointsForLevel(level); Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; // Reset talents in case low level (on level down) or wrong points for level (hunter can unlearn TP increase talent) @@ -2368,7 +2368,7 @@ void Pet::LearnPetPassives() void Pet::CastPetAuras(bool current) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; if (!IsPermanentPetFor(owner->ToPlayer())) @@ -2397,7 +2397,7 @@ void Pet::learnSpellHighRank(uint32 spellid) void Pet::SynchronizeLevelWithOwner() { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; switch (getPetType()) diff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp index 680aaa43e..1ce4308aa 100644 --- a/src/server/game/Entities/Player/KillRewarder.cpp +++ b/src/server/game/Entities/Player/KillRewarder.cpp @@ -130,7 +130,7 @@ void KillRewarder::_InitXP(Player* player) _xp = Acore::XP::Gain(player, _victim, _isBattleGround); if (_xp && !_isBattleGround && _victim) // pussywizard: npcs with relatively low hp give lower exp - if (_victim->GetTypeId() == TYPEID_UNIT) + if (_victim->IsCreature()) if (const CreatureTemplate* ct = _victim->ToCreature()->GetCreatureTemplate()) if (ct->ModHealth <= 0.75f && ct->ModHealth >= 0.0f) _xp = uint32(_xp * ct->ModHealth); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c2493134d..676d53663 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -83,6 +83,7 @@ #include "World.h" #include "WorldPacket.h" #include "WorldSession.h" +#include /// @todo: this import is not necessary for compilation and marked as unused by the IDE // however, for some reasons removing it would cause a damn linking issue @@ -2384,7 +2385,7 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward) return; } - if (victim && victim->GetTypeId() == TYPEID_UNIT && !victim->ToCreature()->hasLootRecipient()) + if (victim && victim->IsCreature() && !victim->ToCreature()->hasLootRecipient()) { return; } @@ -6033,7 +6034,7 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool awar // do not reward honor in arenas, but enable onkill spellproc if (InArena()) { - if (!uVictim || uVictim == this || uVictim->GetTypeId() != TYPEID_PLAYER) + if (!uVictim || uVictim == this || !uVictim->IsPlayer()) return false; if (GetBgTeamId() == uVictim->ToPlayer()->GetBgTeamId()) @@ -7749,7 +7750,7 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) // remove FD and invisibility at all loots constexpr std::array toRemove = {SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_FEIGN_DEATH}; - for (const auto& aura : toRemove) + for (auto const& aura : toRemove) { RemoveAurasByType(aura); } @@ -9266,7 +9267,7 @@ void Player::StopCastingCharm(Aura* except /*= nullptr*/) return; } - if (charm->GetTypeId() == TYPEID_UNIT) + if (charm->IsCreature()) { if (charm->ToCreature()->HasUnitTypeMask(UNIT_MASK_PUPPET)) { @@ -9621,7 +9622,7 @@ void Player::CharmSpellInitialize() } uint8 addlist = 0; - if (charm->GetTypeId() != TYPEID_PLAYER) + if (!charm->IsPlayer()) { //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureTemplate(); //if (cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK) @@ -9637,7 +9638,7 @@ void Player::CharmSpellInitialize() data << uint16(0); data << uint32(0); - if (charm->GetTypeId() != TYPEID_PLAYER) + if (!charm->IsPlayer()) data << uint8(charm->ToCreature()->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0); else data << uint32(0); @@ -10655,7 +10656,7 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c if (!bStore) AutoUnequipOffhandIfNeed(); - if (pProto->Flags & ITEM_FLAG_ITEM_PURCHASE_RECORD && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1) + if (pProto->HasFlag(ITEM_FLAG_ITEM_PURCHASE_RECORD) && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1) { it->SetFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE); it->SetRefundRecipient(GetGUID().GetCounter()); @@ -10703,7 +10704,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin return false; } - if (!IsGameMaster() && ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && GetTeamId(true) == TEAM_ALLIANCE) || (pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && GetTeamId(true) == TEAM_HORDE))) + if (!IsGameMaster() && ((pProto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && GetTeamId(true) == TEAM_ALLIANCE) || (pProto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && GetTeamId(true) == TEAM_HORDE))) { return false; } @@ -10815,7 +10816,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT // reputation discount - price = uint32(floor(price * GetReputationPriceDiscount(creature))); + price = uint32(std::floor(price * GetReputationPriceDiscount(creature))); if (!HasEnoughMoney(price)) { @@ -11733,7 +11734,7 @@ void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint3 void Player::ApplyEquipCooldown(Item* pItem) { - if (pItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_NO_EQUIP_COOLDOWN)) + if (pItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_EQUIP_COOLDOWN)) return; for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) @@ -12632,7 +12633,7 @@ bool Player::isHonorOrXPTarget(Unit* victim) const return false; } - if (victim->GetTypeId() == TYPEID_UNIT) + if (victim->IsCreature()) { if (victim->IsTotem() || victim->IsCritter() || victim->IsPet() || (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP)) { @@ -12694,7 +12695,7 @@ void Player::RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewar if (!pRewardSource) return; - ObjectGuid creature_guid = (pRewardSource->GetTypeId() == TYPEID_UNIT) ? pRewardSource->GetGUID() : ObjectGuid::Empty; + ObjectGuid creature_guid = (pRewardSource->IsCreature()) ? pRewardSource->GetGUID() : ObjectGuid::Empty; // prepare data for near group iteration if (Group* group = GetGroup()) @@ -12828,7 +12829,7 @@ void Player::SetClientControl(Unit* target, bool allowMove, bool packetOnly /*= SetMover(target); // Xinef: disable moving if target has disable move flag - if (target->GetTypeId() != TYPEID_UNIT) + if (!target->IsCreature()) return; if (allowMove && target->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE)) @@ -12865,12 +12866,12 @@ void Player::SetMover(Unit* target) LOG_INFO("misc", "Player::SetMover (B2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0); } m_mover->m_movedByPlayer = nullptr; - if (m_mover->GetTypeId() == TYPEID_UNIT) + if (m_mover->IsCreature()) m_mover->GetMotionMaster()->Initialize(); m_mover = target; m_mover->m_movedByPlayer = this; - if (m_mover->GetTypeId() == TYPEID_UNIT) + if (m_mover->IsCreature()) m_mover->GetMotionMaster()->Initialize(); } @@ -13115,7 +13116,7 @@ void Player::StopCastingBindSight(Aura* except /*= nullptr*/) { if (WorldObject* target = GetViewpoint()) { - if (target->isType(TYPEMASK_UNIT)) + if (target->IsUnit()) { ((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID(), except); ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID(), except); @@ -13139,7 +13140,7 @@ void Player::SetViewpoint(WorldObject* target, bool apply) // farsight dynobj or puppet may be very far away UpdateVisibilityOf(target); - if (target->isType(TYPEMASK_UNIT) && !GetVehicle()) + if (target->IsUnit() && !GetVehicle()) ((Unit*)target)->AddPlayerToVision(this); SetSeer(target); } @@ -13156,7 +13157,7 @@ void Player::SetViewpoint(WorldObject* target, bool apply) return; } - if (target->isType(TYPEMASK_UNIT) && !GetVehicle()) + if (target->IsUnit() && !GetVehicle()) static_cast(target)->RemovePlayerFromVision(this); // must immediately set seer back otherwise may crash @@ -13776,7 +13777,7 @@ InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limi InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 except_slot, uint32 limit_count) const { // check unique-equipped on item - if (itemProto->Flags & ITEM_FLAG_UNIQUE_EQUIPPABLE) + if (itemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE)) { // there is an equip limit on this item if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot)) @@ -15482,7 +15483,7 @@ void Player::SendRefundInfo(Item* item) // This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours. item->UpdatePlayedTime(this); - if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + if (!item->IsRefundable()) { LOG_DEBUG("entities.player.items", "Item refund: item not refundable!"); return; @@ -15550,7 +15551,7 @@ PetStable& Player::GetOrInitPetStable() void Player::RefundItem(Item* item) { - if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + if (!item->IsRefundable()) { LOG_DEBUG("entities.player.items", "Item refund: item not refundable!"); return; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 0d04f0800..70de7e631 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -851,39 +851,40 @@ enum PlayedTimeIndex // used at player loading query list preparing, and later result selection enum PlayerLoginQueryIndex { - PLAYER_LOGIN_QUERY_LOAD_FROM = 0, - PLAYER_LOGIN_QUERY_LOAD_AURAS = 3, - PLAYER_LOGIN_QUERY_LOAD_SPELLS = 4, - PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS = 5, - PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS = 6, - PLAYER_LOGIN_QUERY_LOAD_REPUTATION = 7, - PLAYER_LOGIN_QUERY_LOAD_INVENTORY = 8, - PLAYER_LOGIN_QUERY_LOAD_ACTIONS = 9, - PLAYER_LOGIN_QUERY_LOAD_MAILS = 10, - PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS = 11, - PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST = 13, - PLAYER_LOGIN_QUERY_LOAD_HOME_BIND = 14, - PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS = 15, - PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES = 16, - PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS = 18, - PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS = 19, - PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS = 20, - PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT = 21, - PLAYER_LOGIN_QUERY_LOAD_GLYPHS = 22, - PLAYER_LOGIN_QUERY_LOAD_TALENTS = 23, - PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA = 24, - PLAYER_LOGIN_QUERY_LOAD_SKILLS = 25, - PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS = 26, - PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG = 27, - PLAYER_LOGIN_QUERY_LOAD_BANNED = 28, - PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW = 29, - PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES = 30, - PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS = 31, - PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS = 32, - PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH = 34, - PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION = 35, - PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS = 36, - PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS = 37, + PLAYER_LOGIN_QUERY_LOAD_FROM = 0, + PLAYER_LOGIN_QUERY_LOAD_AURAS = 3, + PLAYER_LOGIN_QUERY_LOAD_SPELLS = 4, + PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS = 5, + PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS = 6, + PLAYER_LOGIN_QUERY_LOAD_REPUTATION = 7, + PLAYER_LOGIN_QUERY_LOAD_INVENTORY = 8, + PLAYER_LOGIN_QUERY_LOAD_ACTIONS = 9, + PLAYER_LOGIN_QUERY_LOAD_MAILS = 10, + PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS = 11, + PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST = 13, + PLAYER_LOGIN_QUERY_LOAD_HOME_BIND = 14, + PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS = 15, + PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES = 16, + PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS = 18, + PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS = 19, + PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS = 20, + PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT = 21, + PLAYER_LOGIN_QUERY_LOAD_GLYPHS = 22, + PLAYER_LOGIN_QUERY_LOAD_TALENTS = 23, + PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA = 24, + PLAYER_LOGIN_QUERY_LOAD_SKILLS = 25, + PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS = 26, + PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG = 27, + PLAYER_LOGIN_QUERY_LOAD_BANNED = 28, + PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW = 29, + PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES = 30, + PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS = 31, + PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS = 32, + PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH = 34, + PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION = 35, + PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS = 36, + PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS = 37, + PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES = 38, MAX_PLAYER_LOGIN_QUERY }; diff --git a/src/server/game/Entities/Player/PlayerGossip.cpp b/src/server/game/Entities/Player/PlayerGossip.cpp index 1029ae478..609d9776d 100644 --- a/src/server/game/Entities/Player/PlayerGossip.cpp +++ b/src/server/game/Entities/Player/PlayerGossip.cpp @@ -44,13 +44,13 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool uint32 npcflags = 0; - if (source->GetTypeId() == TYPEID_UNIT) + if (source->IsCreature()) { npcflags = source->ToUnit()->GetNpcFlags(); if (showQuests && npcflags & UNIT_NPC_FLAG_QUESTGIVER) PrepareQuestMenu(source->GetGUID()); } - else if (source->GetTypeId() == TYPEID_GAMEOBJECT) + else if (source->IsGameObject()) if (showQuests && source->ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) PrepareQuestMenu(source->GetGUID()); @@ -211,7 +211,7 @@ void Player::SendPreparedGossip(WorldObject* source) if (!source) return; - if (source->GetTypeId() == TYPEID_UNIT) + if (source->IsCreature()) { // in case no gossip flag and quest menu not empty, open quest menu (client expect gossip menu with this flag) if (!source->ToCreature()->HasNpcFlag(UNIT_NPC_FLAG_GOSSIP) && !PlayerTalkClass->GetQuestMenu().Empty()) @@ -220,7 +220,7 @@ void Player::SendPreparedGossip(WorldObject* source) return; } } - else if (source->GetTypeId() == TYPEID_GAMEOBJECT) + else if (source->IsGameObject()) { // probably need to find a better way here if (!PlayerTalkClass->GetGossipMenu().GetMenuId() && !PlayerTalkClass->GetQuestMenu().Empty()) @@ -256,7 +256,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men uint32 gossipOptionId = item->OptionType; ObjectGuid guid = source->GetGUID(); - if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->GetTypeId() == TYPEID_UNIT) + if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->IsCreature()) { if (gossipOptionId == GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT && source->ToUnit()->GetNpcFlags() & UNIT_NPC_FLAG_FLIGHTMASTER) { @@ -272,7 +272,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men } } - if (source->GetTypeId() == TYPEID_GAMEOBJECT) + if (source->IsGameObject()) { if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER) { diff --git a/src/server/game/Entities/Player/PlayerQuest.cpp b/src/server/game/Entities/Player/PlayerQuest.cpp index 1f02dc12b..833fd1bd2 100644 --- a/src/server/game/Entities/Player/PlayerQuest.cpp +++ b/src/server/game/Entities/Player/PlayerQuest.cpp @@ -829,28 +829,30 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, if (quest->GetRewSpellCast() > 0) { if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast())) - { - if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) + if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) { - if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) - creature->CastSpell(this, quest->GetRewSpellCast(), true); + if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) + { + if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) + creature->CastSpell(this, quest->GetRewSpellCast(), true); + } + else + CastSpell(this, quest->GetRewSpellCast(), true); } - else - CastSpell(this, quest->GetRewSpellCast(), true); - } } else if (quest->GetRewSpell() > 0) { if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell())) - { - if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) + if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) { - if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) - creature->CastSpell(this, quest->GetRewSpell(), true); + if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) + { + if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) + creature->CastSpell(this, quest->GetRewSpell(), true); + } + else + CastSpell(this, quest->GetRewSpell(), true); } - else - CastSpell(this, quest->GetRewSpell(), true); - } } if (quest->GetZoneOrSort() > 0) diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index 4fcdc5602..0211a5777 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -1897,7 +1897,7 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16& dest, Item* pItem, bool if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot)) return EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE; - // if we are swapping 2 equiped items, CanEquipUniqueItem check + // if we are swapping 2 equipped items, CanEquipUniqueItem check // should ignore the item we are trying to swap, and not the // destination item. CanEquipUniqueItem should ignore destination // item only when we are swapping weapon from bag @@ -2296,12 +2296,12 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const return EQUIP_ERR_ITEM_NOT_FOUND; } - if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeamId(true) != TEAM_HORDE) + if (proto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && GetTeamId(true) != TEAM_HORDE) { return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; } - if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeamId(true) != TEAM_ALLIANCE) + if (proto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && GetTeamId(true) != TEAM_ALLIANCE) { return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; } @@ -2645,7 +2645,7 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool if (pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM || - (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPED && IsBagPos(pos))) + (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos))) pItem->SetBinding(true); Bag* pBag = (bag == INVENTORY_SLOT_BAG_0) ? nullptr : GetBagByPos(bag); @@ -2685,7 +2685,7 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool { if (pItem2->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem2->GetTemplate()->Bonding == BIND_QUEST_ITEM || - (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPED && IsBagPos(pos))) + (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos))) pItem2->SetBinding(true); pItem2->SetCount(pItem2->GetCount() + count); @@ -2893,7 +2893,7 @@ void Player::VisualizeItem(uint8 slot, Item* pItem) return; // check also BIND_WHEN_PICKED_UP and BIND_QUEST_ITEM for .additem or .additemset case by GM (not binded at adding to inventory) - if (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPED || pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM) + if (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED || pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM) pItem->SetBinding(true); LOG_DEBUG("entities.player.items", "STORAGE: EquipItem slot = {}, item = {}", slot, pItem->GetEntry()); @@ -3030,7 +3030,7 @@ void Player::MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool // in case trade we already have item in other player inventory pLastItem->SetState(in_characterInventoryDB ? ITEM_CHANGED : ITEM_NEW, this); - if (pLastItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + if (pLastItem->IsBOPTradable()) AddTradeableItem(pLastItem); } } @@ -3047,7 +3047,7 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) for (uint8 i = 0; i < MAX_BAG_SIZE; ++i) DestroyItem(slot, i, update); - if (pItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (pItem->IsWrapped()) { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); stmt->SetData(0, pItem->GetGUID().GetCounter()); @@ -3117,7 +3117,7 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) pBag->RemoveItem(slot, update); // Xinef: item is removed, remove loot from storage if any - if (proto->Flags & ITEM_FLAG_HAS_LOOT) + if (proto->HasFlag(ITEM_FLAG_HAS_LOOT)) sLootItemStorage->RemoveStoredLoot(pItem->GetGUID()); if (IsInWorld() && update) @@ -4169,7 +4169,7 @@ void Player::UpdateItemDuration(uint32 time, bool realtimeonly) Item* item = *itr; ++itr; // current element can be erased in UpdateDuration - if (!realtimeonly || item->GetTemplate()->FlagsCu & ITEM_FLAGS_CU_DURATION_REAL_TIME) + if (!realtimeonly || item->GetTemplate()->HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME)) item->UpdateDuration(this, time); } } @@ -5023,7 +5023,7 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons SetCreationTime(fields[74].Get()); // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria) - m_achievementMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS)); + m_achievementMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES)); uint32 money = fields[8].Get(); if (money > MAX_MONEY_AMOUNT) @@ -5999,13 +5999,13 @@ Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint3 remove = true; } // "Conjured items disappear if you are logged out for more than 15 minutes" - else if (timeDiff > 15 * MINUTE && proto->Flags & ITEM_FLAG_CONJURED) + else if (timeDiff > 15 * MINUTE && proto->HasFlag(ITEM_FLAG_CONJURED)) { LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', diff: {}) has conjured item ({}, entry: {}) with expired lifetime (15 minutes). Deleting item.", GetGUID().ToString(), GetName(), timeDiff, item->GetGUID().ToString(), item->GetEntry()); remove = true; } - else if (item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + else if (item->IsRefundable()) { if (item->GetPlayedTime() > (2 * HOUR)) { @@ -6038,7 +6038,7 @@ Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint3 } } } - else if (item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + else if (item->IsBOPTradable()) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_BOP_TRADE); stmt->SetData(0, item->GetGUID().GetCounter()); @@ -7266,7 +7266,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans) if (item->GetState() == ITEM_NEW) { // Xinef: item is removed, remove loot from storage if any - if (item->GetTemplate()->Flags & ITEM_FLAG_HAS_LOOT) + if (item->GetTemplate()->HasFlag(ITEM_FLAG_HAS_LOOT)) sLootItemStorage->RemoveStoredLoot(item->GetGUID()); continue; } @@ -7281,7 +7281,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans) m_items[i]->FSetState(ITEM_NEW); // Xinef: item is removed, remove loot from storage if any - if (item->GetTemplate()->Flags & ITEM_FLAG_HAS_LOOT) + if (item->GetTemplate()->HasFlag(ITEM_FLAG_HAS_LOOT)) sLootItemStorage->RemoveStoredLoot(item->GetGUID()); } diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index 39756e8e4..63e9de2c7 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -159,7 +159,7 @@ void Player::Update(uint32 p_time) } } - m_achievementMgr->UpdateTimedAchievements(p_time); + m_achievementMgr->Update(p_time); if (HasUnitState(UNIT_STATE_MELEE_ATTACKING) && !HasUnitState(UNIT_STATE_CASTING) && !HasUnitState(UNIT_STATE_CHARGING)) { @@ -940,7 +940,7 @@ void Player::UpdateWeaponSkill(Unit* victim, WeaponAttackType attType, Item* ite if (GetShapeshiftForm() == FORM_TREE) return; // use weapon but not skill up - if (victim->GetTypeId() == TYPEID_UNIT && + if (victim->IsCreature() && (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_SKILL_GAINS)) return; @@ -1671,7 +1671,7 @@ void Player::UpdateVisibilityOf(WorldObject* target) { if (!CanSeeOrDetect(target, false, true)) { - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) BeforeVisibilityDestroy(target->ToCreature(), this); target->DestroyForPlayer(this); @@ -1688,7 +1688,7 @@ void Player::UpdateVisibilityOf(WorldObject* target) // target aura duration for caster show only if target exist at // caster client send data at target visibility change (adding to // client) - if (target->isType(TYPEMASK_UNIT)) + if (target->IsUnit()) GetInitialVisiblePackets((Unit*) target); } } @@ -1914,7 +1914,7 @@ void Player::UpdateCharmedAI() // Xinef: we should be killed if caster enters evade mode and charm is // infinite - if (charmer->GetTypeId() == TYPEID_UNIT && + if (charmer->IsCreature() && charmer->ToCreature()->IsInEvadeMode()) { AuraEffectList const& auras = diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index e66f52629..d5b5fdf59 100644 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -29,7 +29,7 @@ PlayerSocial::PlayerSocial(): m_playerGUID() { } uint32 PlayerSocial::GetNumberOfSocialsWithFlag(SocialFlag flag) const { uint32 counter = 0; - for (const auto& itr : m_playerSocialMap) + for (auto const& itr : m_playerSocialMap) { if ((itr.second.Flags & flag) != 0) ++counter; @@ -178,7 +178,7 @@ void PlayerSocial::SendSocialList(Player* player, uint32 flags) bool PlayerSocial::_checkContact(ObjectGuid guid, SocialFlag flags) const { - const auto& itr = m_playerSocialMap.find(guid); + auto const& itr = m_playerSocialMap.find(guid); if (itr != m_playerSocialMap.end()) return (itr->second.Flags & flags) != 0; diff --git a/src/server/game/Entities/Unit/CharmInfo.cpp b/src/server/game/Entities/Unit/CharmInfo.cpp index df36bb732..c278bd366 100644 --- a/src/server/game/Entities/Unit/CharmInfo.cpp +++ b/src/server/game/Entities/Unit/CharmInfo.cpp @@ -34,7 +34,7 @@ CharmInfo::CharmInfo(Unit* unit) for (uint8 i = 0; i < MAX_SPELL_CHARM; ++i) _charmspells[i].SetActionAndType(0, ACT_DISABLED); - if (_unit->GetTypeId() == TYPEID_UNIT) + if (_unit->IsCreature()) { _oldReactState = _unit->ToCreature()->GetReactState(); _unit->ToCreature()->SetReactState(REACT_PASSIVE); @@ -76,7 +76,7 @@ void CharmInfo::InitEmptyActionBar(bool withAttack) void CharmInfo::InitPossessCreateSpells() { - if (_unit->GetTypeId() == TYPEID_UNIT) + if (_unit->IsCreature()) { // Adding switch until better way is found. Malcrom // Adding entrys to this switch will prevent COMMAND_ATTACK being added to pet bar. @@ -98,12 +98,10 @@ void CharmInfo::InitPossessCreateSpells() uint32 spellId = _unit->ToCreature()->m_spells[i]; SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (spellInfo) - { if (spellInfo->IsPassive()) _unit->CastSpell(_unit, spellInfo, true); - else - AddSpellToActionBar(spellInfo, ACT_PASSIVE); - } + + AddSpellToActionBar(spellInfo, ACT_PASSIVE, i); } } else @@ -157,10 +155,16 @@ void CharmInfo::InitCharmCreateSpells() } } -bool CharmInfo::AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate) +bool CharmInfo::AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate, uint32 index) { - uint32 spell_id = spellInfo->Id; - uint32 first_id = spellInfo->GetFirstRankSpell()->Id; + uint32 spell_id = 0; + uint32 first_id = 0; + + if (spellInfo) + { + spell_id = spellInfo->Id; + first_id = spellInfo->GetFirstRankSpell()->Id; + } // new spell rank can be already listed for (uint8 i = 0; i < MAX_UNIT_ACTION_BAR_INDEX; ++i) @@ -180,6 +184,9 @@ bool CharmInfo::AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates new { if (!PetActionBar[i].GetAction() && PetActionBar[i].IsActionBarForSpell()) { + if (i != index && index <= MAX_UNIT_ACTION_BAR_INDEX) + continue; + SetActionBar(i, spell_id, newstate == ACT_DECIDE ? spellInfo->IsAutocastable() ? ACT_DISABLED : ACT_PASSIVE : newstate); if (_unit->GetCharmer() && _unit->GetCharmer()->IsPlayer()) @@ -218,7 +225,7 @@ bool CharmInfo::RemoveSpellFromActionBar(uint32 spell_id) { if (PetActionBar[i].IsActionBarForSpell() && sSpellMgr->GetFirstSpellInChain(action) == first_id) { - SetActionBar(i, 0, ACT_PASSIVE); + SetActionBar(i, 0, ACT_DISABLED); return true; } } diff --git a/src/server/game/Entities/Unit/CharmInfo.h b/src/server/game/Entities/Unit/CharmInfo.h index 6a62c6ef8..2f44c2ff4 100644 --- a/src/server/game/Entities/Unit/CharmInfo.h +++ b/src/server/game/Entities/Unit/CharmInfo.h @@ -140,7 +140,7 @@ public: void InitEmptyActionBar(bool withAttack = true); //return true if successful - bool AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate = ACT_DECIDE); + bool AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate = ACT_DECIDE, uint32 index = MAX_UNIT_ACTION_BAR_INDEX + 1); bool RemoveSpellFromActionBar(uint32 spell_id); void LoadPetActionBar(const std::string& data); void BuildActionBar(WorldPacket* data); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 2844975d3..0ffa162a1 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -69,7 +69,7 @@ #include "Vehicle.h" #include "World.h" #include "WorldPacket.h" -#include +#include float baseMoveSpeed[MAX_MOVE_TYPE] = { @@ -393,7 +393,7 @@ void Unit::Update(uint32 p_time) return; // pussywizard: - if (GetTypeId() != TYPEID_PLAYER || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate)) + if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate)) { if (m_delayed_unit_relocation_timer) { @@ -560,7 +560,7 @@ public: bool operator()(Movement::MoveSpline::UpdateResult result) { if ((result & (Movement::MoveSpline::Result_NextSegment | Movement::MoveSpline::Result_JustArrived)) && - _unit->GetTypeId() == TYPEID_UNIT && _unit->GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE && + _unit->IsCreature() && _unit->GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE && _unit->movespline->GetId() == _unit->GetMotionMaster()->GetCurrentSplineId()) { _unit->ToCreature()->AI()->MovementInform(ESCORT_MOTION_TYPE, _unit->movespline->currentPathIdx() - 1); @@ -595,7 +595,7 @@ void Unit::UpdateSplineMovement(uint32 t_diff) { DisableSpline(); - if (movespline->HasAnimation() && GetTypeId() == TYPEID_UNIT && IsAlive()) + if (movespline->HasAnimation() && IsCreature() && IsAlive()) SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, movespline->GetAnimationType()); } @@ -786,7 +786,7 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons void Unit::DealDamageMods(Unit const* victim, uint32& damage, uint32* absorb) { - if (!victim || !victim->IsAlive() || victim->IsInFlight() || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks())) + if (!victim || !victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())) { if (absorb) *absorb += damage; @@ -831,7 +831,7 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage } // Signal the pet it was attacked so the AI can respond if needed - if (victim->GetTypeId() == TYPEID_UNIT && attacker != victim && victim->IsPet() && victim->IsAlive()) + if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive()) victim->ToPet()->AI()->AttackedBy(attacker); if (damagetype != NODAMAGE) @@ -1039,12 +1039,8 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE) victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0); - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) { - // Part of Evade mechanics. DoT's and Thorns / Retribution Aura do not contribute to this - if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD))) - victim->ToCreature()->SetLastDamagedTime(GameTime::GetGameTime().count() + MAX_AGGRO_RESET_TIME); - if (attacker) { if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker)) @@ -1432,7 +1428,7 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss, if (!victim) return; - if (!victim->IsAlive() || victim->IsInFlight() || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks())) + if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())) return; SpellInfo const* spellProto = damageInfo->spellInfo; @@ -1525,7 +1521,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { // only players have secondary weapon damage - if (i > 0 && GetTypeId() != TYPEID_PLAYER) + if (i > 0 && !IsPlayer()) { break; } @@ -1819,7 +1815,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) auto canTakeMeleeDamage = [&]() { - return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (victim->GetTypeId() != TYPEID_UNIT || !victim->ToCreature()->IsEvadingAttacks()); + return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks()); }; if (!canTakeMeleeDamage()) @@ -1879,7 +1875,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) // If this is a creature and it attacks from behind it has a probability to daze it's victim if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) && - GetTypeId() != TYPEID_PLAYER && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this) + !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this) && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle())) { // -probability is between 0% and 40% @@ -2013,14 +2009,14 @@ uint32 Unit::CalcArmorReducedDamage(Unit const* attacker, Unit const* victim, co { if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL && (*j)->IsAffectedOnSpell(spellInfo)) - armor = floor(AddPct(armor, -(*j)->GetAmount())); + armor = std::floor(AddPct(armor, -(*j)->GetAmount())); } AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j) { if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) - armor = floor(AddPct(armor, -(*j)->GetAmount())); + armor = std::floor(AddPct(armor, -(*j)->GetAmount())); } // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc. @@ -2125,7 +2121,7 @@ void Unit::CalcAbsorbResist(DamageInfo& dmgInfo, bool Splited) // Magic damage, check for resists // Ignore spells that cant be resisted // Xinef: holy resistance exists for npcs - if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->GetTypeId() == TYPEID_UNIT) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG)))) + if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG)))) { float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim); @@ -2626,7 +2622,7 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType /*= BASE_A if (IsPlayer() && !m_Controlled.empty()) for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) if (Unit* pet = *itr) - if (pet->IsAlive() && pet->GetTypeId() == TYPEID_UNIT) + if (pet->IsAlive() && pet->IsCreature()) pet->ToCreature()->AI()->OwnerAttacked(victim); } } @@ -2657,7 +2653,7 @@ bool Unit::GetMeleeAttackPoint(Unit* attacker, Position& pos) double attackerSize = attacker->GetCollisionRadius(); - for (const auto& otherAttacker: attackers) + for (auto const& otherAttacker: attackers) { // if the otherAttacker is not valid, skip if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() || @@ -2770,7 +2766,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const { - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks()) + if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()) { return MELEE_HIT_EVADE; } @@ -2888,7 +2884,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon) if (attType != RANGED_ATTACK && (IsPlayer() || IsPet()) && - victim->GetTypeId() != TYPEID_PLAYER && !victim->IsPet() && + !victim->IsPlayer() && !victim->IsPet() && GetLevel() < victim->getLevelForTarget(this)) { // cap possible value (with bonuses > max skill) @@ -2909,7 +2905,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 && // can be from by creature (if can) or from controlled player that considered as creature !IsControlledByPlayer() && - !(GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS)) + !(IsCreature() && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS)) { // when their weapon skill is 15 or more above victim's defense skill tmp = victimDefenseSkill; @@ -2936,7 +2932,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy if (tmp > 0 && roll < (sum += tmp)) { LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum); - if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT)) + if (IsCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT)) { LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)"); } @@ -3006,7 +3002,7 @@ uint32 Unit::CalculateDamage(WeaponAttackType attType, bool normalized, bool add float Unit::CalculateLevelPenalty(SpellInfo const* spellProto) const { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return 1.0f; if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel) @@ -3073,7 +3069,7 @@ bool Unit::isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttac if (victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION) || victim->HasInArc(M_PI, this)) { // Check creatures flags_extra for disable block - if (victim->GetTypeId() == TYPEID_UNIT && + if (victim->IsCreature() && victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK) return false; @@ -3199,7 +3195,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo } // Check creatures flags_extra for disable parry - if (victim->GetTypeId() == TYPEID_UNIT) + if (victim->IsCreature()) { uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra; // Xinef: no dodge flag @@ -3294,7 +3290,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo SpellMissInfo Unit::MagicSpellHitResult(Unit* victim, SpellInfo const* spellInfo) { // Can`t miss on dead target (on skinning for example) - if (!victim->IsAlive() && victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsAlive() && !victim->IsPlayer()) return SPELL_MISS_NONE; // vehicles cant miss @@ -3314,12 +3310,12 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit* victim, SpellInfo const* spellInfo SpellSchoolMask schoolMask = spellInfo->GetSchoolMask(); int32 thisLevel = getLevelForTarget(victim); - if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsTrigger()) + if (IsCreature() && ToCreature()->IsTrigger()) thisLevel = std::max(thisLevel, spellInfo->SpellLevel); int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel; int32 MISS_CHANCE_MULTIPLIER; - if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && GetTypeId() != TYPEID_PLAYER) // keep it as it was originally (7 and 11) + if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11) { MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11; } @@ -3455,7 +3451,7 @@ SpellMissInfo Unit::SpellHitResult(Unit* victim, SpellInfo const* spell, bool Ca return SPELL_MISS_NONE; // Return evade for units in evade mode - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE) + if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE) && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT)) return SPELL_MISS_EVADE; @@ -3530,7 +3526,7 @@ SpellMissInfo Unit::SpellHitResult(Unit* victim, Spell const* spell, bool CanRef } // Return evade for units in evade mode - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && + if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spellInfo->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT)) { return SPELL_MISS_EVADE; @@ -3637,7 +3633,7 @@ float Unit::GetUnitParryChance() const chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE); } } - else if (GetTypeId() == TYPEID_UNIT) + else if (IsCreature()) { if (ToCreature()->isWorldBoss()) chance = 13.4f; // + 0.6 by skill diff @@ -4224,7 +4220,7 @@ void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data) void Unit::ProcessTerrainStatusUpdate() { - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) ToCreature()->UpdateMovementFlags(); if (IsFlying() || (!IsControlledByPlayer())) @@ -4430,7 +4426,7 @@ AuraApplication* Unit::_CreateAuraApplication(Aura* aura, uint8 effMask) // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load) // Xinef: Added IsAllowingDeadTarget check - if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->GetSession()->PlayerLoading())) + if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading())) return nullptr; Unit* caster = aura->GetCaster(); @@ -4603,6 +4599,9 @@ void Unit::_UnapplyAura(AuraApplicationMap::iterator& i, AuraRemoveMode removeMo i = m_appliedAuras.begin(); sScriptMgr->OnAuraRemove(this, aurApp, removeMode); + + if (this->ToCreature() && this->ToCreature()->IsAIEnabled) + this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode); } void Unit::_UnapplyAura(AuraApplication* aurApp, AuraRemoveMode removeMode) @@ -6229,11 +6228,11 @@ void Unit::RemoveAllGameObjects() void Unit::SendSpellNonMeleeReflectLog(SpellNonMeleeDamage* log, Unit* attacker) { // Xinef: function for players only, placed in unit because of cosmetics - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return; WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size - //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop + // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop uint32 damage = log->damage; uint32 absorb = log->absorb; if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD)) @@ -6621,7 +6620,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin) case 39446: { - if (GetTypeId() != TYPEID_PLAYER || !IsAlive()) + if (!IsPlayer() || !IsAlive()) return false; // Select class defined buff @@ -6706,7 +6705,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // cast 45428 Arcane Strike if Exalted by Scryers case 45482: { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; // Get Aldor reputation rank @@ -6729,7 +6728,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // cast 45432 Light's Ward if Exalted by Scryers case 45483: { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; // Get Aldor reputation rank @@ -6753,7 +6752,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // cast 45430 Arcane Surge if Exalted by Scryers case 45484: { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; // Get Aldor reputation rank @@ -6812,7 +6811,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } case 71519: // Deathbringer's Will Normal { - if (GetTypeId() != TYPEID_PLAYER || HasSpellCooldown(71484)) + if (!IsPlayer() || HasSpellCooldown(71484)) return false; AddSpellCooldown(71484, 0, cooldown); @@ -6855,7 +6854,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } case 71562: // Deathbringer's Will Heroic { - if (GetTypeId() != TYPEID_PLAYER || HasSpellCooldown(71561)) + if (!IsPlayer() || HasSpellCooldown(71561)) return false; AddSpellCooldown(71561, 0, cooldown); @@ -7041,7 +7040,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Incanter's Regalia set (add trigger chance to Mana Shield) if (dummySpell->SpellFamilyFlags[0] & 0x8000) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; target = this; @@ -7381,7 +7380,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere { if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3) { - if (target && target->GetTypeId() == TYPEID_UNIT) + if (target && target->IsCreature()) { triggered_spell_id = 54820; break; @@ -8222,7 +8221,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Flametongue Weapon (Passive) if (dummySpell->SpellFamilyFlags[0] & 0x200000) { - if (GetTypeId() != TYPEID_PLAYER || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped()) + if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped()) return false; WeaponAttackType attType = WeaponAttackType(Player::GetAttackBySlot(castItem->GetSlot())); @@ -8297,7 +8296,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Lightning Overload if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura { - if(!procSpell || GetTypeId() != TYPEID_PLAYER || !victim) + if(!procSpell || !IsPlayer() || !victim) return false; if (procEx & PROC_EX_CRITICAL_HIT) @@ -8353,7 +8352,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Improved Blood Presence if (dummySpell->SpellIconID == 2636) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; basepoints0 = CalculatePct(int32(damage), triggerAmount); break; @@ -9142,7 +9141,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg // Item - Hunter T9 4P Bonus (Steady Shot) else if (auraSpellInfo->Id == 67151) { - if (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->GetPet()) + if (!IsPlayer() || !ToPlayer()->GetPet()) return false; target = ToPlayer()->GetPet(); @@ -9182,7 +9181,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg case 67712: // Item - Coliseum 25 Normal Caster Trinket case 67758: // Item - Coliseum 25 Heroic Caster Trinket { - if (!victim || !victim->IsAlive() || GetTypeId() != TYPEID_PLAYER) + if (!victim || !victim->IsAlive() || !IsPlayer()) return false; uint32 stack_spell_id = 0; @@ -9350,7 +9349,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg // Blood Presence (Improved) else if (auraSpellInfo->Id == 63611) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; trigger_spell_id = 50475; @@ -9398,7 +9397,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg case 12849: case 12867: { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK) @@ -9476,7 +9475,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg break; // Ulduar, Hodir, Toasty Fire case 62821: - if (this->GetTypeId() != TYPEID_PLAYER) // spell has Attribute, but persistent area auras ignore it + if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it return false; break; case 15337: // Improved Spirit Tap (Rank 1) @@ -9518,7 +9517,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg // Item - Death Knight T10 Melee 4P Bonus if (auraSpellInfo->Id == 70656) { - if (GetTypeId() != TYPEID_PLAYER || !IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) + if (!IsPlayer() || !IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) return false; for (uint8 i = 0; i < MAX_RUNES; ++i) @@ -9538,7 +9537,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg // Rime else if (auraSpellInfo->SpellIconID == 56) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; // Howling Blast @@ -9998,7 +9997,7 @@ FactionTemplateEntry const* Unit::GetFactionTemplateEntry() const void Unit::SetFaction(uint32 faction) { SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, faction); - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) ToCreature()->UpdateMoveInLineOfSightState(); } @@ -10323,7 +10322,7 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) AddUnitState(UNIT_STATE_MELEE_ATTACKING); // set position before any AI calls/assistance - //if (GetTypeId() == TYPEID_UNIT) + //if (IsCreature()) // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ()); if (creature && !(IsControllableGuardian() && IsControlledByPlayer())) { @@ -10401,10 +10400,12 @@ void Unit::CombatStop(bool includingCast) RemoveAllAttackers(); if (IsPlayer()) ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel + if (Creature* pCreature = ToCreature()) + pCreature->ClearLastLeashExtensionTimePtr(); ClearInCombat(); // xinef: just in case - if (IsPetInCombat() && GetTypeId() != TYPEID_PLAYER) + if (IsPetInCombat() && !IsPlayer()) ClearInPetCombat(); } @@ -10777,7 +10778,7 @@ void Unit::SetMinion(Minion* minion, bool apply) (*itr)->OutDebugInfo(); ABORT(); } - ASSERT((*itr)->GetTypeId() == TYPEID_UNIT); + ASSERT((*itr)->IsCreature()); if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN)) continue; @@ -10806,7 +10807,7 @@ void Unit::GetAllMinionsByEntry(std::list& Minions, uint32 entry) { Unit* unit = *itr; ++itr; - if (unit->GetEntry() == entry && unit->GetTypeId() == TYPEID_UNIT + if (unit->GetEntry() == entry && unit->IsCreature() && unit->ToCreature()->IsSummon()) // minion, actually Minions.push_back(unit->ToCreature()); } @@ -10818,7 +10819,7 @@ void Unit::RemoveAllMinionsByEntry(uint32 entry) { Unit* unit = *itr; ++itr; - if (unit->GetEntry() == entry && unit->GetTypeId() == TYPEID_UNIT + if (unit->GetEntry() == entry && unit->IsCreature() && unit->ToCreature()->IsSummon()) // minion, actually unit->ToTempSummon()->UnSummon(); // i think this is safe because i have never heard that a despawned minion will trigger a same minion @@ -10921,7 +10922,7 @@ int32 Unit::DealHeal(Unit* healer, Unit* victim, uint32 addhealth) Unit* unit = healer; - if (healer && healer->GetTypeId() == TYPEID_UNIT && healer->ToCreature()->IsTotem()) + if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem()) unit = healer->GetOwner(); if (!unit) @@ -10994,7 +10995,7 @@ Unit* Unit::GetMagicHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo) float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ()); if (dist < 5.0f) dist = 5.0f; - queueTime = magnet->m_Events.CalculateTime((uint64)floor(dist / spellInfo->Speed * 1000.0f)); + queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f)); } magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime); @@ -11069,7 +11070,7 @@ Unit* Unit::GetNextRandomRaidMemberOrPet(float radius) if (IsPlayer()) player = ToPlayer(); // Should we enable this also for charmed units? - else if (GetTypeId() == TYPEID_UNIT && IsPet()) + else if (IsCreature() && IsPet()) player = GetOwner()->ToPlayer(); if (!player) @@ -11243,7 +11244,7 @@ float Unit::SpellPctDamageModsDone(Unit* victim, SpellInfo const* spellProto, Da return 1.0f; // For totems get damage bonus from owner - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { if (IsTotem()) { @@ -11266,7 +11267,7 @@ float Unit::SpellPctDamageModsDone(Unit* victim, SpellInfo const* spellProto, Da { // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization) if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 && - !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL) + !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL) { continue; } @@ -11281,7 +11282,7 @@ float Unit::SpellPctDamageModsDone(Unit* victim, SpellInfo const* spellProto, Da { if ((*i)->GetSpellInfo()->EquippedItemClass == -1) AddPct(DoneTotalMod, (*i)->GetAmount()); - else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) + else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) AddPct(DoneTotalMod, (*i)->GetAmount()); else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) AddPct(DoneTotalMod, (*i)->GetAmount()); @@ -11574,7 +11575,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin return pdamage; // For totems get damage bonus from owner - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { if (IsTotem()) { @@ -11595,7 +11596,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype); // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controled Damage - if (GetTypeId() == TYPEID_UNIT && (!ToCreature()->IsPet() || !ToCreature()->IsGuardian() || !ToCreature()->IsControlledByPlayer())) + if (IsCreature() && (!ToCreature()->IsPet() || !ToCreature()->IsGuardian() || !ToCreature()->IsControlledByPlayer())) DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank); // Some spells don't benefit from pct done mods @@ -11946,7 +11947,7 @@ int32 Unit::SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT) float Unit::SpellDoneCritChance(Unit const* /*victim*/, SpellInfo const* spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const { // Mobs can't crit with spells. - if (GetTypeId() == TYPEID_UNIT && !GetSpellModOwner()) + if (IsCreature() && !GetSpellModOwner()) return -100.0f; // not critting spell @@ -12312,7 +12313,7 @@ uint32 Unit::SpellCriticalHealingBonus(Unit const* caster, SpellInfo const* spel float Unit::SpellPctHealingModsDone(Unit* victim, SpellInfo const* spellProto, DamageEffectType damagetype) { // For totems get healing bonus from owner (statue isn't totem in fact) - if (GetTypeId() == TYPEID_UNIT && IsTotem()) + if (IsCreature() && IsTotem()) if (Unit* owner = GetOwner()) return owner->SpellPctHealingModsDone(victim, spellProto, damagetype); @@ -12404,7 +12405,7 @@ float Unit::SpellPctHealingModsDone(Unit* victim, SpellInfo const* spellProto, D uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod, uint32 stack) { // For totems get healing bonus from owner (statue isn't totem in fact) - if (GetTypeId() == TYPEID_UNIT && IsTotem()) + if (IsCreature() && IsTotem()) if (Unit* owner = GetOwner()) return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack); @@ -13028,7 +13029,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType if (!victim || pdamage == 0) return 0; - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { // Dancing Rune Weapon... if (GetEntry() == 27893) @@ -13106,7 +13107,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType { if ((*i)->GetSpellInfo()->EquippedItemClass == -1) AddPct(DoneTotalMod, (*i)->GetAmount()); - else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) + else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) AddPct(DoneTotalMod, (*i)->GetAmount()); else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) AddPct(DoneTotalMod, (*i)->GetAmount()); @@ -13411,7 +13412,7 @@ float Unit::GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const* spe if (Player* modOwner = GetSpellModOwner()) modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM); - return floor((WeaponSpeed * PPM) / 600.0f); // result is chance in percents (probability = Speed_in_sec * (PPM / 60)) + return std::floor((WeaponSpeed * PPM) / 600.0f); // result is chance in percents (probability = Speed_in_sec * (PPM / 60)) } void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) @@ -13460,7 +13461,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) // xinef: if we have charmed npc, stun him also if (Unit* charm = player->GetCharm()) - if (charm->GetTypeId() == TYPEID_UNIT) + if (charm->IsCreature()) charm->SetUnitFlag(UNIT_FLAG_STUNNED); WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4); @@ -13525,7 +13526,7 @@ void Unit::Dismount() // xinef: if we have charmed npc, remove stun also if (Unit* charm = player->GetCharm()) - if (charm->GetTypeId() == TYPEID_UNIT && !charm->HasUnitState(UNIT_STATE_STUNNED)) + if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED)) charm->RemoveUnitFlag(UNIT_FLAG_STUNNED); } } @@ -13533,7 +13534,7 @@ void Unit::Dismount() void Unit::SetInCombatWith(Unit* enemy, uint32 duration) { // Xinef: Dont allow to start combat with triggers - if (enemy->GetTypeId() == TYPEID_UNIT && enemy->ToCreature()->IsTrigger()) + if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger()) return; Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf(); @@ -13553,6 +13554,9 @@ void Unit::SetInCombatWith(Unit* enemy, uint32 duration) return; } } + if (Creature* pCreature = ToCreature()) + pCreature->UpdateLeashExtensionTime(); + SetInCombatState(false, enemy, duration); } @@ -13577,7 +13581,7 @@ void Unit::SetImmuneToNPC(bool apply, bool keepCombat) void Unit::CombatStart(Unit* victim, bool initialAggro) { // Xinef: Dont allow to start combat with triggers - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsTrigger()) + if (victim->IsCreature() && victim->ToCreature()->IsTrigger()) return; if (initialAggro) @@ -13588,7 +13592,7 @@ void Unit::CombatStart(Unit* victim, bool initialAggro) victim->SetStandState(UNIT_STAND_STATE_STAND); } - if (!victim->IsInCombat() && victim->GetTypeId() != TYPEID_PLAYER && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled) + if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled) { if (victim->IsPet()) victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart() @@ -13643,7 +13647,7 @@ void Unit::CombatStart(Unit* victim, bool initialAggro) SetContestedPvP(who->ToPlayer()); Player* player = GetCharmerOrOwnerPlayerOrPlayerItself(); - if (player && who->IsPvP() && (who->GetTypeId() != TYPEID_PLAYER || !player->duel || player->duel->Opponent != who)) + if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who)) { player->UpdatePvP(true); player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); @@ -13653,7 +13657,7 @@ void Unit::CombatStart(Unit* victim, bool initialAggro) void Unit::CombatStartOnCast(Unit* target, bool initialAggro, uint32 duration) { // Xinef: Dont allow to start combat with triggers - if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsTrigger()) + if (target->IsCreature() && target->ToCreature()->IsTrigger()) return; if (initialAggro) @@ -13670,7 +13674,7 @@ void Unit::CombatStartOnCast(Unit* target, bool initialAggro, uint32 duration) SetContestedPvP(who->ToPlayer()); Player* player = GetCharmerOrOwnerPlayerOrPlayerItself(); - if (player && who->IsPvP() && (who->GetTypeId() != TYPEID_PLAYER || !player->duel || player->duel->Opponent != who)) + if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who)) { player->UpdatePvP(true); player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); @@ -13692,7 +13696,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy, uint32 duration) return; // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back - if (GetTypeId() == TYPEID_UNIT && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself()) + if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself()) SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back if (IsInCombat()) @@ -13740,7 +13744,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy, uint32 duration) ++itr; // Xinef: Dont set combat for passive units, they will evade in next update... - if (controlled->GetTypeId() == TYPEID_UNIT && controlled->ToCreature()->HasReactState(REACT_PASSIVE)) + if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE)) continue; controlled->SetInCombatState(PvP, enemy, duration); @@ -13887,10 +13891,10 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo Player* owner = GetAffectingPlayer(); Unit const* const thisUnit = owner ? owner : this; if (!(target->IsPlayer() && thisUnit->IsPlayer()) && - !(target->GetTypeId() == TYPEID_UNIT && thisUnit->GetTypeId() == TYPEID_UNIT)) + !(target->IsCreature() && thisUnit->IsCreature())) { Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer(); - Unit const* creature = target->GetTypeId() == TYPEID_UNIT ? target : thisUnit; + Unit const* creature = target->IsCreature() ? target : thisUnit; if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry()) { @@ -14249,7 +14253,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) } case MOVE_FLIGHT: { - if (GetTypeId() == TYPEID_UNIT && IsControlledByPlayer()) // not sure if good for pet + if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet { main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED); stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS); @@ -14294,7 +14298,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) case MOVE_FLIGHT: { // Set creature speed rate - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) { @@ -14355,7 +14359,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED)) { - float base_speed = (GetTypeId() == TYPEID_UNIT ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f); + float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f); float min_speed = base_speed * (minSpeedMod / 100.0f); if (speed < min_speed) speed = min_speed; @@ -14443,7 +14447,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle())) pet = nullptr; - if (pet && pet->GetTypeId() == TYPEID_UNIT && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE) + if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE) pet->UpdateSpeed(mtype, forced); if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID())) critter->UpdateSpeed(mtype, forced); @@ -14558,7 +14562,7 @@ void Unit::setDeathState(DeathState s, bool despawn) bool Unit::CanHaveThreatList() const { // only creatures can have threat list - if (GetTypeId() != TYPEID_UNIT) + if (!IsCreature()) return false; // only alive units can have threat list @@ -14607,7 +14611,7 @@ void Unit::AddThreat(Unit* victim, float fThreat, SpellSchoolMask schoolMask, Sp void Unit::TauntApply(Unit* taunter) { - ASSERT(GetTypeId() == TYPEID_UNIT); + ASSERT(IsCreature()); if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster())) return; @@ -14637,7 +14641,7 @@ void Unit::TauntApply(Unit* taunter) void Unit::TauntFadeOut(Unit* taunter) { - ASSERT(GetTypeId() == TYPEID_UNIT); + ASSERT(IsCreature()); if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster())) return; @@ -14730,7 +14734,7 @@ Unit* Creature::SelectVictim() // it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list // Note: creature does not have targeted movement generator but has attacker in this case for (AttackerSet::const_iterator itr = m_attackers.begin(); itr != m_attackers.end(); ++itr) - if ((*itr) && CanCreatureAttack(*itr) && (*itr)->GetTypeId() != TYPEID_PLAYER && !(*itr)->ToCreature()->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN)) + if ((*itr) && CanCreatureAttack(*itr) && !(*itr)->IsPlayer() && !(*itr)->ToCreature()->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN)) return nullptr; if (GetVehicle()) @@ -15014,7 +15018,7 @@ float Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32& duration, if (group == DIMINISHING_TAUNT) { - if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS)) + if (IsCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS)) { DiminishingLevels diminish = Level; switch (diminish) @@ -15041,7 +15045,7 @@ float Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32& duration, // Some diminishings applies to mobs too (for example, Stun) else if ((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer())) - || (GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) + || (IsCreature() && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) { DiminishingLevels diminish = Level; @@ -15437,7 +15441,7 @@ void Unit::SetHealth(uint32 val) SetUInt32Value(UNIT_FIELD_HEALTH, val); // mobs that are now or were below 30% need to update their speed - if (GetTypeId() == TYPEID_UNIT && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30))) + if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30))) { UpdateSpeed(MOVE_RUN, false); } @@ -16351,7 +16355,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u case SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK: // Skip melee hits or instant cast spells // xinef: check channeled spells which are affected by haste also - if (procSpellInfo && (procSpellInfo->SpellFamilyName || GetTypeId() != TYPEID_PLAYER) && + if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) && (procSpellInfo->CalcCastTime() > 0 /*|| (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/)) takeCharges = true; @@ -16553,7 +16557,7 @@ Player* Unit::GetSpellModOwner() const void Unit::SendPetActionFeedback(uint8 msg) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; WorldPacket data(SMSG_PET_ACTION_FEEDBACK, 1); @@ -16564,7 +16568,7 @@ void Unit::SendPetActionFeedback(uint8 msg) void Unit::SendPetTalk(uint32 pettalk) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; WorldPacket data(SMSG_PET_ACTION_SOUND, 8 + 4); @@ -16576,7 +16580,7 @@ void Unit::SendPetTalk(uint32 pettalk) void Unit::SendPetAIReaction(ObjectGuid guid) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; WorldPacket data(SMSG_AI_REACTION, 8 + 4); @@ -17023,7 +17027,7 @@ void Unit::ApplyCastTimePercentMod(float val, bool apply) uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectType damagetype, uint32 CastingTime) const { // Not apply this to creature casted spells with casttime == 0 - if (CastingTime == 0 && GetTypeId() == TYPEID_UNIT && !IsPet()) + if (CastingTime == 0 && IsCreature() && !IsPet()) return 3500; if (CastingTime > 7000) CastingTime = 7000; @@ -17123,7 +17127,7 @@ void Unit::UpdateAuraForGroup(uint8 slot) player->SetAuraUpdateMaskForRaid(slot); } } - else if (GetTypeId() == TYPEID_UNIT && IsPet()) + else if (IsCreature() && IsPet()) { Pet* pet = ((Pet*)this); if (pet->isControlled()) @@ -17162,7 +17166,7 @@ float Unit::CalculateDefaultCoefficient(SpellInfo const* spellInfo, DamageEffect float Unit::GetAPMultiplier(WeaponAttackType attType, bool normalized) { - if (!normalized || GetTypeId() != TYPEID_PLAYER) + if (!normalized || !IsPlayer()) return float(GetAttackTime(attType)) / 1000.0f; Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true); @@ -17230,7 +17234,7 @@ void Unit::SetContestedPvP(Player* attackedPlayer, bool lookForNearContestedGuar void Unit::AddPetAura(PetAura const* petSpell) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return; m_petAuras.insert(petSpell); @@ -17242,7 +17246,7 @@ void Unit::AddPetAura(PetAura const* petSpell) void Unit::RemovePetAura(PetAura const* petSpell) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return; m_petAuras.erase(petSpell); @@ -17271,7 +17275,7 @@ bool Unit::IsPetAura(Aura const* aura) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return false; // if the owner has that pet aura, return true @@ -17284,7 +17288,7 @@ bool Unit::IsPetAura(Aura const* aura) Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget, uint32 spell_id) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return nullptr; Pet* pet = new Pet(ToPlayer(), HUNTER_PET); @@ -17308,7 +17312,7 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget, uint32 spell_id) Pet* Unit::CreateTamedPetFrom(uint32 creatureEntry, uint32 spell_id) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return nullptr; CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry); @@ -17842,7 +17846,7 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp plrVictim->SendDurabilityLoss(); } // Call KilledUnit for creatures - if (killer && killer->GetTypeId() == TYPEID_UNIT && killer->IsAIEnabled) + if (killer && killer->IsCreature() && killer->IsAIEnabled) killer->ToCreature()->AI()->KilledUnit(victim); // last damage from non duel opponent or opponent controlled creature @@ -17873,7 +17877,7 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp } // Call KilledUnit for creatures, this needs to be called after the lootable flag is set - if (killer && killer->GetTypeId() == TYPEID_UNIT && killer->IsAIEnabled) + if (killer && killer->IsCreature() && killer->IsAIEnabled) killer->ToCreature()->AI()->KilledUnit(victim); // Call creature just died function @@ -17941,7 +17945,7 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp // achievement stuff if (killer && victim->IsPlayer()) { - if (killer->GetTypeId() == TYPEID_UNIT) + if (killer->IsCreature()) victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, killer->GetEntry()); else if (victim != killer && killer->IsPlayer()) victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, killer->ToPlayer()->GetTeamId()); @@ -18029,7 +18033,7 @@ void Unit::SetControlled(bool apply, UnitState state, Unit* source /*= nullptr*/ break; case UNIT_STATE_ROOT: // Prevent creature_template_movement rooted flag from being removed on aura expiration. - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { if (ToCreature()->GetCreatureTemplate()->Movement.Rooted) { @@ -18115,16 +18119,16 @@ void Unit::SetStunned(bool apply) if (IsAlive() && GetVictim()) SetTarget(GetVictim()->GetGUID()); - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface) Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !owner->ToPlayer()->IsMounted()) + if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted()) RemoveUnitFlag(UNIT_FLAG_STUNNED); // Xinef: same for charmed npcs owner = GetCharmer(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !owner->ToPlayer()->IsMounted()) + if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted()) RemoveUnitFlag(UNIT_FLAG_STUNNED); } else @@ -18159,7 +18163,7 @@ void Unit::SetRooted(bool apply, bool isStun) } // Creature specific - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) { if (isStun && movespline->Finalized()) { @@ -18210,7 +18214,7 @@ void Unit::SetRooted(bool apply, bool isStun) void Unit::DisableRotate(bool apply) { - if (GetTypeId() != TYPEID_UNIT) + if (!IsCreature()) return; if (apply) @@ -18375,7 +18379,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au StopAttackingInvalidTarget(); - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { GetMotionMaster()->Clear(false); GetMotionMaster()->MoveIdle(); @@ -18423,7 +18427,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au GetCharmInfo()->InitCharmCreateSpells(); // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers - if (type == CHARM_TYPE_CONVERT && GetTypeId() == TYPEID_UNIT) + if (type == CHARM_TYPE_CONVERT && IsCreature()) ToCreature()->SetReactState(REACT_DEFENSIVE); } } @@ -18447,7 +18451,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au playerCharmer->PossessSpellInitialize(); break; case CHARM_TYPE_CHARM: - if (GetTypeId() == TYPEID_UNIT && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM)) + if (IsCreature() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM)) { CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate(); if (cinfo && cinfo->type == CREATURE_TYPE_DEMON) @@ -18535,7 +18539,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) GetMotionMaster()->InitDefault(); // xinef: remove stunned flag if owner was mounted - if (GetTypeId() == TYPEID_UNIT && !HasUnitState(UNIT_STATE_STUNNED)) + if (IsCreature() && !HasUnitState(UNIT_STATE_STUNNED)) RemoveUnitFlag(UNIT_FLAG_STUNNED); // If charmer still exists @@ -18543,7 +18547,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) return; ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer()); - ASSERT(type != CHARM_TYPE_VEHICLE || (GetTypeId() == TYPEID_UNIT && IsVehicle())); + ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle())); charmer->SetCharm(this, false); @@ -18569,7 +18573,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) ClearUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); break; case CHARM_TYPE_CHARM: - if (GetTypeId() == TYPEID_UNIT && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM)) + if (IsCreature() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM)) { CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate(); if (cinfo && cinfo->type == CREATURE_TYPE_DEMON) @@ -18624,7 +18628,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) playerCharmer->SendRemoveControlBar(); // xinef: Always delete charm info (restores react state) - if (IsPlayer() || (GetTypeId() == TYPEID_UNIT && !ToCreature()->IsGuardian())) + if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian())) DeleteCharmInfo(); } @@ -18720,11 +18724,11 @@ bool Unit::IsInPartyWith(Unit const* unit) const if (u1->IsPlayer() && u2->IsPlayer()) return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer()); // Xinef: we assume that npcs with the same faction are in party - else if (u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer()) + else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer()) return u1->GetFaction() == u2->GetFaction(); // Xinef: creature type_flag should work for party check only if player group is not a raid - else if ((u2->IsPlayer() && u1->GetTypeId() == TYPEID_UNIT && (u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) && u2->ToPlayer()->GetGroup() && !u2->ToPlayer()->GetGroup()->isRaidGroup()) || - (u1->IsPlayer() && u2->GetTypeId() == TYPEID_UNIT && (u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) && u1->ToPlayer()->GetGroup() && !u1->ToPlayer()->GetGroup()->isRaidGroup())) + else if ((u2->IsPlayer() && u1->IsCreature() && (u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) && u2->ToPlayer()->GetGroup() && !u2->ToPlayer()->GetGroup()->isRaidGroup()) || + (u1->IsPlayer() && u2->IsCreature() && (u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) && u1->ToPlayer()->GetGroup() && !u1->ToPlayer()->GetGroup()->isRaidGroup())) return true; else return false; @@ -18743,10 +18747,10 @@ bool Unit::IsInRaidWith(Unit const* unit) const if (u1->IsPlayer() && u2->IsPlayer()) return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer()); // Xinef: we assume that npcs with the same faction are in party - else if (u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer()) + else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer()) return u1->GetFaction() == u2->GetFaction(); - else if ((u2->IsPlayer() && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) || - (u1->IsPlayer() && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)) + else if ((u2->IsPlayer() && u1->IsCreature() && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) || + (u1->IsPlayer() && u2->IsCreature() && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)) return true; else return false; @@ -18875,13 +18879,13 @@ void Unit::SendPlaySpellImpact(ObjectGuid guid, uint32 id) void Unit::ApplyResilience(Unit const* victim, float* crit, int32* damage, bool isCrit, CombatRating type) { // player mounted on multi-passenger mount is also classified as vehicle - if (victim->IsVehicle() && victim->GetTypeId() != TYPEID_PLAYER) + if (victim->IsVehicle() && !victim->IsPlayer()) return; Unit const* target = nullptr; if (victim->IsPlayer()) target = victim; - else if (victim->GetTypeId() == TYPEID_UNIT) + else if (victim->IsCreature()) { if (Unit* owner = victim->GetOwner()) if (owner->IsPlayer()) @@ -19009,7 +19013,7 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update) return; // modify hostile references for new phasemask, some special cases deal with hostile references themselves - if (GetTypeId() == TYPEID_UNIT || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout())) + if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout())) { HostileRefMgr& refMgr = getHostileRefMgr(); HostileReference* ref = refMgr.getFirst(); @@ -19024,7 +19028,7 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update) } // modify threat lists for new phasemask - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) { ThreatContainer::StorageType threatList = GetThreatMgr().GetThreatList(); ThreatContainer::StorageType offlineThreatList = GetThreatMgr().GetOfflineThreatList(); @@ -19052,7 +19056,7 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update) { Unit* controlled = *itr; ++itr; - if (controlled->GetTypeId() == TYPEID_UNIT) + if (controlled->IsCreature()) { controlled->SetPhaseMask(newPhaseMask, true); } @@ -19338,7 +19342,7 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const if (formEntry && formEntry->modelID_A) { // Take the alliance modelid as default - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return formEntry->modelID_A; else { @@ -19462,7 +19466,7 @@ Unit* Unit::GetRedirectThreatTarget() const void Unit::JumpTo(float speedXY, float speedZ, bool forward) { float angle = forward ? 0 : M_PI; - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ); else { @@ -19799,7 +19803,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) } // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest - if (GetTypeId() == TYPEID_UNIT && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298)) + if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298)) { GetMotionMaster()->MoveFall(); } @@ -19811,7 +19815,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) { vehicle->Dismiss(); } - else if (vehicleBase->GetTypeId() == TYPEID_UNIT) + else if (vehicleBase->IsCreature()) { vehicle->Uninstall(); vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000)); @@ -19956,7 +19960,7 @@ void Unit::SendTameFailure(uint8 result) void Unit::SendTeleportPacket(Position& pos) { Position oldPos = { GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation() }; - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) Relocate(&pos); if (IsPlayer()) { @@ -19965,7 +19969,7 @@ void Unit::SendTeleportPacket(Position& pos) WorldPacket data2(MSG_MOVE_TELEPORT, 38); data2 << GetPackGUID(); BuildMovementPacket(&data2); - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) Relocate(&oldPos); if (IsPlayer()) Relocate(&pos); @@ -20278,7 +20282,7 @@ uint32 Unit::GetResistance(SpellSchoolMask mask) const void Unit::PetSpellFail(SpellInfo const* spellInfo, Unit* target, uint32 result) { CharmInfo* charmInfo = GetCharmInfo(); - if (!charmInfo || GetTypeId() != TYPEID_UNIT) + if (!charmInfo || !IsCreature()) return; if ((DisableMgr::IsPathfindingEnabled(GetMap()) || result != SPELL_FAILED_LINE_OF_SIGHT) && target) @@ -20328,7 +20332,7 @@ void Unit::PetSpellFail(SpellInfo const* spellInfo, Unit* target, uint32 result) int32 Unit::CalculateAOEDamageReduction(int32 damage, uint32 schoolMask, Unit* caster) const { damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask)); - if (caster && caster->GetTypeId() == TYPEID_UNIT) + if (caster && caster->IsCreature()) damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE, schoolMask)); return damage; @@ -20620,7 +20624,7 @@ bool Unit::SetHover(bool enable, bool /*packetOnly = false*/, bool /*updateAnima else { RemoveUnitMovementFlag(MOVEMENTFLAG_HOVER); - if (hoverHeight && (!isDying() || GetTypeId() != TYPEID_UNIT)) + if (hoverHeight && (!isDying() || !IsCreature())) { float newZ = std::max(GetFloorZ(), GetPositionZ() - hoverHeight); UpdateAllowedPositionZ(GetPositionX(), GetPositionY(), newZ); @@ -20889,7 +20893,7 @@ void Unit::PatchValuesUpdate(ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPoi valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !! }// pussywizard / Callmephil else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() && - (this->IsPlayer() || this->GetTypeId() == TYPEID_UNIT || this->IsDynamicObject())) + (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject())) { valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY } @@ -20907,7 +20911,7 @@ void Unit::PatchValuesUpdate(ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPoi valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction())); }// pussywizard / Callmephil else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() && - (this->IsPlayer() || this->GetTypeId() == TYPEID_UNIT || this->IsDynamicObject())) + (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject())) { valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction())); } diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 22952cd67..ca5bbbd34 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -67,7 +67,7 @@ Vehicle::~Vehicle() void Vehicle::Install() { - if (_me->GetTypeId() == TYPEID_UNIT) + if (_me->IsCreature()) { if (PowerDisplayEntry const* powerDisplay = sPowerDisplayStore.LookupEntry(_vehicleInfo->m_powerDisplayId)) _me->setPowerType(Powers(powerDisplay->PowerType)); @@ -76,7 +76,7 @@ void Vehicle::Install() } _status = STATUS_INSTALLED; - if (GetBase()->GetTypeId() == TYPEID_UNIT) + if (GetBase()->IsCreature()) sScriptMgr->OnInstall(this); } @@ -107,7 +107,7 @@ void Vehicle::Uninstall() LOG_DEBUG("vehicles", "Vehicle::Uninstall {}", _me->GetGUID().ToString()); RemoveAllPassengers(); - if (_me && _me->GetTypeId() == TYPEID_UNIT) + if (_me && _me->IsCreature()) { sScriptMgr->OnUninstall(this); } @@ -129,7 +129,7 @@ void Vehicle::Reset(bool evading /*= false*/) _me->SetNpcFlag(UNIT_NPC_FLAG_SPELLCLICK); } - if (GetBase()->GetTypeId() == TYPEID_UNIT) + if (GetBase()->IsCreature()) sScriptMgr->OnReset(this); } @@ -274,8 +274,8 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ // already installed if (passenger->GetEntry() == entry) { - ASSERT(passenger->GetTypeId() == TYPEID_UNIT); - if (_me->GetTypeId() == TYPEID_UNIT) + ASSERT(passenger->IsCreature()); + if (_me->IsCreature()) { if (_me->ToCreature()->IsInEvadeMode() && passenger->ToCreature()->IsAIEnabled) passenger->ToCreature()->AI()->EnterEvadeMode(); @@ -297,7 +297,7 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ return; } - if (GetBase()->GetTypeId() == TYPEID_UNIT) + if (GetBase()->IsCreature()) sScriptMgr->OnInstallAccessory(this, accessory); } } @@ -382,7 +382,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) unit->m_movementInfo.transport.guid = _me->GetGUID(); // xinef: removed seat->first == 0 check... - if (_me->GetTypeId() == TYPEID_UNIT + if (_me->IsCreature() && unit->IsPlayer() && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) { @@ -424,14 +424,14 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) init.SetTransportEnter(); init.Launch(); - if (_me->GetTypeId() == TYPEID_UNIT) + if (_me->IsCreature()) { if (_me->ToCreature()->IsAIEnabled) _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, true); } } - if (GetBase()->GetTypeId() == TYPEID_UNIT) + if (GetBase()->IsCreature()) sScriptMgr->OnAddPassenger(this, unit, seatId); // Remove parachute on vehicle switch @@ -468,7 +468,7 @@ void Vehicle::RemovePassenger(Unit* unit) seat->second.Passenger.Reset(); - if (_me->GetTypeId() == TYPEID_UNIT && unit->IsPlayer() && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + if (_me->IsCreature() && unit->IsPlayer() && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) _me->RemoveCharmedBy(unit); if (_me->IsInWorld()) @@ -486,10 +486,10 @@ void Vehicle::RemovePassenger(Unit* unit) if (_me->IsFlying() && !_me->GetInstanceId() && unit->IsPlayer() && !(unit->ToPlayer()->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT) && _me->GetEntry() != 30275 /*NPC_WILD_WYRM*/) _me->CastSpell(unit, VEHICLE_SPELL_PARACHUTE, true); - if (_me->GetTypeId() == TYPEID_UNIT) + if (_me->IsCreature()) sScriptMgr->OnRemovePassenger(this, unit); - if (_me->GetTypeId() == TYPEID_UNIT && _me->ToCreature()->IsAIEnabled) + if (_me->IsCreature() && _me->ToCreature()->IsAIEnabled) _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, false); } @@ -520,7 +520,7 @@ void Vehicle::RelocatePassengers() void Vehicle::Dismiss() { - if (GetBase()->GetTypeId() != TYPEID_UNIT) + if (!GetBase()->IsCreature()) return; LOG_DEBUG("vehicles", "Vehicle::Dismiss {}", _me->GetGUID().ToString()); @@ -535,7 +535,7 @@ bool Vehicle::IsVehicleInUse() { if (passenger->IsPlayer()) return true; - else if (passenger->GetTypeId() == TYPEID_UNIT && passenger->GetVehicleKit() && passenger->GetVehicleKit()->IsVehicleInUse()) + else if (passenger->IsCreature() && passenger->GetVehicleKit() && passenger->GetVehicleKit()->IsVehicleInUse()) return true; } @@ -556,7 +556,7 @@ void Vehicle::TeleportVehicle(float x, float y, float z, float ang) passenger->NearTeleportTo(x, y, z, ang, false, true); passenger->ToPlayer()->ScheduleDelayedOperation(DELAYED_VEHICLE_TELEPORT); } - else if (passenger->GetTypeId() == TYPEID_UNIT && passenger->GetVehicleKit()) + else if (passenger->IsCreature() && passenger->GetVehicleKit()) passenger->GetVehicleKit()->TeleportVehicle(x, y, z, ang); } } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index aff933782..f2fca152a 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -948,7 +948,7 @@ void ObjectMgr::LoadCreatureTemplateAddons() void ObjectMgr::LoadCreatureCustomIDs() { // Hack for modules - std::string stringCreatureIds = sConfigMgr->GetOption("Creatures.CustomIDs", ""); + std::string stringCreatureIds = sConfigMgr->GetOption("Creatures.CustomIDs", "190010,55005,999991,25462,98888,601014,34567,34568"); std::vector CustomCreatures = Acore::Tokenize(stringCreatureIds, ',', false); for (auto& itr : CustomCreatures) @@ -2720,8 +2720,8 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.Name1 = fields[4].Get(); itemTemplate.DisplayInfoID = fields[5].Get(); itemTemplate.Quality = uint32(fields[6].Get()); - itemTemplate.Flags = fields[7].Get(); - itemTemplate.Flags2 = fields[8].Get(); + itemTemplate.Flags = ItemFlags(fields[7].Get()); + itemTemplate.Flags2 = ItemFlags2(fields[8].Get()); itemTemplate.BuyCount = uint32(fields[9].Get()); itemTemplate.BuyPrice = int32(fields[10].Get() * sWorld->getRate((Rates)(RATE_BUYVALUE_ITEM_POOR + itemTemplate.Quality))); itemTemplate.SellPrice = uint32(fields[11].Get() * sWorld->getRate((Rates)(RATE_SELLVALUE_ITEM_POOR + itemTemplate.Quality))); @@ -2817,7 +2817,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.FoodType = uint32(fields[134].Get()); itemTemplate.MinMoneyLoot = fields[135].Get(); itemTemplate.MaxMoneyLoot = fields[136].Get(); - itemTemplate.FlagsCu = fields[137].Get(); + itemTemplate.FlagsCu = ItemFlagsCustom(fields[137].Get()); // Checks ItemEntry const* dbcitem = sItemStore.LookupEntry(entry); @@ -2873,23 +2873,23 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.Quality = ITEM_QUALITY_NORMAL; } - if (itemTemplate.Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) + if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_HORDE)) { if (FactionEntry const* faction = sFactionStore.LookupEntry(HORDE)) if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0) - LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAGS_EXTRA_HORDE_ONLY ({}) in Flags field, item cannot be equipped or used by these races.", - entry, itemTemplate.AllowableRace, ITEM_FLAGS_EXTRA_HORDE_ONLY); + LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAG2_FACTION_HORDE ({}) in Flags field, item cannot be equipped or used by these races.", + entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_HORDE); - if (itemTemplate.Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) - LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `Flags2` flags (ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) and ITEM_FLAGS_EXTRA_HORDE_ONLY ({}) in Flags field, this is a wrong combination.", - entry, ITEM_FLAGS_EXTRA_ALLIANCE_ONLY, ITEM_FLAGS_EXTRA_HORDE_ONLY); + if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE)) + LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `Flags2` flags (ITEM_FLAG2_FACTION_ALLIANCE) and ITEM_FLAG2_FACTION_HORDE ({}) in Flags field, this is a wrong combination.", + entry, ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE); } - else if (itemTemplate.Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) + else if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE)) { if (FactionEntry const* faction = sFactionStore.LookupEntry(ALLIANCE)) if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0) - LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAGS_EXTRA_ALLIANCE_ONLY ({}) in Flags field, item cannot be equipped or used by these races.", - entry, itemTemplate.AllowableRace, ITEM_FLAGS_EXTRA_ALLIANCE_ONLY); + LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAG2_FACTION_ALLIANCE ({}) in Flags field, item cannot be equipped or used by these races.", + entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_ALLIANCE); } if (itemTemplate.BuyCount <= 0) @@ -2989,7 +2989,6 @@ void ObjectMgr::LoadItemTemplates() switch (itemTemplate.ItemStat[j].ItemStatType) { case ITEM_MOD_SPELL_HEALING_DONE: - case ITEM_MOD_SPELL_DAMAGE_DONE: LOG_ERROR("sql.sql", "Item (Entry: {}) has deprecated stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType); break; default: @@ -3201,10 +3200,10 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.HolidayId = 0; } - if (itemTemplate.FlagsCu & ITEM_FLAGS_CU_DURATION_REAL_TIME && !itemTemplate.Duration) + if (itemTemplate.HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME) && !itemTemplate.Duration) { LOG_ERROR("sql.sql", "Item (Entry {}) has flag ITEM_FLAGS_CU_DURATION_REAL_TIME but it does not have duration limit", entry); - itemTemplate.FlagsCu &= ~ITEM_FLAGS_CU_DURATION_REAL_TIME; + itemTemplate.FlagsCu = static_cast(static_cast(itemTemplate.FlagsCu) & ~ITEM_FLAGS_CU_DURATION_REAL_TIME); } // Fill categories map diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index d3e1e89b2..e238a3061 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -91,7 +91,7 @@ namespace Acore { Unit& i_unit; bool isCreature; - explicit AIRelocationNotifier(Unit& unit) : i_unit(unit), isCreature(unit.GetTypeId() == TYPEID_UNIT) {} + explicit AIRelocationNotifier(Unit& unit) : i_unit(unit), isCreature(unit.IsCreature()) {} template void Visit(GridRefMgr&) {} void Visit(CreatureMapType&); }; @@ -864,7 +864,7 @@ namespace Acore bool operator()(Unit* u) { if (u->IsAlive() && !u->IsCritter() && i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u) && - (i_funit->GetTypeId() != TYPEID_UNIT || !i_funit->ToCreature()->IsAvoidingAOE())) // pussywizard + (!i_funit->IsCreature() || !i_funit->ToCreature()->IsAvoidingAOE())) // pussywizard return true; else return false; @@ -887,7 +887,7 @@ namespace Acore if (u->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET) return false; - if (u->GetTypeId() == TYPEID_UNIT && (u->ToCreature()->IsTotem() || u->ToCreature()->IsTrigger() || u->ToCreature()->IsAvoidingAOE())) // pussywizard: added IsAvoidingAOE() + if (u->IsCreature() && (u->ToCreature()->IsTotem() || u->ToCreature()->IsTrigger() || u->ToCreature()->IsAvoidingAOE())) // pussywizard: added IsAvoidingAOE() return false; if (!u->isTargetableForAttack(false, i_funit)) @@ -918,7 +918,7 @@ namespace Acore return false; } - if (u->GetTypeId() == TYPEID_UNIT && u->ToCreature()->IsTotem()) + if (u->IsCreature() && u->ToCreature()->IsTotem()) { return false; } @@ -930,7 +930,7 @@ namespace Acore uint32 losChecks = LINEOFSIGHT_ALL_CHECKS; Optional collisionHeight = { }; - if (i_obj->GetTypeId() == TYPEID_GAMEOBJECT) + if (i_obj->IsGameObject()) { losChecks &= ~LINEOFSIGHT_CHECK_GOBJECT_M2; collisionHeight = i_owner->GetCollisionHeight(); @@ -1203,7 +1203,7 @@ namespace Acore if (!me->IsValidAttackTarget(u)) return false; - if (i_playerOnly && u->GetTypeId() != TYPEID_PLAYER) + if (i_playerOnly && !u->IsPlayer()) return false; m_range = me->GetDistance(u); // use found unit range as new range limit for next check diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index c9e8a5896..7bd5cef5b 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1202,7 +1202,7 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) if (item->DisenchantID && m_maxEnchantingLevel >= item->RequiredDisenchantSkill) r->rollVoteMask |= ROLL_FLAG_TYPE_DISENCHANT; - if (item->Flags2 & ITEM_FLAGS_EXTRA_NEED_ROLL_DISABLED) + if (item->HasFlag2(ITEM_FLAG2_CAN_ONLY_ROLL_GREED)) r->rollVoteMask &= ~ROLL_FLAG_TYPE_NEED; loot->items[itemSlot].is_blocked = true; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 4b67556c5..06326e9fe 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1734,6 +1734,9 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool if (uint32(_GetMemberRemainingMoney(*member)) < amount) // Check if we have enough slot/money today return false; + if (!(GetRankRights(member->GetRankId()) & GR_RIGHT_WITHDRAW_REPAIR) && repair) + return false; + // Call script after validation and before money transfer. sScriptMgr->OnGuildMemberWitdrawMoney(this, player, amount, repair); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index a9a43c895..bf5fbc069 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -207,7 +207,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) itemEntry = item->GetTemplate()->ItemId; if (sAuctionMgr->GetAItem(item->GetGUID()) || !item->CanBeTraded() || item->IsNotEmptyBag() || - item->GetTemplate()->Flags & ITEM_FLAG_CONJURED || item->GetUInt32Value(ITEM_FIELD_DURATION) || + item->GetTemplate()->HasFlag(ITEM_FLAG_CONJURED) || item->GetUInt32Value(ITEM_FIELD_DURATION) || item->GetCount() < count[i] || itemEntry != item->GetTemplate()->ItemId) { SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 2594f1dc1..2e637662d 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -206,6 +206,10 @@ bool LoginQueryHolder::Initialize() stmt->SetData(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS, stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, lowGuid); + res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES, stmt); + return res; } diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 5673c5fee..a5b5fcc90 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -802,7 +802,7 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote, 0, unit); //Send scripted event call - if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI()) + if (unit && unit->IsCreature() && ((Creature*)unit)->AI()) ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), text_emote); } diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 96ef394c3..7f22c320c 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -956,7 +956,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData) recvData >> Guid; Player* player = HashMapHolder::Find(Guid); - if (!player) + if (!player || !player->IsInSameRaidWith(_player)) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3 + 4 + 2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index afe228b4e..3873b82a3 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -28,6 +28,7 @@ #include "UpdateData.h" #include "WorldPacket.h" #include "WorldSession.h" +#include void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData) { @@ -319,7 +320,7 @@ void WorldSession::HandleDestroyItemOpcode(WorldPacket& recvData) return; } - if (pItem->GetTemplate()->Flags & ITEM_FLAG_NO_USER_DESTROY) + if (pItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_USER_DESTROY)) { _player->SendEquipError(EQUIP_ERR_CANT_DROP_SOULBOUND, nullptr, nullptr); return; @@ -783,7 +784,7 @@ void WorldSession::HandleSellItemOpcode(WorldPacket& recvData) // prevent selling item for sellprice when the item is still refundable // this probably happens when right clicking a refundable item, the client sends both // CMSG_SELL_ITEM and CMSG_REFUND_ITEM (unverified) - if (pItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + if (pItem->IsRefundable()) return; // Therefore, no feedback to client // special case at auto sell (sell all) @@ -1091,7 +1092,7 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry) } // Only display items in vendor lists for the team the // player is on. If GM on, display all items. - if (!_player->IsGameMaster() && ((itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && _player->GetTeamId() == TEAM_ALLIANCE) || (itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && _player->GetTeamId() == TEAM_HORDE))) + if (!_player->IsGameMaster() && ((itemTemplate->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && _player->GetTeamId() == TEAM_ALLIANCE) || (itemTemplate->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && _player->GetTeamId() == TEAM_HORDE))) { continue; } @@ -1111,7 +1112,7 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry) } // reputation discount - int32 price = item->IsGoldRequired(itemTemplate) ? uint32(floor(itemTemplate->BuyPrice * discountMod)) : 0; + int32 price = item->IsGoldRequired(itemTemplate) ? uint32(std::floor(itemTemplate->BuyPrice * discountMod)) : 0; data << uint32(slot + 1); // client expects counting to start at 1 data << uint32(item->item); @@ -1282,7 +1283,7 @@ void WorldSession::HandleWrapItemOpcode(WorldPacket& recvData) return; } - if (!(gift->GetTemplate()->Flags & ITEM_FLAG_IS_WRAPPER)) // cheating: non-wrapper wrapper + if (!(gift->GetTemplate()->HasFlag(ITEM_FLAG_IS_WRAPPER))) // cheating: non-wrapper wrapper { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, gift, nullptr); return; @@ -1483,7 +1484,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData) ItemTemplate const* iGemProto = Gems[i]->GetTemplate(); // unique item (for new and already placed bit removed enchantments - if (iGemProto->Flags & ITEM_FLAG_UNIQUE_EQUIPPABLE) + if (iGemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE)) { for (int j = 0; j < MAX_GEM_SOCKETS; ++j) { diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 70a2e0513..cd644bef9 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -372,7 +372,7 @@ void WorldSession::DoLootRelease(ObjectGuid lguid) player->DestroyItemCount(pItem, count, true); } - else if (pItem->loot.isLooted() || !(proto->Flags & ITEM_FLAG_HAS_LOOT)) + else if (pItem->loot.isLooted() || !proto->HasFlag(ITEM_FLAG_HAS_LOOT)) { player->DestroyItem(pItem->GetBagSlot(), pItem->GetSlot(), true); return; diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 3c8482a3b..71cd2dfb0 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -203,7 +203,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) if (item) { ItemTemplate const* itemProto = item->GetTemplate(); - if (!itemProto || !(itemProto->Flags & ITEM_FLAG_IS_BOUND_TO_ACCOUNT)) + if (!itemProto || !itemProto->HasFlag(ITEM_FLAG_IS_BOUND_TO_ACCOUNT)) { accountBound = false; break; @@ -257,13 +257,13 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) return; } - if (item->GetTemplate()->Flags & ITEM_FLAG_CONJURED || item->GetUInt32Value(ITEM_FIELD_DURATION)) + if (item->GetTemplate()->HasFlag(ITEM_FLAG_CONJURED) || item->GetUInt32Value(ITEM_FIELD_DURATION)) { player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_MAIL_BOUND_ITEM); return; } - if (COD && item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (COD && item->IsWrapped()) { player->SendMailResult(0, MAIL_SEND, MAIL_ERR_CANT_SEND_WRAPPED_COD); return; diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index babfb01fc..ef7560e76 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -373,7 +373,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) // Stop emote on move if (Player* plrMover = mover->ToPlayer()) { - if (plrMover->GetUInt32Value(UNIT_NPC_EMOTESTATE) != EMOTE_ONESHOT_NONE) + if (plrMover->GetUInt32Value(UNIT_NPC_EMOTESTATE) != EMOTE_ONESHOT_NONE && movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_MOVING)) { plrMover->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); } @@ -410,7 +410,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) } movementInfo.pos.Relocate(mover->GetPositionX(), mover->GetPositionY(), mover->GetPositionZ()); - if (mover->GetTypeId() == TYPEID_UNIT) + if (mover->IsCreature()) { movementInfo.transport.guid = mover->m_movementInfo.transport.guid; movementInfo.transport.pos.Relocate(mover->m_movementInfo.transport.pos.GetPositionX(), mover->m_movementInfo.transport.pos.GetPositionY(), mover->m_movementInfo.transport.pos.GetPositionZ()); diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index b226b9ed0..5f68af663 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -32,6 +32,7 @@ #include "UpdateMask.h" #include "WorldPacket.h" #include "WorldSession.h" +#include enum StableResultCode { @@ -164,7 +165,7 @@ void WorldSession::SendTrainerList(ObjectGuid guid, const std::string& strTitle) data << uint32(tSpell->spell); // learned spell (or cast-spell in profession case) data << uint8(state == TRAINER_SPELL_GREEN_DISABLED ? TRAINER_SPELL_GREEN : state); - data << uint32(floor(tSpell->spellCost * fDiscountMod)); + data << uint32(std::floor(tSpell->spellCost * fDiscountMod)); data << uint32(primary_prof_first_rank && can_learn_primary_prof ? 1 : 0); // primary prof. learn confirmation dialog @@ -247,7 +248,7 @@ void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket& recvData) return; // apply reputation discount - uint32 nSpellCost = uint32(floor(trainer_spell->spellCost * _player->GetReputationPriceDiscount(unit))); + uint32 nSpellCost = uint32(std::floor(trainer_spell->spellCost * _player->GetReputationPriceDiscount(unit))); // check money requirement if (!_player->HasEnoughMoney(nSpellCost)) diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 8368c8723..af53948ca 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -50,7 +50,7 @@ void WorldSession::HandleDismissCritter(WorldPackets::Pet::DismissCritter& packe if (_player->GetCritterGUID() == pet->GetGUID()) { - if (pet->GetTypeId() == TYPEID_UNIT && pet->ToCreature()->IsSummon()) + if (pet->IsCreature() && pet->ToCreature()->IsSummon()) pet->ToTempSummon()->UnSummon(); } } @@ -234,7 +234,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe // Not let attack through obstructions bool checkLos = !DisableMgr::IsPathfindingEnabled(pet->GetMap()) || - (TargetUnit->GetTypeId() == TYPEID_UNIT && (TargetUnit->ToCreature()->isWorldBoss() || TargetUnit->ToCreature()->IsDungeonBoss())); + (TargetUnit->IsCreature() && (TargetUnit->ToCreature()->isWorldBoss() || TargetUnit->ToCreature()->IsDungeonBoss())); if (checkLos && !pet->IsWithinLOSInMap(TargetUnit)) { @@ -252,7 +252,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe { pet->AttackStop(); - if (pet->GetTypeId() != TYPEID_PLAYER && pet->ToCreature()->IsAIEnabled) + if (!pet->IsPlayer() && pet->ToCreature()->IsAIEnabled) { charmInfo->SetIsCommandAttack(true); charmInfo->SetIsAtStay(false); @@ -292,7 +292,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe } else if (pet->GetOwnerGUID() == GetPlayer()->GetGUID()) { - ASSERT(pet->GetTypeId() == TYPEID_UNIT); + ASSERT(pet->IsCreature()); if (pet->IsPet()) { if (pet->ToPet()->getPetType() == HUNTER_PET) @@ -323,7 +323,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe case REACT_DEFENSIVE: //recovery case REACT_AGGRESSIVE: //activete - if (pet->GetTypeId() == TYPEID_UNIT) + if (pet->IsCreature()) pet->ToCreature()->SetReactState(ReactStates(spellId)); else charmInfo->SetPlayerReactState(ReactStates(spellId)); @@ -491,7 +491,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe if (pet->GetVictim()) pet->AttackStop(); - if (pet->GetTypeId() != TYPEID_PLAYER && pet->ToCreature() && pet->ToCreature()->IsAIEnabled) + if (!pet->IsPlayer() && pet->ToCreature() && pet->ToCreature()->IsAIEnabled) { charmInfo->SetIsCommandAttack(true); charmInfo->SetIsAtStay(false); @@ -537,7 +537,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe else victim = nullptr; - if (pet->GetTypeId() != TYPEID_PLAYER && pet->ToCreature() && pet->ToCreature()->IsAIEnabled) + if (!pet->IsPlayer() && pet->ToCreature() && pet->ToCreature()->IsAIEnabled) { pet->StopMoving(); pet->GetMotionMaster()->Clear(); @@ -775,7 +775,7 @@ void WorldSession::HandlePetSetAction(WorldPacket& recvData) //sign for autocast if (act_state == ACT_ENABLED) { - if (pet->GetTypeId() == TYPEID_UNIT && pet->IsPet()) + if (pet->IsCreature() && pet->IsPet()) { ((Pet*)pet)->ToggleAutocast(spellInfo, true); } @@ -793,7 +793,7 @@ void WorldSession::HandlePetSetAction(WorldPacket& recvData) //sign for no/turn off autocast else if (act_state == ACT_DISABLED) { - if (pet->GetTypeId() == TYPEID_UNIT && pet->IsPet()) + if (pet->IsCreature() && pet->IsPet()) { ((Pet*)pet)->ToggleAutocast(spellInfo, false); } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 120424711..4933dc6ef 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -123,7 +123,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData) Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM | TYPEMASK_PLAYER); // no or incorrect quest giver - if (!object || object == _player || (object->GetTypeId() != TYPEID_PLAYER && !object->hasQuest(questId)) || + if (!object || object == _player || (!object->IsPlayer() && !object->hasQuest(questId)) || (object->IsPlayer() && !object->ToPlayer()->CanShareQuest(questId))) { _player->PlayerTalkClass->SendCloseGossip(); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index e09e8033b..e93215587 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -116,14 +116,14 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) } // only allow conjured consumable, bandage, poisons (all should have the 2^21 item flag set in DB) - if (proto->Class == ITEM_CLASS_CONSUMABLE && !(proto->Flags & ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS) && pUser->InArena()) + if (proto->Class == ITEM_CLASS_CONSUMABLE && !proto->HasFlag(ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS) && pUser->InArena()) { pUser->SendEquipError(EQUIP_ERR_NOT_DURING_ARENA_MATCH, pItem, nullptr); return; } // don't allow items banned in arena - if (proto->Flags & ITEM_FLAG_NOT_USEABLE_IN_ARENA && pUser->InArena()) + if (proto->HasFlag(ITEM_FLAG_NOT_USEABLE_IN_ARENA) && pUser->InArena()) { pUser->SendEquipError(EQUIP_ERR_NOT_DURING_ARENA_MATCH, pItem, nullptr); return; @@ -204,7 +204,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) } // Verify that the bag is an actual bag or wrapped item that can be used "normally" - if (!(proto->Flags & ITEM_FLAG_HAS_LOOT) && !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (!proto->HasFlag(ITEM_FLAG_HAS_LOOT) && !item->IsWrapped()) { pUser->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, nullptr); LOG_ERROR("network.opcode", "Possible hacking attempt: Player {} [{}] tried to open item [{}, entry: {}] which is not openable!", @@ -235,7 +235,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) if (sScriptMgr->OnBeforeOpenItem(pUser, item)) { - if (item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED))// wrapped? + if (item->IsWrapped())// wrapped? { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM); stmt->SetData(0, item->GetGUID().GetCounter()); @@ -258,7 +258,7 @@ void WorldSession::HandleOpenWrappedItemCallback(uint8 bagIndex, uint8 slot, Obj if (!item) return; - if (item->GetGUID().GetCounter() != itemLowGUID || !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) // during getting result, gift was swapped with another item + if (item->GetGUID().GetCounter() != itemLowGUID || !item->IsWrapped()) // during getting result, gift was swapped with another item return; if (!result) @@ -409,7 +409,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) if (Vehicle* veh = mover->GetVehicleKit()) if (const VehicleSeatEntry* seat = veh->GetSeatForPassenger(_player)) if (seat->m_flags & VEHICLE_SEAT_FLAG_CAN_ATTACK || spellInfo->Effects[EFFECT_0].Effect == SPELL_EFFECT_OPEN_LOCK /*allow looting from vehicle, but only if player has required spell (all necessary opening spells are in playercreateinfo_spell)*/) - if ((mover->GetTypeId() == TYPEID_UNIT && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) // the creature can't cast that spell, check player instead + if ((mover->IsCreature() && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) // the creature can't cast that spell, check player instead { if( !(spellInfo->Targets & TARGET_FLAG_GAMEOBJECT_ITEM) && (!_player->HasActiveSpell (spellId) || spellInfo->IsPassive()) ) { @@ -419,12 +419,12 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) } // at this point, player is a valid caster - // swapping the mover will stop the check below at == TYPEID_UNIT, so everything works fine + // swapping the mover will stop the check below at IsUnit, so everything works fine mover = _player; } // not have spell in spellbook or spell passive and not casted by client - if ((mover->GetTypeId() == TYPEID_UNIT && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) + if ((mover->IsCreature() && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) { //cheater? kick? ban? recvPacket.rfinish(); // prevent spam at ignore packet diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 9d649ae85..77cba1d8e 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -102,7 +102,7 @@ void WorldSession::SendUpdateTrade(bool trader_data /*= true*/) data << uint32(item->GetTemplate()->DisplayInfoID);// display id data << uint32(item->GetCount()); // stack count // wrapped: hide stats but show giftcreator name - data << uint32(item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED) ? 1 : 0); + data << uint32(item->IsWrapped() ? 1 : 0); data << item->GetGuidValue(ITEM_FIELD_GIFTCREATOR); // perm. enchantment and gems data << uint32(item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); @@ -154,7 +154,7 @@ void WorldSession::moveItems(Item* myItems[], Item* hisItems[]) LOG_DEBUG("network", "partner storing: {}", myItems[i]->GetGUID().ToString()); // adjust time (depends on /played) - if (myItems[i]->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + if (myItems[i]->IsBOPTradable()) myItems[i]->SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, trader->GetTotalPlayedTime() - (_player->GetTotalPlayedTime() - myItems[i]->GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME))); // store trader->MoveItemToInventory(traderDst, myItems[i], true, true); @@ -165,7 +165,7 @@ void WorldSession::moveItems(Item* myItems[], Item* hisItems[]) LOG_DEBUG("network", "player storing: {}", hisItems[i]->GetGUID().ToString()); // adjust time (depends on /played) - if (hisItems[i]->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + if (hisItems[i]->IsBOPTradable()) hisItems[i]->SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, _player->GetTotalPlayedTime() - (trader->GetTotalPlayedTime() - hisItems[i]->GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME))); // store _player->MoveItemToInventory(playerDst, hisItems[i], true, true); diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 0c0581192..122257c15 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -679,7 +679,7 @@ void InstanceScript::DoCastSpellOnPlayer(Player* player, uint32 spell, bool incl for (auto itr2 = player->m_Controlled.begin(); itr2 != player->m_Controlled.end(); ++itr2) { if (Unit* controlled = *itr2) - if (controlled->IsInWorld() && controlled->GetTypeId() == TYPEID_UNIT) + if (controlled->IsInWorld() && controlled->IsCreature()) controlled->CastSpell(player, spell, true); } } diff --git a/src/server/game/Loot/LootItemStorage.cpp b/src/server/game/Loot/LootItemStorage.cpp index 1c490f13a..712702346 100644 --- a/src/server/game/Loot/LootItemStorage.cpp +++ b/src/server/game/Loot/LootItemStorage.cpp @@ -214,7 +214,7 @@ bool LootItemStorage::LoadStoredLoot(Item* item, Player* player) // non-conditional one-player only items are counted here, // free for all items are counted in FillFFALoot(), // non-ffa conditionals are counted in FillNonQuestNonFFAConditionalLoot() - if ((!li.needs_quest && li.conditions.empty() && !(proto->Flags & ITEM_FLAG_MULTI_DROP)) || li.is_counted) + if ((!li.needs_quest && li.conditions.empty() && !proto->HasFlag(ITEM_FLAG_MULTI_DROP)) || li.is_counted) { ++loot->unlootedCount; } diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index d85a49194..9b714e225 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -390,8 +390,8 @@ LootItem::LootItem(LootStoreItem const& li) conditions = li.conditions; ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemid); - freeforall = proto && (proto->Flags & ITEM_FLAG_MULTI_DROP); - follow_loot_rules = proto && (proto->FlagsCu & ITEM_FLAGS_CU_FOLLOW_LOOT_RULES); + freeforall = proto && proto->HasFlag(ITEM_FLAG_MULTI_DROP); + follow_loot_rules = proto && proto->HasFlagCu(ITEM_FLAGS_CU_FOLLOW_LOOT_RULES); needs_quest = li.needs_quest; @@ -429,7 +429,7 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const // Master Looter can see conditioned recipes if (isMasterLooter && itemVisibleForMasterLooter) { - if ((pProto->Flags & ITEM_FLAG_HIDE_UNUSABLE_RECIPE) || (pProto->Class == ITEM_CLASS_RECIPE && pProto->Bonding == BIND_WHEN_PICKED_UP && pProto->Spells[1].SpellId != 0)) + if (pProto->HasFlag(ITEM_FLAG_HIDE_UNUSABLE_RECIPE) || (pProto->Class == ITEM_CLASS_RECIPE && pProto->Bonding == BIND_WHEN_PICKED_UP && pProto->Spells[1].SpellId != 0)) { return true; } @@ -439,12 +439,12 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const } // not show loot for not own team - if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && player->GetTeamId(true) != TEAM_HORDE) + if (pProto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && player->GetTeamId(true) != TEAM_HORDE) { return false; } - if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && player->GetTeamId(true) != TEAM_ALLIANCE) + if (pProto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && player->GetTeamId(true) != TEAM_ALLIANCE) { return false; } @@ -456,7 +456,7 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const } // Don't allow loot for players without profession or those who already know the recipe - if ((pProto->Flags & ITEM_FLAG_HIDE_UNUSABLE_RECIPE) && (!player->HasSkill(pProto->RequiredSkill) || player->HasSpell(pProto->Spells[1].SpellId))) + if (pProto->HasFlag(ITEM_FLAG_HIDE_UNUSABLE_RECIPE) && (!player->HasSkill(pProto->RequiredSkill) || player->HasSpell(pProto->Spells[1].SpellId))) { return false; } @@ -468,7 +468,7 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const } // check quest requirements - if (!(pProto->FlagsCu & ITEM_FLAGS_CU_IGNORE_QUEST_STATUS)) + if (!pProto->HasFlagCu(ITEM_FLAGS_CU_IGNORE_QUEST_STATUS)) { // Don't drop quest items if the player is missing the relevant quest if (needs_quest && !player->HasQuestForItem(itemid)) @@ -555,7 +555,7 @@ void Loot::AddItem(LootStoreItem const& item) // non-conditional one-player only items are counted here, // free for all items are counted in FillFFALoot(), // non-ffa conditionals are counted in FillNonQuestNonFFAConditionalLoot() - if (!item.needs_quest && item.conditions.empty() && !(proto->Flags & ITEM_FLAG_MULTI_DROP)) + if (!item.needs_quest && item.conditions.empty() && !proto->HasFlag(ITEM_FLAG_MULTI_DROP)) ++unlootedCount; } } @@ -2099,7 +2099,7 @@ void LoadLootTemplates_Item() // remove real entries and check existence loot ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) - if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end() && itr->second.Flags & ITEM_FLAG_HAS_LOOT) + if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end() && itr->second.HasFlag(ITEM_FLAG_HAS_LOOT)) lootIdSet.erase(itr->second.ItemId); // output error for any still listed (not referenced from appropriate table) ids @@ -2126,7 +2126,7 @@ void LoadLootTemplates_Milling() ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) { - if (!(itr->second.Flags & ITEM_FLAG_IS_MILLABLE)) + if (!itr->second.HasFlag(ITEM_FLAG_IS_MILLABLE)) continue; if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end()) @@ -2193,7 +2193,7 @@ void LoadLootTemplates_Prospecting() ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) { - if (!(itr->second.Flags & ITEM_FLAG_IS_PROSPECTABLE)) + if (!itr->second.HasFlag(ITEM_FLAG_IS_PROSPECTABLE)) continue; if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end()) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index b44069a32..21fa4d3ae 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -587,7 +587,7 @@ bool Map::AddToMap(T* obj, bool checkTransport) obj->AddToWorld(); if (checkTransport) - if (!(obj->GetTypeId() == TYPEID_GAMEOBJECT && obj->ToGameObject()->IsTransport())) // dont add transport to transport ;d + if (!(obj->IsGameObject() && obj->ToGameObject()->IsTransport())) // dont add transport to transport ;d if (Transport* transport = GetTransportForPos(obj->GetPhaseMask(), obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj)) transport->AddPassenger(obj, true); @@ -602,7 +602,7 @@ bool Map::AddToMap(T* obj, bool checkTransport) // Xinef: little hack for vehicles, accessories have to be added after visibility update so they wont fall off the vehicle, moved from Creature::AIM_Initialize // Initialize vehicle, this is done only for summoned npcs, DB creatures are handled by grid loaders - if (obj->GetTypeId() == TYPEID_UNIT) + if (obj->IsCreature()) if (Vehicle* vehicle = obj->ToCreature()->GetVehicleKit()) vehicle->Reset(); return true; @@ -2668,8 +2668,8 @@ void Map::AddObjectToSwitchList(WorldObject* obj, bool on) { ASSERT(obj->GetMapId() == GetId() && obj->GetInstanceId() == GetInstanceId()); // i_objectsToSwitch is iterated only in Map::RemoveAllObjectsInRemoveList() and it uses - // the contained objects only if GetTypeId() == TYPEID_UNIT , so we can return in all other cases - if (obj->GetTypeId() != TYPEID_UNIT && obj->GetTypeId() != TYPEID_GAMEOBJECT) + // the contained objects only if IsCreature() , so we can return in all other cases + if (!obj->IsCreature() && !obj->IsGameObject()) return; std::map::iterator itr = i_objectsToSwitch.find(obj); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 710177ab1..7fdf96c7b 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -244,7 +244,7 @@ void MotionMaster::MoveRandom(float wanderDistance) if (_owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE)) return; - if (_owner->GetTypeId() == TYPEID_UNIT) + if (_owner->IsCreature()) { LOG_DEBUG("movement.motionmaster", "Creature ({}) start moving random", _owner->GetGUID().ToString()); Mutate(new RandomMovementGenerator(wanderDistance), MOTION_SLOT_IDLE); @@ -260,12 +260,12 @@ void MotionMaster::MoveTargetedHome(bool walk /*= false*/) { Clear(false); - if (_owner->GetTypeId() == TYPEID_UNIT && !_owner->ToCreature()->GetCharmerOrOwnerGUID()) + if (_owner->IsCreature() && !_owner->ToCreature()->GetCharmerOrOwnerGUID()) { LOG_DEBUG("movement.motionmaster", "Creature ({}) targeted home", _owner->GetGUID().ToString()); Mutate(new HomeMovementGenerator(walk), MOTION_SLOT_ACTIVE); } - else if (_owner->GetTypeId() == TYPEID_UNIT && _owner->ToCreature()->GetCharmerOrOwnerGUID()) + else if (_owner->IsCreature() && _owner->ToCreature()->GetCharmerOrOwnerGUID()) { _owner->ClearUnitState(UNIT_STATE_EVADE); @@ -645,7 +645,7 @@ void MotionMaster::MoveFall(uint32 id /*=0*/, bool addFlagForNPC) _owner->m_movementInfo.SetFallTime(0); _owner->ToPlayer()->SetFallInformation(GameTime::GetGameTime().count(), _owner->GetPositionZ()); } - else if (_owner->GetTypeId() == TYPEID_UNIT && addFlagForNPC) // pussywizard + else if (_owner->IsCreature() && addFlagForNPC) // pussywizard { _owner->RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING); _owner->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY); diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp index 5f64daef3..c1505f9af 100644 --- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp @@ -72,7 +72,7 @@ bool RotateMovementGenerator::Update(Unit* owner, uint32 diff) void RotateMovementGenerator::Finalize(Unit* unit) { unit->ClearUnitState(UNIT_STATE_ROTATING); - if (unit->GetTypeId() == TYPEID_UNIT) + if (unit->IsCreature()) unit->ToCreature()->AI()->MovementInform(ROTATE_MOTION_TYPE, 0); } @@ -90,7 +90,7 @@ void DistractMovementGenerator::Finalize(Unit* owner) owner->ClearUnitState(UNIT_STATE_DISTRACTED); // If this is a creature, then return orientation to original position (for idle movement creatures) - if (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()) + if (owner->IsCreature() && owner->ToCreature()) { float angle = owner->ToCreature()->GetHomePosition().GetOrientation(); owner->SetFacingTo(angle); diff --git a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp index ebe4934f8..4ec46038c 100644 --- a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp @@ -636,7 +636,7 @@ void PathGenerator::CreateFilter() uint16 includeFlags = 0; uint16 excludeFlags = 0; - if (_source->GetTypeId() == TYPEID_UNIT) + if (_source->IsCreature()) { Creature* creature = (Creature*)_source; if (creature->CanWalk()) diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index b3b43a572..e77fd9107 100644 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -231,10 +231,10 @@ bool EffectMovementGenerator::Update(Unit* unit, uint32) void EffectMovementGenerator::Finalize(Unit* unit) { - if (unit->GetTypeId() != TYPEID_UNIT) + if (!unit->IsCreature()) return; - if (unit->GetTypeId() == TYPEID_UNIT && unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING) && unit->movespline->isFalling()) // pussywizard + if (unit->IsCreature() && unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING) && unit->movespline->isFalling()) // pussywizard unit->RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); // Need restore previous movement since we have no proper states system diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 015f93650..4dc2f55bd 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -148,6 +148,15 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) owner->ClearUnitState(UNIT_STATE_CHASE_MOVE); owner->SetInFront(target); MovementInform(owner); + + // Mobs should chase you infinitely if you stop and wait every few seconds. + i_leashExtensionTimer.Update(time_diff); + if (i_leashExtensionTimer.Passed()) + { + i_leashExtensionTimer.Reset(5000); + if (Creature* creature = owner->ToCreature()) + creature->UpdateLeashExtensionTime(); + } } // if the target moved, we have to consider whether to adjust @@ -305,7 +314,7 @@ void ChaseMovementGenerator::DoReset(T* owner) template void ChaseMovementGenerator::MovementInform(T* owner) { - if (owner->GetTypeId() != TYPEID_UNIT) + if (!owner->IsCreature()) return; // Pass back the GUIDLow of the target. If it is pet's owner then PetAI will handle @@ -385,7 +394,7 @@ bool FollowMovementGenerator::PositionOkay(Unit* target, bool isPlayerPet, bo float exactDistSq = target->GetExactDistSq(_lastTargetPosition->GetPositionX(), _lastTargetPosition->GetPositionY(), _lastTargetPosition->GetPositionZ()); float distanceTolerance = 0.25f; // For creatures, increase tolerance - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) { distanceTolerance += _range + _range; } @@ -554,7 +563,7 @@ void FollowMovementGenerator::DoReset(T* owner) template void FollowMovementGenerator::MovementInform(T* owner) { - if (owner->GetTypeId() != TYPEID_UNIT) + if (!owner->IsCreature()) return; // Pass back the GUIDLow of the target. If it is pet's owner then PetAI will handle diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index 41678c471..4e7df89db 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -39,7 +39,7 @@ class ChaseMovementGenerator : public MovementGeneratorMedium range = {}, Optional angle = {}) - : TargetedMovementGeneratorBase(target), i_path(nullptr), i_recheckDistance(0), i_recalculateTravel(true), _range(range), _angle(angle) {} + : TargetedMovementGeneratorBase(target), i_leashExtensionTimer(0), i_path(nullptr), i_recheckDistance(0), i_recalculateTravel(true), _range(range), _angle(angle) {} ~ChaseMovementGenerator() { } MovementGeneratorType GetMovementGeneratorType() { return CHASE_MOTION_TYPE; } @@ -59,6 +59,7 @@ public: bool HasLostTarget(Unit* unit) const { return unit->GetVictim() != this->GetTarget(); } private: + TimeTrackerSmall i_leashExtensionTimer; std::unique_ptr i_path; TimeTrackerSmall i_recheckDistance; bool i_recalculateTravel; diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index faf6cd203..c2f6664b6 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -101,7 +101,9 @@ namespace Movement moveFlags = (moveFlags & ~(MOVEMENTFLAG_FORWARD)) | MOVEMENTFLAG_BACKWARD; } - if (moveFlags & MOVEMENTFLAG_ROOT) + bool isOrientationOnly = args.path.size() == 2 && args.path[0] == args.path[1]; + + if ((moveFlags & MOVEMENTFLAG_ROOT) || isOrientationOnly) moveFlags &= ~MOVEMENTFLAG_MASK_MOVING; if (!args.HasVelocity) diff --git a/src/server/game/Movement/Spline/Spline.cpp b/src/server/game/Movement/Spline/Spline.cpp index 601951a20..59086cc1a 100644 --- a/src/server/game/Movement/Spline/Spline.cpp +++ b/src/server/game/Movement/Spline/Spline.cpp @@ -71,7 +71,7 @@ namespace Movement 1.f, 0.f, 0.f, 0.f); /* classic view: - inline void C_Evaluate(const Vector3 *vertice, float t, const float (&matrix)[4][4], Vector3 &position) + inline void C_Evaluate(Vector3 const* vertice, float t, const float (&matrix)[4][4], Vector3 &position) { Vector3 tvec(t*t*t, t*t, t); int i = 0; diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 44df2047c..2fc354e01 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -513,7 +513,7 @@ void OutdoorPvP::HandleKill(Player* killer, Unit* killed) // creature kills must be notified, even if not inside objective / not outdoor pvp active // player kills only count if active and inside objective - if ((groupGuy->IsOutdoorPvPActive() && IsInsideObjective(groupGuy)) || killed->GetTypeId() == TYPEID_UNIT) + if ((groupGuy->IsOutdoorPvPActive() && IsInsideObjective(groupGuy)) || killed->IsCreature()) { HandleKillImpl(groupGuy, killed); } @@ -522,7 +522,7 @@ void OutdoorPvP::HandleKill(Player* killer, Unit* killed) else { // creature kills must be notified, even if not inside objective / not outdoor pvp active - if ((killer->IsOutdoorPvPActive() && IsInsideObjective(killer)) || killed->GetTypeId() == TYPEID_UNIT) + if ((killer->IsOutdoorPvPActive() && IsInsideObjective(killer)) || killed->IsCreature()) { HandleKillImpl(killer, killed); } diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index fe945d719..ebf2d3daa 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -157,7 +157,7 @@ inline Unit* Map::_GetScriptUnit(Object* obj, bool isSource, const ScriptInfo* s Unit* unit = nullptr; if (!obj) LOG_ERROR("maps.script", "{} {} object is nullptr.", scriptInfo->GetDebugInfo(), isSource ? "source" : "target"); - else if (!obj->isType(TYPEMASK_UNIT)) + else if (!obj->IsUnit()) LOG_ERROR("maps.script", "{} {} object is not unit (TypeId: {}, Entry: {}, GUID: {}), skipping.", scriptInfo->GetDebugInfo(), isSource ? "source" : "target", obj->GetTypeId(), obj->GetEntry(), obj->GetGUID().ToString()); else @@ -236,7 +236,7 @@ inline void Map::_ScriptProcessDoor(Object* source, Object* target, const Script LOG_ERROR("maps.script", "{} door guid is not specified.", scriptInfo->GetDebugInfo()); else if (!source) LOG_ERROR("maps.script", "{} source object is nullptr.", scriptInfo->GetDebugInfo()); - else if (!source->isType(TYPEMASK_UNIT)) + else if (!source->IsUnit()) LOG_ERROR("maps.script", "{} source object is not unit ({}), skipping.", scriptInfo->GetDebugInfo(), source->GetGUID().ToString()); else { @@ -510,7 +510,7 @@ void Map::ScriptsProcess() Player* player = target->ToPlayer(); if (player) { - if (source->GetTypeId() != TYPEID_UNIT && source->GetTypeId() != TYPEID_GAMEOBJECT && source->GetTypeId() != TYPEID_PLAYER) + if (!source->IsCreature() && !source->IsGameObject() && !source->IsPlayer()) { LOG_ERROR("maps.script", "{} source is not unit, gameobject or player ({}), skipping.", step.script->GetDebugInfo(), source->GetGUID().ToString()); break; @@ -522,7 +522,7 @@ void Map::ScriptsProcess() player = source->ToPlayer(); if (player) { - if (target->GetTypeId() != TYPEID_UNIT && target->GetTypeId() != TYPEID_GAMEOBJECT && target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsCreature() && !target->IsGameObject() && !target->IsPlayer()) { LOG_ERROR("maps.script", "{} target is not unit, gameobject or player ({}), skipping.", step.script->GetDebugInfo(), target->GetGUID().ToString()); break; @@ -538,7 +538,7 @@ void Map::ScriptsProcess() } // quest id and flags checked at script loading - if ((worldObject->GetTypeId() != TYPEID_UNIT || ((Unit*)worldObject)->IsAlive()) && + if ((!worldObject->IsCreature() || ((Unit*)worldObject)->IsAlive()) && (step.script->QuestExplored.Distance == 0 || worldObject->IsWithinDistInMap(player, float(step.script->QuestExplored.Distance)))) player->GroupEventHappens(step.script->QuestExplored.QuestID, worldObject); else @@ -641,7 +641,7 @@ void Map::ScriptsProcess() break; } - if (target->GetTypeId() != TYPEID_GAMEOBJECT) + if (!target->IsGameObject()) { LOG_ERROR("maps.script", "{} target object is not gameobject ({}), skipping.", step.script->GetDebugInfo(), target->GetGUID().ToString()); break; @@ -697,13 +697,13 @@ void Map::ScriptsProcess() break; } - if (!uSource || !uSource->isType(TYPEMASK_UNIT)) + if (!uSource || !uSource->IsUnit()) { LOG_ERROR("maps.script", "{} no source unit found for spell {}", step.script->GetDebugInfo(), step.script->CastSpell.SpellID); break; } - if (!uTarget || !uTarget->isType(TYPEMASK_UNIT)) + if (!uTarget || !uTarget->IsUnit()) { LOG_ERROR("maps.script", "{} no target unit found for spell {}", step.script->GetDebugInfo(), step.script->CastSpell.SpellID); break; diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp index fd3a8dcdf..35baeb271 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp @@ -34,6 +34,11 @@ bool ScriptMgr::CanSaveToDB(ArenaTeam* team) CALL_ENABLED_BOOLEAN_HOOKS(ArenaScript, ARENAHOOK_CAN_SAVE_TO_DB, !script->CanSaveToDB(team)); } +bool ScriptMgr::OnBeforeArenaCheckWinConditions(Battleground* const bg) +{ + CALL_ENABLED_BOOLEAN_HOOKS(ArenaScript, ARENAHOOK_ON_BEFORE_CHECK_WIN_CONDITION, !script->OnBeforeArenaCheckWinConditions(bg)); +} + ArenaScript::ArenaScript(const char* name, std::vector enabledHooks) : ScriptObject(name, ARENAHOOK_END) { diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.h b/src/server/game/Scripting/ScriptDefines/ArenaScript.h index bbc18e2b2..c50a96449 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.h +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.h @@ -27,6 +27,7 @@ enum ArenaHook ARENAHOOK_CAN_ADD_MEMBER, ARENAHOOK_ON_GET_POINTS, ARENAHOOK_CAN_SAVE_TO_DB, + ARENAHOOK_ON_BEFORE_CHECK_WIN_CONDITION, ARENAHOOK_END }; @@ -44,6 +45,8 @@ public: virtual void OnGetPoints(ArenaTeam* /*team*/, uint32 /*memberRating*/, float& /*points*/) { } + [[nodiscard]] virtual bool OnBeforeArenaCheckWinConditions(Battleground* const /* bg */) { return true; } + [[nodiscard]] virtual bool CanSaveToDB(ArenaTeam* /*team*/) { return true; } }; diff --git a/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp b/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp index ae58a8cd5..590050f4d 100644 --- a/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp @@ -22,7 +22,7 @@ void ScriptMgr::OnInstall(Vehicle* veh) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) { @@ -33,7 +33,7 @@ void ScriptMgr::OnInstall(Vehicle* veh) void ScriptMgr::OnUninstall(Vehicle* veh) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) { @@ -44,7 +44,7 @@ void ScriptMgr::OnUninstall(Vehicle* veh) void ScriptMgr::OnReset(Vehicle* veh) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) { @@ -55,7 +55,7 @@ void ScriptMgr::OnReset(Vehicle* veh) void ScriptMgr::OnInstallAccessory(Vehicle* veh, Creature* accessory) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); ASSERT(accessory); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) @@ -67,7 +67,7 @@ void ScriptMgr::OnInstallAccessory(Vehicle* veh, Creature* accessory) void ScriptMgr::OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); ASSERT(passenger); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) @@ -79,7 +79,7 @@ void ScriptMgr::OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId) void ScriptMgr::OnRemovePassenger(Vehicle* veh, Unit* passenger) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); ASSERT(passenger); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 91fc1f271..47a6c8669 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -679,6 +679,7 @@ public: /* ArenaScript */ bool CanAddMember(ArenaTeam* team, ObjectGuid PlayerGuid); void OnGetPoints(ArenaTeam* team, uint32 memberRating, float& points); bool CanSaveToDB(ArenaTeam* team); + bool OnBeforeArenaCheckWinConditions(Battleground* const bg); public: /* MiscScript */ diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 92a3021a1..acb108952 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -798,7 +798,7 @@ void AuraEffect::HandleEffect(Unit* target, uint8 mode, bool apply) void AuraEffect::ApplySpellMod(Unit* target, bool apply) { - if (!m_spellmod || target->GetTypeId() != TYPEID_PLAYER) + if (!m_spellmod || !target->IsPlayer()) return; target->ToPlayer()->AddSpellMod(m_spellmod, apply); @@ -951,7 +951,7 @@ void AuraEffect::UpdatePeriodic(Unit* caster) case 49472: // Drink Coffee case 57073: case 61830: - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; // Get SPELL_AURA_MOD_POWER_REGEN aura from spell if (AuraEffect* aurEff = GetBase()->GetEffect(0)) @@ -1712,7 +1712,7 @@ void AuraEffect::HandleDetectAmore(AuraApplication const* aurApp, uint8 mode, bo } Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) { return; } @@ -1744,7 +1744,7 @@ void AuraEffect::HandleSpiritOfRedemption(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // prepare spirit state @@ -1779,7 +1779,7 @@ void AuraEffect::HandleAuraGhost(AuraApplication const* aurApp, uint8 mode, bool Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (apply) @@ -2178,7 +2178,7 @@ void AuraEffect::HandleAuraTransform(AuraApplication const* aurApp, uint8 mode, // Orb of Deception case 16739: { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; switch (target->getRace()) @@ -2237,7 +2237,7 @@ void AuraEffect::HandleAuraTransform(AuraApplication const* aurApp, uint8 mode, // Corsair Costume case 51926: { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; switch (target->getRace()) @@ -2811,7 +2811,7 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (Player* targetPlayer = target->ToPlayer()) @@ -2842,7 +2842,7 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo if ((*iter)->GetCurrentSpell(i) && (*iter)->GetCurrentSpell(i)->m_targets.GetUnitTargetGUID() == target->GetGUID()) { SpellInfo const* si = (*iter)->GetCurrentSpell(i)->GetSpellInfo(); - if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->GetTypeId() == TYPEID_UNIT) + if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->IsCreature()) { Creature* c = (*iter)->ToCreature(); if ((!c->IsPet() && c->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS) || c->isWorldBoss() || c->IsDungeonBoss()) @@ -3009,7 +3009,7 @@ void AuraEffect::HandleAuraModDisarm(AuraApplication const* aurApp, uint8 mode, if (apply) target->SetFlag(field, flag); - if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->GetCurrentEquipmentId()) + if (target->IsCreature() && target->ToCreature()->GetCurrentEquipmentId()) target->UpdateDamagePhysical(attType); } @@ -3112,7 +3112,7 @@ void AuraEffect::HandleAuraTrackCreatures(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (apply) @@ -3128,7 +3128,7 @@ void AuraEffect::HandleAuraTrackResources(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (apply) @@ -3144,7 +3144,7 @@ void AuraEffect::HandleAuraTrackStealthed(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (!(apply)) @@ -3206,7 +3206,7 @@ void AuraEffect::HandleAuraModPetTalentsPoints(AuraApplication const* aurApp, ui Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Recalculate pet talent points @@ -3220,7 +3220,7 @@ void AuraEffect::HandleAuraModSkill(AuraApplication const* aurApp, uint8 mode, b return; Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; uint32 prot = GetMiscValue(); @@ -3318,7 +3318,7 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode target->SetCanFly(apply); - if (!apply && target->GetTypeId() == TYPEID_UNIT && !target->IsLevitating()) + if (!apply && target->IsCreature() && !target->IsLevitating()) target->GetMotionMaster()->MoveFall(); } @@ -3444,7 +3444,7 @@ void AuraEffect::HandleAuraModTotalThreat(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (!target->IsAlive() || target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsAlive() || !target->IsPlayer()) return; Unit* caster = GetCaster(); @@ -3547,7 +3547,7 @@ void AuraEffect::HandleModPossess(AuraApplication const* aurApp, uint8 mode, boo Unit* caster = GetCaster(); // no support for posession AI yet - if (caster && caster->GetTypeId() == TYPEID_UNIT) + if (caster && caster->IsCreature()) { HandleModCharm(aurApp, mode, apply); return; @@ -3567,7 +3567,7 @@ void AuraEffect::HandleModPossessPet(AuraApplication const* aurApp, uint8 mode, return; Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; //seems it may happen that when removing it is no longer owner's pet @@ -3575,7 +3575,7 @@ void AuraEffect::HandleModPossessPet(AuraApplication const* aurApp, uint8 mode, // return; Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT || !target->IsPet()) + if (!target->IsCreature() || !target->IsPet()) return; Pet* pet = target->ToPet(); @@ -3675,7 +3675,7 @@ void AuraEffect::HandleAuraControlVehicle(AuraApplication const* aurApp, uint8 m if (GetId() == 53111) // Devour Humanoid { Unit::Kill(target, caster); - if (caster->GetTypeId() == TYPEID_UNIT) + if (caster->IsCreature()) caster->ToCreature()->RemoveCorpse(); } @@ -3725,7 +3725,7 @@ void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const* aurApp, { target->SetCanFly(apply); - if (!apply && target->GetTypeId() == TYPEID_UNIT && !target->IsLevitating()) + if (!apply && target->IsCreature() && !target->IsLevitating()) target->GetMotionMaster()->MoveFall(); } @@ -4464,8 +4464,8 @@ void AuraEffect::HandleModPercentStat(AuraApplication const* aurApp, uint8 mode, return; } - // only players have base stats - if (target->GetTypeId() != TYPEID_PLAYER) + // only players currently use base stats + if (!target->IsPlayer()) return; for (int32 i = STAT_STRENGTH; i < MAX_STATS; ++i) @@ -4482,7 +4482,7 @@ void AuraEffect::HandleModSpellDamagePercentFromStat(AuraApplication const* aurA Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Magic damage modifiers implemented in Unit::SpellDamageBonus @@ -4498,7 +4498,7 @@ void AuraEffect::HandleModSpellHealingPercentFromStat(AuraApplication const* aur Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Recalculate bonus @@ -4512,7 +4512,7 @@ void AuraEffect::HandleModSpellDamagePercentFromAttackPower(AuraApplication cons Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Magic damage modifiers implemented in Unit::SpellDamageBonus @@ -4528,7 +4528,7 @@ void AuraEffect::HandleModSpellHealingPercentFromAttackPower(AuraApplication con Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Recalculate bonus @@ -4542,7 +4542,7 @@ void AuraEffect::HandleModHealingDone(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // implemented in Unit::SpellHealingBonus // this information is for client side only @@ -4613,7 +4613,7 @@ void AuraEffect::HandleAuraModResistenceOfStatPercent(AuraApplication const* aur Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (GetMiscValue() != SPELL_SCHOOL_MASK_NORMAL) @@ -4635,7 +4635,7 @@ void AuraEffect::HandleAuraModExpertise(AuraApplication const* aurApp, uint8 mod Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->ToPlayer()->UpdateExpertise(BASE_ATTACK); @@ -4652,7 +4652,7 @@ void AuraEffect::HandleModPowerRegen(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Update manaregen value @@ -4675,7 +4675,7 @@ void AuraEffect::HandleModManaRegen(AuraApplication const* aurApp, uint8 mode, b Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; //Note: an increase in regen does NOT cause threat. @@ -4815,7 +4815,7 @@ void AuraEffect::HandleAuraModParryPercent(AuraApplication const* aurApp, uint8 Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (!target->ToPlayer()->CanParry()) @@ -4831,7 +4831,7 @@ void AuraEffect::HandleAuraModDodgePercent(AuraApplication const* aurApp, uint8 Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->ToPlayer()->UpdateDodgePercentage(); @@ -4844,7 +4844,7 @@ void AuraEffect::HandleAuraModBlockPercent(AuraApplication const* aurApp, uint8 Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->ToPlayer()->UpdateBlockPercentage(); @@ -4862,7 +4862,7 @@ void AuraEffect::HandleAuraModWeaponCritPercent(AuraApplication const* aurApp, u Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; for (int i = 0; i < MAX_ATTACK; ++i) @@ -4937,7 +4937,7 @@ void AuraEffect::HandleModSpellCritChanceShool(AuraApplication const* aurApp, ui Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; for (int school = SPELL_SCHOOL_NORMAL; school < MAX_SPELL_SCHOOL; ++school) @@ -4952,7 +4952,7 @@ void AuraEffect::HandleAuraModCritPct(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) { target->m_baseSpellCritChance += (apply) ? GetAmount() : -GetAmount(); return; @@ -5051,7 +5051,7 @@ void AuraEffect::HandleRangedAmmoHaste(AuraApplication const* aurApp, uint8 mode Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->ApplyAttackTimePercentMod(RANGED_ATTACK, (float)GetAmount(), apply); @@ -5068,7 +5068,7 @@ void AuraEffect::HandleModRating(AuraApplication const* aurApp, uint8 mode, bool Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating) @@ -5083,7 +5083,7 @@ void AuraEffect::HandleModRatingFromStat(AuraApplication const* aurApp, uint8 mo Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Just recalculate ratings @@ -5202,7 +5202,7 @@ void AuraEffect::HandleModDamageDone(AuraApplication const* aurApp, uint8 mode, if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) != 0 && sScriptMgr->CanModAuraEffectDamageDone(this, target, aurApp, mode, apply)) { // apply generic physical damage bonuses including wand case - if (GetSpellInfo()->EquippedItemClass == -1 || target->GetTypeId() != TYPEID_PLAYER) + if (GetSpellInfo()->EquippedItemClass == -1 || !target->IsPlayer()) { target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(GetAmount()), apply); target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(GetAmount()), apply); @@ -5279,7 +5279,7 @@ void AuraEffect::HandleModDamagePercentDone(AuraApplication const* aurApp, uint8 target->ToPlayer()->_ApplyWeaponDependentAuraDamageMod(item, WeaponAttackType(i), this, apply); } - if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) && (GetSpellInfo()->EquippedItemClass == -1 || target->GetTypeId() != TYPEID_PLAYER)) + if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) && (GetSpellInfo()->EquippedItemClass == -1 || !target->IsPlayer())) { target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(GetAmount()), apply); target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(GetAmount()), apply); @@ -5373,7 +5373,7 @@ void AuraEffect::HandleNoReagentUseAura(AuraApplication const* aurApp, uint8 mod Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; flag96 mask; @@ -5393,7 +5393,7 @@ void AuraEffect::HandleAuraRetainComboPoints(AuraApplication const* aurApp, uint Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // combo points was added in SPELL_EFFECT_ADD_COMBO_POINTS handler @@ -5609,7 +5609,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool break; case 43681: // Inactive { - if (target->GetTypeId() != TYPEID_PLAYER || aurApp->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + if (!target->IsPlayer() || aurApp->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) return; if (target->GetMap()->IsBattleground()) @@ -5643,7 +5643,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool break; case 46374: // quest The Power of the Elements (11893) { - if (target->isDead() && GetBase() && target->GetTypeId() == TYPEID_UNIT && target->GetEntry() == 24601) + if (target->isDead() && GetBase() && target->IsCreature() && target->GetEntry() == 24601) { auto caster2 = GetBase()->GetCaster(); if (caster2 && caster2->IsPlayer()) @@ -5716,7 +5716,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool case 57821: // Champion of the Kirin Tor case 57822: // Wyrmrest Champion { - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) break; uint32 FactionID = 0; @@ -5860,7 +5860,7 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mod Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; Player* plCaster = caster->ToPlayer(); @@ -5904,7 +5904,7 @@ void AuraEffect::HandleBindSight(AuraApplication const* aurApp, uint8 mode, bool Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; caster->ToPlayer()->SetViewpoint(target, apply); @@ -5918,7 +5918,7 @@ void AuraEffect::HandleFarSight(AuraApplication const* /*aurApp*/, uint8 mode, b } Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) { return; } @@ -5943,7 +5943,7 @@ void AuraEffect::HandleForceReaction(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; Player* player = target->ToPlayer(); @@ -6023,7 +6023,7 @@ void AuraEffect::HandleAuraConvertRune(AuraApplication const* aurApp, uint8 mode Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; Player* player = target->ToPlayer(); @@ -6095,7 +6095,7 @@ void AuraEffect::HandleAuraOpenStable(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER || !target->IsInWorld()) + if (!target->IsPlayer() || !target->IsInWorld()) return; if (apply) @@ -6154,7 +6154,7 @@ void AuraEffect::HandleAuraSetVehicle(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER || !target->IsInWorld()) + if (!target->IsPlayer() || !target->IsInWorld()) return; uint32 vehicleId = GetMiscValue(); @@ -6184,7 +6184,7 @@ void AuraEffect::HandlePreventResurrection(AuraApplication const* aurApp, uint8 if (!(mode & AURA_EFFECT_HANDLE_REAL)) return; - if (aurApp->GetTarget()->GetTypeId() != TYPEID_PLAYER) + if (!aurApp->GetTarget()->IsPlayer()) return; if (apply) @@ -6270,7 +6270,7 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const // Death Rune Mastery if (GetSpellInfo()->SpellIconID == 3041 || GetSpellInfo()->SpellIconID == 22 || GetSpellInfo()->SpellIconID == 2622) { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (!target->ToPlayer()->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) return; @@ -6355,7 +6355,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) return; // Inoculate Nestlewood Owlkin case 29528: - if (target->GetTypeId() != TYPEID_UNIT) // prevent error reports in case ignored player target + if (!target->IsCreature()) // prevent error reports in case ignored player target return; break; // Feed Captured Animal @@ -6367,7 +6367,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) { // move loot to player inventory and despawn target if (caster && caster->IsPlayer() && - target->GetTypeId() == TYPEID_UNIT && + target->IsCreature() && target->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_GAS_CLOUD) { Player* player = caster->ToPlayer(); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 051c30310..0a4e6e7c4 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -380,7 +380,7 @@ Aura* Aura::Create(SpellInfo const* spellproto, uint8 effMask, WorldObject* owne casterGUID = caster->GetGUID(); // check if aura can be owned by owner - if (owner->isType(TYPEMASK_UNIT)) + if (owner->IsUnit()) if (!owner->IsInWorld() || ((Unit*)owner)->IsDuringRemoveFromWorld()) // owner not in world so don't allow to own not self casted single target auras if (casterGUID != owner->GetGUID() && spellproto->IsSingleTarget()) @@ -1789,7 +1789,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b { if (removeMode != AURA_REMOVE_BY_EXPIRE) break; - if (caster->GetTypeId() != TYPEID_PLAYER) + if (!caster->IsPlayer()) break; Player* player = caster->ToPlayer(); @@ -1860,7 +1860,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b { if (!GetEffect(0) || GetEffect(0)->GetAuraType() != SPELL_AURA_PERIODIC_DUMMY) break; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) break; if (!target->ToPlayer()->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) break; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 2498fe402..56b585487 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -55,6 +55,7 @@ #include "Vehicle.h" #include "World.h" #include "WorldPacket.h" +#include /// @todo: this import is not necessary for compilation and marked as unused by the IDE // however, for some reasons removing it would cause a damn linking issue @@ -742,7 +743,7 @@ void Spell::InitExplicitTargets(SpellCastTargets const& targets) unit = selectedUnit; } // try to use attacked unit as a target - else if ((m_caster->GetTypeId() == TYPEID_UNIT) && neededTargets & (TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT)) + else if ((m_caster->IsCreature()) && neededTargets & (TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT)) unit = m_caster->GetVictim(); // didn't find anything - let's use self as target @@ -900,7 +901,7 @@ uint64 Spell::CalculateDelayMomentForDst() const { float speed = m_targets.GetSpeedXY(); if (speed > 0.0f) - return (uint64)floor(m_targets.GetDist2d() / speed * 1000.0f); + return (uint64)std::floor(m_targets.GetDist2d() / speed * 1000.0f); } else if (m_spellInfo->Speed > 0.0f) { @@ -1441,7 +1442,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici bool inwater = false; bool wcol = false; const float step = 2.0f; - const uint8 numChecks = ceil(fabs(distance / step)); + const uint8 numChecks = std::ceil(std::fabs(distance / step)); const float DELTA_X = (destx - pos.GetPositionX()) / numChecks; const float DELTA_Y = (desty - pos.GetPositionY()) / numChecks; int j = 1; @@ -1787,7 +1788,7 @@ void Spell::SelectImplicitCasterObjectTargets(SpellEffIndex effIndex, SpellImpli case TARGET_UNIT_PASSENGER_5: case TARGET_UNIT_PASSENGER_6: case TARGET_UNIT_PASSENGER_7: - if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsVehicle()) + if (m_caster->IsCreature() && m_caster->ToCreature()->IsVehicle()) target = m_caster->GetVehicleKit()->GetPassenger(targetType.GetTarget() - TARGET_UNIT_PASSENGER_0); break; default: @@ -2364,7 +2365,7 @@ void Spell::prepareDataForTriggerSystem(AuraEffect const* /*triggeredByAura*/) m_procEx |= PROC_EX_INTERNAL_TRIGGERED; } // Totem casts require spellfamilymask defined in spell_proc_event to proc - if (m_originalCaster && m_caster != m_originalCaster && m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsTotem() && m_caster->IsControlledByPlayer()) + if (m_originalCaster && m_caster != m_originalCaster && m_caster->IsCreature() && m_caster->ToCreature()->IsTotem() && m_caster->IsControlledByPlayer()) m_procEx |= PROC_EX_INTERNAL_REQ_FAMILY; } @@ -2462,7 +2463,7 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= if (dist < 5.0f) dist = 5.0f; - targetInfo.timeDelay = (uint64) floor(dist / m_spellInfo->Speed * 1000.0f); + targetInfo.timeDelay = (uint64) std::floor(dist / m_spellInfo->Speed * 1000.0f); // Calculate minimum incoming time if (m_delayMoment == 0 || m_delayMoment > targetInfo.timeDelay) @@ -2561,7 +2562,7 @@ void Spell::AddGOTarget(GameObject* go, uint32 effectMask) float dist = m_caster->GetDistance(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()); if (dist < 5.0f) dist = 5.0f; - target.timeDelay = uint64(floor(dist / m_spellInfo->Speed * 1000.0f)); + target.timeDelay = uint64(std::floor(dist / m_spellInfo->Speed * 1000.0f)); if (m_delayMoment == 0 || m_delayMoment > target.timeDelay) m_delayMoment = target.timeDelay; } @@ -2691,7 +2692,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) { spellHitTarget = m_caster; unitTarget = m_caster; - if (m_caster->GetTypeId() == TYPEID_UNIT) + if (m_caster->IsCreature()) m_caster->ToCreature()->LowerPlayerDamageReq(target->damage); } } @@ -2918,7 +2919,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) } // Failed Pickpocket, reveal rogue - if (missInfo == SPELL_MISS_RESIST && m_spellInfo->HasAttribute(SPELL_ATTR0_CU_PICKPOCKET) && unitTarget->GetTypeId() == TYPEID_UNIT && m_caster) + if (missInfo == SPELL_MISS_RESIST && m_spellInfo->HasAttribute(SPELL_ATTR0_CU_PICKPOCKET) && unitTarget->IsCreature() && m_caster) { m_caster->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK); if (unitTarget->ToCreature()->IsAIEnabled) @@ -2964,19 +2965,19 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) } // Check for SPELL_ATTR7_CAN_CAUSE_INTERRUPT - if (m_spellInfo->HasAttribute(SPELL_ATTR7_CAN_CAUSE_INTERRUPT) && effectUnit->GetTypeId() != TYPEID_PLAYER) + if (m_spellInfo->HasAttribute(SPELL_ATTR7_CAN_CAUSE_INTERRUPT) && !effectUnit->IsPlayer()) caster->CastSpell(effectUnit, SPELL_INTERRUPT_NONPLAYER, true); if (spellHitTarget) { //AI functions - if (spellHitTarget->GetTypeId() == TYPEID_UNIT) + if (spellHitTarget->IsCreature()) { if (spellHitTarget->ToCreature()->IsAIEnabled) spellHitTarget->ToCreature()->AI()->SpellHit(m_caster, m_spellInfo); } - if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsAIEnabled) + if (m_caster->IsCreature() && m_caster->ToCreature()->IsAIEnabled) m_caster->ToCreature()->AI()->SpellHitTarget(spellHitTarget, m_spellInfo); // Needs to be called after dealing damage/healing to not remove breaking on damage auras @@ -3052,7 +3053,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA // Xinef: Also check evade state if (m_spellInfo->Speed > 0.0f) { - if (unit->GetTypeId() == TYPEID_UNIT && unit->ToCreature()->IsInEvadeMode()) + if (unit->IsCreature() && unit->ToCreature()->IsInEvadeMode()) return SPELL_MISS_EVADE; if (unit->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE) && unit->GetCharmerOrOwnerGUID() != m_caster->GetGUID()) @@ -3100,12 +3101,12 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA // Xinef: Do not increase diminishing level for self cast m_diminishGroup = GetDiminishingReturnsGroupForSpell(m_spellInfo, m_triggeredByAuraSpell.spellInfo); // xinef: do not increase diminish level for bosses (eg. Void Reaver silence is never diminished) - if (((m_spellFlags & SPELL_FLAG_REFLECTED) && !(unit->HasAuraType(SPELL_AURA_REFLECT_SPELLS))) || (aura_effmask && m_diminishGroup && unit != m_caster && (m_caster->GetTypeId() != TYPEID_UNIT || !m_caster->ToCreature()->isWorldBoss()))) + if (((m_spellFlags & SPELL_FLAG_REFLECTED) && !(unit->HasAuraType(SPELL_AURA_REFLECT_SPELLS))) || (aura_effmask && m_diminishGroup && unit != m_caster && (!m_caster->IsCreature() || !m_caster->ToCreature()->isWorldBoss()))) { m_diminishLevel = unit->GetDiminishing(m_diminishGroup); DiminishingReturnsType type = GetDiminishingReturnsGroupType(m_diminishGroup); - uint32 flagsExtra = unit->GetTypeId() == TYPEID_UNIT ? unit->ToCreature()->GetCreatureTemplate()->flags_extra : 0; + uint32 flagsExtra = unit->IsCreature() ? unit->ToCreature()->GetCreatureTemplate()->flags_extra : 0; // Increase Diminishing on unit, current informations for actually casts will use values above if ((type == DRTYPE_PLAYER && (unit->IsCharmedOwnedByPlayerOrPlayer() || flagsExtra & CREATURE_FLAG_EXTRA_ALL_DIMINISH || @@ -3684,7 +3685,7 @@ SpellCastResult Spell::prepare(SpellCastTargets const* targets, AuraEffect const // set target for proper facing if ((m_casttime || m_spellInfo->IsChanneled()) && !HasTriggeredCastFlag(TRIGGERED_IGNORE_SET_FACING)) { - if (m_caster->GetTypeId() == TYPEID_UNIT && !m_caster->ToCreature()->IsInEvadeMode() && + if (m_caster->IsCreature() && !m_caster->ToCreature()->IsInEvadeMode() && ((m_targets.GetObjectTarget() && m_caster != m_targets.GetObjectTarget()) || m_spellInfo->IsPositive())) { // Xinef: Creature should focus to cast target if there is explicit target or self if casting positive spell @@ -3837,14 +3838,14 @@ void Spell::_cast(bool skipCheck) if (!playerCaster->m_Controlled.empty()) for (Unit::ControlSet::iterator itr = playerCaster->m_Controlled.begin(); itr != playerCaster->m_Controlled.end(); ++itr) if (Unit* pet = *itr) - if (pet->IsAlive() && pet->GetTypeId() == TYPEID_UNIT) + if (pet->IsAlive() && pet->IsCreature()) pet->ToCreature()->AI()->OwnerAttacked(m_targets.GetUnitTarget()); } SetExecutedCurrently(true); if (!HasTriggeredCastFlag(TRIGGERED_IGNORE_SET_FACING)) - if (m_caster->GetTypeId() == TYPEID_UNIT && m_targets.GetObjectTarget() && m_caster != m_targets.GetObjectTarget()) + if (m_caster->IsCreature() && m_targets.GetObjectTarget() && m_caster != m_targets.GetObjectTarget()) m_caster->SetInFront(m_targets.GetObjectTarget()); CallScriptBeforeCastHandlers(); @@ -4086,7 +4087,7 @@ void Spell::_cast(bool skipCheck) // handle this here, in other places SpellHitTarget can be set to nullptr, if there is an error in this function if (m_spellInfo->HasAttribute(SPELL_ATTR7_CAN_CAUSE_INTERRUPT)) if (Unit* target = m_targets.GetUnitTarget()) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) m_caster->CastSpell(target, 32747, true); // xinef: start combat at cast for delayed spells, only for explicit target @@ -4345,7 +4346,7 @@ void Spell::_handle_finish_phase() void Spell::SendSpellCooldown() { // xinef: properly add creature cooldowns - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) { if (!HasTriggeredCastFlag(TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD)) { @@ -4488,7 +4489,7 @@ void Spell::finish(bool ok) if (m_spellInfo->IsChanneled() && m_caster->IsPlayer()) { if (Unit* charm = m_caster->GetCharm()) - if (charm->GetTypeId() == TYPEID_UNIT + if (charm->IsCreature() && charm->ToCreature()->HasUnitTypeMask(UNIT_MASK_PUPPET) && charm->GetUInt32Value(UNIT_CREATED_BY_SPELL) == m_spellInfo->Id) ((Puppet*)charm)->UnSummon(); @@ -4520,7 +4521,7 @@ void Spell::finish(bool ok) if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_ENCOUNTER_REWARD) && m_caster->FindMap()) m_caster->FindMap()->UpdateEncounterState(ENCOUNTER_CREDIT_CAST_SPELL, m_spellInfo->Id, m_caster); - if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsSummon()) + if (m_caster->IsCreature() && m_caster->ToCreature()->IsSummon()) { // Unsummon statue uint32 spell = m_caster->GetUInt32Value(UNIT_CREATED_BY_SPELL); @@ -4672,7 +4673,7 @@ void Spell::SendCastResult(SpellCastResult result) if (result == SPELL_CAST_OK) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER || m_caster->IsCharmed()) + if (!m_caster->IsPlayer() || m_caster->IsCharmed()) return; if (m_caster->ToPlayer()->GetSession()->PlayerLoading()) // don't send cast results at loading time @@ -5241,7 +5242,7 @@ void Spell::SendResurrectRequest(Player* target) void Spell::TakeCastItem() { - if (!m_CastItem || m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_CastItem || !m_caster->IsPlayer()) return; // not remove cast item at triggered spell (equipping, weapon damage, etc) @@ -5400,7 +5401,7 @@ SpellCastResult Spell::CheckRuneCost(uint32 RuneCostID) if (m_spellInfo->PowerType != POWER_RUNE || !RuneCostID) return SPELL_CAST_OK; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_CAST_OK; Player* player = m_caster->ToPlayer(); @@ -5451,7 +5452,7 @@ SpellCastResult Spell::CheckRuneCost(uint32 RuneCostID) void Spell::TakeRunePower(bool didHit) { - if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_caster->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) + if (!m_caster->IsPlayer() || !m_caster->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) return; SpellRuneCostEntry const* runeCostData = sSpellRuneCostStore.LookupEntry(m_spellInfo->RuneCostID); @@ -5520,13 +5521,13 @@ void Spell::TakeRunePower(bool didHit) void Spell::TakeReagents() { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; ItemTemplate const* castItemTemplate = m_CastItem ? m_CastItem->GetTemplate() : nullptr; // do not take reagents for these item casts - if (castItemTemplate && castItemTemplate->Flags & ITEM_FLAG_NO_REAGENT_COST) + if (castItemTemplate && castItemTemplate->HasFlag(ITEM_FLAG_NO_REAGENT_COST)) return; Player* p_caster = m_caster->ToPlayer(); @@ -5679,7 +5680,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->ToPlayer()->GetLastPotionId() && m_CastItem && (m_CastItem->IsPotion() || m_spellInfo->IsCooldownStartedOnEvent())) return SPELL_FAILED_NOT_READY; } - else if (!IsTriggered() && m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsSpellProhibited(m_spellInfo->GetSchoolMask())) + else if (!IsTriggered() && m_caster->IsCreature() && m_caster->ToCreature()->IsSpellProhibited(m_spellInfo->GetSchoolMask())) return SPELL_FAILED_NOT_READY; } @@ -5986,7 +5987,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_NOT_IN_ARENA; // zone check - if (m_caster->GetTypeId() == TYPEID_UNIT || !m_caster->ToPlayer()->IsGameMaster()) + if (m_caster->IsCreature() || !m_caster->ToPlayer()->IsGameMaster()) { uint32 zone, area; m_caster->GetZoneAndAreaId(zone, area); @@ -6113,7 +6114,7 @@ SpellCastResult Spell::CheckCast(bool strict) { case SPELL_EFFECT_LEARN_SPELL: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; if (m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_PET) @@ -6139,7 +6140,7 @@ SpellCastResult Spell::CheckCast(bool strict) // check target only for unit target case if (Unit* unitTarget = m_targets.GetUnitTarget()) { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; Pet* pet = unitTarget->ToPet(); @@ -6166,7 +6167,7 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_FEED_PET: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; Item* foodItem = m_targets.GetItemTarget(); @@ -6259,7 +6260,7 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_SKINNING: { - if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_targets.GetUnitTarget() || m_targets.GetUnitTarget()->GetTypeId() != TYPEID_UNIT) + if (!m_caster->IsPlayer() || !m_targets.GetUnitTarget() || !m_targets.GetUnitTarget()->IsCreature()) return SPELL_FAILED_BAD_TARGETS; if (!(m_targets.GetUnitTarget()->GetUnitFlags() & UNIT_FLAG_SKINNABLE)) @@ -6285,7 +6286,7 @@ SpellCastResult Spell::CheckCast(bool strict) m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_GAMEOBJECT_ITEM_TARGET) break; - if (m_caster->GetTypeId() != TYPEID_PLAYER // only players can open locks, gather etc. + if (!m_caster->IsPlayer() // only players can open locks, gather etc. // we need a go target in case of TARGET_GAMEOBJECT_TARGET || (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_TARGET && !m_targets.GetGOTarget())) return SPELL_FAILED_BAD_TARGETS; @@ -6409,7 +6410,7 @@ SpellCastResult Spell::CheckCast(bool strict) { if (m_targets.GetUnitTarget()) { - if (m_targets.GetUnitTarget()->GetTypeId() != TYPEID_PLAYER) + if (!m_targets.GetUnitTarget()->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; if (m_targets.GetUnitTarget()->GetPetGUID()) return SPELL_FAILED_ALREADY_HAVE_SUMMON; @@ -6471,7 +6472,7 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_SUMMON_PLAYER: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; if (!m_caster->GetTarget()) return SPELL_FAILED_BAD_TARGETS; @@ -6506,7 +6507,7 @@ SpellCastResult Spell::CheckCast(bool strict) // RETURN HERE case SPELL_EFFECT_SUMMON_RAF_FRIEND: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; Player* playerCaster = m_caster->ToPlayer(); @@ -6601,7 +6602,7 @@ SpellCastResult Spell::CheckCast(bool strict) break; case SPELL_AURA_MOD_POSSESS_PET: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_NO_PET; Pet* pet = m_caster->ToPlayer()->GetPet(); @@ -6636,7 +6637,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (Unit* target = m_targets.GetUnitTarget()) { - if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsVehicle()) + if (target->IsCreature() && target->ToCreature()->IsVehicle()) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; if (target->IsMounted()) @@ -6718,7 +6719,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_spellInfo->Effects[i].IsTargetingArea()) break; - if (m_caster->GetTypeId() != TYPEID_PLAYER || m_CastItem) + if (!m_caster->IsPlayer() || m_CastItem) break; if (!m_targets.GetUnitTarget()) @@ -6756,7 +6757,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_CastItem) return SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_NOT_TRADING; TradeData* my_trade = m_caster->ToPlayer()->GetTradeData(); @@ -7057,7 +7058,7 @@ SpellCastResult Spell::CheckRange(bool strict) float min_range = m_caster->GetSpellMinRangeForTarget(target, m_spellInfo); // xinef: hack for npc shooters - if (min_range && GetCaster()->GetTypeId() == TYPEID_UNIT && !GetCaster()->GetOwnerGUID().IsPlayer() && min_range <= 6.0f) + if (min_range && GetCaster()->IsCreature() && !GetCaster()->GetOwnerGUID().IsPlayer() && min_range <= 6.0f) range_type = SPELL_RANGE_RANGED; if (Player* modOwner = m_caster->GetSpellModOwner()) @@ -7075,7 +7076,7 @@ SpellCastResult Spell::CheckRange(bool strict) if (range_type == SPELL_RANGE_MELEE) { float real_max_range = max_range; - if (m_caster->GetTypeId() != TYPEID_UNIT && m_caster->isMoving() && target->isMoving() && !m_caster->IsWalking() && !target->IsWalking()) + if (!m_caster->IsCreature() && m_caster->isMoving() && target->isMoving() && !m_caster->IsWalking() && !target->IsWalking()) real_max_range -= MIN_MELEE_REACH; // Because of lag, we can not check too strictly here (is only used if both caster and target are moving) else real_max_range -= 2 * MIN_MELEE_REACH; @@ -7254,7 +7255,7 @@ SpellCastResult Spell::CheckItems() // check target item if (m_targets.GetItemTargetGUID()) { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; if (!m_targets.GetItemTarget()) @@ -7273,7 +7274,7 @@ SpellCastResult Spell::CheckItems() } // do not take reagents for these item casts - if (!(m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_FLAG_NO_REAGENT_COST)) + if (!(m_CastItem && m_CastItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_REAGENT_COST))) { bool checkReagents = !HasTriggeredCastFlag(TRIGGERED_IGNORE_POWER_AND_REAGENT_COST) && !player->CanNoReagentCast(m_spellInfo); // Not own traded item (in trader trade slot) requires reagents even if triggered spell @@ -7427,7 +7428,7 @@ SpellCastResult Spell::CheckItems() if (m_targets.GetItemTarget()->GetOwner() != m_caster) return SPELL_FAILED_NOT_TRADEABLE; // do not allow to enchant vellum from scroll made by vellum-prevent exploit - if (m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_FLAG_NO_REAGENT_COST) + if (m_CastItem && m_CastItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_REAGENT_COST)) return SPELL_FAILED_TOTEM_CATEGORY; ItemPosCountVec dest; InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, m_spellInfo->Effects[i].ItemType, 1); @@ -7561,7 +7562,7 @@ SpellCastResult Spell::CheckItems() if (!m_targets.GetItemTarget()) return SPELL_FAILED_CANT_BE_PROSPECTED; //ensure item is a prospectable ore - if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_FLAG_IS_PROSPECTABLE)) + if (!(m_targets.GetItemTarget()->GetTemplate()->HasFlag(ITEM_FLAG_IS_PROSPECTABLE))) return SPELL_FAILED_CANT_BE_PROSPECTED; //prevent prospecting in trade slot if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) @@ -7584,7 +7585,7 @@ SpellCastResult Spell::CheckItems() if (!m_targets.GetItemTarget()) return SPELL_FAILED_CANT_BE_MILLED; //ensure item is a millable herb - if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_FLAG_IS_MILLABLE)) + if (!(m_targets.GetItemTarget()->GetTemplate()->HasFlag(ITEM_FLAG_IS_MILLABLE))) return SPELL_FAILED_CANT_BE_MILLED; //prevent milling in trade slot if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) @@ -7605,7 +7606,7 @@ SpellCastResult Spell::CheckItems() case SPELL_EFFECT_WEAPON_DAMAGE: case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_TARGET_NOT_PLAYER; if (m_attackType != RANGED_ATTACK) @@ -7759,7 +7760,7 @@ SpellCastResult Spell::CheckSpellFocus() void Spell::Delayed() // only called in DealDamage() { - if (!m_caster)// || m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster)// || !m_caster->IsPlayer()) return; //if (m_spellState == SPELL_STATE_DELAYED) @@ -7804,7 +7805,7 @@ void Spell::Delayed() // only called in DealDamage() void Spell::DelayedChannel() { - if (!m_caster || m_caster->GetTypeId() != TYPEID_PLAYER || getState() != SPELL_STATE_CASTING) + if (!m_caster || !m_caster->IsPlayer() || getState() != SPELL_STATE_CASTING) return; if (isDelayableNoMore()) // Spells may only be delayed twice @@ -7918,7 +7919,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff) const case SPELL_AURA_MOD_CHARM: case SPELL_AURA_MOD_POSSESS_PET: case SPELL_AURA_AOE_CHARM: - if (target->GetTypeId() == TYPEID_UNIT && target->IsVehicle()) + if (target->IsCreature() && target->IsVehicle()) return false; if (target->IsMounted()) return false; @@ -7934,7 +7935,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff) const // xinef: skip los checking if spell has appropriate attribute, or target requires specific entry // this is only for target addition and target has to have unselectable flag, this is valid for FLAG_EXTRA_TRIGGER and quest triggers however there are some without this flag, used not_selectable - if (m_spellInfo->HasAttribute(SPELL_ATTR2_IGNORE_LINE_OF_SIGHT) || (target->GetTypeId() == TYPEID_UNIT && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE) && (m_spellInfo->Effects[eff].TargetA.GetCheckType() == TARGET_CHECK_ENTRY || m_spellInfo->Effects[eff].TargetB.GetCheckType() == TARGET_CHECK_ENTRY))) + if (m_spellInfo->HasAttribute(SPELL_ATTR2_IGNORE_LINE_OF_SIGHT) || (target->IsCreature() && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE) && (m_spellInfo->Effects[eff].TargetA.GetCheckType() == TARGET_CHECK_ENTRY || m_spellInfo->Effects[eff].TargetB.GetCheckType() == TARGET_CHECK_ENTRY))) return true; // if spell is triggered, need to check for LOS disable on the aura triggering it and inherit that behaviour @@ -7991,7 +7992,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff) const } break; case SPELL_EFFECT_SUMMON_RAF_FRIEND: - if (m_caster->GetTypeId() != TYPEID_PLAYER || target->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer() || !target->IsPlayer()) return false; if (m_caster->ToPlayer()->GetSession()->IsARecruiter() && target->ToPlayer()->GetSession()->GetRecruiterId() != m_caster->ToPlayer()->GetSession()->GetAccountId()) return false; @@ -8384,7 +8385,7 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk reqSkillValue = lockInfo->Skill[j]; // castitem check: rogue using skeleton keys. the skill values should not be added in this case. - skillValue = m_CastItem || m_caster->GetTypeId() != TYPEID_PLAYER ? + skillValue = m_CastItem || !m_caster->IsPlayer() ? 0 : m_caster->ToPlayer()->GetSkillValue(skillId); // skill bonus provided by casting spell (mostly item spells) @@ -9034,14 +9035,14 @@ namespace Acore bool WorldObjectSpellAreaTargetCheck::operator()(WorldObject* target) { - if (target->GetTypeId() == TYPEID_GAMEOBJECT) + if (target->IsGameObject()) { if (!target->ToGameObject()->IsInRange(_position->GetPositionX(), _position->GetPositionY(), _position->GetPositionZ(), _range)) return false; } else if (!target->IsWithinDist3d(_position, _range)) return false; - else if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsAvoidingAOE()) // pussywizard + else if (target->IsCreature() && target->ToCreature()->IsAvoidingAOE()) // pussywizard return false; return WorldObjectSpellTargetCheck::operator ()(target); } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 2a3d7b008..aab419f79 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -257,7 +257,7 @@ void Spell::EffectResurrectNew(SpellEffIndex effIndex) if (!unitTarget || unitTarget->IsAlive()) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) return; if (!unitTarget->IsInWorld()) @@ -435,7 +435,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) // Shadow Bite else if (m_spellInfo->SpellFamilyFlags[1] & 0x400000) { - if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->IsPet()) + if (m_caster->IsCreature() && m_caster->IsPet()) { if (Player* owner = m_caster->GetOwner()->ToPlayer()) { @@ -776,7 +776,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) { sScriptMgr->OnDummyEffect(m_caster, m_spellInfo->Id, effIndex, gameObjTarget); } - else if (unitTarget && unitTarget->GetTypeId() == TYPEID_UNIT) + else if (unitTarget && unitTarget->IsCreature()) { sScriptMgr->OnDummyEffect(m_caster, m_spellInfo->Id, effIndex, unitTarget->ToCreature()); } @@ -2065,7 +2065,7 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) { LOG_DEBUG("spells.aura", "WORLD: Open Lock - No Player Caster!"); return; @@ -2182,7 +2182,7 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* player = m_caster->ToPlayer(); @@ -2291,7 +2291,7 @@ void Spell::EffectProficiency(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_target = m_caster->ToPlayer(); @@ -2524,7 +2524,7 @@ void Spell::EffectLearnSpell(SpellEffIndex effIndex) if (!unitTarget) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) { if (unitTarget->ToPet()) EffectLearnPetSpell(effIndex); @@ -2677,7 +2677,7 @@ void Spell::EffectDistract(SpellEffIndex /*effIndex*/) if (unitTarget->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING)) return; - unitTarget->SetFacingTo(unitTarget->GetAngle(destTarget)); /// @BUG Causes the player to stop moving + interrupts spellcast. + unitTarget->SetFacingTo(unitTarget->GetAngle(destTarget)); /// @BUG Causes the player to stop moving. unitTarget->GetMotionMaster()->MoveDistract(damage * IN_MILLISECONDS); } @@ -2686,7 +2686,7 @@ void Spell::EffectPickPocket(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; m_caster->ToPlayer()->SendLoot(unitTarget->GetGUID(), LOOT_PICKPOCKETING); @@ -2697,7 +2697,7 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; float radius = m_spellInfo->Effects[effIndex].CalcRadius(); @@ -2751,7 +2751,7 @@ void Spell::EffectLearnSkill(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) return; if (damage < 0) @@ -2767,7 +2767,7 @@ void Spell::EffectAddHonor(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) return; // not scale value for item based reward (/10 value expected) @@ -2801,7 +2801,7 @@ void Spell::EffectTradeSkill(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; // uint32 skillid = m_spellInfo->Effects[i].MiscValue; // uint16 skillmax = unitTarget->ToPlayer()->(skillid); @@ -2813,7 +2813,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; if (!itemTarget) return; @@ -2835,7 +2835,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) else { // do not increase skill if vellum used - if (!(m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_FLAG_NO_REAGENT_COST)) + if (!(m_CastItem && m_CastItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_REAGENT_COST))) p_caster->UpdateCraftSkill(m_spellInfo->Id); uint32 enchant_id = m_spellInfo->Effects[effIndex].MiscValue; @@ -2869,7 +2869,7 @@ void Spell::EffectEnchantItemPrismatic(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; if (!itemTarget) return; @@ -2923,7 +2923,7 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_caster = m_caster->ToPlayer(); @@ -3070,7 +3070,7 @@ void Spell::EffectTameCreature(SpellEffIndex /*effIndex*/) if (!unitTarget) return; - if (unitTarget->GetTypeId() != TYPEID_UNIT) + if (!unitTarget->IsCreature()) return; Creature* creatureTarget = unitTarget->ToCreature(); @@ -3199,7 +3199,7 @@ void Spell::EffectSummonPet(SpellEffIndex effIndex) if (!pet) return; - if (m_caster->GetTypeId() == TYPEID_UNIT) + if (m_caster->IsCreature()) { if (m_caster->ToCreature()->IsTotem()) pet->SetReactState(REACT_AGGRESSIVE); @@ -3831,7 +3831,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) /*// Mug Transformation case 41931: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; uint8 bag = 19; @@ -3874,12 +3874,12 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) } case 52173: // Coyote Spirit Despawn case 60243: // Blood Parrot Despawn - if (unitTarget->GetTypeId() == TYPEID_UNIT && unitTarget->ToCreature()->IsSummon()) + if (unitTarget->IsCreature() && unitTarget->ToCreature()->IsSummon()) unitTarget->ToTempSummon()->UnSummon(); return; case 57347: // Retrieving (Wintergrasp RP-GG pickup spell) { - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT || m_caster->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget || !unitTarget->IsCreature() || !m_caster->IsPlayer()) return; unitTarget->ToCreature()->DespawnOrUnsummon(); @@ -3888,7 +3888,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) } case 57349: // Drop RP-GG (Wintergrasp RP-GG at death drop spell) { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; // Delete item from inventory at death @@ -3899,7 +3899,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) case 58418: // Portal to Orgrimmar case 58420: // Portal to Stormwind { - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER || effIndex != 0) + if (!unitTarget || !unitTarget->IsPlayer() || effIndex != 0) return; uint32 spellID = m_spellInfo->Effects[EFFECT_0].CalcValue(); @@ -4041,7 +4041,7 @@ void Spell::EffectSanctuary(SpellEffIndex /*effIndex*/) if ((*iter)->GetCurrentSpell(i) && (*iter)->GetCurrentSpell(i)->m_targets.GetUnitTargetGUID() == unitTarget->GetGUID()) { SpellInfo const* si = (*iter)->GetCurrentSpell(i)->GetSpellInfo(); - if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->GetTypeId() == TYPEID_UNIT) + if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->IsCreature()) { Creature* c = (*iter)->ToCreature(); if ((!c->IsPet() && c->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS) || c->isWorldBoss() || c->IsDungeonBoss()) @@ -4085,7 +4085,7 @@ void Spell::EffectDuel(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || m_caster->GetTypeId() != TYPEID_PLAYER || unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget || !m_caster->IsPlayer() || !unitTarget->IsPlayer()) return; Player* caster = m_caster->ToPlayer(); @@ -4161,7 +4161,7 @@ void Spell::EffectStuck(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* target = m_caster->ToPlayer(); @@ -4311,7 +4311,7 @@ void Spell::EffectApplyGlyph(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER || m_glyphIndex >= MAX_GLYPH_SLOT_INDEX) + if (!m_caster->IsPlayer() || m_glyphIndex >= MAX_GLYPH_SLOT_INDEX) return; Player* player = m_caster->ToPlayer(); @@ -4770,7 +4770,7 @@ void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) // xinef: we should also force pets to remove us from current target Unit::AttackerSet attackerSet; for (Unit::AttackerSet::const_iterator itr = m_caster->getAttackers().begin(); itr != m_caster->getAttackers().end(); ++itr) - if ((*itr)->GetTypeId() == TYPEID_UNIT && !(*itr)->CanHaveThreatList()) + if ((*itr)->IsCreature() && !(*itr)->CanHaveThreatList()) attackerSet.insert(*itr); for (Unit::AttackerSet::const_iterator itr = attackerSet.begin(); itr != attackerSet.end(); ++itr) @@ -4801,7 +4801,7 @@ void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) if (spell->m_targets.GetUnitTargetGUID() == m_caster->GetGUID()) { SpellInfo const* si = spell->GetSpellInfo(); - if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->GetTypeId() == TYPEID_UNIT) + if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->IsCreature()) { Creature* c = (*iter)->ToCreature(); if ((!c->IsPet() && c->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS) || c->isWorldBoss() || c->IsDungeonBoss()) @@ -4832,7 +4832,7 @@ void Spell::EffectSelfResurrect(SpellEffIndex effIndex) if (!m_caster || m_caster->IsAlive()) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; if (!m_caster->IsInWorld()) return; @@ -4870,9 +4870,9 @@ void Spell::EffectSkinning(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (unitTarget->GetTypeId() != TYPEID_UNIT) + if (!unitTarget->IsCreature()) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Creature* creature = unitTarget->ToCreature(); @@ -5472,11 +5472,11 @@ void Spell::EffectProspecting(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_caster = m_caster->ToPlayer(); - if (!itemTarget || !(itemTarget->GetTemplate()->Flags & ITEM_FLAG_IS_PROSPECTABLE)) + if (!itemTarget || !itemTarget->GetTemplate()->HasFlag(ITEM_FLAG_IS_PROSPECTABLE)) return; if (itemTarget->GetCount() < 5) @@ -5497,11 +5497,11 @@ void Spell::EffectMilling(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_caster = m_caster->ToPlayer(); - if (!itemTarget || !(itemTarget->GetTemplate()->Flags & ITEM_FLAG_IS_MILLABLE)) + if (!itemTarget || !itemTarget->GetTemplate()->HasFlag(ITEM_FLAG_IS_MILLABLE)) return; if (itemTarget->GetCount() < 5) @@ -5535,7 +5535,7 @@ void Spell::EffectSpiritHeal(SpellEffIndex /*effIndex*/) return; /* - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) return; if (!unitTarget->IsInWorld()) return; @@ -5554,7 +5554,7 @@ void Spell::EffectSkinPlayerCorpse(SpellEffIndex /*effIndex*/) return; LOG_DEBUG("spells.aura", "Effect: SkinPlayerCorpse"); - if ((m_caster->GetTypeId() != TYPEID_PLAYER) || (unitTarget->GetTypeId() != TYPEID_PLAYER) || (unitTarget->IsAlive())) + if ((!m_caster->IsPlayer()) || (!unitTarget->IsPlayer()) || (unitTarget->IsAlive())) return; unitTarget->ToPlayer()->RemovedInsignia(m_caster->ToPlayer()); @@ -5747,7 +5747,7 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* player = m_caster->ToPlayer(); @@ -5820,7 +5820,7 @@ void Spell::EffectCreateTamedPet(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER || unitTarget->GetPetGUID() || !unitTarget->IsClass(CLASS_HUNTER, CLASS_CONTEXT_PET)) + if (!unitTarget || !unitTarget->IsPlayer() || unitTarget->GetPetGUID() || !unitTarget->IsClass(CLASS_HUNTER, CLASS_CONTEXT_PET)) return; uint32 creatureEntry = m_spellInfo->Effects[effIndex].MiscValue; @@ -6088,7 +6088,7 @@ void Spell::EffectRenamePet(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT || + if (!unitTarget || !unitTarget->IsCreature() || !unitTarget->IsPet() || unitTarget->ToPet()->getPetType() != HUNTER_PET) return; @@ -6199,7 +6199,7 @@ void Spell::EffectCastButtons(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_caster = m_caster->ToPlayer(); @@ -6242,7 +6242,7 @@ void Spell::EffectRechargeManaGem(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget || !unitTarget->IsPlayer()) return; Player* player = m_caster->ToPlayer(); @@ -6319,7 +6319,7 @@ void Spell::EffectSummonRaFFriend(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; if (!unitTarget) diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 46f31c6f4..0e3c9833a 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4812,6 +4812,16 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx3 |= SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD; }); + // Warrior stances passives + ApplySpellFix({ + 2457, // Battle Stance + 2458, // Berserker Stance + 7376 // Defensive Stance Passive + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_SUPRESS_CASTER_PROCS; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 78fd3ce63..aad55356b 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -343,9 +343,9 @@ void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket const* case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: { - if (range == TEXT_RANGE_NORMAL)//ignores team and gmOnly + if (range == TEXT_RANGE_NORMAL) // ignores team and GM only { - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return; target->ToPlayer()->GetSession()->SendPacket(data); diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index c90a6300e..91ad59fe1 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -189,9 +189,9 @@ void CreatureTextMgr::SendChatPacket(WorldObject* source, Builder const& builder case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: { - if (range == TEXT_RANGE_NORMAL) //ignores team and gmOnly + if (range == TEXT_RANGE_NORMAL) // ignores team and GM only { - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return; localizer(const_cast(target->ToPlayer())); diff --git a/src/server/game/Time/UpdateTime.cpp b/src/server/game/Time/UpdateTime.cpp index 3c4886376..3b584a615 100644 --- a/src/server/game/Time/UpdateTime.cpp +++ b/src/server/game/Time/UpdateTime.cpp @@ -20,6 +20,7 @@ #include "Log.h" #include "Timer.h" #include +#include #include // create instance @@ -87,12 +88,12 @@ uint32 UpdateTime::GetPercentile(uint8 p) double index = (double(p) / 100.0) * (GetDatasetSize() - 1); // If the index is an integer, return the value at that index - if (index == floor(index)) + if (index == std::floor(index)) return _orderedUpdateTimeDataTable[index]; // Otherwise, perform linear interpolation - int lowerIndex = floor(index); - int upperIndex = ceil(index); + int lowerIndex = std::floor(index); + int upperIndex = std::ceil(index); double fraction = index - lowerIndex; return _orderedUpdateTimeDataTable[lowerIndex] * (1 - fraction) + _orderedUpdateTimeDataTable[upperIndex] * fraction; @@ -150,7 +151,7 @@ void UpdateTime::SortUpdateTimeDataTable() void WorldUpdateTime::LoadFromConfig() { - _recordUpdateTimeInverval = Milliseconds(sConfigMgr->GetOption("RecordUpdateTimeDiffInterval", 60000)); + _recordUpdateTimeInverval = Milliseconds(sConfigMgr->GetOption("RecordUpdateTimeDiffInterval", 300000)); _recordUpdateTimeMin = Milliseconds(sConfigMgr->GetOption("MinRecordUpdateTimeDiff", 100)); } diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 96f066a9e..95fbdd787 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -304,7 +304,7 @@ void PlayerDump::InitializeTables() // item0 - item18 for (uint32 j = 0; j < EQUIPMENT_SLOT_END; ++j) { - std::string itColumn = Acore::StringFormat("item%u", j); + std::string itColumn = Acore::StringFormat("item{}", j); MarkDependentColumn(t, itColumn, GUID_TYPE_ITEM); } break; @@ -923,7 +923,7 @@ DumpReturn PlayerDumpReader::LoadDump(std::istream& input, uint32 account, std:: if (name.empty()) { // generate a temporary name - std::string guidPart = Acore::StringFormat("%X", guid); + std::string guidPart = Acore::StringFormat("{:X}", guid); std::size_t maxCharsFromOriginalName = MAX_PLAYER_NAME - guidPart.length(); name = GetColumn(ts, line, "name").substr(0, maxCharsFromOriginalName) + guidPart; diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 298264e46..e32fcc1c9 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -246,14 +246,14 @@ void Warden::ApplyPenalty(uint16 checkId, std::string const& reason) if (Player const* plr = _session->GetPlayer()) { std::string const reportFormat = "Player {} (guid {}, account id: {}) failed warden {} check ({}). Action: {}"; - reportMsg = Acore::StringFormatFmt(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(), + reportMsg = Acore::StringFormat(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(), checkId, ((checkData && !checkData->Comment.empty()) ? checkData->Comment : ""), GetWardenActionStr(action)); } else { std::string const reportFormat = "Account id: {} failed warden {} check. Action: {}"; - reportMsg = Acore::StringFormatFmt(reportFormat, _session->GetAccountId(), checkId, GetWardenActionStr(action)); + reportMsg = Acore::StringFormat(reportFormat, _session->GetAccountId(), checkId, GetWardenActionStr(action)); } } else @@ -261,12 +261,12 @@ void Warden::ApplyPenalty(uint16 checkId, std::string const& reason) if (Player const* plr = _session->GetPlayer()) { std::string const reportFormat = "Player {} (guid {}, account id: {}) triggered warden penalty by reason: {}. Action: {}"; - reportMsg = Acore::StringFormatFmt(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(), causeMsg, GetWardenActionStr(action)); + reportMsg = Acore::StringFormat(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(), causeMsg, GetWardenActionStr(action)); } else { std::string const reportFormat = "Account id: {} failed warden {} check. Action: {}"; - reportMsg = Acore::StringFormatFmt(reportFormat, _session->GetAccountId(), causeMsg, GetWardenActionStr(action)); + reportMsg = Acore::StringFormat(reportFormat, _session->GetAccountId(), causeMsg, GetWardenActionStr(action)); } } diff --git a/src/server/game/Warden/Warden.h b/src/server/game/Warden/Warden.h index ba53a54ca..5b256993c 100644 --- a/src/server/game/Warden/Warden.h +++ b/src/server/game/Warden/Warden.h @@ -127,8 +127,8 @@ public: void DecryptData(uint8* buffer, uint32 length); void EncryptData(uint8* buffer, uint32 length); - static bool IsValidCheckSum(uint32 checksum, const uint8 *data, const uint16 length); - static uint32 BuildChecksum(const uint8 *data, uint32 length); + static bool IsValidCheckSum(uint32 checksum, uint8 const* data, const uint16 length); + static uint32 BuildChecksum(uint8 const* data, uint32 length); // If no check is passed, the default action from config is executed void ApplyPenalty(uint16 checkId, std::string const& reason); diff --git a/src/server/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp index 301659781..0ac1c7e36 100644 --- a/src/server/game/Warden/WardenCheckMgr.cpp +++ b/src/server/game/Warden/WardenCheckMgr.cpp @@ -137,7 +137,7 @@ void WardenCheckMgr::LoadWardenChecks() continue; } - std::string str2 = Acore::StringFormat("%04u", id); + std::string str2 = Acore::StringFormat("{:04}", id); ASSERT(str2.size() == 4); std::copy(str2.begin(), str2.end(), wardenCheck.IdStr.begin()); diff --git a/src/server/game/Warden/WardenPayloadMgr.cpp b/src/server/game/Warden/WardenPayloadMgr.cpp index 4f88f1891..d6a06edc3 100644 --- a/src/server/game/Warden/WardenPayloadMgr.cpp +++ b/src/server/game/Warden/WardenPayloadMgr.cpp @@ -74,7 +74,7 @@ bool WardenPayloadMgr::RegisterPayload(std::string const& payload, uint16 payloa wCheck.Str = payload; wCheck.CheckId = payloadId; - std::string idStr = Acore::StringFormat("%04u", payloadId); + std::string idStr = Acore::StringFormat("{:04}", payloadId); ASSERT(idStr.size() == 4); std::copy(idStr.begin(), idStr.end(), wCheck.IdStr.begin()); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index c4e89ee68..82614f911 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -977,15 +977,15 @@ void World::LoadConfigSettings(bool reload) _int_configs[CONFIG_TELEPORT_TIMEOUT_FAR] = sConfigMgr->GetOption("TeleportTimeoutFar", 45); // pussywizard _int_configs[CONFIG_MAX_ALLOWED_MMR_DROP] = sConfigMgr->GetOption("MaxAllowedMMRDrop", 500); // pussywizard _bool_configs[CONFIG_ENABLE_LOGIN_AFTER_DC] = sConfigMgr->GetOption("EnableLoginAfterDC", true); // pussywizard - _bool_configs[CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS] = sConfigMgr->GetOption("DontCacheRandomMovementPaths", true); // pussywizard + _bool_configs[CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS] = sConfigMgr->GetOption("DontCacheRandomMovementPaths", false); _int_configs[CONFIG_SKILL_CHANCE_ORANGE] = sConfigMgr->GetOption("SkillChance.Orange", 100); _int_configs[CONFIG_SKILL_CHANCE_YELLOW] = sConfigMgr->GetOption("SkillChance.Yellow", 75); _int_configs[CONFIG_SKILL_CHANCE_GREEN] = sConfigMgr->GetOption("SkillChance.Green", 25); _int_configs[CONFIG_SKILL_CHANCE_GREY] = sConfigMgr->GetOption("SkillChance.Grey", 0); - _int_configs[CONFIG_SKILL_CHANCE_MINING_STEPS] = sConfigMgr->GetOption("SkillChance.MiningSteps", 75); - _int_configs[CONFIG_SKILL_CHANCE_SKINNING_STEPS] = sConfigMgr->GetOption("SkillChance.SkinningSteps", 75); + _int_configs[CONFIG_SKILL_CHANCE_MINING_STEPS] = sConfigMgr->GetOption("SkillChance.MiningSteps", 0); + _int_configs[CONFIG_SKILL_CHANCE_SKINNING_STEPS] = sConfigMgr->GetOption("SkillChance.SkinningSteps", 0); _bool_configs[CONFIG_SKILL_PROSPECTING] = sConfigMgr->GetOption("SkillChance.Prospecting", false); _bool_configs[CONFIG_SKILL_MILLING] = sConfigMgr->GetOption("SkillChance.Milling", false); @@ -1087,7 +1087,7 @@ void World::LoadConfigSettings(bool reload) _bool_configs[CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL] = sConfigMgr->GetOption("Channel.SilentlyGMJoin", false); _bool_configs[CONFIG_TALENTS_INSPECTING] = sConfigMgr->GetOption("TalentsInspecting", true); - _bool_configs[CONFIG_CHAT_FAKE_MESSAGE_PREVENTING] = sConfigMgr->GetOption("ChatFakeMessagePreventing", false); + _bool_configs[CONFIG_CHAT_FAKE_MESSAGE_PREVENTING] = sConfigMgr->GetOption("ChatFakeMessagePreventing", true); _int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY] = sConfigMgr->GetOption("ChatStrictLinkChecking.Severity", 0); _int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_KICK] = sConfigMgr->GetOption("ChatStrictLinkChecking.Kick", 0); @@ -1172,10 +1172,10 @@ void World::LoadConfigSettings(bool reload) _bool_configs[CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS] = sConfigMgr->GetOption("Arena.AutoDistributePoints", false); _int_configs[CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS] = sConfigMgr->GetOption("Arena.AutoDistributeInterval", 7); // pussywizard: spoiled by implementing constant day and hour, always 7 now _int_configs[CONFIG_ARENA_GAMES_REQUIRED] = sConfigMgr->GetOption("Arena.GamesRequired", 10); - _int_configs[CONFIG_ARENA_SEASON_ID] = sConfigMgr->GetOption("Arena.ArenaSeason.ID", 1); + _int_configs[CONFIG_ARENA_SEASON_ID] = sConfigMgr->GetOption("Arena.ArenaSeason.ID", 8); _int_configs[CONFIG_ARENA_START_RATING] = sConfigMgr->GetOption("Arena.ArenaStartRating", 0); _int_configs[CONFIG_LEGACY_ARENA_POINTS_CALC] = sConfigMgr->GetOption("Arena.LegacyArenaPoints", 0); - _int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfigMgr->GetOption("Arena.ArenaStartPersonalRating", 1000); + _int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfigMgr->GetOption("Arena.ArenaStartPersonalRating", 0); _int_configs[CONFIG_ARENA_START_MATCHMAKER_RATING] = sConfigMgr->GetOption("Arena.ArenaStartMatchmakerRating", 1500); _bool_configs[CONFIG_ARENA_SEASON_IN_PROGRESS] = sConfigMgr->GetOption("Arena.ArenaSeason.InProgress", true); _float_configs[CONFIG_ARENA_WIN_RATING_MODIFIER_1] = sConfigMgr->GetOption("Arena.ArenaWinRatingModifier1", 48.0f); @@ -1316,8 +1316,8 @@ void World::LoadConfigSettings(bool reload) LOG_INFO("server.loading", "Using DataDir {}", _dataPath); } - _bool_configs[CONFIG_VMAP_INDOOR_CHECK] = sConfigMgr->GetOption("vmap.enableIndoorCheck", 0); bool enableIndoor = sConfigMgr->GetOption("vmap.enableIndoorCheck", true); + _bool_configs[CONFIG_VMAP_INDOOR_CHECK] = enableIndoor; bool enableLOS = sConfigMgr->GetOption("vmap.enableLOS", true); bool enableHeight = sConfigMgr->GetOption("vmap.enableHeight", true); bool enablePetLOS = sConfigMgr->GetOption("vmap.petLOS", true); @@ -1331,7 +1331,7 @@ void World::LoadConfigSettings(bool reload) VMAP::VMapFactory::createOrGetVMapMgr()->setEnableHeightCalc(enableHeight); LOG_INFO("server.loading", "WORLD: VMap support included. LineOfSight:{}, getHeight:{}, indoorCheck:{} PetLOS:{}", enableLOS, enableHeight, enableIndoor, enablePetLOS); - _bool_configs[CONFIG_PET_LOS] = sConfigMgr->GetOption("vmap.petLOS", true); + _bool_configs[CONFIG_PET_LOS] = enablePetLOS; _bool_configs[CONFIG_START_CUSTOM_SPELLS] = sConfigMgr->GetOption("PlayerStart.CustomSpells", false); _int_configs[CONFIG_HONOR_AFTER_DUEL] = sConfigMgr->GetOption("HonorPointsAfterDuel", 0); _bool_configs[CONFIG_START_ALL_EXPLORED] = sConfigMgr->GetOption("PlayerStart.MapsExplored", false); diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 44d14e6e6..fc479a383 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -310,7 +310,7 @@ public: if (target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->bit_index) activeStr = handler->GetAcoreString(LANG_ACTIVE); - std::string titleName = Acore::StringFormat(name, player->GetName().c_str()); + std::string titleName = Acore::StringFormat(name, player->GetName()); // send title in "id (idx:idx) - [namedlink locale]" format if (handler->GetSession()) diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 3053564e6..93fe67cc3 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -263,7 +263,7 @@ public: Unit* unit = handler->getSelectedUnit(); Player* player = nullptr; - if (!unit || (unit->GetTypeId() != TYPEID_PLAYER)) + if (!unit || (!unit->IsPlayer())) { player = handler->GetSession()->GetPlayer(); } @@ -733,14 +733,14 @@ public: if (item->GetOwnerGUID() != player->GetGUID()) { - handler->SendSysMessage(Acore::StringFormatFmt("queue({}): For the item {}, the owner ({}) and the player ({}) don't match!", index, item->GetGUID().ToString(), item->GetOwnerGUID().ToString(), player->GetGUID().ToString())); + handler->SendSysMessage(Acore::StringFormat("queue({}): For the item {}, the owner ({}) and the player ({}) don't match!", index, item->GetGUID().ToString(), item->GetOwnerGUID().ToString(), player->GetGUID().ToString())); error = true; continue; } if (item->GetQueuePos() != index) { - handler->SendSysMessage(Acore::StringFormatFmt("queue({}): For the item {}, the queuepos doesn't match it's position in the queue!", index, item->GetGUID().ToString())); + handler->SendSysMessage(Acore::StringFormat("queue({}): For the item {}, the queuepos doesn't match it's position in the queue!", index, item->GetGUID().ToString())); error = true; continue; } @@ -752,14 +752,14 @@ public: if (!test) { - handler->SendSysMessage(Acore::StringFormatFmt("queue({}): The bag({}) and slot({}) values for {} are incorrect, the player doesn't have any item at that position!", index, item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString())); + handler->SendSysMessage(Acore::StringFormat("queue({}): The bag({}) and slot({}) values for {} are incorrect, the player doesn't have any item at that position!", index, item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString())); error = true; continue; } if (test != item) { - handler->SendSysMessage(Acore::StringFormatFmt("queue({}): The bag({}) and slot({}) values for the {} are incorrect, {} is there instead!", index, item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString())); + handler->SendSysMessage(Acore::StringFormat("queue({}): The bag({}) and slot({}) values for the {} are incorrect, {} is there instead!", index, item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString())); error = true; continue; } diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp index dd42ce23d..717e94ef7 100644 --- a/src/server/scripts/Commands/cs_message.cpp +++ b/src/server/scripts/Commands/cs_message.cpp @@ -87,7 +87,7 @@ public: if (message.empty()) return false; - sWorld->SendServerMessage(SERVER_MSG_STRING, Acore::StringFormatFmt(handler->GetAcoreString(LANG_SYSTEMMESSAGE), message.data())); + sWorld->SendServerMessage(SERVER_MSG_STRING, Acore::StringFormat(handler->GetAcoreString(LANG_SYSTEMMESSAGE), message.data())); return true; } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index debc5af85..7324dab13 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1142,7 +1142,7 @@ public: { if (sWorld->getBoolConfig(CONFIG_DIE_COMMAND_MODE)) { - if (target->GetTypeId() == TYPEID_UNIT && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard + if (target->IsCreature() && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard { target->ToCreature()->LowerPlayerDamageReq(target->GetMaxHealth()); } @@ -2393,7 +2393,7 @@ public: Unit* target = handler->getSelectedUnit(); if (player->GetTarget() && target) { - if (target->GetTypeId() != TYPEID_UNIT || target->IsPet()) + if (!target->IsCreature() || target->IsPet()) { handler->SendErrorMessage(LANG_SELECT_CREATURE); return false; @@ -2745,7 +2745,7 @@ public: } case HOME_MOTION_TYPE: { - if (unit->GetTypeId() == TYPEID_UNIT) + if (unit->IsCreature()) { handler->PSendSysMessage(LANG_MOVEGENS_HOME_CREATURE, x, y, z); } @@ -2816,7 +2816,7 @@ public: if (!target->IsAlive() || !damage) return true; - if (target->GetTypeId() == TYPEID_UNIT && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard + if (target->IsCreature() && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard target->ToCreature()->LowerPlayerDamageReq(target->GetMaxHealth()); if (percent) diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 4e016dac3..445281218 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -337,7 +337,7 @@ public: return false; Unit* unit = handler->getSelectedUnit(); - if (!unit || unit->GetTypeId() != TYPEID_UNIT) + if (!unit || !unit->IsCreature()) { handler->SendErrorMessage(LANG_SELECT_CREATURE); return false; diff --git a/src/server/scripts/Commands/cs_send.cpp b/src/server/scripts/Commands/cs_send.cpp index 3645370ae..d09e9e292 100644 --- a/src/server/scripts/Commands/cs_send.cpp +++ b/src/server/scripts/Commands/cs_send.cpp @@ -79,7 +79,7 @@ public: itemCount = *Acore::StringTo(itemTokens.at(1)); break; default: - handler->SendSysMessage(Acore::StringFormatFmt("> Incorrect item list format for '{}'", itemString)); + handler->SendSysMessage(Acore::StringFormat("> Incorrect item list format for '{}'", itemString)); continue; } diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 511867c96..da1daf0d2 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -121,9 +121,9 @@ public: dbPort = (*res)[0].Get(); if (dbPort) - dbPortOutput = Acore::StringFormatFmt("Realmlist (Realm Id: {}) configured in port {}", realm.Id.Realm, dbPort); + dbPortOutput = Acore::StringFormat("Realmlist (Realm Id: {}) configured in port {}", realm.Id.Realm, dbPort); else - dbPortOutput = Acore::StringFormatFmt("Realm Id: {} not found in `realmlist` table. Please check your setup", realm.Id.Realm); + dbPortOutput = Acore::StringFormat("Realm Id: {} not found in `realmlist` table. Please check your setup", realm.Id.Realm); } HandleServerInfoCommand(handler); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index 50f7d26fb..214b92355 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -303,7 +303,7 @@ public: bool doReset = false; if (resetTimer > 0) { - for (const auto& sum : summons) + for (auto const& sum : summons) { if (Creature* creature = ObjectAccessor::GetCreature(*me, sum)) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp index 51f19f74b..63219693b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp @@ -221,7 +221,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() != TYPEID_UNIT) + if (!summoner->IsCreature()) { return; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp index 014531fa2..1e7dde565 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp @@ -471,7 +471,7 @@ public: SetData(TYPE_RING_OF_LAW, NOT_STARTED); break; case DONE: - for (const auto& itr : ArenaSpectators) + for (auto const& itr : ArenaSpectators) { if (Creature* spectator = instance->GetCreature(itr)) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_solakar_flamewreath.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_solakar_flamewreath.cpp index f820384c8..39cb7594e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_solakar_flamewreath.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_solakar_flamewreath.cpp @@ -83,7 +83,7 @@ public: } GetCreatureListWithEntryInGrid(nearbyWhelps, me, NPC_ROOKERY_WHELP, RANGE_WHELP_CALL_HELP); - for (const auto& whelp : nearbyWhelps) + for (auto const& whelp : nearbyWhelps) { if (!whelp->IsInCombat()) { @@ -106,7 +106,7 @@ public: minDist = 50; tempDist = 50; me->GetGameObjectListWithEntryInGrid(nearbyEggs, GO_ROOKERY_EGG, 40); - for (const auto& egg : nearbyEggs) + for (auto const& egg : nearbyEggs) { if (egg->isSpawned() && egg->getLootState() == GO_READY) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp index fc06b6222..cff24c081 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp @@ -401,14 +401,14 @@ public: pile->SetLootState(GO_READY); pile->Respawn(); } - for (const auto& circleGUID : go_urokOgreCirles) + for (auto const& circleGUID : go_urokOgreCirles) { if (GameObject* circle = instance->GetGameObject(circleGUID)) { circle->Delete(); } } - for (const auto& mobGUID : UrokMobs) + for (auto const& mobGUID : UrokMobs) { if (Creature* mob = instance->GetCreature(mobGUID)) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index a356db01a..e5ca5f2aa 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -212,7 +212,7 @@ struct ClassCallSelector : public Acore::unary_function bool operator()(Unit const* target) const { - if (!_me || !target || target->GetTypeId() != TYPEID_PLAYER) + if (!_me || !target || !target->IsPlayer()) { return false; } @@ -1114,7 +1114,7 @@ class spell_class_call_polymorph : public SpellScript { targets.remove_if([&](WorldObject const* target) -> bool { - return target->GetTypeId() != TYPEID_PLAYER || target->ToPlayer()->IsGameMaster() || target->ToPlayer()->HasAura(SPELL_POLYMORPH); + return !target->IsPlayer() || target->ToPlayer()->IsGameMaster() || target->ToPlayer()->HasAura(SPELL_POLYMORPH); }); if (!targets.empty()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 7265ab78e..c837cfc81 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -110,7 +110,7 @@ public: bool CanAIAttack(Unit const* target) const override { - if (target->GetTypeId() == TYPEID_UNIT && !secondPhase) + if (target->IsCreature() && !secondPhase) { return false; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp index eee82b933..7cccc6479 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -587,7 +587,7 @@ class spell_hate_to_zero : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleHit(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp index 9abac7475..9d1d0033e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp @@ -129,7 +129,7 @@ class spell_mc_play_dead_aura : public AuraScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index 305091957..e93336e13 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -155,7 +155,7 @@ struct boss_priestess_delrissa : public ScriptedAI void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; if (PlayersKilled < SAY_DEATH) diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index eb9e7777b..1b3df4fd4 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -678,7 +678,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (PlayerGUID || who->GetTypeId() != TYPEID_PLAYER || !who->IsWithinDist(me, INTERACTION_DISTANCE)) + if (PlayerGUID || !who->IsPlayer() || !who->IsWithinDist(me, INTERACTION_DISTANCE)) return; if (MeetQuestCondition(who->ToPlayer())) diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index c018ba6a8..39de1d1c0 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -458,7 +458,7 @@ public: { Position pos = LightOfDawnFightPos[urand(0, 9)]; if (Unit* target = cr->SelectNearbyTarget(nullptr, 10.0f)) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->GetMotionMaster()->MoveCharge(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), me->GetSpeed(MOVE_RUN)); cr->GetMotionMaster()->MoveCharge(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), me->GetSpeed(MOVE_RUN)); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index 87a22ba7c..0c068d070 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -389,7 +389,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() != TYPEID_UNIT) + if (!summoner->IsCreature()) { return; } diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp index 4ed70e573..ce5bd7764 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp @@ -64,7 +64,7 @@ public: void OnUnitDeath(Unit* unit) override { - if (unit->GetTypeId() == TYPEID_UNIT && unit->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && unit->GetEntry() != NPC_SHADE_OF_ERANIKUS) + if (unit->IsCreature() && unit->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && unit->GetEntry() != NPC_SHADE_OF_ERANIKUS) _dragonkinList.remove(unit->GetGUID()); if (unit->GetEntry() == NPC_JAMMAL_AN_THE_PROPHET) { diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index d832b3088..bce86175d 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -533,7 +533,7 @@ class DoorsGuidCheck public: bool operator()(WorldObject* object) const { - if (object->GetTypeId() != TYPEID_UNIT) + if (!object->IsCreature()) return true; Creature* cr = object->ToCreature(); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 163b60d6d..ecf69c19f 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -1088,7 +1088,7 @@ class spell_kiljaeden_sinister_reflection_clone : public SpellScript WorldObject* target = targets.front(); targets.clear(); - if (target && target->GetTypeId() == TYPEID_UNIT) + if (target && target->IsCreature()) { target->ToCreature()->AI()->SetData(1, GetCaster()->getClass()); targets.push_back(target); @@ -1133,7 +1133,7 @@ class spell_kiljaeden_darkness_aura : public AuraScript void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - if (GetUnitOwner()->GetTypeId() == TYPEID_UNIT) + if (GetUnitOwner()->IsCreature()) GetUnitOwner()->ToCreature()->AI()->DoAction(ACTION_NO_KILL_TALK); GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DARKNESS_OF_A_THOUSAND_SOULS_DAMAGE, true); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 03268f04e..ade6501fa 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -393,7 +393,7 @@ class spell_entropius_negative_energy : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void FilterTargets(std::list& targets) diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp index 7e597eada..6b9916e2a 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp @@ -183,7 +183,7 @@ public: bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT && GetUnitOwner()->GetMapId() == MAP_ULDAMAN; + return GetUnitOwner()->IsCreature() && GetUnitOwner()->GetMapId() == MAP_ULDAMAN; } void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index ffdb70f6f..dbe0f1263 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -234,7 +234,7 @@ public: me->SetInFront(me->GetVictim()); } /*if (float dist = me->IsWithinDist3d(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 5.0f) dist = 5.0f; - SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);*/ + SDisruptAOEVisual_Timer = 1000 + std::floor(dist / 30 * 1000.0f);*/ events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 18000)); break; } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 1d14f0ff0..4698c81db 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -209,7 +209,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; reviveGUID = victim->GetGUID(); @@ -449,7 +449,7 @@ public: { if (!me || !target) return false; - if (target->GetTypeId() != TYPEID_PLAYER || !me->IsWithinLOSInMap(target)) + if (!target->IsPlayer() || !me->IsWithinLOSInMap(target)) return false; return true; })) @@ -540,7 +540,7 @@ public: void JustEngagedWith(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; _scheduler.Schedule(6s, 12s, [this](TaskContext context) @@ -557,7 +557,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; reviveGUID = victim->GetGUID(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp index 60ae3fa1c..f9bd23b6a 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp @@ -217,7 +217,7 @@ private: { Unit* target = SelectTarget(SelectTargetMethod::Random, 0, [this](Unit* target) -> bool { - if (target->GetTypeId() != TYPEID_PLAYER || target->getPowerType() != Powers::POWER_MANA) + if (!target->IsPlayer() || target->getPowerType() != Powers::POWER_MANA) return false; if (me->IsWithinMeleeRange(target) || me->GetVictim() == target) return false; diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index 244d503b7..103c17bb9 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -239,7 +239,7 @@ public: { if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) { - if (summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAlive() && !summoner->IsInCombat()) + if (summoner->IsCreature() && summoner->IsAlive() && !summoner->IsInCombat()) summoner->ToCreature()->AI()->AttackStart(who); } } @@ -253,7 +253,7 @@ public: { if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) { - if (summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAlive()) + if (summoner->IsCreature() && summoner->IsAlive()) summoner->ToCreature()->DisappearAndDie(); } } @@ -267,7 +267,7 @@ public: if (me->IsSummon()) { Unit* summoner = me->ToTempSummon()->GetSummonerUnit(); - if (summoner && summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAIEnabled) + if (summoner && summoner->IsCreature() && summoner->IsAIEnabled) { npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI* ai = CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, summoner->GetAI()); diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index 6e888f622..ad8d4a73c 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -140,7 +140,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (!who || who->GetTypeId() != TYPEID_PLAYER) + if (!who || !who->IsPlayer()) return; if (me->FindNearestGameObject(GO_BEACON_TORCH, 10.0f)) diff --git a/src/server/scripts/Events/brewfest.cpp b/src/server/scripts/Events/brewfest.cpp index b04f32701..4a0c96b4a 100644 --- a/src/server/scripts/Events/brewfest.cpp +++ b/src/server/scripts/Events/brewfest.cpp @@ -1584,7 +1584,7 @@ struct npc_coren_direbrew : public ScriptedAI void MoveInLineOfSight(Unit* who) override { - if (!_events.IsInPhase(PHASE_ALL) || who->GetTypeId() != TYPEID_PLAYER) + if (!_events.IsInPhase(PHASE_ALL) || !who->IsPlayer()) { return; } diff --git a/src/server/scripts/Events/midsummer.cpp b/src/server/scripts/Events/midsummer.cpp index 3e4eacfc1..314235ab1 100644 --- a/src/server/scripts/Events/midsummer.cpp +++ b/src/server/scripts/Events/midsummer.cpp @@ -332,7 +332,7 @@ struct npc_midsummer_bonfire : public ScriptedAI void SpellHit(Unit* caster, SpellInfo const* spellInfo) override { - if (caster->GetTypeId() != TYPEID_PLAYER) + if (!caster->IsPlayer()) return; switch (spellInfo->Id) @@ -1172,7 +1172,7 @@ class spell_midsummer_juggling_torch : public SpellScript void HandleFinish() { Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; if (const WorldLocation* loc = GetExplTargetDest()) diff --git a/src/server/scripts/Events/pilgrims_bounty.cpp b/src/server/scripts/Events/pilgrims_bounty.cpp index 86e7ed523..0a5ee60d4 100644 --- a/src/server/scripts/Events/pilgrims_bounty.cpp +++ b/src/server/scripts/Events/pilgrims_bounty.cpp @@ -571,7 +571,7 @@ class spell_pilgrims_bounty_serve_generic : public AuraScript void OnAuraRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp index 2a21d7205..5081432e5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp @@ -90,7 +90,7 @@ struct boss_aeonus : public BossAI void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER) + if (who->IsCreature() && who->GetEntry() == NPC_TIME_KEEPER) { if (me->IsWithinDistInMap(who, 20.0f)) { diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp index 3f2aaaf13..c835be08e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp @@ -79,7 +79,7 @@ enum Spells void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER) + if (who->IsCreature() && who->GetEntry() == NPC_TIME_KEEPER) { if (me->IsWithinDistInMap(who, 20.0f)) { diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp index b5ec43ce7..35b7f2654 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp @@ -90,7 +90,7 @@ struct boss_temporus : public BossAI void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER) + if (who->IsCreature() && who->GetEntry() == NPC_TIME_KEEPER) { if (me->IsWithinDistInMap(who, 20.0f)) { diff --git a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp index fdf47189b..52d569572 100644 --- a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp +++ b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp @@ -120,7 +120,7 @@ public: immol->GetAI()->SetData(1, 1); immol->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); } - for (const auto& guid : HighborneSummoners) + for (auto const& guid : HighborneSummoners) { if (Creature* summoner = instance->GetCreature(guid)) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index 184037492..f7ec9c838 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -367,7 +367,7 @@ struct boss_vem : public boss_bug_trio { if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, [this](Unit* target) -> bool { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return false; if (me->IsWithinMeleeRange(target) || target == me->GetVictim()) return false; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 0162d8cbb..ec8a985f2 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -386,7 +386,7 @@ struct boss_cthun : public BossAI }, 500ms); //Spawn flesh tentacle - for (const auto& position : FleshTentaclePos) + for (auto const& position : FleshTentaclePos) me->SummonCreature(NPC_FLESH_TENTACLE, position, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); ScheduleTasks(); @@ -501,7 +501,7 @@ struct boss_cthun : public BossAI me->RemoveAurasDueToSpell(SPELL_PURPLE_COLORATION); DoCastSelf(SPELL_CARAPACE_CTHUN, true); //Spawn flesh tentacle - for (const auto& position : FleshTentaclePos) + for (auto const& position : FleshTentaclePos) me->SummonCreature(NPC_FLESH_TENTACLE, position, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); }); } diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp index b7206f9d9..14076a4d5 100644 --- a/src/server/scripts/Kalimdor/zone_durotar.cpp +++ b/src/server/scripts/Kalimdor/zone_durotar.cpp @@ -180,7 +180,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_UNIT || !victim->IsSummon()) + if (!victim->IsCreature() || !victim->IsSummon()) return; if (Unit* vehSummoner = victim->ToTempSummon()->GetSummonerUnit()) diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index 6d4fc105e..477bbea29 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -124,7 +124,7 @@ public: return; //only aggro text if not player and only in this area - if (who->GetTypeId() != TYPEID_PLAYER && me->GetAreaId() == AREA_MERCHANT_COAST) + if (!who->IsPlayer() && me->GetAreaId() == AREA_MERCHANT_COAST) { //appears to be pretty much random (possible only if escorter not in combat with who yet?) Talk(SAY_GIL_AGGRO, who); @@ -325,7 +325,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (!who->IsAlive() || EventInProgress || who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsAlive() || EventInProgress || !who->IsPlayer()) return; if (me->IsWithinDistInMap(who, 10.0f) && who->ToPlayer()->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE) diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index d599c462c..c32f6490c 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -95,7 +95,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (!_initTalk) diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp index 54a382f5b..f386515dc 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp @@ -347,7 +347,7 @@ class spell_herald_volzaj_insanity : public SpellScript { PrepareSpellScript(spell_herald_volzaj_insanity); - bool Load() override { return GetCaster()->GetTypeId() == TYPEID_UNIT; } + bool Load() override { return GetCaster()->IsCreature(); } void HandleDummyEffect(std::list& targets) { @@ -362,7 +362,7 @@ class spell_herald_volzaj_insanity : public SpellScript { targets.remove_if([this](WorldObject* targetObj) -> bool { - return !targetObj || targetObj->GetTypeId() != TYPEID_PLAYER || !targetObj->ToPlayer()->IsInCombatWith(GetCaster()) || + return !targetObj || !targetObj->IsPlayer() || !targetObj->ToPlayer()->IsInCombatWith(GetCaster()) || targetObj->GetDistance(GetCaster()) >= (MAX_VISIBILITY_DISTANCE * 2); }); } @@ -466,7 +466,7 @@ class spell_volazj_whisper : public SpellScript }); } - bool Load() override { return GetCaster()->GetTypeId() == TYPEID_UNIT; } + bool Load() override { return GetCaster()->IsCreature(); } void HandleScriptEffect(SpellEffIndex /* effIndex */) { diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp index 934e4b3e7..574db0338 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp @@ -333,7 +333,7 @@ struct boss_jedoga_shadowseeker : public BossAI void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) { return; } diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp index 2bf096992..c8e970d07 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp @@ -307,7 +307,7 @@ struct boss_taldaram : public BossAI void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) { return; } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index fe4ad7c8a..6428031cf 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -925,7 +925,7 @@ struct boss_sartharion_dragonAI : public BossAI void KilledUnit(Unit* victim) final { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!victim->IsPlayer() || urand(0, 2)) { return; } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 7e4e3d92a..a63f52bda 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1053,7 +1053,7 @@ class spell_halion_twilight_phasing : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void Phase() @@ -1116,7 +1116,7 @@ class spell_halion_twilight_realm_aura : public AuraScript return; target->RemoveAurasDueToSpell(SPELL_FIERY_COMBUSTION, ObjectGuid::Empty, 0, AURA_REMOVE_BY_ENEMY_SPELL); - if (GetTarget()->GetTypeId() != TYPEID_PLAYER) + if (!GetTarget()->IsPlayer()) return; GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); } @@ -1149,7 +1149,7 @@ class spell_halion_leave_twilight_realm_aura : public AuraScript { GetTarget()->RemoveAurasDueToSpell(SPELL_TWILIGHT_REALM); - if (GetTarget()->GetTypeId() != TYPEID_PLAYER) + if (!GetTarget()->IsPlayer()) return; GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index 554ae002c..63b002435 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -765,7 +765,7 @@ class spell_toc5_light_rain : public SpellScript { for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) { - if ((*itr)->GetTypeId() == TYPEID_UNIT) + if ((*itr)->IsCreature()) if ((*itr)->ToCreature()->GetEntry() == NPC_FOUNTAIN_OF_LIGHT) { targets.erase(itr); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index cb8d3be45..7ed03a36d 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -691,7 +691,7 @@ public: if( me->GetExactDist(plr) <= 5.0f ) if( Vehicle* v = plr->GetVehicle() ) if( Unit* c = v->GetBase() ) - if( c->GetTypeId() == TYPEID_UNIT && c->ToCreature()->GetEntry() == (pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? VEHICLE_ARGENT_BATTLEWORG : VEHICLE_ARGENT_WARHORSE) ) + if( c->IsCreature() && c->ToCreature()->GetEntry() == (pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? VEHICLE_ARGENT_BATTLEWORG : VEHICLE_ARGENT_WARHORSE) ) { me->GetMotionMaster()->MovementExpired(); me->GetMotionMaster()->MoveIdle(); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp index 746728d3e..76b54fe59 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp @@ -1156,7 +1156,7 @@ public: { NPC_BlackKnightGUID = bk->GetGUID(); bk->SendMovementFlagUpdate(); // put him on vehicle visually - if( bk->GetTypeId() == TYPEID_UNIT ) + if( bk->IsCreature() ) bk->ToCreature()->SetReactState(REACT_PASSIVE); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 6dfdf56a0..bb41e7eee 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -400,7 +400,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDistSq(who) > 6400.0f) // 80yd*80yd + if (!who->IsPlayer() || me->GetExactDistSq(who) > 6400.0f) // 80yd*80yd return; if (me->getStandState() != UNIT_STAND_STATE_STAND) @@ -846,7 +846,7 @@ public: { target->UpdatePosition(*c, false); target->CastCustomSpell(SPELL_SPIKE_FAIL, SPELLVALUE_MAX_TARGETS, 1); - if( target->GetTypeId() == TYPEID_UNIT ) + if( target->IsCreature() ) target->ToCreature()->AI()->DoAction(-1); Remove(); return; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 5423cf881..01a4a7203 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -172,7 +172,7 @@ public: break; case EVENT_SPELL_FIRE_BOMB: { - if( t->GetTypeId() != TYPEID_PLAYER && pInstance ) + if( !t->IsPlayer() && pInstance ) { GuidVector validPlayers; Map::PlayerList const& pl = me->GetMap()->GetPlayers(); @@ -342,7 +342,7 @@ public: if( Vehicle* vk = me->GetVehicleKit() ) if( Unit* snobold = vk->GetPassenger(4) ) { - if( snobold->GetTypeId() == TYPEID_UNIT ) + if( snobold->IsCreature() ) { CAST_AI(npc_snobold_vassal::npc_snobold_vassalAI, snobold->ToCreature()->AI())->TargetGUID = PlayerGUID; snobold->ToCreature()->AI()->AttackStart(p); @@ -357,7 +357,7 @@ public: { events.RescheduleEvent(EVENT_PICK_SNOBOLD_TARGET, 5s); if( Unit* snobold = vk->GetPassenger(4) ) - if( snobold->GetTypeId() == TYPEID_UNIT ) + if( snobold->IsCreature() ) { bool needDespawn = true; for( uint8 i = 0; i < 4; ++i ) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index 7b3ab1688..8a9a3a498 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -118,7 +118,7 @@ public: return true; if (item->ItemId == 46017) // Val'anyr, Hammer of Ancient Kings - exception, too powerful return false; - if (item->ItemLevel == 245 && item->Bonding == BIND_WHEN_EQUIPED) // this also includes items crafted from patterns obtained in ToC 10 norm/hc + if (item->ItemLevel == 245 && item->Bonding == BIND_WHEN_EQUIPPED) // this also includes items crafted from patterns obtained in ToC 10 norm/hc return true; if (validDedicatedInsanityItems.find(item->ItemId) != validDedicatedInsanityItems.end()) // list of items dropping from ToC 10 norm/hc and also items ilevel 245 buyable for emblems of triumph return true; diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index 2710c6063..8e872f2ec 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -84,7 +84,7 @@ class spell_dtk_raise_dead_aura : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index 70e2fb391..076d0c4ac 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -258,7 +258,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; int32 textId = 0; @@ -347,7 +347,7 @@ class spell_wailing_souls_periodic_aura : public AuraScript { t->SetControlled(false, UNIT_STATE_ROOT); t->DisableRotate(false); - if (t->GetTypeId() == TYPEID_UNIT) + if (t->IsCreature()) t->ToCreature()->SetReactState(REACT_AGGRESSIVE); if (t->GetVictim()) { diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 12fc5a6f0..12eb4361c 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -333,7 +333,7 @@ class spell_garfrost_permafrost : public SpellScript if (valid) { if (Aura* aur = target->ToUnit()->GetAura(70336)) - if (aur->GetStackAmount() >= 10 && caster->GetTypeId() == TYPEID_UNIT) + if (aur->GetStackAmount() >= 10 && caster->IsCreature()) caster->ToCreature()->AI()->SetData(1, aur->GetStackAmount()); targetList.push_back(*itrU); } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index d2babe69a..3148377a6 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -470,7 +470,7 @@ class spell_krick_explosive_barrage_aura : public AuraScript { PreventDefaultAction(); if (Unit* caster = GetCaster()) - if (caster->GetTypeId() == TYPEID_UNIT) + if (caster->IsCreature()) { Map::PlayerList const& players = caster->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) @@ -505,7 +505,7 @@ class spell_exploding_orb_auto_grow_aura : public AuraScript target->RemoveAurasDueToSpell(SPELL_HASTY_GROW); target->RemoveAurasDueToSpell(SPELL_AUTO_GROW); target->RemoveAurasDueToSpell(SPELL_EXPLODING_ORB_VISUAL); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->DespawnOrUnsummon(2000); } } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index 3dcfa3e42..515476bfd 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -1130,7 +1130,7 @@ public: me->LoadCreaturesAddon(true); me->SetLootRecipient(nullptr); me->ResetPlayerDamageReq(); - me->SetLastDamagedTime(0); + me->UpdateLeashExtensionTime(); } }; @@ -1405,7 +1405,7 @@ class spell_pos_rimefang_frost_nova : public SpellScript if (Unit* caster = GetCaster()) { Unit::Kill(caster, target); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->DespawnOrUnsummon(30000); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index c1193e442..b344f352f 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -343,7 +343,7 @@ public: void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (damage > RAID_MODE(23000, 25000, 23000, 25000)) @@ -613,7 +613,7 @@ public: void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (damage > RAID_MODE(23000, 25000, 23000, 25000)) @@ -907,7 +907,7 @@ public: void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (damage > RAID_MODE(23000, 25000, 23000, 25000)) @@ -1102,7 +1102,7 @@ public: if (_introDone) return; - if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDist2d(who) > 100.0f) + if (!who->IsPlayer() || me->GetExactDist2d(who) > 100.0f) { return; } @@ -1335,7 +1335,7 @@ public: void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) { return; } @@ -1506,7 +1506,7 @@ class spell_taldaram_summon_flame_ball : public SpellScript bool Load() override { - if (GetCaster()->GetTypeId() != TYPEID_UNIT) + if (!GetCaster()->IsCreature()) { return false; } @@ -1573,7 +1573,7 @@ class spell_valanar_kinetic_bomb_aura : public AuraScript void HandleDummyTick(AuraEffect const* /*aurEff*/) { Unit* target = GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT) + if (!target->IsCreature()) return; if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 1.0f, true)) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index 7686841c6..57239edd3 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -823,7 +823,7 @@ class spell_blood_queen_vampiric_bite : public SpellScript return; } - if (GetCaster()->GetTypeId() != TYPEID_PLAYER || GetCaster()->GetMapId() != 631) + if (!GetCaster()->IsPlayer() || GetCaster()->GetMapId() != 631) return; InstanceScript* instance = GetCaster()->GetInstanceScript(); if (!instance || instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != IN_PROGRESS) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index eb84105c7..78f23ff95 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -1259,7 +1259,7 @@ class spell_deathbringer_boiling_blood : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void FilterTargets(std::list& targets) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index 0073e7cb5..52b5095a9 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -290,13 +290,13 @@ class spell_festergut_pungent_blight : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScript(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_UNIT) + if (!caster->IsCreature()) return; // Get Inhaled Blight id for our difficulty @@ -383,7 +383,7 @@ public: bool OnCheck(Player* /*source*/, Unit* target, uint32 /*criteria_id*/) override { - if (target && target->GetTypeId() == TYPEID_UNIT) + if (target && target->IsCreature()) return target->ToCreature()->AI()->GetData(DATA_INOCULATED_STACK) < 3; return false; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index cac357457..c70c69018 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -602,7 +602,7 @@ public: Transport::PassengerSet const& passengers = t->GetStaticPassengers(); for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) { - if ((*itr)->GetTypeId() != TYPEID_UNIT || (*itr)->GetEntry() != NPC_GUNSHIP_HULL) + if (!(*itr)->IsCreature() || (*itr)->GetEntry() != NPC_GUNSHIP_HULL) continue; (*itr)->ToCreature()->CastSpell((*itr)->ToCreature(), explosionSpell, true); } @@ -615,7 +615,7 @@ public: Transport::PassengerSet const& passengers = t->GetStaticPassengers(); for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) { - if ((*itr)->GetTypeId() != TYPEID_UNIT || (*itr)->GetEntry() != cannonEntry) + if (!(*itr)->IsCreature() || (*itr)->GetEntry() != cannonEntry) continue; Creature* cannon = (*itr)->ToCreature(); cannon->CastSpell(cannon, SPELL_EJECT_ALL_PASSENGERS, true); @@ -661,7 +661,7 @@ public: Transport::PassengerSet const& passengers = t->GetPassengers(); for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) { - if ((*itr)->GetTypeId() != TYPEID_UNIT) + if (!(*itr)->IsCreature()) continue; Creature* c = (*itr)->ToCreature(); if (c->GetEntry() == NPC_SKYBREAKER_MARINE || c->GetEntry() == NPC_SKYBREAKER_SERGEANT || c->GetEntry() == NPC_KOR_KRON_REAVER || c->GetEntry() == NPC_KOR_KRON_SERGEANT) @@ -2080,7 +2080,7 @@ class spell_igb_check_for_players : public SpellScript bool Load() override { _playerCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void CountTargets(std::list& targets) @@ -2302,7 +2302,7 @@ class spell_igb_cannon_blast : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void CalculatePower() @@ -2467,7 +2467,7 @@ public: bool operator()(WorldObject* unit) { - return unit->GetTypeId() != TYPEID_PLAYER || unit->GetPositionZ() > 478.0f || !unit->GetTransport() || unit->GetTransport()->GetEntry() != _entry + return !unit->IsPlayer() || unit->GetPositionZ() > 478.0f || !unit->GetTransport() || unit->GetTransport()->GetEntry() != _entry || unit->GetMapHeight(unit->GetPhaseMask(), unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ()) < 465.0f; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 17d68df61..f67ad6333 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -84,7 +84,7 @@ public: if (target->GetExactDist(_source) > 175.0f) return false; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return false; if (target->GetPositionX() > -337.0f) @@ -415,7 +415,7 @@ public: { if (Unit* u = v->GetBase()) { - if (u->GetEntry() == NPC_BONE_SPIKE && u->GetTypeId() == TYPEID_UNIT) + if (u->GetEntry() == NPC_BONE_SPIKE && u->IsCreature()) { u->ToCreature()->AI()->DoAction(-1337); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 8753fefb4..64852ccb6 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -209,7 +209,7 @@ public: bool operator()(Unit const* target) const { - if (!me || !target || target->GetTypeId() != TYPEID_PLAYER) + if (!me || !target || !target->IsPlayer()) return false; if (me->IsWithinCombatRange(target, 7.0f)) @@ -952,7 +952,7 @@ class spell_putricide_unstable_experiment : public SpellScript void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - if (GetCaster()->GetTypeId() != TYPEID_UNIT) + if (!GetCaster()->IsCreature()) return; Creature* creature = GetCaster()->ToCreature(); @@ -1044,7 +1044,7 @@ class spell_putricide_ooze_channel : public SpellScript bool Load() override { _target = nullptr; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void SelectTarget(std::list& targets) @@ -1318,7 +1318,7 @@ class spell_putricide_mutation_init : public SpellScript if (!GetExplTargetUnit()) return SPELL_FAILED_BAD_TARGETS; - if (GetExplTargetUnit()->GetTypeId() != TYPEID_PLAYER) + if (!GetExplTargetUnit()->IsPlayer()) return SPELL_FAILED_TARGET_NOT_PLAYER; SpellCustomErrors extension = SPELL_CUSTOM_ERROR_NONE; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index b0b845e3d..e9e7acfbd 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -360,7 +360,7 @@ public: if (!summoner) return; - if (summoner->GetTypeId() != TYPEID_UNIT) + if (!summoner->IsCreature()) { return; } @@ -651,7 +651,7 @@ class spell_rotface_large_ooze_combine : public SpellScript if (Creature* rotface = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_ROTFACE))) if (rotface->IsAlive()) { - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) GetCaster()->ToCreature()->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION); rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION); } @@ -708,7 +708,7 @@ class spell_rotface_large_ooze_buff_combine : public SpellScript if (Creature* rotface = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_ROTFACE))) if (rotface->IsAlive()) { - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) GetCaster()->ToCreature()->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION); rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION); } @@ -792,7 +792,7 @@ class spell_rotface_unstable_ooze_explosion_suicide_aura : public AuraScript { PreventDefaultAction(); Unit* target = GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT) + if (!target->IsCreature()) return; target->SetVisible(false); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 1295c9d1a..85a564b39 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -252,7 +252,7 @@ public: if (target->GetExactDist(_source) > 80.0f) return false; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return false; if (target->HasAura(SPELL_FROST_IMBUED_BLADE)) @@ -1154,7 +1154,7 @@ class spell_sindragosa_soul_preservation_aura : public AuraScript { s->CastSpell(s, 72466, true); s->RemoveAurasDueToSpell(72424); - if (s->GetTypeId() == TYPEID_UNIT) s->ToCreature()->SetLootMode(3); + if (s->IsCreature()) s->ToCreature()->SetLootMode(3); SetDuration(1); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 6285b3500..2b99e1127 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -386,7 +386,7 @@ public: return false; if (!target->IsAlive()) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (_maxDist && _source->GetExactDist(target) > _maxDist) return false; @@ -412,7 +412,7 @@ public: return false; if (!target->IsAlive()) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (target == _source->GetVictim()) return false; @@ -446,7 +446,7 @@ public: return false; if (!target->IsAlive()) return false; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return false; if (_source->GetExactDist(target) > 100.0f) return false; @@ -600,7 +600,7 @@ public: bool operator()(Unit* unit) const { - if (!unit || unit->GetTypeId() != TYPEID_PLAYER || unit == _sourceObj || _sourceObj->GetVictim() == unit || !unit->isTargetableForAttack()) + if (!unit || !unit->IsPlayer() || unit == _sourceObj || _sourceObj->GetVictim() == unit || !unit->isTargetableForAttack()) return false; if (unit->HasAura(SPELL_PLAGUE_AVOIDANCE) || unit->HasAura(SPELL_BOSS_HITTIN_YA_AURA) || unit->HasAura(_notAura1) || unit->HasAura(_notAura2)) return false; @@ -2078,7 +2078,7 @@ class spell_the_lich_king_shadow_trap_periodic : public SpellScript GetCaster()->CastSpell((Unit*)nullptr, SPELL_SHADOW_TRAP_KNOCKBACK, true); if (Aura* a = GetCaster()->GetAura(SPELL_SHADOW_TRAP_AURA)) a->SetDuration(0); - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) GetCaster()->ToCreature()->DespawnOrUnsummon(3000); } @@ -2102,7 +2102,7 @@ class spell_the_lich_king_ice_burst_target_search : public SpellScript if (unitList.empty()) return; - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) GetCaster()->ToCreature()->AI()->DoAction(-1); } @@ -2336,7 +2336,7 @@ class VehicleCheck public: bool operator()(WorldObject* unit) { - return (unit->GetTypeId() != TYPEID_UNIT && unit->GetTypeId() != TYPEID_PLAYER) || unit->ToUnit()->GetVehicle(); + return (!unit->IsCreature() && !unit->IsPlayer()) || unit->ToUnit()->GetVehicle(); } }; @@ -2804,7 +2804,7 @@ class spell_the_lich_king_vile_spirit_move_target_search : public SpellScript bool Load() override { _target = nullptr; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void SelectTarget(std::list& targets) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 86adf4725..df7969c4c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -967,7 +967,7 @@ public: bool CanAIAttack(Unit const* target) const override { // do not see targets inside Frostwing Halls when we are not there - return target->GetTypeId() != TYPEID_PLAYER && (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && target->GetEntry() != NPC_SINDRAGOSA; + return !target->IsPlayer() && (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && target->GetEntry() != NPC_SINDRAGOSA; } private: @@ -1757,7 +1757,7 @@ public: void SpellHitTarget(Unit* c, SpellInfo const* spell) override { - if (spell->Id == 71306 && c->GetTypeId() == TYPEID_UNIT) // Twisted Winds + if (spell->Id == 71306 && c->IsCreature()) // Twisted Winds { Position myPos = me->GetPosition(); me->NearTeleportTo(c->GetPositionX(), c->GetPositionY(), c->GetPositionZ(), c->GetOrientation()); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 43df1ceaa..4398b49a2 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -401,7 +401,7 @@ public: case NPC_SE_HIGH_OVERLORD_SAURFANG: if (TeamIdInInstance == TEAM_ALLIANCE) { - creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, creature->GetCreatureData()); + creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, true); creature->LoadEquipment(); } DeathbringerSaurfangEventGUID = creature->GetGUID(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.h b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.h index 601d9d384..d5d62ab7d 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.h @@ -135,7 +135,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index 612bcaae5..0b35acde0 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -21,6 +21,7 @@ #include "SpellInfo.h" #include "naxxramas.h" + using namespace Faerlina; void AddSC_boss_faerlina() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.h b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.h index e1d242e25..bcd9e2b36 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.h @@ -131,7 +131,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (!urand(0, 3)) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 0845348e7..dcb1caf40 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -24,6 +24,7 @@ #include "SpellScriptLoader.h" #include "naxxramas.h" + using namespace FourHorsemen; void AddSC_boss_four_horsemen() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.h b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.h index 59e97aa8d..6508552bd 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.h @@ -247,7 +247,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp index b3a14c35d..f7e536ff7 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp @@ -23,6 +23,7 @@ #include "SpellScriptLoader.h" #include "naxxramas.h" + using namespace Gluth; void AddSC_boss_gluth() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.h b/src/server/scripts/Northrend/Naxxramas/boss_gluth.h index db2eafd2f..5c4f45143 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.h @@ -147,7 +147,7 @@ public: return false; Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for (const auto& itr : pList) + for (auto const& itr : pList) { Player* player = itr.GetSource(); if (!player || !player->IsAlive()) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index d195bd9ed..507bd07fe 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -24,6 +24,7 @@ #include "SpellScriptLoader.h" #include "naxxramas.h" + using namespace Gothik; void AddSC_boss_gothik() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.h b/src/server/scripts/Northrend/Naxxramas/boss_gothik.h index ebbab9c80..e8d343296 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.h @@ -311,7 +311,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_KILL); @@ -375,7 +375,7 @@ public: { bool checklife = false; bool checkdead = false; - for (const auto& i : PlayerList) + for (auto const& i : PlayerList) { Player* player = i.GetSource(); if (player->IsAlive() && diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp index 3e56e7196..9b9891c7f 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp @@ -22,6 +22,7 @@ #include "boss_heigan.h" + using namespace Heigan; void AddSC_boss_heigan() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.h b/src/server/scripts/Northrend/Naxxramas/boss_heigan.h index 203d53944..2850a10f5 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.h @@ -9,40 +9,40 @@ namespace Heigan { -enum HeiganSays +enum Says { - HEIGAN_SAY_AGGRO = 0, - HEIGAN_SAY_SLAY = 1, - HEIGAN_SAY_TAUNT = 2, - HEIGAN_EMOTE_DEATH = 3, - HEIGAN_EMOTE_DANCE = 4, - HEIGAN_EMOTE_DANCE_END = 5, - HEIGAN_SAY_DANCE = 6 + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_TAUNT = 2, + EMOTE_DEATH = 3, + EMOTE_DANCE = 4, + EMOTE_DANCE_END = 5, + SAY_DANCE = 6 }; -enum HeiganSpells +enum Spells { - HEIGAN_SPELL_SPELL_DISRUPTION = 29310, - HEIGAN_SPELL_DECREPIT_FEVER_10 = 29998, - HEIGAN_SPELL_DECREPIT_FEVER_25 = 55011, - HEIGAN_SPELL_PLAGUE_CLOUD = 29350, - HEIGAN_SPELL_TELEPORT_SELF = 30211 + SPELL_SPELL_DISRUPTION = 29310, + SPELL_DECREPIT_FEVER_10 = 29998, + SPELL_DECREPIT_FEVER_25 = 55011, + SPELL_PLAGUE_CLOUD = 29350, + SPELL_TELEPORT_SELF = 30211 }; -enum HeiganEvents +enum Events { - HEIGAN_EVENT_DISRUPTION = 1, - HEIGAN_EVENT_DECEPIT_FEVER = 2, - HEIGAN_EVENT_ERUPT_SECTION = 3, - HEIGAN_EVENT_SWITCH_PHASE = 4, - HEIGAN_EVENT_SAFETY_DANCE = 5, - HEIGAN_EVENT_PLAGUE_CLOUD = 6 + EVENT_DISRUPTION = 1, + EVENT_DECEPIT_FEVER = 2, + EVENT_ERUPT_SECTION = 3, + EVENT_SWITCH_PHASE = 4, + EVENT_SAFETY_DANCE = 5, + EVENT_PLAGUE_CLOUD = 6 }; -enum HeiganMisc +enum Misc { - HEIGAN_PHASE_SLOW_DANCE = 0, - HEIGAN_PHASE_FAST_DANCE = 1 + PHASE_SLOW_DANCE = 0, + PHASE_FAST_DANCE = 1 }; class boss_heigan : public CreatureScript @@ -86,10 +86,10 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; - Talk(HEIGAN_SAY_SLAY); + Talk(SAY_SLAY); if (pInstance) { pInstance->SetData(DATA_IMMORTAL_FAIL, 0); @@ -99,14 +99,14 @@ public: void JustDied(Unit* killer) override { BossAI::JustDied(killer); - Talk(HEIGAN_EMOTE_DEATH); + Talk(EMOTE_DEATH); } void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); me->SetInCombatWithZone(); - Talk(HEIGAN_SAY_AGGRO); + Talk(SAY_AGGRO); if (pInstance) { if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HEIGAN_ENTER_GATE))) @@ -114,7 +114,7 @@ public: go->SetGoState(GO_STATE_READY); } } - StartFightPhase(HEIGAN_PHASE_SLOW_DANCE); + StartFightPhase(PHASE_SLOW_DANCE); } void StartFightPhase(uint8 phase) @@ -122,30 +122,30 @@ public: currentSection = 3; currentPhase = phase; events.Reset(); - if (phase == HEIGAN_PHASE_SLOW_DANCE) + if (phase == PHASE_SLOW_DANCE) { me->CastStop(); me->SetReactState(REACT_AGGRESSIVE); DoZoneInCombat(); - events.ScheduleEvent(HEIGAN_EVENT_DISRUPTION, 12s, 15s); - events.ScheduleEvent(HEIGAN_EVENT_DECEPIT_FEVER, 17s); - events.ScheduleEvent(HEIGAN_EVENT_ERUPT_SECTION, 15s); - events.ScheduleEvent(HEIGAN_EVENT_SWITCH_PHASE, 90s); + events.ScheduleEvent(EVENT_DISRUPTION, 12s, 15s); + events.ScheduleEvent(EVENT_DECEPIT_FEVER, 17s); + events.ScheduleEvent(EVENT_ERUPT_SECTION, 15s); + events.ScheduleEvent(EVENT_SWITCH_PHASE, 90s); } - else // if (phase == HEIGAN_PHASE_FAST_DANCE) + else // if (phase == PHASE_FAST_DANCE) { - Talk(HEIGAN_EMOTE_DANCE); - Talk(HEIGAN_SAY_DANCE); + Talk(EMOTE_DANCE); + Talk(SAY_DANCE); me->AttackStop(); me->StopMoving(); me->SetReactState(REACT_PASSIVE); - me->CastSpell(me, HEIGAN_SPELL_TELEPORT_SELF, false); + me->CastSpell(me, SPELL_TELEPORT_SELF, false); me->SetFacingTo(2.40f); - events.ScheduleEvent(HEIGAN_EVENT_PLAGUE_CLOUD, 1s); - events.ScheduleEvent(HEIGAN_EVENT_ERUPT_SECTION, 7s); - events.ScheduleEvent(HEIGAN_EVENT_SWITCH_PHASE, 45s); + events.ScheduleEvent(EVENT_PLAGUE_CLOUD, 1s); + events.ScheduleEvent(EVENT_ERUPT_SECTION, 7s); + events.ScheduleEvent(EVENT_SWITCH_PHASE, 45s); } - events.ScheduleEvent(HEIGAN_EVENT_SAFETY_DANCE, 5s); + events.ScheduleEvent(EVENT_SAFETY_DANCE, 5s); } bool IsInRoom(Unit* who) @@ -172,29 +172,29 @@ public: switch (events.ExecuteEvent()) { - case HEIGAN_EVENT_DISRUPTION: - me->CastSpell(me, HEIGAN_SPELL_SPELL_DISRUPTION, false); + case EVENT_DISRUPTION: + me->CastSpell(me, SPELL_SPELL_DISRUPTION, false); events.Repeat(10s); break; - case HEIGAN_EVENT_DECEPIT_FEVER: - me->CastSpell(me, RAID_MODE(HEIGAN_SPELL_DECREPIT_FEVER_10, HEIGAN_SPELL_DECREPIT_FEVER_25), false); + case EVENT_DECEPIT_FEVER: + me->CastSpell(me, RAID_MODE(SPELL_DECREPIT_FEVER_10, SPELL_DECREPIT_FEVER_25), false); events.Repeat(22s, 25s); break; - case HEIGAN_EVENT_PLAGUE_CLOUD: - me->CastSpell(me, HEIGAN_SPELL_PLAGUE_CLOUD, false); + case EVENT_PLAGUE_CLOUD: + me->CastSpell(me, SPELL_PLAGUE_CLOUD, false); break; - case HEIGAN_EVENT_SWITCH_PHASE: - if (currentPhase == HEIGAN_PHASE_SLOW_DANCE) + case EVENT_SWITCH_PHASE: + if (currentPhase == PHASE_SLOW_DANCE) { - StartFightPhase(HEIGAN_PHASE_FAST_DANCE); + StartFightPhase(PHASE_FAST_DANCE); } else { - StartFightPhase(HEIGAN_PHASE_SLOW_DANCE); - Talk(HEIGAN_EMOTE_DANCE_END); // avoid play the emote on aggro + StartFightPhase(PHASE_SLOW_DANCE); + Talk(EMOTE_DANCE_END); // avoid play the emote on aggro } break; - case HEIGAN_EVENT_ERUPT_SECTION: + case EVENT_ERUPT_SECTION: if (pInstance) { pInstance->SetData(DATA_HEIGAN_ERUPTION, currentSection); @@ -208,16 +208,16 @@ public: } moveRight ? currentSection++ : currentSection--; } - if (currentPhase == HEIGAN_PHASE_SLOW_DANCE) + if (currentPhase == PHASE_SLOW_DANCE) { - Talk(HEIGAN_SAY_TAUNT); + Talk(SAY_TAUNT); } - events.Repeat(currentPhase == HEIGAN_PHASE_SLOW_DANCE ? 10s : 4s); + events.Repeat(currentPhase == PHASE_SLOW_DANCE ? 10s : 4s); break; - case HEIGAN_EVENT_SAFETY_DANCE: + case EVENT_SAFETY_DANCE: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for (const auto& itr : pList) + for (auto const& itr : pList) { if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive()) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 734da65e2..c5e5d13f8 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -23,6 +23,7 @@ #include "SpellScriptLoader.h" #include "naxxramas.h" + using namespace Kelthuzad; void AddSC_boss_kelthuzad() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.h b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.h index 9ca392250..a80aee931 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.h @@ -251,7 +251,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_SLAY); @@ -553,7 +553,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER && !who->IsPet()) + if (!who->IsPlayer() && !who->IsPet()) return; ScriptedAI::MoveInLineOfSight(who); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index ead2c0cb7..4cbc7a79a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -20,6 +20,7 @@ #include "ScriptedCreature.h" #include "naxxramas.h" + using namespace Noth; void AddSC_boss_noth() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.h b/src/server/scripts/Northrend/Naxxramas/boss_noth.h index c24664872..05225e19e 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.h @@ -8,20 +8,20 @@ namespace Noth { -enum NothSays +enum Says { - NOTH_SAY_AGGRO = 0, - NOTH_SAY_SUMMON = 1, - NOTH_SAY_SLAY = 2, - NOTH_SAY_DEATH = 3, - NOTH_EMOTE_SUMMON = 4, - NOTH_EMOTE_SUMMON_WAVE = 5, - NOTH_EMOTE_TELEPORT_BALCONY = 6, - NOTH_EMOTE_TELEPORT_BACK = 7, - NOTH_EMOTE_BLINK = 8 + SAY_AGGRO = 0, + SAY_SUMMON = 1, + SAY_SLAY = 2, + SAY_DEATH = 3, + EMOTE_SUMMON = 4, + EMOTE_SUMMON_WAVE = 5, + EMOTE_TELEPORT_BALCONY = 6, + EMOTE_TELEPORT_BACK = 7, + EMOTE_BLINK = 8 }; -enum NothSpells +enum Spells { SPELL_CURSE_OF_THE_PLAGUEBRINGER_10 = 29213, SPELL_CURSE_OF_THE_PLAGUEBRINGER_25 = 54835, @@ -30,11 +30,11 @@ enum NothSpells SPELL_SUMMON_PLAGUED_WARRIORS = 29237, SPELL_TELEPORT = 29216, SPELL_TELEPORT_BACK = 29231, - NOTH_SPELL_BERSERK = 68378, + SPELL_BERSERK = 68378, SPELL_BLINK = 29208 }; -enum NothEvents +enum Events { EVENT_CURSE = 1, EVENT_CRIPPLE = 2, @@ -47,7 +47,7 @@ enum NothEvents EVENT_BALCONY_SUMMON_REAL = 9 }; -enum NothMisc +enum Misc { NPC_PLAGUED_WARRIOR = 16984, NPC_PLAGUED_CHAMPION = 16983, @@ -158,7 +158,7 @@ public: void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - Talk(NOTH_SAY_AGGRO); + Talk(SAY_AGGRO); StartGroundPhase(); if (pInstance) { @@ -183,7 +183,7 @@ public: me->NearTeleportTo(nothPosition.GetPositionX(), nothPosition.GetPositionY(), nothPosition.GetPositionZ(), nothPosition.GetOrientation(), true); } BossAI::JustDied(killer); - Talk(NOTH_SAY_DEATH); + Talk(SAY_DEATH); if (pInstance) { if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_NOTH_ENTRY_GATE))) @@ -195,10 +195,10 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; - Talk(NOTH_SAY_SLAY); + Talk(SAY_SLAY); if (pInstance) { pInstance->SetData(DATA_IMMORTAL_FAIL, 0); @@ -228,8 +228,8 @@ public: events.Repeat(25s); break; case EVENT_SUMMON_PLAGUED_WARRIOR_ANNOUNCE: - Talk(NOTH_SAY_SUMMON); - Talk(NOTH_EMOTE_SUMMON); + Talk(SAY_SUMMON); + Talk(EMOTE_SUMMON); events.Repeat(30s); events.ScheduleEvent(EVENT_SUMMON_PLAGUED_WARRIOR_REAL, 4s); break; @@ -238,7 +238,7 @@ public: SummonHelper(NPC_PLAGUED_WARRIOR, RAID_MODE(2, 3)); break; case EVENT_MOVE_TO_BALCONY: - Talk(NOTH_EMOTE_TELEPORT_BALCONY); + Talk(EMOTE_TELEPORT_BALCONY); me->CastSpell(me, SPELL_TELEPORT, true); StartBalconyPhase(); break; @@ -246,12 +246,12 @@ public: DoResetThreatList(); me->CastSpell(me, RAID_MODE(SPELL_CRIPPLE_10, SPELL_CRIPPLE_25), false); me->CastSpell(me, SPELL_BLINK, true); - Talk(NOTH_EMOTE_BLINK); + Talk(EMOTE_BLINK); events.Repeat(30s); break; // BALCONY case EVENT_BALCONY_SUMMON_ANNOUNCE: - Talk(NOTH_EMOTE_SUMMON_WAVE); + Talk(EMOTE_SUMMON_WAVE); events.Repeat(30s); events.ScheduleEvent(EVENT_BALCONY_SUMMON_REAL, 4s); break; @@ -272,12 +272,12 @@ public: } break; case EVENT_MOVE_TO_GROUND: - Talk(NOTH_EMOTE_TELEPORT_BACK); + Talk(EMOTE_TELEPORT_BACK); me->CastSpell(me, SPELL_TELEPORT_BACK, true); timesInBalcony++; if (timesInBalcony == 3) { - DoCastSelf(NOTH_SPELL_BERSERK); + DoCastSelf(SPELL_BERSERK); } StartGroundPhase(); break; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp index cfa7b18c7..aa8783aa5 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp @@ -20,6 +20,7 @@ #include "ScriptedCreature.h" #include "naxxramas.h" + using namespace PatchWerk; void AddSC_boss_patchwerk() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.h b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.h index 18d87a645..2cc7600a0 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.h @@ -8,33 +8,33 @@ namespace PatchWerk { -enum PatchwerkYells +enum Yells { - PATCHWERK_SAY_AGGRO = 0, - PATCHWERK_SAY_SLAY = 1, - PATCHWERK_SAY_DEATH = 2, - PATCHWERK_EMOTE_BERSERK = 3, - PATCHWERK_EMOTE_ENRAGE = 4 + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_DEATH = 2, + EMOTE_BERSERK = 3, + EMOTE_ENRAGE = 4 }; -enum PatchwerkSpells +enum Spells { SPELL_HATEFUL_STRIKE_10 = 41926, SPELL_HATEFUL_STRIKE_25 = 59192, - PATCHWERK_SPELL_FRENZY = 28131, - PATCHWERK_SPELL_BERSERK = 26662, + SPELL_FRENZY = 28131, + SPELL_BERSERK = 26662, SPELL_SLIME_BOLT = 32309 }; -enum PatchwerkEvents +enum Events { - PATCHWERK_EVENT_HEALTH_CHECK = 1, + EVENT_HEALTH_CHECK = 1, EVENT_HATEFUL_STRIKE = 2, EVENT_SLIME_BOLT = 3, - PATCHWERK_EVENT_BERSERK = 4 + EVENT_BERSERK = 4 }; -enum PatchwerkMisc +enum Misc { ACHIEV_TIMED_START_EVENT = 10286 }; @@ -67,12 +67,12 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (!urand(0, 3)) { - Talk(PATCHWERK_SAY_SLAY); + Talk(SAY_SLAY); } if (pInstance) { @@ -83,17 +83,17 @@ public: void JustDied(Unit* killer) override { BossAI::JustDied(killer); - Talk(PATCHWERK_SAY_DEATH); + Talk(SAY_DEATH); } void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - Talk(PATCHWERK_SAY_AGGRO); + Talk(SAY_AGGRO); me->SetInCombatWithZone(); events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 1500ms); - events.ScheduleEvent(PATCHWERK_EVENT_BERSERK, 6min); - events.ScheduleEvent(PATCHWERK_EVENT_HEALTH_CHECK, 1s); + events.ScheduleEvent(EVENT_BERSERK, 6min); + events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s); if (pInstance) { pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); @@ -159,20 +159,20 @@ public: events.Repeat(1s); break; } - case PATCHWERK_EVENT_BERSERK: - Talk(PATCHWERK_EMOTE_BERSERK); - me->CastSpell(me, PATCHWERK_SPELL_BERSERK, true); + case EVENT_BERSERK: + Talk(EMOTE_BERSERK); + me->CastSpell(me, SPELL_BERSERK, true); events.ScheduleEvent(EVENT_SLIME_BOLT, 3s); break; case EVENT_SLIME_BOLT: me->CastSpell(me, SPELL_SLIME_BOLT, false); events.Repeat(3s); break; - case PATCHWERK_EVENT_HEALTH_CHECK: + case EVENT_HEALTH_CHECK: if (me->GetHealthPct() <= 5) { - Talk(PATCHWERK_EMOTE_ENRAGE); - me->CastSpell(me, PATCHWERK_SPELL_FRENZY, true); + Talk(EMOTE_ENRAGE); + me->CastSpell(me, SPELL_FRENZY, true); break; } events.Repeat(1s); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp index dc701b9c0..106f70e54 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp @@ -21,6 +21,7 @@ #include "naxxramas.h" #include "SpellInfo.h" + using namespace Razuvious; void AddSC_boss_razuvious() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.h b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.h index 11fb73b60..66f43e725 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.h @@ -210,7 +210,7 @@ public: void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override { // Damage done by the controlled Death Knight understudies should also count toward damage done by players - if(who && who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_DEATH_KNIGHT_UNDERSTUDY) + if(who && who->IsCreature() && who->GetEntry() == NPC_DEATH_KNIGHT_UNDERSTUDY) { me->LowerPlayerDamageReq(damage); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 09989da49..7d7fee5b7 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -23,6 +23,7 @@ #include "SpellScriptLoader.h" #include "naxxramas.h" + using namespace Sapphiron; void AddSC_boss_sapphiron() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.h b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.h index 9fad5789a..29c05bde2 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.h @@ -130,7 +130,7 @@ public: if (PlList.IsEmpty()) return; - for (const auto& i : PlList) + for (auto const& i : PlList) { if (Player* player = i.GetSource()) { @@ -388,7 +388,7 @@ public: case EVENT_HUNDRED_CLUB: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for (const auto& itr : pList) + for (auto const& itr : pList) { if (itr.GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100 && pInstance) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index 4c13cbdf8..3855db22a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -24,6 +24,7 @@ #include "SpellScriptLoader.h" #include "naxxramas.h" + using namespace Thaddius; void AddSC_boss_thaddius() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.h b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.h index c6ebd6a24..e7962364a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.h @@ -197,7 +197,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_SLAY); @@ -477,7 +477,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (pInstance) @@ -635,7 +635,7 @@ class spell_thaddius_pos_neg_charge : public SpellScript if (!target) return; - if (target->HasAura(GetTriggeringSpell()->Id) || target->GetTypeId() != TYPEID_PLAYER) + if (target->HasAura(GetTriggeringSpell()->Id) || !target->IsPlayer()) { SetHitDamage(0); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp index c3efec7bf..162579292 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp @@ -245,7 +245,7 @@ class spell_boss_magus_telestra_summon_telestra_clones_aura : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 958af9464..0e54a5e37 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -354,7 +354,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner->IsPlayer()) { return; } @@ -392,7 +392,7 @@ public: void PassengerBoarded(Unit* passenger, int8 /*seatid*/, bool add) override { - if (passenger->GetTypeId() != TYPEID_PLAYER) + if (!passenger->IsPlayer()) return; if (add) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index 919cdbcc8..9435ba649 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -197,7 +197,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp index 2624f55ad..0524fd43f 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp @@ -132,7 +132,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index e41c57ace..0ad61d242 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -162,7 +162,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index 3de2a1263..c64594b11 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -183,7 +183,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 3374fad99..9eec77e62 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -401,7 +401,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!victim->IsPlayer() || urand(0, 2)) return; Talk(SAY_ALGALON_KILL); @@ -1018,7 +1018,7 @@ public: void SpellHit(Unit* caster, SpellInfo const* spell) override { - if (spell->Id != SPELL_CONSTELLATION_PHASE_EFFECT || caster->GetTypeId() != TYPEID_UNIT) + if (spell->Id != SPELL_CONSTELLATION_PHASE_EFFECT || !caster->IsCreature()) return; if (InstanceScript* instance = me->GetInstanceScript()) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp index aaef1709b..8007e94d9 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp @@ -310,7 +310,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (_phase == 3) @@ -488,7 +488,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_MOLGEIM_SLAY); @@ -706,7 +706,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!who->IsPlayer() || urand(0, 2)) return; Talk(SAY_BRUNDIR_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index b1b8fb589..101116798 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -194,7 +194,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!victim->IsPlayer() || urand(0, 2)) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 471f6784d..7b1ebde90 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -447,7 +447,7 @@ public: case EVENT_REINSTALL: for (uint8 i = RAID_MODE(0, 2); i < 4; ++i) if (Unit* seat = vehicle->GetPassenger(i)) - if (seat->GetTypeId() == TYPEID_UNIT) + if (seat->IsCreature()) seat->ToCreature()->AI()->EnterEvadeMode(); Talk(FLAME_LEVIATHAN_EMOTE_REACTIVATE); return; @@ -758,7 +758,7 @@ public: void PassengerBoarded(Unit* who, int8 seatId, bool apply) override { - if (who->GetTypeId() != TYPEID_PLAYER || !me->GetVehicle()) + if (!who->IsPlayer() || !me->GetVehicle()) return; who->ApplySpellImmune(63847, IMMUNITY_ID, 63847, apply); // SPELL_FLAME_VENTS_TRIGGER @@ -780,7 +780,7 @@ public: { turret->ReplaceAllUnitFlags(UNIT_FLAG_NOT_SELECTABLE); turret->SetImmuneToAll(true); - if (turret->GetTypeId() == TYPEID_UNIT) + if (turret->IsCreature()) turret->ToCreature()->AI()->EnterEvadeMode(); } } @@ -829,7 +829,7 @@ public: bool CanAIAttack(Unit const* who) const override { - if (!who || who->GetTypeId() != TYPEID_PLAYER || !who->GetVehicle() || who->GetVehicleBase()->GetEntry() != NPC_SEAT) + if (!who || !who->IsPlayer() || !who->GetVehicle() || who->GetVehicleBase()->GetEntry() != NPC_SEAT) return false; return true; } @@ -1231,7 +1231,7 @@ public: { if (!_lock) { - if (who->GetTypeId() != TYPEID_PLAYER && !who->IsVehicle()) + if (!who->IsPlayer() && !who->IsVehicle()) return; // MIMIRON @@ -1753,7 +1753,7 @@ class spell_vehicle_grab_pyrite : public SpellScript GetCaster()->CastSpell(parent, SPELL_ADD_PYRITE, true); target->CastSpell(seat, GetEffectValue()); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->DespawnOrUnsummon(1300); } } @@ -1927,7 +1927,7 @@ class spell_demolisher_ride_vehicle : public SpellScript SpellCastResult CheckCast() { - if (GetCaster()->GetTypeId() != TYPEID_PLAYER) + if (!GetCaster()->IsPlayer()) return SPELL_CAST_OK; Unit* target = this->GetExplTargetUnit(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 92581c758..aa4419540 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -307,7 +307,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!victim->IsPlayer() || urand(0, 2)) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index 872d9340d..be71517da 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -486,7 +486,7 @@ class spell_aura_of_despair_aura : public AuraScript if (Unit* caster = GetCaster()) if (Unit* target = GetTarget()) { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->CastSpell(target, SPELL_AURA_OF_DESPAIR_2, true); @@ -614,7 +614,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_VEZAX && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(1); + return target && target->GetEntry() == NPC_VEZAX && target->IsCreature() && target->ToCreature()->AI()->GetData(1); } }; @@ -625,7 +625,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_VEZAX && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(2); + return target && target->GetEntry() == NPC_VEZAX && target->IsCreature() && target->ToCreature()->AI()->GetData(2); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index e526e3299..7c1dbd136 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -578,7 +578,7 @@ public: { if (t->IsPlayer()) return !t->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER); - else if (t->GetTypeId() == TYPEID_UNIT) + else if (t->IsCreature()) return !t->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC); return true; @@ -702,7 +702,7 @@ public: { if (Unit* s = me->ToTempSummon()->GetSummonerUnit()) { - if ((s->IsPlayer() && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER)) || (s->GetTypeId() == TYPEID_UNIT && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))) + if ((s->IsPlayer() && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER)) || (s->IsCreature() && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))) me->DespawnOrUnsummon(2000); else if (s->IsPlayer()) if (InstanceScript* instanceScript = me->GetInstanceScript()) @@ -1354,14 +1354,14 @@ class spell_hodir_flash_freeze_aura : public AuraScript { Unit* target = GetTarget(); Unit* caster = GetCaster(); - if (!target || !caster || caster->GetTypeId() != TYPEID_UNIT) + if (!target || !caster || !caster->IsCreature()) return; if (Aura* aur = target->GetAura(target->IsPlayer() ? SPELL_FLASH_FREEZE_TRAPPED_PLAYER : SPELL_FLASH_FREEZE_TRAPPED_NPC)) { if (Unit* caster2 = aur->GetCaster()) { - if (caster2->GetTypeId() == TYPEID_UNIT) + if (caster2->IsCreature()) { caster2->ToCreature()->DespawnOrUnsummon(); } @@ -1378,7 +1378,7 @@ class spell_hodir_flash_freeze_aura : public AuraScript caster->ToCreature()->AI()->JustSummoned(c); } } - else if (target->GetTypeId() == TYPEID_UNIT) + else if (target->IsCreature()) { if( Creature* c = target->SummonCreature(NPC_FLASH_FREEZE_NPC, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000) ) { @@ -1483,7 +1483,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_HODIR && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(1); + return target && target->GetEntry() == NPC_HODIR && target->IsCreature() && target->ToCreature()->AI()->GetData(1); } }; @@ -1494,7 +1494,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_HODIR && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(2); + return target && target->GetEntry() == NPC_HODIR && target->IsCreature() && target->ToCreature()->AI()->GetData(2); } }; @@ -1505,7 +1505,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_HODIR && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(3); + return target && target->GetEntry() == NPC_HODIR && target->IsCreature() && target->ToCreature()->AI()->GetData(3); } }; @@ -1516,7 +1516,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_HODIR && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(4); + return target && target->GetEntry() == NPC_HODIR && target->IsCreature() && target->ToCreature()->AI()->GetData(4); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index 7277c0257..f44e278d4 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -542,7 +542,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - if (!target || target->GetTypeId() != TYPEID_UNIT) + if (!target || !target->IsCreature()) return false; return !!target->ToCreature()->AI()->GetData(1337); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index f9210e80c..fdbebae70 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -707,7 +707,7 @@ public: if (target == _victim && _me->GetThreatMgr().GetThreatListSize() > 1) return true; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return true; return false; @@ -724,7 +724,7 @@ class spell_ulduar_stone_grip_cast_target : public SpellScript bool Load() override { - if (GetCaster()->GetTypeId() != TYPEID_UNIT) + if (!GetCaster()->IsCreature()) return false; return true; } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index a80545c36..5ced2828d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -1342,7 +1342,7 @@ public: if( Vehicle* vk = me->GetVehicleKit() ) for (uint8 i = 0; i < 2; ++i) if (Unit* r = vk->GetPassenger(5 + i)) - if (r->GetTypeId() == TYPEID_UNIT) + if (r->IsCreature()) r->ToCreature()->DespawnOrUnsummon(1); } @@ -1438,7 +1438,7 @@ public: exitPos.m_positionZ += 2.0f * Phase; r->_ExitVehicle(&exitPos); me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE, r->GetGUID()); - if (r->GetTypeId() == TYPEID_UNIT) + if (r->IsCreature()) r->ToCreature()->AI()->SetData(0, 0); } } @@ -2155,7 +2155,7 @@ class spell_mimiron_p3wx2_laser_barrage_aura : public AuraScript { if (Unit* caster = GetCaster()) { - if (caster->GetTypeId() != TYPEID_UNIT) + if (!caster->IsCreature()) return; uint32 diff = getMSTimeDiff(_lastMSTime, GameTime::GetGameTimeMS().count()); if (_lastOrientation == -1.0f) @@ -2466,7 +2466,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_MIMIRON && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(1); + return target && target->GetEntry() == NPC_MIMIRON && target->IsCreature() && target->ToCreature()->AI()->GetData(1); } }; @@ -2477,7 +2477,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_MIMIRON && target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->AI()->GetData(11); + return target && target->GetEntry() == NPC_MIMIRON && target->IsCreature() && !target->ToCreature()->AI()->GetData(11); } }; @@ -2488,7 +2488,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_MIMIRON && target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->AI()->GetData(12); + return target && target->GetEntry() == NPC_MIMIRON && target->IsCreature() && !target->ToCreature()->AI()->GetData(12); } }; @@ -2499,7 +2499,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_MIMIRON && target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->AI()->GetData(13); + return target && target->GetEntry() == NPC_MIMIRON && target->IsCreature() && !target->ToCreature()->AI()->GetData(13); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 1baf2d1dd..985c014da 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -711,7 +711,7 @@ public: if (_introSpoken) return; - if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDist2d(who) > 15.0f) + if (!who->IsPlayer() || me->GetExactDist2d(who) > 15.0f) return; _introSpoken = true; @@ -1153,7 +1153,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetTypeId() == TYPEID_UNIT && target->GetEntry() == NPC_RAZORSCALE && target->ToCreature()->AI()->GetData(1); + return target && target->IsCreature() && target->GetEntry() == NPC_RAZORSCALE && target->ToCreature()->AI()->GetData(1); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 98e944888..c67299d86 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -427,7 +427,7 @@ public: { summons.Summon(cr); if (Unit* owner = me->GetVehicleBase()) - if (owner->GetTypeId() == TYPEID_UNIT) + if (owner->IsCreature()) owner->ToCreature()->AI()->JustSummoned(cr); } void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index df26adcb6..bf51c0556 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -1103,7 +1103,7 @@ public: if (Creature* algalon = instance->GetCreature(m_uiAlgalonGUID)) algalon->AI()->DoAction(ACTION_FEEDS_ON_TEARS_FAILED); } - else if (unit->GetTypeId() == TYPEID_UNIT && unit->GetAreaId() == 4656 /*Conservatory of Life*/) + else if (unit->IsCreature() && unit->GetAreaId() == 4656 /*Conservatory of Life*/) { if (GameTime::GetGameTime().count() > (m_conspeedatoryAttempt + DAY)) { diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index c196312e4..5222dcae7 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -328,7 +328,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index aa7d0e250..35409dd8b 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -404,7 +404,7 @@ class spell_svala_ritual_strike : public SpellScript { if (Unit* unitTarget = GetHitUnit()) { - if (unitTarget->GetTypeId() != TYPEID_UNIT) + if (!unitTarget->IsCreature()) return; Unit::DealDamage(GetCaster(), unitTarget, 7000, nullptr, DIRECT_DAMAGE); diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index 001b2dfb2..6b02fe826 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -217,7 +217,7 @@ public: void HandlePeriodicDummy(AuraEffect const* /*aurEff*/) { Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_UNIT && GetAura()->GetStackAmount() >= 10) + if (target->IsCreature() && GetAura()->GetStackAmount() >= 10) { target->CastSpell(target, SPELL_OVERCHARGED_BLAST, true); Unit::Kill(target, target, false); diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 4355e2109..8798a5691 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -45,7 +45,7 @@ class spell_q11919_q11940_drake_hunt_aura : public AuraScript bool Load() override { - return GetOwner()->GetTypeId() == TYPEID_UNIT; + return GetOwner()->IsCreature(); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -217,7 +217,7 @@ public: { ScriptedAI::MoveInLineOfSight(who); - if (who->GetTypeId() != TYPEID_UNIT) + if (!who->IsCreature()) return; if (who->GetEntry() == NPC_ORPHANED_MAMMOTH_CALF && me->IsWithinDistInMap(who, 10.0f)) @@ -314,7 +314,7 @@ public: void JustDied(Unit* killer) override { - if (!killer || killer->GetTypeId() != TYPEID_PLAYER) + if (!killer || !killer->IsPlayer()) { return; } diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 9d0a4f893..c3525a4cd 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -694,7 +694,7 @@ public: if (Vehicle* gryphon = me->GetVehicleKit()) if (Unit* villager = gryphon->GetPassenger(1)) { - if (villager->GetTypeId() != TYPEID_UNIT) + if (!villager->IsCreature()) return; if (Creature* seat = villager->ToCreature()) @@ -1296,7 +1296,7 @@ public: if (Unit* vb = c->GetVehicleBase()) { if (Unit* pass = vb->GetVehicleKit()->GetPassenger(0)) - if (pass->GetTypeId() == TYPEID_UNIT) + if (pass->IsCreature()) pass->ToCreature()->DespawnOrUnsummon(1); vb->RemoveAllAuras(); vb->ToCreature()->DespawnOrUnsummon(1); @@ -1323,7 +1323,7 @@ public: void SpellHitTarget(Unit* target, SpellInfo const* spell) override { - if (spell->Id == SPELL_SAC_REPEL_HAMMER && target->GetTypeId() == TYPEID_UNIT) + if (spell->Id == SPELL_SAC_REPEL_HAMMER && target->IsCreature()) { target->CastSpell((Unit*)nullptr, SPELL_SAC_THROW_HAMMER, true); target->ToCreature()->DespawnOrUnsummon(1); @@ -1469,7 +1469,7 @@ public: explicit GhoulTargetCheck(bool alive) : _alive(alive) {} bool operator()(WorldObject* object) const { - return _alive ^ (object->GetTypeId() != TYPEID_UNIT || ((Unit*)object)->GetDisplayId() != 11686); + return _alive ^ (!object->IsCreature() || ((Unit*)object)->GetDisplayId() != 11686); } private: bool _alive; @@ -1489,7 +1489,7 @@ class spell_q24545_aod_special : public SpellScript { PreventHitDefaultEffect(effIndex); if (Unit* target = GetHitUnit()) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id == 70790 ? -2 : -1); } @@ -1648,7 +1648,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (!summoner || summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner || !summoner->IsPlayer()) return; uint8 id = GetSpeachId(); diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index 06974fad7..4f925cfef 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -967,7 +967,7 @@ class spell_shredder_delivery : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScript(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index 79cfb26da..e36fe45b5 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -139,7 +139,7 @@ public: void setphase(short newPhase) { Unit* summoner = me->ToTempSummon() ? me->ToTempSummon()->GetSummonerUnit() : nullptr; - if (!summoner || summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner || !summoner->IsPlayer()) return; switch (newPhase) diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 684b6a58b..ab3e63295 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -51,7 +51,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER || me->GetDistance(who) > 8.0f || who->ToPlayer()->GetQuestStatus(QUEST_BLACK_KNIGHT_CURSE) != QUEST_STATUS_INCOMPLETE) + if (!who->IsPlayer() || me->GetDistance(who) > 8.0f || who->ToPlayer()->GetQuestStatus(QUEST_BLACK_KNIGHT_CURSE) != QUEST_STATUS_INCOMPLETE) return; if (me->FindNearestCreature(NPC_CULT_ASSASSIN, 30.0f)) @@ -1248,7 +1248,7 @@ public: if (!summoner) return; - if (summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner->IsPlayer()) return; Player* player = summoner->ToPlayer(); @@ -1493,7 +1493,7 @@ public: if (me->GetAreaId() != AREA_SUNREAVER_PAVILION && me->GetAreaId() != AREA_SILVER_COVENANT_PAVILION) return; - if (!who || who->GetTypeId() != TYPEID_PLAYER || !me->IsHostileTo(who) || !me->isInBackInMap(who, 5.0f)) + if (!who || !who->IsPlayer() || !me->IsHostileTo(who) || !me->isInBackInMap(who, 5.0f)) return; if (who->HasAura(SPELL_TRESPASSER_H) || who->HasAura(SPELL_TRESPASSER_A)) diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index 8ab42c3f9..5c82da7a9 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -875,7 +875,7 @@ public: for (uint8 i = 1; i < 4; ++i) if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i)) { - if (prisoner->GetTypeId() != TYPEID_UNIT) + if (!prisoner->IsCreature()) return; prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true); prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true); diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 3a4ea4d30..56aa104a6 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -34,6 +34,7 @@ #include "SpellScriptLoader.h" #include "Vehicle.h" #include "World.h" +#include enum eWGqueuenpctext { @@ -1089,7 +1090,7 @@ class spell_wg_reduce_damage_by_distance : public SpellScript float maxDistance = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); // Xinef: always stored in EFFECT_0 float distance = std::min(GetHitUnit()->GetDistance(*GetExplTargetDest()), maxDistance); - int32 damage = std::max(0, int32(GetHitDamage() - floor(GetHitDamage() * (distance / maxDistance)))); + int32 damage = std::max(0, int32(GetHitDamage() - std::floor(GetHitDamage() * (distance / maxDistance)))); SetHitDamage(damage); } diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp index 403fafd97..1fb4a1231 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp @@ -322,7 +322,7 @@ void OPvPCapturePointHP::HandlePlayerLeave(Player* player) void OutdoorPvPHP::HandleKillImpl(Player* player, Unit* killed) { - if (killed->GetTypeId() != TYPEID_PLAYER) + if (!killed->IsPlayer()) return; if (player->GetTeamId() == TEAM_ALLIANCE && killed->ToPlayer()->GetTeamId() != TEAM_ALLIANCE) diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp index f8b8664d7..6db94e287 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp @@ -56,7 +56,7 @@ void OutdoorPvPNA::HandleKill(Player* killer, Unit* killed) // creature kills must be notified, even if not inside objective / not outdoor pvp active // player kills only count if active and inside objective - if ((groupGuy->IsOutdoorPvPActive() && groupGuy->GetAreaId() == NA_HALAA_ZONE_ID) || killed->GetTypeId() == TYPEID_UNIT) + if ((groupGuy->IsOutdoorPvPActive() && groupGuy->GetAreaId() == NA_HALAA_ZONE_ID) || killed->IsCreature()) { HandleKillImpl(groupGuy, killed); } @@ -65,7 +65,7 @@ void OutdoorPvPNA::HandleKill(Player* killer, Unit* killed) else { // creature kills must be notified, even if not inside objective / not outdoor pvp active - if (killer && ((killer->IsOutdoorPvPActive() && killer->ToPlayer()->GetAreaId() == NA_HALAA_ZONE_ID) || killed->GetTypeId() == TYPEID_UNIT)) + if (killer && ((killer->IsOutdoorPvPActive() && killer->ToPlayer()->GetAreaId() == NA_HALAA_ZONE_ID) || killed->IsCreature())) { HandleKillImpl(killer, killed); } diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp index ab0325b9b..3ecf6d9e7 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp @@ -199,7 +199,7 @@ bool OutdoorPvPZM::SetupOutdoorPvP() void OutdoorPvPZM::HandleKillImpl(Player* player, Unit* killed) { - if (killed->GetTypeId() != TYPEID_PLAYER) + if (!killed->IsPlayer()) return; if (player->GetTeamId() == TEAM_ALLIANCE && killed->ToPlayer()->GetTeamId() != TEAM_ALLIANCE) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 70e1c3fa0..7c165d68e 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1194,7 +1194,7 @@ class spell_illidan_demon_transform1_aura : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void OnPeriodic(AuraEffect const* /*aurEff*/) @@ -1222,7 +1222,7 @@ class spell_illidan_demon_transform2_aura : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void OnPeriodic(AuraEffect const* aurEff) @@ -1313,7 +1313,7 @@ class spell_illidan_cage_trap : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScriptEffect(SpellEffIndex effIndex) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp index 5c20cb1e5..407506228 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -88,12 +88,6 @@ enum Misc EVENT_SPELL_JUDGEMENT = 5, EVENT_SPELL_CONSECRATION = 6, - EVENT_SPELL_FLAMESTRIKE = 10, - EVENT_SPELL_BLIZZARD = 11, - EVENT_SPELL_ARCANE_BOLT = 12, - EVENT_SPELL_DAMPEN_MAGIC = 13, - EVENT_SPELL_ARCANE_EXPLOSION = 14, - EVENT_SPELL_REFLECTIVE_SHIELD = 20, EVENT_SPELL_CIRCLE_OF_HEALING = 21, EVENT_SPELL_DIVINE_WRATH = 22, @@ -146,9 +140,10 @@ struct boss_illidari_council : public BossAI void DoAction(int32 param) override { - if (!me->isActiveObject() && param == ACTION_START_ENCOUNTER) + if (param == ACTION_START_ENCOUNTER) { - me->setActive(true); + if (!me->isActiveObject()) + me->setActive(true); bool spoken = false; @@ -231,7 +226,12 @@ struct boss_illidari_council_memberAI : public ScriptedAI void EnterEvadeMode(EvadeReason why) override { - me->SetOwnerGUID(ObjectGuid::Empty); + if (Unit* council = me->GetOwner()) + { + me->SetOwnerGUID(ObjectGuid::Empty); // Set owner here to avoid infinite loop of evade calls + if (council->ToCreature()->AI()) + council->ToCreature()->AI()->EnterEvadeMode(why); + } ScriptedAI::EnterEvadeMode(why); } @@ -248,13 +248,13 @@ struct boss_illidari_council_memberAI : public ScriptedAI { InstanceScript* instance = me->GetInstanceScript(); - if (me->GetHealth() <= damage) - damage = me->GetHealth() - 1; - int32 damageTaken = damage; Creature* target = instance->GetCreature(DATA_ILLIDARI_COUNCIL); me->CastCustomSpell(target->ToUnit(), SPELL_SHARED_RULE_DMG, &damageTaken, &damageTaken, &damageTaken, true, nullptr, nullptr, me->GetGUID()); + + if (me->GetHealth() <= damage) + damage = me->GetHealth() - 1; } void KilledUnit(Unit*) override @@ -372,22 +372,67 @@ private: struct boss_high_nethermancer_zerevor : public boss_illidari_council_memberAI { - boss_high_nethermancer_zerevor(Creature* creature) : boss_illidari_council_memberAI(creature) { } + boss_high_nethermancer_zerevor(Creature* creature) : boss_illidari_council_memberAI(creature), _canCastDampenMagic(true) { } + + void Reset() override + { + scheduler.CancelAll(); + _canCastDampenMagic = true; + boss_illidari_council_memberAI::Reset(); + CastDampenMagicIfPossible(); + } void AttackStart(Unit* who) override { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, 20.0f); + AttackStartCaster(who, 20.0f); } void JustEngagedWith(Unit* who) override { boss_illidari_council_memberAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 5000); - events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 15000); - events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 0); - events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); + + ScheduleTimedEvent(25s, [&] + { + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + DoCastRandomTarget(SPELL_FLAMESTRIKE, 0, 100.0f); + }, 40s); + + ScheduleTimedEvent(15s, [&] + { + DoCastVictim(SPELL_ARCANE_BOLT); + }, 3s); + + ScheduleTimedEvent(5s, [&] + { + DoCastRandomTarget(SPELL_BLIZZARD, 0, 100.0f); + }, 40s); + + ScheduleTimedEvent(10s, [&] + { + if (SelectTarget(SelectTargetMethod::Random, 0, 10.0f)) + DoCastAOE(SPELL_ARCANE_EXPLOSION); + }, 10s); + + if (Aura* aura = me->GetAura(SPELL_DAMPEN_MAGIC)) + { + if (aura->GetDuration() <= 4 * MINUTE * IN_MILLISECONDS) + CastDampenMagicIfPossible(); + } + } + + void OnAuraRemove(AuraApplication* auraApp, AuraRemoveMode mode) override + { + if (auraApp->GetBase()->GetId() == SPELL_DAMPEN_MAGIC) + if (mode == AURA_REMOVE_BY_ENEMY_SPELL || mode == AURA_REMOVE_BY_EXPIRE) + if (!CastDampenMagicIfPossible()) + { + scheduler.Schedule(1s, [this](TaskContext context) + { + if (!CastDampenMagicIfPossible()) + context.Repeat(); + }); + } } void UpdateAI(uint32 diff) override @@ -395,41 +440,44 @@ struct boss_high_nethermancer_zerevor : public boss_illidari_council_memberAI if (!UpdateVictim()) return; - events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) + scheduler.Update(diff, + std::bind(&BossAI::DoMeleeAttackIfReady, this)); + } + + bool CastDampenMagicIfPossible() + { + if (_canCastDampenMagic) { - case EVENT_SPELL_DAMPEN_MAGIC: - me->CastSpell(me, SPELL_DAMPEN_MAGIC, false); - events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 120000); - break; - case EVENT_SPELL_ARCANE_BOLT: - me->CastSpell(me->GetVictim(), SPELL_ARCANE_BOLT, false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 3000); - break; - case EVENT_SPELL_FLAMESTRIKE: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) - me->CastSpell(target, SPELL_FLAMESTRIKE, false); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 40000); - break; - case EVENT_SPELL_BLIZZARD: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) - me->CastSpell(target, SPELL_BLIZZARD, false); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 40000); - break; - case EVENT_SPELL_ARCANE_EXPLOSION: - if (SelectTarget(SelectTargetMethod::Random, 0, 10.0f)) - me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); - break; + _canCastDampenMagic = false; + me->m_Events.AddEventAtOffset([this] { + _canCastDampenMagic = true; + }, 1min); + + if (me->IsInCombat()) + { + scheduler.Schedule(1s, [this](TaskContext /*context*/) + { + DoCastSelf(SPELL_DAMPEN_MAGIC); + }); + } + else + { + me->m_Events.AddEventAtOffset([this] { + DoCastSelf(SPELL_DAMPEN_MAGIC); + }, 1s); + } + + return true; } - DoMeleeAttackIfReady(); + return false; } + + private: + bool _canCastDampenMagic; }; struct boss_lady_malande : public boss_illidari_council_memberAI @@ -559,16 +607,14 @@ class spell_illidari_council_empyreal_balance : public SpellScript bool Load() override { _targetCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleDummy(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); if (GetHitUnit()) - { _targetCount++; - } } void HandleAfterCast() @@ -579,7 +625,7 @@ class spell_illidari_council_empyreal_balance : public SpellScript return; } - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + auto const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) { @@ -606,26 +652,22 @@ class spell_illidari_council_empyreal_equivalency : public SpellScript bool Load() override { _targetCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleDummy(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); if (GetHitUnit()) - { _targetCount++; - } } void HandleAfterCast() { if (_targetCount != 4) - { return; - } - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + auto const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) target->SetHealth(GetCaster()->GetHealth() / _targetCount); diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index db41a2091..830447c8d 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -212,14 +212,7 @@ class spell_mother_shahraz_fatal_attraction : public SpellScript void SetDest(SpellDestination& dest) { - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (Unit* target = ObjectAccessor::GetUnit(*GetCaster(), ihit->targetGUID)) - { - dest.Relocate(*target); - if (roll_chance_i(50)) - break; - } + dest.Relocate(GetCaster()->GetRandomNearPosition(50.0f)); } void HandleTeleportUnits(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index 50b6f7359..79d68ebfa 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -141,7 +141,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (!who || me->getStandState() != UNIT_STAND_STATE_SLEEP || who->GetTypeId() != TYPEID_PLAYER || me->GetDistance2d(who) > 90.0f || who->ToPlayer()->IsGameMaster()) + if (!who || me->getStandState() != UNIT_STAND_STATE_SLEEP || !who->IsPlayer() || me->GetDistance2d(who) > 90.0f || who->ToPlayer()->IsGameMaster()) return; me->SetInCombatWithZone(); diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index 91ee4a3ae..392cbecde 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -264,7 +264,7 @@ class spell_teron_gorefiend_shadowy_construct : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp index e98daa3e1..d429e6d84 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp @@ -82,7 +82,7 @@ public: void OnUnitDeath(Unit* unit) override { - if (unit && unit->GetTypeId() == TYPEID_UNIT && unit->GetEntry() == NPC_NASCENT_FEL_ORC) + if (unit && unit->IsCreature() && unit->GetEntry() == NPC_NASCENT_FEL_ORC) PrisonerDied(unit->GetGUID()); } diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 8ff0f0512..23226e225 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -23,7 +23,7 @@ #include "WorldPacket.h" #include "the_eye.h" -enum Yells +enum KTYells { // Kael'thas Speech SAY_INTRO = 0, @@ -54,7 +54,7 @@ enum Yells EMOTE_THALADRED_FIXATE = 2 }; -enum Spells +enum KTSpells { // _phase 2 spells SPELL_SUMMON_WEAPONS = 36976, @@ -79,7 +79,7 @@ enum Spells SPELL_FLAME_STRIKE = 36735, SPELL_FLAME_STRIKE_DAMAGE = 36731, - // Event + // transition scene spells SPELL_NETHERBEAM_AURA1 = 36364, SPELL_NETHERBEAM_AURA2 = 36370, SPELL_NETHERBEAM_AURA3 = 36371, @@ -115,6 +115,7 @@ enum Spells SPELL_NETHER_BEAM_DAMAGE = 35873, SPELL_REMOTE_TOY_STUN = 37029, + SPELL_REMOVE_ENCHANTED_WEAPONS = 39497, // Advisors // Universal @@ -138,57 +139,44 @@ enum Spells SPELL_SILENCE = 30225 }; -enum Misc +enum KTPhases { - POINT_MIDDLE = 1, - POINT_AIR = 2, - POINT_START_LAST_PHASE = 3, - DATA_RESURRECT_CAST = 1, - NPC_WORLD_TRIGGER = 19871, - NPC_NETHER_VAPOR = 21002, - NPC_NETHERSTRAND_LONGBOW = 21268, - NPC_STAFF_OF_DISINTEGRATION = 21274, - PHASE_NONE = 0, PHASE_SINGLE_ADVISOR = 1, PHASE_WEAPONS = 2, PHASE_TRANSITION = 3, PHASE_ALL_ADVISORS = 4, - PHASE_FINAL = 5, + PHASE_FINAL = 5 +}; - EVENT_PREFIGHT_PHASE11 = 1, - EVENT_PREFIGHT_PHASE12 = 2, - EVENT_PREFIGHT_PHASE21 = 3, - EVENT_PREFIGHT_PHASE22 = 4, - EVENT_PREFIGHT_PHASE31 = 5, - EVENT_PREFIGHT_PHASE32 = 6, - EVENT_PREFIGHT_PHASE41 = 7, - EVENT_PREFIGHT_PHASE42 = 8, - EVENT_PREFIGHT_PHASE51 = 9, - EVENT_PREFIGHT_PHASE52 = 10, - EVENT_PREFIGHT_PHASE61 = 11, - EVENT_PREFIGHT_PHASE62 = 12, - EVENT_PREFIGHT_PHASE63 = 13, - EVENT_PREFIGHT_PHASE71 = 14, - EVENT_GATHER_ADVISORS = 15, +enum KTMisc +{ + POINT_MIDDLE = 1, + POINT_AIR = 2, + POINT_LAND = 3, + POINT_START_LAST_PHASE = 4, - EVENT_SPELL_SEQ_1 = 30, - EVENT_SPELL_SEQ_2 = 31, - EVENT_SPELL_SEQ_3 = 32, - EVENT_SPELL_FIREBALL = 33, - EVENT_SPELL_PYROBLAST = 34, - EVENT_SPELL_FLAMESTRIKE = 35, - EVENT_SPELL_ARCANE_DISRUPTION = 36, - EVENT_SPELL_MIND_CONTROL = 37, - EVENT_SPELL_SUMMON_PHOENIX = 38, - EVENT_CHECK_HEALTH = 39, - EVENT_SPELL_GRAVITY_LAPSE = 40, - EVENT_GRAVITY_LAPSE_END = 41, - EVENT_SPELL_SHOCK_BARRIER = 42, - EVENT_SPELL_NETHER_BEAM = 43, - EVENT_SPELL_NETHER_VAPOR = 44, + DATA_RESURRECT_CAST = 1, - EVENT_SCENE_1 = 50, + NPC_WORLD_TRIGGER = 19871, + NPC_NETHER_VAPOR = 21002, + NPC_NETHERSTRAND_LONGBOW = 21268, + NPC_STAFF_OF_DISINTEGRATION = 21274, +}; + +enum KTPreFightEvents +{ + EVENT_PREFIGHT_PHASE1_01 = 1, + EVENT_PREFIGHT_PHASE1_02 = 2, + EVENT_PREFIGHT_PHASE5_01 = 3, + EVENT_PREFIGHT_PHASE5_02 = 4, + EVENT_PREFIGHT_PHASE6_02 = 5, + EVENT_PREFIGHT_PHASE6_03 = 6, +}; + +enum KTTransitionScene +{ + EVENT_SCENE_1 = 50, // NYI EVENT_SCENE_2 = 51, EVENT_SCENE_3 = 52, EVENT_SCENE_4 = 53, @@ -206,7 +194,7 @@ enum Misc EVENT_SCENE_16 = 65 }; -enum KaelActions +enum KTActions { ACTION_START_SANGUINAR = 0, ACTION_START_CAPERNIAN = 1, @@ -215,7 +203,7 @@ enum KaelActions ACTION_PROGRESS_PHASE_CHECK = 4 }; -enum SpellGroups +enum KTSpellGroups { GROUP_PROGRESS_PHASE = 0, GROUP_PYROBLAST = 1, @@ -288,7 +276,9 @@ struct boss_kaelthas : public BossAI { PrepareAdvisors(); }); + _phase = PHASE_NONE; + _transitionSceneReached = false; me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_HOVER, true); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); @@ -296,15 +286,6 @@ struct boss_kaelthas : public BossAI SetRoomState(GO_STATE_READY); me->SetDisableGravity(false); me->SetWalk(false); - ScheduleHealthCheckEvent(50, [&]{ - scheduler.CancelAll(); - me->CastStop(); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, me->GetHomePosition(), true, true); - me->ClearUnitState(UNIT_STATE_MELEE_ATTACKING); - me->SendMeleeAttackStop(); - }); } void AttackStart(Unit* who) override @@ -313,17 +294,24 @@ struct boss_kaelthas : public BossAI BossAI::AttackStart(who); } + void JustReachedHome() override + { + Reset(); + } + void MoveInLineOfSight(Unit* who) override { if (_phase == PHASE_NONE && who->IsPlayer() && me->IsValidAttackTarget(who)) { _phase = PHASE_SINGLE_ADVISOR; me->SetInCombatWithZone(); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); Talk(SAY_INTRO); + DoCastAOE(SPELL_REMOVE_ENCHANTED_WEAPONS, true); ScheduleUniqueTimedEvent(23s, [&] { Talk(SAY_INTRO_THALADRED); - }, EVENT_PREFIGHT_PHASE11); + }, EVENT_PREFIGHT_PHASE1_01); ScheduleUniqueTimedEvent(30s, [&] { if (Creature* thaladred = summons.GetCreatureWithEntry(NPC_THALADRED)) @@ -334,15 +322,10 @@ struct boss_kaelthas : public BossAI thaladred->AI()->AttackStart(target); thaladred->SetInCombatWithZone(); } - }, EVENT_PREFIGHT_PHASE12); + }, EVENT_PREFIGHT_PHASE1_02); } } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - } - void KilledUnit(Unit* victim) override { if (victim->IsPlayer()) @@ -376,7 +359,7 @@ struct boss_kaelthas : public BossAI Talk(SAY_PHASE2_WEAPON); DoCastSelf(SPELL_SUMMON_WEAPONS); _phase = PHASE_WEAPONS; - }, EVENT_PREFIGHT_PHASE51); + }, EVENT_PREFIGHT_PHASE5_01); ScheduleUniqueTimedEvent(9s, [&]{ summons.DoForAllSummons([&](WorldObject* summon) { @@ -397,7 +380,7 @@ struct boss_kaelthas : public BossAI { PhaseAllAdvisorsExecute(); }); - }, EVENT_PREFIGHT_PHASE52); + }, EVENT_PREFIGHT_PHASE5_02); break; case ACTION_PROGRESS_PHASE_CHECK: if (_phase == PHASE_ALL_ADVISORS) @@ -511,7 +494,6 @@ struct boss_kaelthas : public BossAI me->SetTarget(); DoCastSelf(SPELL_KAEL_EXPLODES1, true); DoCastSelf(SPELL_KAEL_GAINING_POWER); - me->SetDisableGravity(true); }, EVENT_SCENE_2); ScheduleUniqueTimedEvent(4000ms, [&] { @@ -519,7 +501,9 @@ struct boss_kaelthas : public BossAI for (uint8 i = 0; i < 2; ++i) if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i], TEMPSUMMON_TIMED_DESPAWN, 60000)) trigger->CastSpell(me, SPELL_NETHERBEAM1 + i, false); - me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), 76.0f, false, true); + me->SetDisableGravity(true); + me->SendMovementFlagUpdate(); + me->GetMotionMaster()->MoveTakeoff(POINT_AIR, me->GetPositionX(), me->GetPositionY(), 75.0f, 2.99); DoCastSelf(SPELL_GROW, true); }, EVENT_SCENE_3); ScheduleUniqueTimedEvent(7000ms, [&] @@ -551,8 +535,6 @@ struct boss_kaelthas : public BossAI ScheduleUniqueTimedEvent(17500ms, [&] { SetRoomState(GO_STATE_ACTIVE); - me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_WALKING | MOVEMENTFLAG_DISABLE_GRAVITY); - me->SendMovementFlagUpdate(); }, EVENT_SCENE_7); ScheduleUniqueTimedEvent(19000ms, [&] { @@ -612,8 +594,6 @@ struct boss_kaelthas : public BossAI DoCastSelf(SPELL_PURE_NETHER_BEAM4, true); DoCastSelf(SPELL_PURE_NETHER_BEAM5, true); DoCastSelf(SPELL_PURE_NETHER_BEAM6, true); - me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_WALKING); - me->SendMovementFlagUpdate(); }, EVENT_SCENE_15); ScheduleUniqueTimedEvent(36000ms, [&] { @@ -621,11 +601,12 @@ struct boss_kaelthas : public BossAI me->CastStop(); me->GetMotionMaster()->Clear(); me->RemoveAurasDueToSpell(SPELL_DARK_BANISH_STATE); // WRONG VISUAL + me->GetMotionMaster()->MoveLand(POINT_LAND, me->GetPositionX(), me->GetPositionY(), 48.0f, 2.99f); // Moveland doesn't handle POINT_START_LAST_PHASE so we need to use MovePoint me->GetMotionMaster()->MovePoint(POINT_START_LAST_PHASE, me->GetHomePosition(), false, true); }, EVENT_SCENE_16); } - void IntroduceNewAdvisor(Yells talkIntroduction, KaelActions kaelAction) + void IntroduceNewAdvisor(KTYells talkIntroduction, KTActions kaelAction) { std::chrono::milliseconds attackStartTimer = 0ms; EyeNPCs advisorNPCId = NPC_THALADRED; @@ -671,7 +652,7 @@ struct boss_kaelthas : public BossAI Talk(SAY_PHASE3_ADVANCE); ScheduleUniqueTimedEvent(6s, [&]{ DoCastSelf(SPELL_RESURRECTION); - }, EVENT_PREFIGHT_PHASE62); + }, EVENT_PREFIGHT_PHASE6_02); ScheduleUniqueTimedEvent(12s, [&]{ _phase = PHASE_ALL_ADVISORS; summons.DoForAllSummons([&](WorldObject* summon) @@ -694,7 +675,7 @@ struct boss_kaelthas : public BossAI { PhaseKaelExecute(); }); - }, EVENT_PREFIGHT_PHASE63); + }, EVENT_PREFIGHT_PHASE6_03); } void PhaseKaelExecute() @@ -703,11 +684,33 @@ struct boss_kaelthas : public BossAI Talk(SAY_PHASE4_INTRO2); _phase = PHASE_FINAL; DoResetThreatList(); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) { AttackStart(target); } + ScheduleHealthCheckEvent(50, [&]{ + if(!_transitionSceneReached) + { + _transitionSceneReached = true; + scheduler.CancelAll(); + me->CastStop(); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, me->GetHomePosition(), true, true); + me->ClearUnitState(UNIT_STATE_MELEE_ATTACKING); + me->SendMeleeAttackStop(); + + ThreatContainer::StorageType threatList = me->GetThreatMgr().GetThreatList(); + for (ThreatContainer::StorageType::const_iterator i = threatList.begin(); i != threatList.end(); ++i) + { + if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) + { + target->AttackStop(); + } + } + } + }); ScheduleTimedEvent(1000ms, [&] { DoCastVictim(SPELL_FIREBALL); @@ -721,7 +724,6 @@ struct boss_kaelthas : public BossAI Talk(SAY_SUMMON_PHOENIX); DoCastSelf(SPELL_PHOENIX); }, 35450ms, 41550ms); - //sequence ScheduleTimedEvent(20s, 23s, [&] { if (roll_chance_i(50)) @@ -762,8 +764,14 @@ struct boss_kaelthas : public BossAI { return me->GetHomePosition().GetExactDist2d(me) > 165.0f || !SelectTargetFromPlayerList(165.0f); } + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + DoCastAOE(SPELL_REMOVE_ENCHANTED_WEAPONS, true); + } private: uint32 _phase; + bool _transitionSceneReached = false; }; struct npc_lord_sanguinar : public ScriptedAI { @@ -1070,7 +1078,7 @@ class spell_kaelthas_kael_phase_two : public SpellScript bool Load() override { - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) if (InstanceScript* instance = GetCaster()->GetInstanceScript()) if (Creature* kael = instance->GetCreature(DATA_KAELTHAS)) kael->AI()->SummonedCreatureDies(GetCaster()->ToCreature(), nullptr); @@ -1188,7 +1196,7 @@ class spell_kaelthas_flame_strike : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -1321,6 +1329,31 @@ class spell_kael_pyroblast : public SpellScript } }; +class spell_kaelthas_remove_enchanted_weapons : public SpellScript +{ + PrepareSpellScript(spell_kaelthas_remove_enchanted_weapons); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); + if (!target || !target->IsPlayer()) + return; + TriggerCastFlags triggerFlags = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST); + target->CastSpell((Unit*)nullptr, 39498, triggerFlags); + target->CastSpell((Unit*)nullptr, 39499, triggerFlags); + target->CastSpell((Unit*)nullptr, 39500, triggerFlags); + target->CastSpell((Unit*)nullptr, 39501, triggerFlags); + target->CastSpell((Unit*)nullptr, 39502, triggerFlags); + target->CastSpell((Unit*)nullptr, 39503, triggerFlags); + target->CastSpell((Unit*)nullptr, 39504, triggerFlags); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_boss_kaelthas() { RegisterTheEyeAI(boss_kaelthas); @@ -1339,4 +1372,5 @@ void AddSC_boss_kaelthas() RegisterSpellScript(spell_kaelthas_nether_beam); RegisterSpellScript(spell_kaelthas_summon_nether_vapor); RegisterSpellScript(spell_kael_pyroblast); + RegisterSpellScript(spell_kaelthas_remove_enchanted_weapons); } diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index 5864a928b..3f973ba59 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -58,7 +58,7 @@ struct npc_pet_hunter_snake_trap : public ScriptedAI me->LoadCreaturesAddon(true); me->SetLootRecipient(nullptr); me->ResetPlayerDamageReq(); - me->SetLastDamagedTime(0); + me->ClearLastLeashExtensionTimePtr(); me->AddUnitState(UNIT_STATE_EVADE); me->GetMotionMaster()->MoveTargetedHome(); diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 4134a6931..b16a931ef 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -606,7 +606,7 @@ class spell_dk_dancing_rune_weapon : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive() || eventInfo.GetActor()->GetTypeId() != TYPEID_PLAYER) + if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive() || !eventInfo.GetActor()->IsPlayer()) return false; SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 42a12e526..35488441d 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -35,6 +35,7 @@ #include "Unit.h" #include "Vehicle.h" #include +#include /* * Scripts for spells with SPELLFAMILY_GENERIC which cannot be included in AI script file * of creature using it or can't be bound to any player class. @@ -135,7 +136,7 @@ class spell_the_flag_of_ownership : public SpellScript void HandleScript(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; Player* target = GetHitPlayer(); if (!target) @@ -144,7 +145,7 @@ class spell_the_flag_of_ownership : public SpellScript LocaleConstant loc_idx = caster->ToPlayer()->GetSession()->GetSessionDbLocaleIndex(); BroadcastText const* bct = sObjectMgr->GetBroadcastText(TEXT_FLAG_OF_OWNERSHIP); - std::string bctMsg = Acore::StringFormat(bct->GetText(loc_idx, caster->getGender()), caster->GetName().c_str(), target->GetName().c_str()); + std::string bctMsg = Acore::StringFormat(bct->GetText(loc_idx, caster->getGender()), caster->GetName(), target->GetName()); caster->Talk(bctMsg, CHAT_MSG_MONSTER_EMOTE, LANG_UNIVERSAL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target); haveTarget = true; @@ -154,7 +155,7 @@ class spell_the_flag_of_ownership : public SpellScript { for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) { - if ((*itr)->GetTypeId() != TYPEID_PLAYER || (*itr)->ToPlayer()->IsAlive()) + if (!(*itr)->IsPlayer() || (*itr)->ToPlayer()->IsAlive()) { targets.erase(itr); itr = targets.begin(); @@ -1834,7 +1835,7 @@ class spell_gen_feign_death_all_flags : public AuraScript target->SetUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->SetUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->SetReactState(REACT_PASSIVE); } @@ -1845,7 +1846,7 @@ class spell_gen_feign_death_all_flags : public AuraScript target->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->RemoveUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->InitializeReactState(); } @@ -1869,7 +1870,7 @@ class spell_gen_feign_death_no_dyn_flag : public AuraScript target->SetUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->SetUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->SetReactState(REACT_PASSIVE); } @@ -1879,7 +1880,7 @@ class spell_gen_feign_death_no_dyn_flag : public AuraScript target->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->RemoveUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->InitializeReactState(); } @@ -1902,7 +1903,7 @@ class spell_gen_feign_death_no_prevent_emotes : public AuraScript target->SetUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->SetUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->SetReactState(REACT_PASSIVE); } @@ -1912,7 +1913,7 @@ class spell_gen_feign_death_no_prevent_emotes : public AuraScript target->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->RemoveUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->InitializeReactState(); } @@ -1943,7 +1944,7 @@ class spell_gen_teleporting : public SpellScript void HandleScript(SpellEffIndex /* effIndex */) { Unit* target = GetHitUnit(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // return from top @@ -2503,7 +2504,7 @@ class spell_gen_vehicle_scaling_aura: public AuraScript bool Load() override { - return GetCaster() && GetCaster()->IsPlayer() && GetOwner()->GetTypeId() == TYPEID_UNIT; + return GetCaster() && GetCaster()->IsPlayer() && GetOwner()->IsCreature(); } void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) @@ -3284,7 +3285,7 @@ class spell_gen_summon_tournament_mount : public SpellScript return ValidateSpellInfo({ SPELL_LANCE_EQUIPPED }); } - SpellCastResult CheckIfLanceEquiped() + SpellCastResult CheckIfLanceEquipped() { if (GetCaster()->IsInDisallowedMountForm()) GetCaster()->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); @@ -3300,7 +3301,7 @@ class spell_gen_summon_tournament_mount : public SpellScript void Register() override { - OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount::CheckIfLanceEquiped); + OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount::CheckIfLanceEquipped); } }; @@ -3728,7 +3729,7 @@ class spell_gen_despawn_self : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleDummy(SpellEffIndex effIndex) @@ -4255,7 +4256,7 @@ class spell_gen_gift_of_naaru : public AuraScript break; } - int32 healTick = floor(heal / aurEff->GetTotalTicks()); + int32 healTick = std::floor(heal / aurEff->GetTotalTicks()); amount += int32(std::max(healTick, 0)); } diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 378604983..284e52654 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -671,7 +671,7 @@ class spell_hun_readiness : public SpellScript std::set> spellsToRemove; std::set categoriesToRemove; - for (const auto& [spellId, cooldown] : cooldowns) + for (auto const& [spellId, cooldown] : cooldowns) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (spellInfo @@ -689,9 +689,9 @@ class spell_hun_readiness : public SpellScript } // we can't remove spell cooldowns while iterating. - for (const auto& [spellId, sendToClient] : spellsToRemove) + for (auto const& [spellId, sendToClient] : spellsToRemove) caster->RemoveSpellCooldown(spellId, sendToClient); - for (const auto& category : categoriesToRemove) + for (auto const& category : categoriesToRemove) caster->RemoveCategoryCooldown(category); } @@ -950,7 +950,7 @@ class spell_hun_tame_beast : public SpellScript SpellCastResult CheckCast() { Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_PLAYER) + if (!caster->IsPlayer()) return SPELL_FAILED_DONT_REPORT; Player* player = GetCaster()->ToPlayer(); @@ -1136,7 +1136,7 @@ class spell_hun_volley_trigger : public SpellScript { if (Unit* pet = *itr) { - if (pet->IsAlive() && pet->GetTypeId() == TYPEID_UNIT) + if (pet->IsAlive() && pet->IsCreature()) { pet->ToCreature()->AI()->OwnerAttacked(_target->ToUnit()); } @@ -1295,7 +1295,7 @@ class spell_hun_bestial_wrath : public SpellScript SpellCastResult CheckCast() { Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) { return SPELL_FAILED_NO_VALID_TARGETS; } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 343a5d514..5bf697b96 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -401,7 +401,7 @@ class spell_item_lil_phylactery : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetActionTarget() && (eventInfo.GetActionTarget()->GetTypeId() != TYPEID_UNIT || eventInfo.GetActionTarget()->ToCreature()->isWorldBoss()); + return eventInfo.GetActionTarget() && (!eventInfo.GetActionTarget()->IsCreature() || eventInfo.GetActionTarget()->ToCreature()->isWorldBoss()); } void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) @@ -501,7 +501,7 @@ class spell_item_lil_xt : public SpellScript Creature* target = GetHitCreature(); if (!target) return; - if (GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->ToCreature()->AI()) + if (GetCaster()->IsCreature() && GetCaster()->ToCreature()->AI()) GetCaster()->ToCreature()->AI()->Talk(2); target->DespawnOrUnsummon(500); } @@ -2291,7 +2291,7 @@ class spell_item_unsated_craving : public AuraScript bool CheckProc(ProcEventInfo& procInfo) { Unit* caster = procInfo.GetActor(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) { return false; } @@ -2302,7 +2302,7 @@ class spell_item_unsated_craving : public AuraScript return true; } - if (!target || target->GetTypeId() != TYPEID_UNIT || target->IsCritter() || target->IsSummon()) + if (!target || !target->IsCreature() || target->IsCritter() || target->IsSummon()) { return false; } diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 13fbefcdd..a708c8044 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -884,7 +884,7 @@ class spell_mage_polymorph_cast_visual : public SpellScript void HandleDummy(SpellEffIndex /*effIndex*/) { if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f)) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->CastSpell(target, PolymorhForms[urand(0, 5)], true); } diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 155c6276b..5345782ac 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -1021,7 +1021,7 @@ class spell_pal_righteous_defense : public SpellScript SpellCastResult CheckCast() { Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_PLAYER) + if (!caster->IsPlayer()) return SPELL_FAILED_DONT_REPORT; if (Unit* target = GetExplTargetUnit()) diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 0d02279f2..9253d5287 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -379,7 +379,7 @@ class spell_pri_lightwell : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScriptEffect(SpellEffIndex /* effIndex */) diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index cfcad45ee..94b2f6dd7 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -691,7 +691,7 @@ class spell_q11653_youre_not_so_big_now : public SpellScript { PreventHitDefaultEffect(effIndex); Unit* target = GetHitUnit(); - if (!target || target->GetTypeId() != TYPEID_UNIT) + if (!target || !target->IsCreature()) return; static uint32 const spellPlayer[5] = @@ -809,7 +809,7 @@ class spell_q1846_bending_shinbone : public SpellScript { Item* target = GetHitItem(); Unit* caster = GetCaster(); - if (!target && caster->GetTypeId() != TYPEID_PLAYER) + if (!target && !caster->IsPlayer()) return; uint32 const spellId = roll_chance_i(20) ? SPELL_BENDING_SHINBONE1 : SPELL_BENDING_SHINBONE2; @@ -1014,7 +1014,7 @@ class spell_q11396_11399_scourging_crystal_controller_dummy : public SpellScript void HandleDummy(SpellEffIndex /*effIndex*/) { if (Unit* target = GetHitUnit()) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->RemoveAurasDueToSpell(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3); } @@ -1704,7 +1704,7 @@ class spell_q12277_wintergarde_mine_explosion : public SpellScript { if (Unit* caster = GetCaster()) { - if (caster->GetTypeId() == TYPEID_UNIT) + if (caster->IsCreature()) { if (Unit* owner = caster->GetOwner()) { @@ -2018,7 +2018,7 @@ enum BearFlankMaster bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScript(SpellEffIndex /*effIndex*/) @@ -2079,7 +2079,7 @@ class spell_q12690_burst_at_the_seams : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleKnockBack(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 2cf818614..4a1a28325 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -464,10 +464,8 @@ public: if (!summoner) return; - if (summoner->GetTypeId() != TYPEID_UNIT) - { + if (!summoner->IsCreature()) return; - } _summonerGuid = summoner->GetGUID(); me->GetMotionMaster()->MoveFollow(summoner->ToUnit(), 0.0f, 0.0f); diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 18c16a4c2..92782ae39 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -1513,7 +1513,7 @@ public: return true; } - if (owner->GetTypeId() != TYPEID_PLAYER || !player->IsInSameRaidWith(owner->ToPlayer())) + if (!owner->IsPlayer() || !player->IsInSameRaidWith(owner->ToPlayer())) { if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(stoneSpell)) { diff --git a/src/server/scripts/World/npc_stave_of_ancients.cpp b/src/server/scripts/World/npc_stave_of_ancients.cpp index bf80e6bd5..fede7e6fa 100644 --- a/src/server/scripts/World/npc_stave_of_ancients.cpp +++ b/src/server/scripts/World/npc_stave_of_ancients.cpp @@ -200,7 +200,7 @@ void NPCStaveQuestAI::StoreAttackerGuidValue(Unit* attacker) bool isGUIDPresent = std::find(attackerGuids.begin(), attackerGuids.end(), guidValue) != attackerGuids.end(); // don't store snaketrap's snakes and trap triggers - if (isGUIDPresent || (IsAllowedEntry(attacker->GetEntry()) && attacker->GetTypeId() != TYPEID_PLAYER)) + if (isGUIDPresent || (IsAllowedEntry(attacker->GetEntry()) && !attacker->IsPlayer())) { return; } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index be36753cd..440738f96 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2538,7 +2538,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner->IsPlayer()) { return; } @@ -2625,7 +2625,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() == TYPEID_UNIT || summoner->IsPlayer()) + if (summoner->IsCreature() || summoner->IsPlayer()) me->GetMotionMaster()->MoveFollow(summoner->ToUnit(), PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); } diff --git a/src/server/shared/DataStores/DBCDatabaseLoader.cpp b/src/server/shared/DataStores/DBCDatabaseLoader.cpp index 49ec694ff..cd139243e 100644 --- a/src/server/shared/DataStores/DBCDatabaseLoader.cpp +++ b/src/server/shared/DataStores/DBCDatabaseLoader.cpp @@ -35,7 +35,7 @@ DBCDatabaseLoader::DBCDatabaseLoader(char const* tableName, char const* dbcForma char* DBCDatabaseLoader::Load(uint32& records, char**& indexTable) { - std::string query = Acore::StringFormat("SELECT * FROM `%s` ORDER BY `ID` DESC", _sqlTableName); + std::string query = Acore::StringFormat("SELECT * FROM `{}` ORDER BY `ID` DESC", _sqlTableName); // no error if empty set QueryResult result = WorldDatabase.Query(query); diff --git a/src/server/shared/Packets/ByteBuffer.cpp b/src/server/shared/Packets/ByteBuffer.cpp index dab792c77..b17b85dce 100644 --- a/src/server/shared/Packets/ByteBuffer.cpp +++ b/src/server/shared/Packets/ByteBuffer.cpp @@ -51,7 +51,7 @@ ByteBufferSourceException::ByteBufferSourceException(std::size_t pos, std::size_ ByteBufferInvalidValueException::ByteBufferInvalidValueException(char const* type, char const* value) { - message().assign(Acore::StringFormat("Invalid %s value (%s) found in ByteBuffer", type, value)); + message().assign(Acore::StringFormat("Invalid {} value ({}) found in ByteBuffer", type, value)); } ByteBuffer& ByteBuffer::operator>>(float& value) diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 308b6d728..1b005826e 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -464,14 +464,14 @@ public: _storage.shrink_to_fit(); } - void append(const char *src, std::size_t cnt) + void append(char const* src, std::size_t cnt) { - return append((const uint8 *)src, cnt); + return append((uint8 const*)src, cnt); } template void append(const T* src, std::size_t cnt) { - return append((const uint8*)src, cnt * sizeof(T)); + return append((uint8 const*)src, cnt * sizeof(T)); } void append(uint8 const* src, std::size_t cnt); @@ -522,7 +522,7 @@ public: } void AppendPackedTime(time_t time); - void put(std::size_t pos, const uint8 *src, std::size_t cnt); + void put(std::size_t pos, uint8 const* src, std::size_t cnt); void print_storage() const; void textlike() const; void hexlike() const; diff --git a/src/server/shared/Secrets/SecretMgr.cpp b/src/server/shared/Secrets/SecretMgr.cpp index cfc42e4ca..5f4d345b5 100644 --- a/src/server/shared/Secrets/SecretMgr.cpp +++ b/src/server/shared/Secrets/SecretMgr.cpp @@ -188,11 +188,11 @@ Optional SecretMgr::AttemptTransition(Secrets i, Optional(totpSecret, oldSecret->ToByteArray()); if (!success) - return Acore::StringFormat("Cannot decrypt old TOTP tokens - value of '%s' is incorrect for some users!", secret_info[i].oldKey); + return Acore::StringFormat("Cannot decrypt old TOTP tokens - value of '{}' is incorrect for some users!", secret_info[i].oldKey); } if (newSecret) diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index b69774dec..1a11f2904 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -580,7 +580,7 @@ enum SpellAttr5 : uint32 SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC = 0x00002000, // TITLE Duration scales with Haste Rating SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED = 0x00004000, // TITLE Charmed units cannot cast this spell SPELL_ATTR5_TREAT_AS_AREA_EFFECT = 0x00008000, // TITLE Unknown attribute 15@Attr5 DESCRIPTION Related to multi-target spells? - SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM = 0x00010000, // TITLE DESCRIPTION this allows spells with EquippedItemClass to affect spells from other items if the required item is equipped + SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM = 0x00010000, // TITLE DESCRIPTION this allows spells with EquippedItemClass to affect spells from other items if the required item is equipped SPELL_ATTR5_ALLOW_WHILE_FLEEING = 0x00020000, // TITLE Usable while feared SPELL_ATTR5_ALLOW_WHILE_CONFUSED = 0x00040000, // TITLE Usable while confused SPELL_ATTR5_AI_DOESNT_FACE_TARGET = 0x00080000, // TITLE Do not auto-turn while casting diff --git a/src/server/shared/enuminfo_SharedDefines.cpp b/src/server/shared/enuminfo_SharedDefines.cpp index e5ae568dd..f584257a8 100644 --- a/src/server/shared/enuminfo_SharedDefines.cpp +++ b/src/server/shared/enuminfo_SharedDefines.cpp @@ -818,7 +818,7 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr5 value) case SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC: return { "SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC", "Duration scales with Haste Rating", "" }; case SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED: return { "SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED", "Charmed units cannot cast this spell", "" }; case SPELL_ATTR5_TREAT_AS_AREA_EFFECT: return { "SPELL_ATTR5_TREAT_AS_AREA_EFFECT", "Unknown attribute 15@Attr5", "Related to multi-target spells?" }; - case SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM: return { "SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM", "DESCRIPTION this allows spells with EquippedItemClass to affect spells from other items if the required item is equipped", "" }; + case SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM: return { "SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM", "DESCRIPTION this allows spells with EquippedItemClass to affect spells from other items if the required item is equipped", "" }; case SPELL_ATTR5_ALLOW_WHILE_FLEEING: return { "SPELL_ATTR5_ALLOW_WHILE_FLEEING", "Usable while feared", "" }; case SPELL_ATTR5_ALLOW_WHILE_CONFUSED: return { "SPELL_ATTR5_ALLOW_WHILE_CONFUSED", "Usable while confused", "" }; case SPELL_ATTR5_AI_DOESNT_FACE_TARGET: return { "SPELL_ATTR5_AI_DOESNT_FACE_TARGET", "Do not auto-turn while casting", "" }; @@ -862,7 +862,7 @@ AC_API_EXPORT SpellAttr5 EnumUtils::FromIndex(std::size_t index) case 13: return SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC; case 14: return SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED; case 15: return SPELL_ATTR5_TREAT_AS_AREA_EFFECT; - case 16: return SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM; + case 16: return SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM; case 17: return SPELL_ATTR5_ALLOW_WHILE_FLEEING; case 18: return SPELL_ATTR5_ALLOW_WHILE_CONFUSED; case 19: return SPELL_ATTR5_AI_DOESNT_FACE_TARGET; @@ -903,7 +903,7 @@ AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr5 value) case SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC: return 13; case SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED: return 14; case SPELL_ATTR5_TREAT_AS_AREA_EFFECT: return 15; - case SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM: return 16; + case SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM: return 16; case SPELL_ATTR5_ALLOW_WHILE_FLEEING: return 17; case SPELL_ATTR5_ALLOW_WHILE_CONFUSED: return 18; case SPELL_ATTR5_AI_DOESNT_FACE_TARGET: return 19; diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp index 1d2d47a37..6f9806e34 100644 --- a/src/tools/map_extractor/System.cpp +++ b/src/tools/map_extractor/System.cpp @@ -990,7 +990,7 @@ void ExtractMapsFromMpq(uint32 build) { printf("Extract %s (%d/%u) \n", map_ids[z].name, z + 1, map_count); // Loadup map grid data - mpqMapName = Acore::StringFormat(R"(World\Maps\%s\%s.wdt)", map_ids[z].name, map_ids[z].name); + mpqMapName = Acore::StringFormat(R"(World\Maps\{}\{}.wdt)", map_ids[z].name, map_ids[z].name); WDT_file wdt; if (!wdt.loadFile(mpqMapName, false)) { @@ -1004,8 +1004,8 @@ void ExtractMapsFromMpq(uint32 build) { if (!wdt.main->adt_list[y][x].exist) continue; - mpqFileName = Acore::StringFormat(R"(World\Maps\%s\%s_%u_%u.adt)", map_ids[z].name, map_ids[z].name, x, y); - outputFileName = Acore::StringFormat("%s/maps/%03u%02u%02u.map", output_path, map_ids[z].id, y, x); + mpqFileName = Acore::StringFormat(R"(World\Maps\{}\{}_{}_{}.adt)", map_ids[z].name, map_ids[z].name, x, y); + outputFileName = Acore::StringFormat("{}/maps/{:03}{:02}{:02}.map", output_path, map_ids[z].id, y, x); ConvertADT(mpqFileName, outputFileName, y, x, build); } // draw progress bar