aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/Asio/ExpectedCompletionHandler.h4
-rw-r--r--src/common/Collision/RegularGrid.h1
-rw-r--r--src/common/Collision/VMapDefinitions.h1
-rw-r--r--src/common/Utilities/FuzzyFind.h7
-rw-r--r--src/common/Utilities/SmartEnum.h1
-rw-r--r--src/common/Utilities/Util.h9
-rw-r--r--src/server/game/AI/CreatureAIFactory.h1
-rw-r--r--src/server/game/AI/GameObjectAIFactory.h1
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp1
-rw-r--r--src/server/game/Globals/PlayerChoice.h1
-rw-r--r--src/server/game/Movement/MotionMaster.cpp17
-rw-r--r--src/server/game/Server/WorldSocketMgr.cpp1
-rw-r--r--src/server/game/Server/WorldSocketMgr.h3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp8
-rw-r--r--src/server/game/Spells/SpellScript.cpp3
-rw-r--r--src/server/game/Spells/SpellScript.h2
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.h2
-rw-r--r--src/server/game/Warden/Modules/WardenModuleMac.h3
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h6
-rw-r--r--src/server/scripts/EasternKingdoms/TheStockade/the_stockade.h6
-rw-r--r--src/server/scripts/Maelstrom/Stonecore/stonecore.h6
-rw-r--r--src/server/scripts/Spells/spell_dh.cpp224
-rw-r--r--src/server/worldserver/Main.cpp1
23 files changed, 244 insertions, 65 deletions
diff --git a/src/common/Asio/ExpectedCompletionHandler.h b/src/common/Asio/ExpectedCompletionHandler.h
index 98d7dd27180..d03c101118c 100644
--- a/src/common/Asio/ExpectedCompletionHandler.h
+++ b/src/common/Asio/ExpectedCompletionHandler.h
@@ -232,7 +232,7 @@ public:
static inline auto initiate(Initiation&& initiation, RawCompletionToken&& token, Args&&... args)
{
return async_initiate<
- conditional_t<
+ std::conditional_t<
is_const<remove_reference_t<RawCompletionToken>>::value,
CompletionToken const, CompletionToken>,
typename Trinity::Asio::Impl::AsExpectedSignature<Signatures>::type...>(
@@ -311,7 +311,7 @@ public:
static inline auto initiate(Initiation&& initiation, RawCompletionToken&& token, Args&&... args)
{
return async_initiate<
- conditional_t<
+ std::conditional_t<
is_const<remove_reference_t<RawCompletionToken>>::value,
CompletionToken const, CompletionToken>,
typename Trinity::Asio::Impl::AsExpectedSignature<Signature>::type>(
diff --git a/src/common/Collision/RegularGrid.h b/src/common/Collision/RegularGrid.h
index 94f97b2cb5a..57ef8094297 100644
--- a/src/common/Collision/RegularGrid.h
+++ b/src/common/Collision/RegularGrid.h
@@ -23,6 +23,7 @@
#include <G3D/Ray.h>
#include <G3D/BoundsTrait.h>
#include <memory>
+#include <span>
#include <unordered_map>
template<class Node>
diff --git a/src/common/Collision/VMapDefinitions.h b/src/common/Collision/VMapDefinitions.h
index 7f0c10406e4..2006cf9ed53 100644
--- a/src/common/Collision/VMapDefinitions.h
+++ b/src/common/Collision/VMapDefinitions.h
@@ -18,6 +18,7 @@
#ifndef _VMAPDEFINITIONS_H
#define _VMAPDEFINITIONS_H
+#include "Define.h"
#include <cstdio>
#define LIQUID_TILE_SIZE (533.333f / 128.f)
diff --git a/src/common/Utilities/FuzzyFind.h b/src/common/Utilities/FuzzyFind.h
index 9b70fc7cb39..a402c60c1cc 100644
--- a/src/common/Utilities/FuzzyFind.h
+++ b/src/common/Utilities/FuzzyFind.h
@@ -19,15 +19,16 @@
#define TRINITY_FUZZYFIND_H
#include <map>
-#include <string>
#include <type_traits>
+struct StringContainsStringI_T;
+
namespace Trinity
{
namespace Containers
{
- template <typename Container, typename NeedleContainer, typename ContainsOperator = bool(std::string const&, std::string const&), typename T = void>
- auto FuzzyFindIn(Container const& container, NeedleContainer const& needles, ContainsOperator const& contains = StringContainsStringI, int(*bonus)(decltype((*std::begin(std::declval<Container>())))) = nullptr)
+ template <typename Container, typename NeedleContainer, typename ContainsOperator = StringContainsStringI_T, typename T = void>
+ auto FuzzyFindIn(Container const& container, NeedleContainer const& needles, ContainsOperator const& contains = {}, int(*bonus)(decltype((*std::begin(std::declval<Container>())))) = nullptr)
{
using IteratorResult = decltype((*std::begin(container)));
using MappedType = std::conditional_t<std::is_reference_v<IteratorResult>, std::reference_wrapper<std::remove_reference_t<IteratorResult>>, IteratorResult>;
diff --git a/src/common/Utilities/SmartEnum.h b/src/common/Utilities/SmartEnum.h
index 3c58d433406..ae915f31694 100644
--- a/src/common/Utilities/SmartEnum.h
+++ b/src/common/Utilities/SmartEnum.h
@@ -18,6 +18,7 @@
#ifndef TRINITY_SMARTENUM_H
#define TRINITY_SMARTENUM_H
+#include "Define.h"
#include "IteratorPair.h"
#include <iterator>
diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h
index e3c63e0e968..9f65fd9b163 100644
--- a/src/common/Utilities/Util.h
+++ b/src/common/Utilities/Util.h
@@ -458,9 +458,16 @@ inline std::vector<uint8> HexStrToByteVector(std::string_view str, bool reverse
TC_COMMON_API float DegToRad(float degrees);
TC_COMMON_API bool StringEqualI(std::string_view str1, std::string_view str2);
-inline bool StringStartsWith(std::string_view haystack, std::string_view needle) { return (haystack.substr(0, needle.length()) == needle); }
+inline bool StringStartsWith(std::string_view haystack, std::string_view needle) { return haystack.starts_with(needle); }
inline bool StringStartsWithI(std::string_view haystack, std::string_view needle) { return StringEqualI(haystack.substr(0, needle.length()), needle); }
+
TC_COMMON_API bool StringContainsStringI(std::string_view haystack, std::string_view needle);
+
+struct StringContainsStringI_T
+{
+ bool operator()(std::string_view haystack, std::string_view needle) const { return StringContainsStringI(haystack, needle); }
+};
+
TC_COMMON_API bool StringCompareLessI(std::string_view a, std::string_view b);
struct StringCompareLessI_T
diff --git a/src/server/game/AI/CreatureAIFactory.h b/src/server/game/AI/CreatureAIFactory.h
index 3d269416902..2408ff0ce4b 100644
--- a/src/server/game/AI/CreatureAIFactory.h
+++ b/src/server/game/AI/CreatureAIFactory.h
@@ -19,7 +19,6 @@
#define TRINITY_CREATUREAIFACTORY_H
#include "ObjectMgr.h"
-#include "ObjectRegistry.h"
#include "SelectableAI.h"
class Creature;
diff --git a/src/server/game/AI/GameObjectAIFactory.h b/src/server/game/AI/GameObjectAIFactory.h
index f3a57c4705d..522aea6cb74 100644
--- a/src/server/game/AI/GameObjectAIFactory.h
+++ b/src/server/game/AI/GameObjectAIFactory.h
@@ -18,6 +18,7 @@
#ifndef TRINITY_GAMEOBJECTAIFACTORY_H
#define TRINITY_GAMEOBJECTAIFACTORY_H
+#include "ObjectMgr.h"
#include "SelectableAI.h"
class GameObject;
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index cb0c5d14a43..7f7e2f1a61f 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -581,7 +581,6 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/)
// TODO: migrate these in DB
_staticFlags.ApplyFlag(CREATURE_STATIC_FLAG_2_ALLOW_MOUNTED_COMBAT, (GetCreatureDifficulty()->TypeFlags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT) != 0);
SetIgnoreFeignDeath((creatureInfo->flags_extra & CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH) != 0);
- SetInteractionAllowedInCombat((GetCreatureDifficulty()->TypeFlags & CREATURE_TYPE_FLAG_ALLOW_INTERACTION_WHILE_IN_COMBAT) != 0);
SetTreatAsRaidUnit((GetCreatureDifficulty()->TypeFlags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) != 0);
return true;
diff --git a/src/server/game/Globals/PlayerChoice.h b/src/server/game/Globals/PlayerChoice.h
index 3a8e7948d8e..17504586b35 100644
--- a/src/server/game/Globals/PlayerChoice.h
+++ b/src/server/game/Globals/PlayerChoice.h
@@ -19,6 +19,7 @@
#define TRINITYCORE_PLAYER_CHOICE_H
#include "Define.h"
+#include "Duration.h"
#include "EnumFlag.h"
#include "Optional.h"
#include <algorithm>
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index bccfa78dd0d..85bb2e365f3 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -806,23 +806,34 @@ void MotionMaster::MoveKnockbackFrom(Position const& origin, float speedXY, floa
if (_owner->GetTypeId() == TYPEID_PLAYER)
return;
- if (speedXY < 0.01f)
+ if (std::abs(speedXY) < 0.01f /* && std::abs(speedZ) < 0.01f */)
return;
Position dest = _owner->GetPosition();
+ float o = dest == origin ? 0.0f : _owner->GetRelativeAngle(origin) + float(M_PI);
+ if (speedXY < 0)
+ {
+ speedXY = -speedXY;
+ o = o - float(M_PI);
+ }
+
+ if (speedZ < 0)
+ speedZ = -speedZ; // doesn't seem to be supported on official servers - packet sent for knockback with positive and negative speed has the same flags and JumpGravity
+
float moveTimeHalf = speedZ / Movement::gravity;
float dist = 2 * moveTimeHalf * speedXY;
float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);
// Use a mmap raycast to get a valid destination.
- _owner->MovePositionToFirstCollision(dest, dist, _owner->GetRelativeAngle(origin) + float(M_PI));
+ _owner->MovePositionToFirstCollision(dest, dist, o);
std::function<void(Movement::MoveSplineInit&)> initializer = [=, effect = (spellEffectExtraData ? Optional<Movement::SpellEffectExtraData>(*spellEffectExtraData) : Optional<Movement::SpellEffectExtraData>())](Movement::MoveSplineInit& init)
{
init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false);
init.SetParabolic(max_height, 0);
init.SetOrientationFixed(true);
- init.SetVelocity(speedXY);
+ if (speedXY >= 0.01f)
+ init.SetVelocity(speedXY);
if (effect)
init.SetSpellEffectExtraData(*effect);
};
diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp
index cc44e5bad4b..4205b6912f0 100644
--- a/src/server/game/Server/WorldSocketMgr.cpp
+++ b/src/server/game/Server/WorldSocketMgr.cpp
@@ -19,7 +19,6 @@
#include "Config.h"
#include "NetworkThread.h"
#include "ScriptMgr.h"
-#include "WorldSocket.h"
#include <boost/system/error_code.hpp>
class WorldSocketThread : public Trinity::Net::NetworkThread<WorldSocket>
diff --git a/src/server/game/Server/WorldSocketMgr.h b/src/server/game/Server/WorldSocketMgr.h
index 8859da81074..9f905f23cd2 100644
--- a/src/server/game/Server/WorldSocketMgr.h
+++ b/src/server/game/Server/WorldSocketMgr.h
@@ -19,8 +19,7 @@
#define TRINITYCORE_WORLD_SOCKET_MGR_H
#include "SocketMgr.h"
-
-class WorldSocket;
+#include "WorldSocket.h"
/// Manages all sockets connected to peers and network threads
class TC_GAME_API WorldSocketMgr : public Trinity::Net::SocketMgr<WorldSocket>
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 9954a89d928..95df657d03d 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -4040,9 +4040,9 @@ void Spell::EffectKnockBack()
return;
float ratio = 0.1f;
- float speedxy = float(effectInfo->MiscValue) * ratio;
- float speedz = float(damage) * ratio;
- if (speedxy < 0.01f && speedz < 0.01f)
+ float speedXY = float(effectInfo->MiscValue) * ratio;
+ float speedZ = float(damage) * ratio;
+ if (std::abs(speedXY) < 0.01f && std::abs(speedZ) < 0.01f)
return;
Position origin;
@@ -4056,7 +4056,7 @@ void Spell::EffectKnockBack()
else //if (effectInfo->Effect == SPELL_EFFECT_KNOCK_BACK)
origin = m_caster->GetPosition();
- unitTarget->KnockbackFrom(origin, speedxy, speedz);
+ unitTarget->KnockbackFrom(origin, speedXY, speedZ);
Unit::ProcSkillsAndAuras(GetUnitCasterForEffectHandlers(), unitTarget, PROC_FLAG_NONE, { PROC_FLAG_NONE, PROC_FLAG_2_KNOCKBACK },
PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_HIT, PROC_HIT_NONE, nullptr, nullptr, nullptr);
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index 9ffefa47fc6..db24e13cb19 100644
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -21,7 +21,6 @@
#include "Spell.h"
#include "SpellAuras.h"
#include "SpellMgr.h"
-#include "StringConvert.h"
#include "Unit.h"
#include <string>
@@ -35,7 +34,7 @@ bool SpellScriptBase::_Validate(SpellInfo const* entry)
return true;
}
-SpellScriptBase::SpellScriptBase() noexcept : m_currentScriptState(SPELL_SCRIPT_STATE_NONE), m_scriptSpellId(0)
+SpellScriptBase::SpellScriptBase() noexcept : m_scriptSpellId(0), m_currentScriptState(SPELL_SCRIPT_STATE_NONE)
{
}
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index 77c5c512fc7..739355cd21e 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -174,9 +174,9 @@ protected:
Ret(* Thunk)(BaseClass&, Args..., StorageType);
};
- uint8 m_currentScriptState;
std::string_view m_scriptName;
uint32 m_scriptSpellId;
+ uint8 m_currentScriptState;
private:
diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.h b/src/server/game/Tools/CharacterDatabaseCleaner.h
index 83a639f99ab..249eb959f66 100644
--- a/src/server/game/Tools/CharacterDatabaseCleaner.h
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.h
@@ -18,6 +18,8 @@
#ifndef CHARACTERDATABASECLEANER_H
#define CHARACTERDATABASECLEANER_H
+#include "Define.h"
+
namespace CharacterDatabaseCleaner
{
enum CleaningFlags
diff --git a/src/server/game/Warden/Modules/WardenModuleMac.h b/src/server/game/Warden/Modules/WardenModuleMac.h
index a699261a284..3ab4a5b64b0 100644
--- a/src/server/game/Warden/Modules/WardenModuleMac.h
+++ b/src/server/game/Warden/Modules/WardenModuleMac.h
@@ -18,6 +18,9 @@
#ifndef _WARDEN_MODULE_MAC_H
#define _WARDEN_MODULE_MAC_H
+#include "Define.h"
+#include <array>
+
std::array<uint8, 9318> Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data =
{
0x07, 0x0C, 0x44, 0xCD, 0xC9, 0xFB, 0x99, 0xBC, 0x7C, 0x77, 0xDC, 0xE8, 0x8D, 0x07, 0xBE, 0x55,
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h
index 2778ab7c609..19ac3c0d538 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h
@@ -45,10 +45,10 @@ enum BRCCreatureIds
NPC_ROMOGG_BONECRUSHER = 39665
};
-template<typename AI>
-inline AI* GetBlackrockCavernsAI(Creature* creature)
+template <class AI, class T>
+inline AI* GetBlackrockCavernsAI(T* obj)
{
- return GetInstanceAI<AI>(creature, BCScriptName);
+ return GetInstanceAI<AI>(obj, BCScriptName);
}
#endif // BLACKROCKCAVERNS_H_
diff --git a/src/server/scripts/EasternKingdoms/TheStockade/the_stockade.h b/src/server/scripts/EasternKingdoms/TheStockade/the_stockade.h
index ede0b8fdc56..f12fc18b24e 100644
--- a/src/server/scripts/EasternKingdoms/TheStockade/the_stockade.h
+++ b/src/server/scripts/EasternKingdoms/TheStockade/the_stockade.h
@@ -41,10 +41,10 @@ enum SSCreatureIds
NPC_MORTIMER_MOLOCH = 46482
};
-template<typename AI>
-inline AI* GetStormwindStockadeAI(Creature* creature)
+template <class AI, class T>
+inline AI* GetStormwindStockadeAI(T* obj)
{
- return GetInstanceAI<AI>(creature, StormwindStockadeScriptName);
+ return GetInstanceAI<AI>(obj, StormwindStockadeScriptName);
}
#define RegisterStormwindStockadesAI(AI) RegisterCreatureAIWithFactory(AI, GetStormwindStockadeAI)
diff --git a/src/server/scripts/Maelstrom/Stonecore/stonecore.h b/src/server/scripts/Maelstrom/Stonecore/stonecore.h
index 2a79ea3fed1..4b311137912 100644
--- a/src/server/scripts/Maelstrom/Stonecore/stonecore.h
+++ b/src/server/scripts/Maelstrom/Stonecore/stonecore.h
@@ -76,10 +76,10 @@ enum SCMisc
CREATURE_FORMATION_MILLHOUSE_EVENT_LAST_GROUP = 340492,
};
-template<typename AI>
-inline AI* GetStonecoreAI(Creature* creature)
+template <class AI, class T>
+inline AI* GetStonecoreAI(T* obj)
{
- return GetInstanceAI<AI>(creature, SCScriptName);
+ return GetInstanceAI<AI>(obj, SCScriptName);
}
#endif // DEF_STONECORE
diff --git a/src/server/scripts/Spells/spell_dh.cpp b/src/server/scripts/Spells/spell_dh.cpp
index ea4d9af7150..b95d1c367ef 100644
--- a/src/server/scripts/Spells/spell_dh.cpp
+++ b/src/server/scripts/Spells/spell_dh.cpp
@@ -35,17 +35,10 @@
#include "SpellMgr.h"
#include "SpellScript.h"
#include "TaskScheduler.h"
-#include "Unit.h"
+#include <numeric>
enum DemonHunterSpells
{
- AREATRIGGER_DH_SHATTERED_SOULS_HAVOC = 8352,
- AREATRIGGER_DH_SHATTERED_SOULS_HAVOC_DEMON = 11231,
- AREATRIGGER_DH_SHATTERED_SOULS_VENGEANCE = 11266,
- AREATRIGGER_DH_SHATTERED_SOULS_VENGEANCE_DEMON = 10693,
- AREATRIGGER_DH_SOUL_FRAGMENT_HAVOC = 12929,
- AREATRIGGER_DH_SOUL_FRAGMENT_VENGEANCE = 10665,
-
SPELL_DH_ABYSSAL_STRIKE = 207550,
SPELL_DH_ANNIHILATION = 201427,
SPELL_DH_ANNIHILATION_MH = 227518,
@@ -72,12 +65,11 @@ enum DemonHunterSpells
SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM = 391057,
SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM_DAMAGE = 391058,
SPELL_DH_COLLECTIVE_ANGUISH_FEL_DEVASTATION = 393831,
- SPELL_DH_CONSUME_SOUL_HAVOC = 228542,
SPELL_DH_CONSUME_SOUL_HAVOC_DEMON = 228556,
+ SPELL_DH_CONSUME_SOUL_HAVOC_LESSER = 228542,
SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED = 228540,
- SPELL_DH_CONSUME_SOUL_HEAL = 203794,
- SPELL_DH_CONSUME_SOUL_VENGEANCE = 208014,
SPELL_DH_CONSUME_SOUL_VENGEANCE_DEMON = 210050,
+ SPELL_DH_CONSUME_SOUL_VENGEANCE_LESSER = 208014,
SPELL_DH_CONSUME_SOUL_VENGEANCE_SHATTERED = 210047,
SPELL_DH_CYCLE_OF_HATRED_TALENT = 258887,
SPELL_DH_CYCLE_OF_HATRED_COOLDOWN_REDUCTION = 1214887,
@@ -87,6 +79,7 @@ enum DemonHunterSpells
SPELL_DH_DARKNESS_ABSORB = 209426,
SPELL_DH_DEFLECTING_SPIKES = 321028,
SPELL_DH_DEMON_BLADES_DMG = 203796,
+ SPELL_DH_DEMON_MUZZLE_PROC = 394933,
SPELL_DH_DEMON_SPIKES = 203819,
SPELL_DH_DEMON_SPIKES_TRIGGER = 203720,
SPELL_DH_DEMONIC = 213410,
@@ -179,18 +172,21 @@ enum DemonHunterSpells
SPELL_DH_RESTLESS_HUNTER_TALENT = 390142,
SPELL_DH_RESTLESS_HUNTER_BUFF = 390212,
SPELL_DH_SEVER = 235964,
- SPELL_DH_SHATTER_SOUL = 209980,
- SPELL_DH_SHATTER_SOUL_1 = 209981,
- SPELL_DH_SHATTER_SOUL_2 = 210038,
+ SPELL_DH_SHATTER_SOUL = 210038,
+ SPELL_DH_SHATTER_SOUL_VENGEANCE_FRONT_RIGHT = 209980,
+ SPELL_DH_SHATTER_SOUL_VENGEANCE_BACK_RIGHT = 209981,
SPELL_DH_SHATTERED_SOUL = 226258,
+ SPELL_DH_SHATTERED_SOULS_V_DEMON_TRIGGER = 226264,
+ SPELL_DH_SHATTERED_SOULS_V_SHATTERED_TRIGGER = 226263,
SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT = 228533,
SPELL_DH_SHATTERED_SOUL_LESSER_LEFT = 237867,
SPELL_DH_SHATTERED_SOULS_HAVOC = 209651,
SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER = 226370,
+ SPELL_DH_SHATTERED_SOULS_HAVOC_LESSER_TRIGGER = 228536,
SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER = 209687,
SPELL_DH_SHATTERED_SOULS_MARKER = 221461,
SPELL_DH_SHEAR = 203782,
- SPELL_DH_SIGIL_OF_CHAINS_AREA_SELECTOR = 204834,
+ SPELL_DH_SHEAR_PASSIVE = 203783,
SPELL_DH_SIGIL_OF_CHAINS_GRIP = 208674,
SPELL_DH_SIGIL_OF_CHAINS_JUMP = 208674,
SPELL_DH_SIGIL_OF_CHAINS_SLOW = 204843,
@@ -201,9 +197,7 @@ enum DemonHunterSpells
SPELL_DH_SIGIL_OF_FLAME_AOE = 204598,
SPELL_DH_SIGIL_OF_FLAME_FLAME_CRASH = 228973,
SPELL_DH_SIGIL_OF_FLAME_VISUAL = 208710,
- SPELL_DH_SIGIL_OF_MISERY = 207685,
SPELL_DH_SIGIL_OF_MISERY_AOE = 207685,
- SPELL_DH_SIGIL_OF_SILENCE = 204490,
SPELL_DH_SIGIL_OF_SILENCE_AOE = 204490,
SPELL_DH_SIGIL_OF_SPITE = 390163,
SPELL_DH_SIGIL_OF_SPITE_AOE = 389860,
@@ -211,6 +205,7 @@ enum DemonHunterSpells
SPELL_DH_SOUL_CLEAVE = 228477,
SPELL_DH_SOUL_CLEAVE_DMG = 228478,
SPELL_DH_SOUL_FRAGMENT_COUNTER = 203981,
+ SPELL_DH_SOUL_FRAGMENTS_DAMAGE_TAKEN_TRACKER = 210788,
SPELL_DH_SOUL_FURNACE_DAMAGE_BUFF = 391172,
SPELL_DH_SOUL_RENDING = 204909,
SPELL_DH_SPIRIT_BOMB_DAMAGE = 218677,
@@ -546,6 +541,34 @@ class spell_dh_collective_anguish_eye_beam : public AuraScript
}
};
+// 203794 - Consume Soul
+class spell_dh_consume_soul_vengeance_lesser : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellEffect({ { SPELL_DH_SOUL_FRAGMENTS_DAMAGE_TAKEN_TRACKER, EFFECT_0 }, { SPELL_DH_SHEAR_PASSIVE, EFFECT_2 } });
+ }
+
+ void CalcHealingFromDamageTaken(SpellEffectInfo const& /*effectInfo*/, Unit const* victim, int32& /*healing*/, int32& flatMod, float& /*pctMod*/) const
+ {
+ AuraEffect* damageTakenTracker = GetCaster()->GetAuraEffect(SPELL_DH_SOUL_FRAGMENTS_DAMAGE_TAKEN_TRACKER, EFFECT_0);
+ if (!damageTakenTracker)
+ return;
+
+ Aura const* shearPassive = GetCaster()->GetAura(SPELL_DH_SHEAR_PASSIVE);
+ if (!shearPassive || !shearPassive->HasEffect(EFFECT_1) || !shearPassive->HasEffect(EFFECT_2))
+ return;
+
+ flatMod += std::max(CalculatePct(uint64(damageTakenTracker->CalculateAmount(GetCaster())), shearPassive->GetEffect(EFFECT_1)->GetAmount()),
+ victim->CountPctFromMaxHealth(shearPassive->GetEffect(EFFECT_2)->GetAmount()));
+ }
+
+ void Register() override
+ {
+ CalcHealing += SpellCalcHealingFn(spell_dh_consume_soul_vengeance_lesser::CalcHealingFromDamageTaken);
+ }
+};
+
// 320413 - Critical Chaos
class spell_dh_critical_chaos : public AuraScript
{
@@ -780,6 +803,28 @@ class spell_dh_deflecting_spikes : public SpellScript
}
};
+// 388111 - Demon Muzzle
+class spell_dh_demon_muzzle : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_DH_DEMON_MUZZLE_PROC });
+ }
+
+ static void HandleProc(AuraScript const&, AuraEffect const*, ProcEventInfo const& procEvent)
+ {
+ procEvent.GetActor()->CastSpell(procEvent.GetActionTarget(), SPELL_DH_DEMON_MUZZLE_PROC, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = procEvent.GetProcSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_dh_demon_muzzle::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+};
+
// 213410 - Demonic (attached to 212084 - Fel Devastation and 198013 - Eye Beam)
class spell_dh_demonic : public SpellScript
{
@@ -902,6 +947,29 @@ class spell_dh_demon_spikes : public SpellScript
}
};
+struct spell_dh_shattered_souls_base_lesser
+{
+ static bool Validate()
+ {
+ return SpellScriptBase::ValidateSpellInfo({
+ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT,
+ SPELL_DH_SHATTERED_SOUL_LESSER_LEFT,
+ SPELL_DH_SHATTER_SOUL_VENGEANCE_FRONT_RIGHT,
+ SPELL_DH_SHATTER_SOUL_VENGEANCE_BACK_RIGHT
+ });
+ }
+
+ static void CreateFragments(Unit* source, Unit* dh, int32 count)
+ {
+ std::array<DemonHunterSpells, 2> spells = dh->IsPlayer() && dh->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::DemonHunterHavoc
+ ? std::array{ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT }
+ : std::array{ SPELL_DH_SHATTER_SOUL_VENGEANCE_FRONT_RIGHT, SPELL_DH_SHATTER_SOUL_VENGEANCE_BACK_RIGHT };
+
+ for (int32 i = 0; i < count; ++i)
+ source->CastSpell(dh, Trinity::Containers::SelectRandomContainerElement(spells), TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+};
+
// 307046 - Elysian Decree (Kyrian)
// 389860 - Sigil of Spite
class spell_dh_elysian_decree : public SpellScript
@@ -912,7 +980,8 @@ public:
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellEffect({ { _primarySpellId, EFFECT_2 } })
- && sSpellMgr->AssertSpellInfo(_primarySpellId, DIFFICULTY_NONE)->GetEffect(EFFECT_2).IsEffect(SPELL_EFFECT_DUMMY);
+ && sSpellMgr->AssertSpellInfo(_primarySpellId, DIFFICULTY_NONE)->GetEffect(EFFECT_2).IsEffect(SPELL_EFFECT_DUMMY)
+ && spell_dh_shattered_souls_base_lesser::Validate();
}
bool Load() override
@@ -928,8 +997,7 @@ public:
int32 fragments = 1 + std::max(int32(_maxFragmentsToCreate - GetUnitTargetCountForEffect(effIndex)), 0);
fragments = std::min(fragments, _fragmentsToCreate);
- for (int32 i = 0; i < fragments; ++i)
- GetHitUnit()->CastSpell(GetCaster(), Trinity::Containers::SelectRandomContainerElement(std::array{ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT }), TRIGGERED_DONT_REPORT_CAST_ERROR);
+ spell_dh_shattered_souls_base_lesser::CreateFragments(GetHitUnit(), GetCaster(), fragments);
_fragmentsToCreate -= fragments;
}
@@ -1647,14 +1715,18 @@ private:
};
// 178940 - Shattered Souls
-class spell_dh_shattered_souls_havoc : public AuraScript
+// 204254 - Shattered Souls
+class spell_dh_shattered_souls : public AuraScript
{
+public:
+ spell_dh_shattered_souls(uint32 triggeredSpellId) : _triggeredSpellId(triggeredSpellId) { }
+
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- return ValidateSpellInfo({ SPELL_DH_SHATTERED_SOULS_HAVOC });
+ return ValidateSpellInfo({ _triggeredSpellId });
}
- static void HandleProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const
{
Unit* caster = eventInfo.GetActor();
Unit* target = eventInfo.GetProcTarget();
@@ -1662,27 +1734,36 @@ class spell_dh_shattered_souls_havoc : public AuraScript
if (!caster || !target)
return;
- target->CastSpell(caster, SPELL_DH_SHATTERED_SOULS_HAVOC, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ target->CastSpell(caster, _triggeredSpellId, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
void Register() override
{
- OnEffectProc += AuraEffectProcFn(spell_dh_shattered_souls_havoc::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ OnEffectProc += AuraEffectProcFn(spell_dh_shattered_souls::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
+
+private:
+ uint32 _triggeredSpellId;
};
// 209651 - Shattered Souls
-class spell_dh_shattered_souls_havoc_trigger : public SpellScript
+// 210038 - Shatter Soul
+class spell_dh_shattered_souls_trigger : public SpellScript
{
+public:
+ spell_dh_shattered_souls_trigger(uint32 triggeredSpellId, uint32 triggeredSpellIdDemon)
+ : _triggeredSpellId(triggeredSpellId), _triggeredSpellIdDemon(triggeredSpellIdDemon) { }
+
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- return ValidateSpellInfo({ SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER, SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER });
+ return ValidateSpellInfo({ _triggeredSpellId })
+ && (!_triggeredSpellIdDemon || ValidateSpellInfo({ _triggeredSpellIdDemon }));
}
void HandleSoulFragment(SpellEffIndex /*effIndex*/) const
{
if (Unit* target = GetExplTargetUnit())
- target->CastSpell(GetHitDest()->GetPosition(), GetCaster()->GetCreatureType() == CREATURE_TYPE_DEMON ? SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER : SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER, CastSpellExtraArgsInit{
+ target->CastSpell(GetHitDest()->GetPosition(), _triggeredSpellIdDemon && GetCaster()->GetCreatureType() == CREATURE_TYPE_DEMON ? _triggeredSpellIdDemon : _triggeredSpellId, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringSpell = GetSpell()
});
@@ -1690,8 +1771,12 @@ class spell_dh_shattered_souls_havoc_trigger : public SpellScript
void Register() override
{
- OnEffectLaunch += SpellEffectFn(spell_dh_shattered_souls_havoc_trigger::HandleSoulFragment, EFFECT_1, SPELL_EFFECT_DUMMY);
+ OnEffectLaunch += SpellEffectFn(spell_dh_shattered_souls_trigger::HandleSoulFragment, EFFECT_1, SPELL_EFFECT_DUMMY);
}
+
+private:
+ uint32 _triggeredSpellId;
+ uint32 _triggeredSpellIdDemon;
};
// 209693 - Shattered Souls and 209788 - Shattered Souls
@@ -1708,6 +1793,66 @@ struct at_dh_shattered_souls : public AreaTriggerAI
}
};
+using at_dh_shattered_souls_havoc_demon = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_DEMON>;
+using at_dh_shattered_souls_havoc_lesser = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_LESSER>;
+using at_dh_shattered_souls_havoc_shattered = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED>;
+using at_dh_shattered_souls_vengeance_demon = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_VENGEANCE_DEMON>;
+using at_dh_shattered_souls_vengeance_lesser = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_VENGEANCE_LESSER>;
+using at_dh_shattered_souls_vengeance_shattered = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_VENGEANCE_SHATTERED>;
+
+// 210788 - Soul Fragments
+class spell_dh_soul_fragments_damage_taken_tracker : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellEffect({ { SPELL_DH_SHEAR_PASSIVE, EFFECT_3 } });
+ }
+
+ bool Load() override
+ {
+ AuraEffect const* seconds = GetUnitOwner()->GetAuraEffect(SPELL_DH_SHEAR_PASSIVE, EFFECT_3);
+ if (!seconds)
+ return false;
+
+ _damagePerSecond.resize(seconds->GetAmount());
+ return !_damagePerSecond.empty();
+ }
+
+ static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
+ {
+ return eventInfo.GetDamageInfo() != nullptr;
+ }
+
+ void Update(AuraEffect* /*aurEff*/)
+ {
+ // Move backwards all datas by one from [23][0][0][0][0] -> [0][23][0][0][0]
+ std::move_backward(_damagePerSecond.begin(), std::next(_damagePerSecond.begin(), std::ssize(_damagePerSecond) - 1), _damagePerSecond.end());
+ _damagePerSecond[0] = 0;
+ }
+
+ void HandleCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = true;
+ amount = int32(std::reduce(_damagePerSecond.begin(), _damagePerSecond.end(), 0u));
+ }
+
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
+ {
+ _damagePerSecond[0] += eventInfo.GetDamageInfo()->GetDamage();
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dh_soul_fragments_damage_taken_tracker::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dh_soul_fragments_damage_taken_tracker::HandleProc, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dh_soul_fragments_damage_taken_tracker::HandleCalcAmount, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dh_soul_fragments_damage_taken_tracker::Update, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+
+private:
+ std::vector<uint32> _damagePerSecond;
+};
+
// 391166 - Soul Furnace
class spell_dh_soul_furnace : public AuraScript
{
@@ -1933,15 +2078,17 @@ void AddSC_demon_hunter_spell_scripts()
RegisterSpellScript(spell_dh_chaos_theory_drop_charge);
RegisterSpellScript(spell_dh_chaotic_transformation);
RegisterSpellScript(spell_dh_charred_warblades);
- RegisterSpellScript(spell_dh_critical_chaos);
RegisterSpellScript(spell_dh_collective_anguish);
RegisterSpellScript(spell_dh_collective_anguish_eye_beam);
+ RegisterSpellScript(spell_dh_consume_soul_vengeance_lesser);
+ RegisterSpellScript(spell_dh_critical_chaos);
RegisterSpellScript(spell_dh_cycle_of_hatred);
RegisterSpellScript(spell_dh_cycle_of_hatred_remove_stacks);
RegisterSpellScript(spell_dh_cycle_of_hatred_talent);
RegisterSpellScript(spell_dh_darkglare_boon);
RegisterSpellScript(spell_dh_darkness);
RegisterSpellScript(spell_dh_deflecting_spikes);
+ RegisterSpellScript(spell_dh_demon_muzzle);
RegisterSpellScriptWithArgs(spell_dh_demonic, "spell_dh_demonic_havoc", SPELL_DH_METAMORPHOSIS_TRANSFORM);
RegisterSpellScriptWithArgs(spell_dh_demonic, "spell_dh_demonic_vengeance", SPELL_DH_METAMORPHOSIS_VENGEANCE_TRANSFORM);
RegisterSpellScript(spell_dh_demonic_appetite);
@@ -1968,12 +2115,21 @@ void AddSC_demon_hunter_spell_scripts()
RegisterSpellScript(spell_dh_repeat_decree_conduit);
RegisterSpellScript(spell_dh_restless_hunter);
RegisterSpellScript(spell_dh_shattered_destiny);
- RegisterSpellScript(spell_dh_shattered_souls_havoc);
- RegisterSpellScript(spell_dh_shattered_souls_havoc_trigger);
- new GenericAreaTriggerEntityScript<at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED>>("at_dh_shattered_souls_havoc_shattered");
- new GenericAreaTriggerEntityScript<at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_DEMON>>("at_dh_shattered_souls_havoc_demon");
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls, "spell_dh_shattered_souls_havoc", SPELL_DH_SHATTERED_SOULS_HAVOC);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls, "spell_dh_shattered_souls_vengeance", SPELL_DH_SHATTER_SOUL);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_havoc_trigger", SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER, SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_havoc_trigger_lesser", SPELL_DH_SHATTERED_SOULS_HAVOC_LESSER_TRIGGER, 0);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_vengeance_trigger", SPELL_DH_SHATTERED_SOULS_V_SHATTERED_TRIGGER, SPELL_DH_SHATTERED_SOULS_V_DEMON_TRIGGER);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_vengeance_trigger_lesser", SPELL_DH_SHATTERED_SOUL, 0);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_havoc_demon);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_havoc_lesser);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_havoc_shattered);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_vengeance_demon);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_vengeance_lesser);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_vengeance_shattered);
RegisterSpellScript(spell_dh_sigil_of_chains);
RegisterSpellScriptWithArgs(spell_dh_elysian_decree, "spell_dh_sigil_of_spite", SPELL_DH_SIGIL_OF_SPITE);
+ RegisterSpellScript(spell_dh_soul_fragments_damage_taken_tracker);
RegisterSpellScript(spell_dh_student_of_suffering);
RegisterSpellScript(spell_dh_tactical_retreat);
RegisterSpellScript(spell_dh_unhindered_assault);
diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp
index ba5c8f9c758..256069f3a06 100644
--- a/src/server/worldserver/Main.cpp
+++ b/src/server/worldserver/Main.cpp
@@ -49,7 +49,6 @@
#include "TerrainMgr.h"
#include "ThreadPool.h"
#include "World.h"
-#include "WorldSocket.h"
#include "WorldSocketMgr.h"
#include "Util.h"
#include <openssl/opensslv.h>