From e44e8fe109313e7f4e7b624a0806963f73a4455e Mon Sep 17 00:00:00 2001 From: Tereneckla Date: Mon, 29 Jul 2024 11:30:42 +0000 Subject: [PATCH 01/24] fix (Core/Movement) Allow MoveFollow to not inherit walkstate of the target to fix Enchanted Elemental speed (#19498) * MoveFollow with own walkstate * switch --- src/server/game/Movement/MotionMaster.cpp | 8 ++--- src/server/game/Movement/MotionMaster.h | 2 +- .../TargetedMovementGenerator.cpp | 4 ++- .../TargetedMovementGenerator.h | 5 +-- .../SerpentShrine/boss_lady_vashj.cpp | 31 ++++++++++--------- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index ff3c9d246..785b48baf 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -270,7 +270,7 @@ void MotionMaster::MoveTargetedHome(bool walk /*= false*/) if (target) { LOG_DEBUG("movement.motionmaster", "Following {} ({})", target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetGUID().ToString()); - Mutate(new FollowMovementGenerator(target, PET_FOLLOW_DIST, _owner->GetFollowAngle()), MOTION_SLOT_ACTIVE); + Mutate(new FollowMovementGenerator(target, PET_FOLLOW_DIST, _owner->GetFollowAngle(),true), MOTION_SLOT_ACTIVE); } } else @@ -391,7 +391,7 @@ void MotionMaster::MoveCircleTarget(Unit* target) init.Launch(); } -void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot) +void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot, bool inheritWalkState) { // Xinef: do not allow to move with UNIT_FLAG_DISABLE_MOVE // ignore movement request if target not exist @@ -405,13 +405,13 @@ void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlo { LOG_DEBUG("movement.motionmaster", "Player ({}) follow to {} ({})", _owner->GetGUID().ToString(), target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetGUID().ToString()); - Mutate(new FollowMovementGenerator(target, dist, angle), slot); + Mutate(new FollowMovementGenerator(target, dist, angle, inheritWalkState), slot); } else { LOG_DEBUG("movement.motionmaster", "Creature ({}) follow to {} ({})", _owner->GetGUID().ToString(), target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetGUID().ToString()); - Mutate(new FollowMovementGenerator(target, dist, angle), slot); + Mutate(new FollowMovementGenerator(target, dist, angle, inheritWalkState), slot); } } diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 21b76a0f5..1c3d16c39 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -199,7 +199,7 @@ public: void MoveIdle(); void MoveTargetedHome(bool walk = false); void MoveRandom(float wanderDistance = 0.0f); - void MoveFollow(Unit* target, float dist, float angle, MovementSlot slot = MOTION_SLOT_ACTIVE); + void MoveFollow(Unit* target, float dist, float angle, MovementSlot slot = MOTION_SLOT_ACTIVE, bool inheritWalkState = true); void MoveChase(Unit* target, std::optional dist = {}, std::optional angle = {}); void MoveChase(Unit* target, float dist, float angle) { MoveChase(target, ChaseRange(dist), ChaseAngle(angle)); } void MoveChase(Unit* target, float dist) { MoveChase(target, ChaseRange(dist)); } diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 2bf83ac14..a2ef923f6 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -520,7 +520,9 @@ bool FollowMovementGenerator::DoUpdate(T* owner, uint32 time_diff) Movement::MoveSplineInit init(owner); init.MovebyPath(i_path->GetPath()); - init.SetWalk(target->IsWalking() || target->movespline->isWalking()); + if (_inheritWalkState) + init.SetWalk(target->IsWalking() || target->movespline->isWalking()); + if (Optional velocity = GetVelocity(owner, target, i_path->GetActualEndPosition(), owner->IsGuardian())) init.SetVelocity(*velocity); init.Launch(); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index d6b13516e..41678c471 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -74,8 +74,8 @@ template class FollowMovementGenerator : public MovementGeneratorMedium>, public TargetedMovementGeneratorBase { public: - FollowMovementGenerator(Unit* target, float range, ChaseAngle angle) - : TargetedMovementGeneratorBase(target), i_path(nullptr), i_recheckPredictedDistanceTimer(0), i_recheckPredictedDistance(false), _range(range), _angle(angle) {} + FollowMovementGenerator(Unit* target, float range, ChaseAngle angle, bool inheritWalkState) + : TargetedMovementGeneratorBase(target), i_path(nullptr), i_recheckPredictedDistanceTimer(0), i_recheckPredictedDistance(false), _range(range), _angle(angle),_inheritWalkState(inheritWalkState) {} ~FollowMovementGenerator() { } MovementGeneratorType GetMovementGeneratorType() { return FOLLOW_MOTION_TYPE; } @@ -106,6 +106,7 @@ private: Optional _lastPredictedPosition; float _range; ChaseAngle _angle; + bool _inheritWalkState; }; #endif diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index 7ecc204b5..b1521fe2f 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -132,21 +132,22 @@ struct boss_lady_vashj : public BossAI void JustSummoned(Creature* summon) override { summons.Summon(summon); - if (summon->GetEntry() == WORLD_TRIGGER) - { - summon->CastSpell(summon, SPELL_MAGIC_BARRIER); - } - else if (summon->GetEntry() == NPC_TOXIC_SPOREBAT) - { - summon->GetMotionMaster()->MoveRandom(30.0f); - } - else if (summon->GetEntry() == NPC_ENCHANTED_ELEMENTAL) - { - summon->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f); - } - else if (summon->GetEntry() != NPC_TAINTED_ELEMENTAL) - { - summon->GetMotionMaster()->MovePoint(POINT_HOME, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, true); + switch(summon->GetEntry()) { + case(WORLD_TRIGGER): + summon->CastSpell(summon, SPELL_MAGIC_BARRIER); + break; + case(NPC_ENCHANTED_ELEMENTAL): + summon->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f, MOTION_SLOT_ACTIVE, false); + summon->SetWalk(true); + summon->SetReactState(REACT_PASSIVE); + break; + case(NPC_TAINTED_ELEMENTAL): + break; + case(NPC_TOXIC_SPOREBAT): + summon->GetMotionMaster()->MoveRandom(30.0f); + break; + default: + summon->GetMotionMaster()->MovePoint(POINT_HOME, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, true); } } From 1c5ee47151208172047acfff0598b90948b32b2f Mon Sep 17 00:00:00 2001 From: dweipert-3138720606 Date: Mon, 29 Jul 2024 14:31:51 +0200 Subject: [PATCH 02/24] fix docker warning about "FromAsCasing" (#19368) Co-authored-by: Daniel Weipert --- apps/docker/Dockerfile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/docker/Dockerfile b/apps/docker/Dockerfile index 87fecde84..da2bcea15 100644 --- a/apps/docker/Dockerfile +++ b/apps/docker/Dockerfile @@ -3,7 +3,7 @@ ARG TZ=Etc/UTC # This target lays out the general directory skeleton for AzerothCore, # This target isn't intended to be directly used -FROM ubuntu:$UBUNTU_VERSION as skeleton +FROM ubuntu:$UBUNTU_VERSION AS skeleton ARG DOCKER=1 ARG DEBIAN_FRONTEND=noninteractive @@ -39,7 +39,7 @@ WORKDIR /azerothcore # This target builds the docker image # This target can be useful to inspect the explicit outputs from the build, -FROM skeleton as build +FROM skeleton AS build ARG CTOOLS_BUILD="all" ARG CTYPE="RelWithDebInfo" @@ -106,7 +106,7 @@ RUN --mount=type=cache,target=/ccache,sharing=locked \ # Base runtime for services # ############################# -FROM skeleton as runtime +FROM skeleton AS runtime ARG USER_ID=1000 ARG GROUP_ID=1000 @@ -144,7 +144,7 @@ ENTRYPOINT ["/usr/bin/env", "bash", "/azerothcore/entrypoint.sh"] # Auth Server # ############### -FROM runtime as authserver +FROM runtime AS authserver LABEL description "AzerothCore Auth Server" ENV ACORE_COMPONENT=authserver @@ -165,7 +165,7 @@ CMD ["authserver"] # World Server # ################ -FROM runtime as worldserver +FROM runtime AS worldserver LABEL description "AzerothCore World Server" @@ -188,7 +188,7 @@ CMD ["worldserver"] # DB Import # ############# -FROM runtime as db-import +FROM runtime AS db-import LABEL description "AzerothCore Database Import tool" @@ -209,7 +209,7 @@ CMD /azerothcore/env/dist/bin/dbimport # Client Data # ############### -FROM skeleton as client-data +FROM skeleton AS client-data LABEL description="AzerothCore client-data" @@ -231,7 +231,7 @@ CMD bash -c "source /azerothcore/apps/installer/includes/functions.sh && inst_do # Map Extractors # ################## -FROM runtime as tools +FROM runtime AS tools LABEL description "AzerothCore Tools" From a3be4c25db9ca3921b288c8ec737de985c0d3e18 Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Mon, 29 Jul 2024 14:57:25 +0200 Subject: [PATCH 03/24] refactor(Scripts/IcecrownCitadel): Spell Scripts use registry macros (#19508) * boss_blood_queen_lana_thel aura:spell_blood_queen_pact_of_the_darkfallen_dmg_aura * boss_blood_queen_lana_thel spell:spell_blood_queen_pact_of_the_darkfallen * boss_blood_queen_lana_thel spell:spell_blood_queen_pact_of_the_darkfallen_dmg_target * boss_blood_queen_lana_thel spell:spell_blood_queen_bloodbolt * boss_blood_queen_lana_thel aura:spell_blood_queen_frenzied_bloodthirst_aura * boss_blood_queen_lana_thel aura:spell_blood_queen_essence_of_the_blood_queen_aura * boss_blood_queen_lana_thel spell:spell_blood_queen_vampiric_bite * boss_blood_queen_lana_thel spell:spell_blood_queen_swarming_shadows_floor_dmg * boss_blood_queen_lana_thel spell:spell_blood_queen_presence_of_the_darkfallen * icecrown_citadel aura:spell_icc_stoneform_aura * icecrown_citadel spell:spell_icc_sprit_alarm * icecrown_citadel spell:spell_icc_geist_alarm * icecrown_citadel spell:spell_frost_giant_death_plague * icecrown_citadel spell:spell_icc_harvest_blight_specimen * icecrown_citadel spell:spell_svalna_revive_champion * icecrown_citadel spell:spell_svalna_remove_spear * icecrown_citadel spell:spell_icc_soul_missile * icecrown_citadel aura:spell_icc_web_wrap_aura * icecrown_citadel aura:spell_icc_dark_reckoning_aura * icecrown_citadel spell:spell_stinky_precious_decimate * icecrown_citadel aura:spell_icc_yf_frozen_orb_aura * icecrown_citadel aura:spell_icc_yh_volley_aura * icecrown_citadel spell:spell_icc_yd_summon_undead * icecrown_citadel spell:spell_icc_shattered_bones * boss_deathbringer_saurfang aura:spell_deathbringer_blood_link_aura * boss_deathbringer_saurfang aura:spell_deathbringer_blood_link_blood_beast_aura * boss_deathbringer_saurfang spell:spell_deathbringer_blood_link * boss_deathbringer_saurfang pair:spell_deathbringer_blood_power * boss_deathbringer_saurfang spell:spell_deathbringer_blood_nova_targeting * boss_deathbringer_saurfang spell:spell_deathbringer_boiling_blood * boss_festergut spell:spell_festergut_pungent_blight * boss_festergut aura:spell_festergut_blighted_spores_aura * boss_festergut spell:spell_festergut_gastric_bloat * boss_valithria_dreamwalker spell:spell_dreamwalker_summon_portal * boss_valithria_dreamwalker spell:spell_dreamwalker_twisted_nightmares * boss_valithria_dreamwalker aura:spell_dreamwalker_nightmare_cloud_aura * boss_valithria_dreamwalker aura:spell_dreamwalker_mana_void_aura * boss_valithria_dreamwalker aura:spell_dreamwalker_decay_periodic_timer_aura * boss_valithria_dreamwalker spell:spell_dreamwalker_summoner * boss_valithria_dreamwalker aura:spell_dreamwalker_summon_suppresser_aura * boss_valithria_dreamwalker spell:spell_dreamwalker_summon_suppresser_effect * boss_valithria_dreamwalker aura:spell_valithria_suppression_aura * boss_lady_deathwhisper aura:spell_deathwhisper_mana_barrier_aura * boss_professor_putricide spell:spell_putricide_slime_puddle * boss_professor_putricide spell:spell_putricide_slime_puddle_spawn * boss_professor_putricide aura:spell_putricide_grow_stacker_aura * boss_professor_putricide spell:spell_putricide_unstable_experiment * boss_professor_putricide spell:spell_putricide_tear_gas_effect * boss_professor_putricide aura:spell_putricide_gaseous_bloat_aura * boss_professor_putricide spell:spell_putricide_ooze_channel * boss_professor_putricide spell:spell_putricide_ooze_eruption_searcher * boss_professor_putricide aura:spell_putricide_mutated_plague_aura * boss_professor_putricide spell:spell_putricide_unbound_plague * boss_professor_putricide aura:spell_putricide_unbound_plague_dmg_aura * boss_professor_putricide spell:spell_putricide_choking_gas_bomb * boss_professor_putricide spell:spell_putricide_clear_aura_effect_value * boss_professor_putricide pair:spell_putricide_mutation_init * boss_professor_putricide spell:spell_putricide_mutated_transformation * boss_professor_putricide aura:spell_putricide_mutated_transformation_dismiss_aura * boss_professor_putricide spell:spell_putricide_mutated_transformation_dmg * boss_professor_putricide spell:spell_putricide_eat_ooze * boss_professor_putricide spell:spell_putricide_regurgitated_ooze * boss_sindragosa spell:spell_sindragosa_s_fury * boss_sindragosa aura:spell_sindragosa_permeating_chill_aura * boss_sindragosa aura:spell_sindragosa_instability_aura * boss_sindragosa spell:spell_sindragosa_icy_grip * boss_sindragosa spell:spell_sindragosa_icy_grip_jump * boss_sindragosa aura:spell_sindragosa_frost_beacon_aura * boss_sindragosa spell:spell_sindragosa_ice_tomb_filter * boss_sindragosa pair:spell_sindragosa_ice_tomb * boss_sindragosa spell:spell_sindragosa_mystic_buffet * boss_sindragosa aura:spell_sindragosa_soul_preservation_aura * boss_sindragosa spell:spell_rimefang_icy_blast * boss_sindragosa spell:spell_frostwarden_handler_order_whelp * boss_sindragosa pair:spell_frostwarden_handler_focus_fire * boss_sindragosa spell:spell_sindragosa_frost_breath * boss_lord_marrowgar spell:spell_marrowgar_coldflame * boss_lord_marrowgar spell:spell_marrowgar_bone_spike_graveyard * boss_lord_marrowgar spell:spell_marrowgar_coldflame_bonestorm * boss_lord_marrowgar spell:spell_marrowgar_bone_storm * boss_lord_marrowgar spell:spell_marrowgar_bone_slice * boss_the_lich_king spell:spell_the_lich_king_quake * boss_the_lich_king spell:spell_the_lich_king_jump * boss_the_lich_king spell:spell_the_lich_king_jump_remove_aura * boss_the_lich_king spell:spell_the_lich_king_play_movie * boss_the_lich_king aura:spell_the_lich_king_infest_aura * boss_the_lich_king aura:spell_the_lich_king_necrotic_plague_aura * boss_the_lich_king pair:spell_the_lich_king_necrotic_plague_jump * boss_the_lich_king aura:spell_the_lich_king_shadow_trap_visual_aura * boss_the_lich_king spell:spell_the_lich_king_shadow_trap_periodic * boss_the_lich_king spell:spell_the_lich_king_ice_burst_target_search * boss_the_lich_king spell:spell_the_lich_king_raging_spirit * boss_the_lich_king spell:spell_the_lich_king_defile * boss_the_lich_king aura:spell_the_lich_king_soul_reaper_aura * boss_the_lich_king spell:spell_the_lich_king_summon_into_air * boss_the_lich_king spell:spell_the_lich_king_teleport_to_frostmourne_hc * boss_the_lich_king spell:spell_the_lich_king_valkyr_target_search * boss_the_lich_king spell:spell_the_lich_king_cast_back_to_caster * boss_the_lich_king spell:spell_the_lich_king_life_siphon * boss_the_lich_king aura:spell_the_lich_king_vile_spirits_aura * boss_the_lich_king spell:spell_the_lich_king_vile_spirits_visual * boss_the_lich_king spell:spell_the_lich_king_vile_spirit_move_target_search * boss_the_lich_king spell:spell_the_lich_king_vile_spirit_damage_target_search * boss_the_lich_king aura:spell_the_lich_king_harvest_soul_aura * boss_the_lich_king aura:spell_the_lich_king_lights_favor_aura * boss_the_lich_king spell:spell_the_lich_king_restore_soul * boss_the_lich_king aura:spell_the_lich_king_dark_hunger_aura * boss_the_lich_king aura:spell_the_lich_king_soul_rip_aura * boss_the_lich_king spell:spell_the_lich_king_summon_spirit_bomb * boss_the_lich_king spell:spell_the_lich_king_trigger_vile_spirit * boss_icecrown_gunship_battle aura:spell_igb_rocket_pack_aura * boss_icecrown_gunship_battle aura:spell_igb_rocket_pack_useable_aura * boss_icecrown_gunship_battle spell:spell_igb_teleport_to_enemy_ship * boss_icecrown_gunship_battle spell:spell_igb_check_for_players * boss_icecrown_gunship_battle spell:spell_igb_gunship_fall_teleport * boss_icecrown_gunship_battle aura:spell_igb_explosion_main_aura * boss_icecrown_gunship_battle spell:spell_igb_explosion * boss_icecrown_gunship_battle spell:spell_igb_teleport_players_on_victory * boss_icecrown_gunship_battle aura:spell_igb_periodic_trigger_with_power_cost_aura * boss_icecrown_gunship_battle aura:spell_igb_overheat_aura * boss_icecrown_gunship_battle spell:spell_igb_cannon_blast * boss_icecrown_gunship_battle spell:spell_igb_incinerating_blast * boss_icecrown_gunship_battle spell:spell_igb_burning_pitch_selector * boss_icecrown_gunship_battle spell:spell_igb_burning_pitch * boss_icecrown_gunship_battle spell:spell_igb_rocket_artillery * boss_icecrown_gunship_battle spell:spell_igb_rocket_artillery_explosion * boss_icecrown_gunship_battle spell:spell_igb_below_zero * boss_icecrown_gunship_battle aura:spell_igb_on_gunship_deck_aura * boss_blood_prince_council aura:spell_blood_council_shadow_prison_aura * boss_blood_prince_council spell:spell_blood_council_shadow_prison_damage * boss_blood_prince_council spell:spell_taldaram_glittering_sparks * boss_blood_prince_council spell:spell_taldaram_summon_flame_ball * boss_blood_prince_council spell:spell_taldaram_ball_of_inferno_flame * boss_blood_prince_council pair:spell_valanar_kinetic_bomb * boss_blood_prince_council aura:spell_valanar_kinetic_bomb_absorb_aura * boss_blood_prince_council spell:spell_valanar_kinetic_bomb_knockback * boss_blood_prince_council spell:spell_valanar_kinetic_bomb_summon * boss_blood_prince_council spell:spell_blood_council_summon_shadow_resonance * boss_rotface pair:spell_rotface_mutated_infection * boss_rotface spell:spell_rotface_little_ooze_combine * boss_rotface spell:spell_rotface_large_ooze_combine * boss_rotface spell:spell_rotface_large_ooze_buff_combine * boss_rotface spell:spell_rotface_unstable_ooze_explosion_init * boss_rotface spell:spell_rotface_unstable_ooze_explosion * boss_rotface aura:spell_rotface_unstable_ooze_explosion_suicide_aura * icecrown_citadel.h spell:spell_trigger_spell_from_caster --- .../rev_1719841493844689528.sql | 43 + .../boss_blood_prince_council.cpp | 579 +++--- .../boss_blood_queen_lana_thel.cpp | 536 +++--- .../boss_deathbringer_saurfang.cpp | 484 +++-- .../IcecrownCitadel/boss_festergut.cpp | 175 +- .../boss_icecrown_gunship_battle.cpp | 1019 +++++----- .../boss_lady_deathwhisper.cpp | 35 +- .../IcecrownCitadel/boss_lord_marrowgar.cpp | 327 ++-- .../boss_professor_putricide.cpp | 1375 ++++++-------- .../IcecrownCitadel/boss_rotface.cpp | 514 +++-- .../IcecrownCitadel/boss_sindragosa.cpp | 833 ++++---- .../IcecrownCitadel/boss_the_lich_king.cpp | 1682 +++++++---------- .../boss_valithria_dreamwalker.cpp | 584 +++--- .../IcecrownCitadel/icecrown_citadel.cpp | 771 ++++---- .../IcecrownCitadel/icecrown_citadel.h | 41 +- 15 files changed, 3812 insertions(+), 5186 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1719841493844689528.sql diff --git a/data/sql/updates/pending_db_world/rev_1719841493844689528.sql b/data/sql/updates/pending_db_world/rev_1719841493844689528.sql new file mode 100644 index 000000000..e61ec6ca1 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719841493844689528.sql @@ -0,0 +1,43 @@ +-- +UPDATE `spell_script_names` SET `ScriptName`='spell_blood_queen_pact_of_the_darkfallen_dmg_aura' WHERE `spell_id`=71340 AND `ScriptName`='spell_blood_queen_pact_of_the_darkfallen_dmg'; +UPDATE `spell_script_names` SET `ScriptName`='spell_blood_queen_frenzied_bloodthirst_aura' WHERE `spell_id` IN (70877,71474) AND `ScriptName`='spell_blood_queen_frenzied_bloodthirst'; +UPDATE `spell_script_names` SET `ScriptName`='spell_blood_queen_essence_of_the_blood_queen_aura' WHERE `spell_id`=70871 AND `ScriptName`='spell_blood_queen_essence_of_the_blood_queen'; +UPDATE `spell_script_names` SET `ScriptName`='spell_icc_stoneform_aura' WHERE `spell_id`=70733 AND `ScriptName`='spell_icc_stoneform'; +UPDATE `spell_script_names` SET `ScriptName`='spell_icc_web_wrap_aura' WHERE `spell_id`=70980 AND `ScriptName`='spell_icc_web_wrap'; +UPDATE `spell_script_names` SET `ScriptName`='spell_icc_dark_reckoning_aura' WHERE `spell_id`=69483 AND `ScriptName`='spell_icc_dark_reckoning'; +UPDATE `spell_script_names` SET `ScriptName`='spell_icc_yf_frozen_orb_aura' WHERE `spell_id`=71274 AND `ScriptName`='spell_icc_yf_frozen_orb'; +UPDATE `spell_script_names` SET `ScriptName`='spell_icc_yh_volley_aura' WHERE `spell_id`=71252 AND `ScriptName`='spell_icc_yh_volley'; +UPDATE `spell_script_names` SET `ScriptName`='spell_festergut_blighted_spores_aura' WHERE `spell_id` IN (69290,71222,73033,73034) AND `ScriptName`='spell_festergut_blighted_spores'; +UPDATE `spell_script_names` SET `ScriptName`='spell_dreamwalker_nightmare_cloud_aura' WHERE `spell_id`=71970 AND `ScriptName`='spell_dreamwalker_nightmare_cloud'; +UPDATE `spell_script_names` SET `ScriptName`='spell_dreamwalker_mana_void_aura' WHERE `spell_id`=71085 AND `ScriptName`='spell_dreamwalker_mana_void'; +UPDATE `spell_script_names` SET `ScriptName`='spell_dreamwalker_decay_periodic_timer_aura' WHERE `spell_id` IN (70912,70913,70915,70916) AND `ScriptName`='spell_dreamwalker_decay_periodic_timer'; +UPDATE `spell_script_names` SET `ScriptName`='spell_dreamwalker_summon_suppresser_aura' WHERE `spell_id`=70912 AND `ScriptName`='spell_dreamwalker_summon_suppresser'; +UPDATE `spell_script_names` SET `ScriptName`='spell_valithria_suppression_aura' WHERE `spell_id`=70588 AND `ScriptName`='spell_valithria_suppression'; +UPDATE `spell_script_names` SET `ScriptName`='spell_deathwhisper_mana_barrier_aura' WHERE `spell_id`=70842 AND `ScriptName`='spell_deathwhisper_mana_barrier'; +UPDATE `spell_script_names` SET `ScriptName`='spell_putricide_grow_stacker_aura' WHERE `spell_id`=70345 AND `ScriptName`='spell_putricide_grow_stacker'; +UPDATE `spell_script_names` SET `ScriptName`='spell_putricide_gaseous_bloat_aura' WHERE `spell_id` IN (70672,72455,72832,72833) AND `ScriptName`='spell_putricide_gaseous_bloat'; +UPDATE `spell_script_names` SET `ScriptName`='spell_putricide_mutated_plague_aura' WHERE `spell_id` IN (72451,72463,72671,72672) AND `ScriptName`='spell_putricide_mutated_plague'; +UPDATE `spell_script_names` SET `ScriptName`='spell_putricide_unbound_plague_dmg_aura' WHERE `spell_id` IN (70911,72854,72855,72856) AND `ScriptName`='spell_putricide_unbound_plague_dmg'; +UPDATE `spell_script_names` SET `ScriptName`='spell_putricide_mutated_transformation_dismiss_aura' WHERE `spell_id` IN (70405,72508,72509,72510) AND `ScriptName`='spell_putricide_mutated_transformation_dismiss'; +UPDATE `spell_script_names` SET `ScriptName`='spell_sindragosa_permeating_chill_aura' WHERE `spell_id`=70107 AND `ScriptName`='spell_sindragosa_permeating_chill'; +UPDATE `spell_script_names` SET `ScriptName`='spell_sindragosa_instability_aura' WHERE `spell_id`=69766 AND `ScriptName`='spell_sindragosa_instability'; +UPDATE `spell_script_names` SET `ScriptName`='spell_sindragosa_frost_beacon_aura' WHERE `spell_id`=70126 AND `ScriptName`='spell_sindragosa_frost_beacon'; +UPDATE `spell_script_names` SET `ScriptName`='spell_sindragosa_soul_preservation_aura' WHERE `spell_id`=72465 AND `ScriptName`='spell_sindragosa_soul_preservation'; +UPDATE `spell_script_names` SET `ScriptName`='spell_the_lich_king_infest_aura' WHERE `spell_id` IN (70541,73779,73780,73781) AND `ScriptName`='spell_the_lich_king_infest'; +UPDATE `spell_script_names` SET `ScriptName`='spell_the_lich_king_necrotic_plague_aura' WHERE `spell_id` IN (70337,73912,73913,73914) AND `ScriptName`='spell_the_lich_king_necrotic_plague'; +UPDATE `spell_script_names` SET `ScriptName`='spell_the_lich_king_shadow_trap_visual_aura' WHERE `spell_id`=73530 AND `ScriptName`='spell_the_lich_king_shadow_trap_visual'; +UPDATE `spell_script_names` SET `ScriptName`='spell_the_lich_king_soul_reaper_aura' WHERE `spell_id` IN (69409,73797,73798,73799) AND `ScriptName`='spell_the_lich_king_soul_reaper'; +UPDATE `spell_script_names` SET `ScriptName`='spell_the_lich_king_vile_spirits_aura' WHERE `spell_id`=70498 AND `ScriptName`='spell_the_lich_king_vile_spirits'; +UPDATE `spell_script_names` SET `ScriptName`='spell_the_lich_king_harvest_soul_aura' WHERE `spell_id` IN (68980,74296,74297,74325) AND `ScriptName`='spell_the_lich_king_harvest_soul'; +UPDATE `spell_script_names` SET `ScriptName`='spell_the_lich_king_lights_favor_aura' WHERE `spell_id`=69382 AND `ScriptName`='spell_the_lich_king_lights_favor'; +UPDATE `spell_script_names` SET `ScriptName`='spell_the_lich_king_dark_hunger_aura' WHERE `spell_id`=69383 AND `ScriptName`='spell_the_lich_king_dark_hunger'; +UPDATE `spell_script_names` SET `ScriptName`='spell_the_lich_king_soul_rip_aura' WHERE `spell_id`=69397 AND `ScriptName`='spell_the_lich_king_soul_rip'; +UPDATE `spell_script_names` SET `ScriptName`='spell_igb_rocket_pack_aura' WHERE `spell_id`=68721 AND `ScriptName`='spell_igb_rocket_pack'; +UPDATE `spell_script_names` SET `ScriptName`='spell_igb_rocket_pack_useable_aura' WHERE `spell_id`=70348 AND `ScriptName`='spell_igb_rocket_pack_useable'; +UPDATE `spell_script_names` SET `ScriptName`='spell_igb_explosion_main_aura' WHERE `spell_id` IN (72134,72137) AND `ScriptName`='spell_igb_explosion_main'; +UPDATE `spell_script_names` SET `ScriptName`='spell_igb_periodic_trigger_with_power_cost_aura' WHERE `spell_id` IN (69470,69487) AND `ScriptName`='spell_igb_periodic_trigger_with_power_cost'; +UPDATE `spell_script_names` SET `ScriptName`='spell_igb_overheat_aura' WHERE `spell_id`=69487 AND `ScriptName`='spell_igb_overheat'; +UPDATE `spell_script_names` SET `ScriptName`='spell_igb_on_gunship_deck_aura' WHERE `spell_id` IN (70120,70121) AND `ScriptName`='spell_igb_on_gunship_deck'; +UPDATE `spell_script_names` SET `ScriptName`='spell_blood_council_shadow_prison_aura' WHERE `spell_id`=73001 AND `ScriptName`='spell_blood_council_shadow_prison'; +UPDATE `spell_script_names` SET `ScriptName`='spell_valanar_kinetic_bomb_absorb_aura' WHERE `spell_id`=72054 AND `ScriptName`='spell_valanar_kinetic_bomb_absorb'; +UPDATE `spell_script_names` SET `ScriptName`='spell_rotface_unstable_ooze_explosion_suicide_aura' WHERE `spell_id`=71441 AND `ScriptName`='spell_rotface_unstable_ooze_explosion_suicide'; 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 f61ccaaf3..4b519e659 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -1440,358 +1440,253 @@ public: } }; -class spell_blood_council_shadow_prison : public SpellScriptLoader +class spell_blood_council_shadow_prison_aura : public AuraScript { -public: - spell_blood_council_shadow_prison() : SpellScriptLoader("spell_blood_council_shadow_prison") { } + PrepareAuraScript(spell_blood_council_shadow_prison_aura); - class spell_blood_council_shadow_prison_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_blood_council_shadow_prison_AuraScript); + return ValidateSpellInfo({ SPELL_SHADOW_PRISON_DAMAGE }); + } - void HandleDummyTick(AuraEffect const* aurEff) - { - if (GetTarget()->GetTypeId() == TYPEID_PLAYER && GetTarget()->isMoving()) - { - GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_PRISON_DAMAGE, true, nullptr, aurEff); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_council_shadow_prison_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandleDummyTick(AuraEffect const* aurEff) { - return new spell_blood_council_shadow_prison_AuraScript(); + if (GetTarget()->GetTypeId() == TYPEID_PLAYER && GetTarget()->isMoving()) + { + GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_PRISON_DAMAGE, true, nullptr, aurEff); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_council_shadow_prison_aura::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; -class spell_blood_council_shadow_prison_damage : public SpellScriptLoader +class spell_blood_council_shadow_prison_damage : public SpellScript { -public: - spell_blood_council_shadow_prison_damage() : SpellScriptLoader("spell_blood_council_shadow_prison_damage") { } + PrepareSpellScript(spell_blood_council_shadow_prison_damage); - class spell_blood_council_shadow_prison_SpellScript : public SpellScript + void AddExtraDamage() { - PrepareSpellScript(spell_blood_council_shadow_prison_SpellScript); - - void AddExtraDamage() + if (Aura* aur = GetHitUnit()->GetAura(GetSpellInfo()->Id)) { - if (Aura* aur = GetHitUnit()->GetAura(GetSpellInfo()->Id)) + if (AuraEffect const* eff = aur->GetEffect(EFFECT_1)) { - if (AuraEffect const* eff = aur->GetEffect(EFFECT_1)) + SetHitDamage(GetHitDamage() + eff->GetAmount()); + } + } + } + + void Register() override + { + OnHit += SpellHitFn(spell_blood_council_shadow_prison_damage::AddExtraDamage); + } +}; + +class spell_taldaram_glittering_sparks : public SpellScript +{ + PrepareSpellScript(spell_taldaram_glittering_sparks); + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_taldaram_glittering_sparks::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_taldaram_summon_flame_ball : public SpellScript +{ + PrepareSpellScript(spell_taldaram_summon_flame_ball); + + bool Load() override + { + if (GetCaster()->GetTypeId() != TYPEID_UNIT) + { + return false; + } + GetCaster()->CastSpell(GetCaster(), uint32(GetSpellInfo()->Effects[0].CalcValue()), true); + return true; + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->ToCreature()->AI()->DoAction(ACTION_FLAME_BALL_CHASE); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_taldaram_summon_flame_ball::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_taldaram_ball_of_inferno_flame : public SpellScript +{ + PrepareSpellScript(spell_taldaram_ball_of_inferno_flame); + + void ModAuraStack() + { + if (Aura* aur = GetHitAura()) + aur->SetStackAmount(uint8(GetSpellInfo()->StackAmount)); + } + + void Register() override + { + AfterHit += SpellHitFn(spell_taldaram_ball_of_inferno_flame::ModAuraStack); + } +}; + +class spell_valanar_kinetic_bomb : public SpellScript +{ + PrepareSpellScript(spell_valanar_kinetic_bomb); + + void ChangeSummonPos(SpellEffIndex /*effIndex*/) + { + WorldLocation summonPos = *GetExplTargetDest(); + Position offset = {0.0f, 0.0f, 20.0f, 0.0f}; + summonPos.RelocateOffset(offset); + SetExplTargetDest(summonPos); + GetHitDest()->RelocateOffset(offset); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_valanar_kinetic_bomb::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); + } +}; + +class spell_valanar_kinetic_bomb_aura : public AuraScript +{ + PrepareAuraScript(spell_valanar_kinetic_bomb_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_KINETIC_BOMB_EXPLOSION, SPELL_KINETIC_BOMB_VISUAL }); + } + + void HandleDummyTick(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + if (target->GetTypeId() != TYPEID_UNIT) + return; + + if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 1.0f, true)) + { + bomb->CastSpell(bomb, SPELL_KINETIC_BOMB_EXPLOSION, true); + bomb->RemoveAurasDueToSpell(SPELL_KINETIC_BOMB_VISUAL); + target->RemoveAura(GetAura()); + bomb->AI()->DoAction(SPELL_KINETIC_BOMB_EXPLOSION); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_valanar_kinetic_bomb_aura::HandleDummyTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +class spell_valanar_kinetic_bomb_absorb_aura : public AuraScript +{ + PrepareAuraScript(spell_valanar_kinetic_bomb_absorb_aura); + + void OnAbsorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = CalculatePct(dmgInfo.GetDamage(), aurEff->GetAmount()); + RoundToInterval(absorbAmount, 0, dmgInfo.GetDamage()); + dmgInfo.AbsorbDamage(absorbAmount); + } + + void Register() override + { + OnEffectAbsorb += AuraEffectAbsorbFn(spell_valanar_kinetic_bomb_absorb_aura::OnAbsorb, EFFECT_0); + } +}; + +class spell_valanar_kinetic_bomb_knockback : public SpellScript +{ + PrepareSpellScript(spell_valanar_kinetic_bomb_knockback); + + void KnockIntoAir(SpellMissInfo missInfo) + { + if (missInfo != SPELL_MISS_NONE) + { + return; + } + + if (Creature* target = GetHitCreature()) + target->AI()->DoAction(ACTION_KINETIC_BOMB_JUMP); + } + + void Register() override + { + BeforeHit += BeforeSpellHitFn(spell_valanar_kinetic_bomb_knockback::KnockIntoAir); + } +}; + +class spell_valanar_kinetic_bomb_summon : public SpellScript +{ + PrepareSpellScript(spell_valanar_kinetic_bomb_summon); + + void SelectDest() + { + if (Position* dest = const_cast(GetExplTargetDest())) + { + float angle = dest->GetAngle(GetCaster()); + Position offset = {6.0f * cos(angle), 6.0f * std::sin(angle), 10.0f, 0.0f}; + dest->RelocateOffset(offset); + GetCaster()->UpdateAllowedPositionZ(dest->GetPositionX(), dest->GetPositionY(), dest->m_positionZ); + } + } + + void Register() override + { + BeforeCast += SpellCastFn(spell_valanar_kinetic_bomb_summon::SelectDest); + } +}; + +class spell_blood_council_summon_shadow_resonance : public SpellScript +{ + PrepareSpellScript(spell_blood_council_summon_shadow_resonance); + + void SetDest(SpellDestination& dest) + { + Unit* summoner = GetCaster(); + float x = dest._position.GetPositionX(); + float y = dest._position.GetPositionY(); + float angle = summoner->GetAngle(x, y); + if (dest._position.GetExactDist2d(summoner) > 35.0f && x > 4585.0f && y > 2716.0f && y < 2822.0f) + return; + + for (uint8 a = 0; a < 2; ++a) + for (uint8 i = 6; i > 0; --i) + { + float destX = summoner->GetPositionX() + cos(angle + a * M_PI) * i * 10.0f; + float destY = summoner->GetPositionY() + std::sin(angle + a * M_PI) * i * 10.0f; + if (summoner->GetMap()->isInLineOfSight(summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ() + 10.0f, destX, destY, + summoner->GetPositionZ() + 10.0f, summoner->GetPhaseMask(), LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::Nothing) && + destX > 4585.0f && destY > 2716.0f && destY < 2822.0f) { - SetHitDamage(GetHitDamage() + eff->GetAmount()); - } - } - } - - void Register() override - { - OnHit += SpellHitFn(spell_blood_council_shadow_prison_SpellScript::AddExtraDamage); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_blood_council_shadow_prison_SpellScript(); - } -}; - -class spell_taldaram_glittering_sparks : public SpellScriptLoader -{ -public: - spell_taldaram_glittering_sparks() : SpellScriptLoader("spell_taldaram_glittering_sparks") { } - - class spell_taldaram_glittering_sparks_SpellScript : public SpellScript - { - PrepareSpellScript(spell_taldaram_glittering_sparks_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_taldaram_glittering_sparks_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_taldaram_glittering_sparks_SpellScript(); - } -}; - -class spell_taldaram_summon_flame_ball : public SpellScriptLoader -{ -public: - spell_taldaram_summon_flame_ball() : SpellScriptLoader("spell_taldaram_summon_flame_ball") { } - - class spell_taldaram_summon_flame_ball_SpellScript : public SpellScript - { - PrepareSpellScript(spell_taldaram_summon_flame_ball_SpellScript); - - bool Load() override - { - if (GetCaster()->GetTypeId() != TYPEID_UNIT) - { - return false; - } - GetCaster()->CastSpell(GetCaster(), uint32(GetSpellInfo()->Effects[0].CalcValue()), true); - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->ToCreature()->AI()->DoAction(ACTION_FLAME_BALL_CHASE); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_taldaram_summon_flame_ball_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_taldaram_summon_flame_ball_SpellScript(); - } -}; - -class spell_taldaram_ball_of_inferno_flame : public SpellScriptLoader -{ -public: - spell_taldaram_ball_of_inferno_flame() : SpellScriptLoader("spell_taldaram_ball_of_inferno_flame") { } - - class spell_taldaram_ball_of_inferno_flame_SpellScript : public SpellScript - { - PrepareSpellScript(spell_taldaram_ball_of_inferno_flame_SpellScript); - - void ModAuraStack() - { - if (Aura* aur = GetHitAura()) - aur->SetStackAmount(uint8(GetSpellInfo()->StackAmount)); - } - - void Register() override - { - AfterHit += SpellHitFn(spell_taldaram_ball_of_inferno_flame_SpellScript::ModAuraStack); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_taldaram_ball_of_inferno_flame_SpellScript(); - } -}; - -class spell_valanar_kinetic_bomb : public SpellScriptLoader -{ -public: - spell_valanar_kinetic_bomb() : SpellScriptLoader("spell_valanar_kinetic_bomb") { } - - class spell_valanar_kinetic_bomb_SpellScript : public SpellScript - { - PrepareSpellScript(spell_valanar_kinetic_bomb_SpellScript); - - void ChangeSummonPos(SpellEffIndex /*effIndex*/) - { - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = {0.0f, 0.0f, 20.0f, 0.0f}; - summonPos.RelocateOffset(offset); - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_valanar_kinetic_bomb_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - class spell_valanar_kinetic_bomb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_valanar_kinetic_bomb_AuraScript); - - void HandleDummyTick(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT) - return; - - if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 1.0f, true)) - { - bomb->CastSpell(bomb, SPELL_KINETIC_BOMB_EXPLOSION, true); - bomb->RemoveAurasDueToSpell(SPELL_KINETIC_BOMB_VISUAL); - target->RemoveAura(GetAura()); - bomb->AI()->DoAction(SPELL_KINETIC_BOMB_EXPLOSION); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_valanar_kinetic_bomb_AuraScript::HandleDummyTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_valanar_kinetic_bomb_SpellScript(); - } - - AuraScript* GetAuraScript() const override - { - return new spell_valanar_kinetic_bomb_AuraScript(); - } -}; - -class spell_valanar_kinetic_bomb_absorb : public SpellScriptLoader -{ -public: - spell_valanar_kinetic_bomb_absorb() : SpellScriptLoader("spell_valanar_kinetic_bomb_absorb") { } - - class spell_valanar_kinetic_bomb_absorb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_valanar_kinetic_bomb_absorb_AuraScript); - - void OnAbsorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) - { - absorbAmount = CalculatePct(dmgInfo.GetDamage(), aurEff->GetAmount()); - RoundToInterval(absorbAmount, 0, dmgInfo.GetDamage()); - dmgInfo.AbsorbDamage(absorbAmount); - } - - void Register() override - { - OnEffectAbsorb += AuraEffectAbsorbFn(spell_valanar_kinetic_bomb_absorb_AuraScript::OnAbsorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_valanar_kinetic_bomb_absorb_AuraScript(); - } -}; - -class spell_valanar_kinetic_bomb_knockback : public SpellScriptLoader -{ -public: - spell_valanar_kinetic_bomb_knockback() : SpellScriptLoader("spell_valanar_kinetic_bomb_knockback") { } - - class spell_valanar_kinetic_bomb_knockback_SpellScript : public SpellScript - { - PrepareSpellScript(spell_valanar_kinetic_bomb_knockback_SpellScript); - - void KnockIntoAir(SpellMissInfo missInfo) - { - if (missInfo != SPELL_MISS_NONE) - { - return; - } - - if (Creature* target = GetHitCreature()) - target->AI()->DoAction(ACTION_KINETIC_BOMB_JUMP); - } - - void Register() override - { - BeforeHit += BeforeSpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_valanar_kinetic_bomb_knockback_SpellScript(); - } -}; - -class spell_valanar_kinetic_bomb_summon : public SpellScriptLoader -{ -public: - spell_valanar_kinetic_bomb_summon() : SpellScriptLoader("spell_valanar_kinetic_bomb_summon") { } - - class spell_valanar_kinetic_bomb_summon_SpellScript : public SpellScript - { - PrepareSpellScript(spell_valanar_kinetic_bomb_summon_SpellScript); - - void SelectDest() - { - if (Position* dest = const_cast(GetExplTargetDest())) - { - float angle = dest->GetAngle(GetCaster()); - Position offset = {6.0f * cos(angle), 6.0f * std::sin(angle), 10.0f, 0.0f}; - dest->RelocateOffset(offset); - GetCaster()->UpdateAllowedPositionZ(dest->GetPositionX(), dest->GetPositionY(), dest->m_positionZ); - } - } - - void Register() override - { - BeforeCast += SpellCastFn(spell_valanar_kinetic_bomb_summon_SpellScript::SelectDest); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_valanar_kinetic_bomb_summon_SpellScript(); - } -}; - -class spell_blood_council_summon_shadow_resonance : public SpellScriptLoader -{ -public: - spell_blood_council_summon_shadow_resonance() : SpellScriptLoader("spell_blood_council_summon_shadow_resonance") { } - - class spell_blood_council_summon_shadow_resonance_SpellScript : public SpellScript - { - PrepareSpellScript(spell_blood_council_summon_shadow_resonance_SpellScript); - - void SetDest(SpellDestination& dest) - { - Unit* summoner = GetCaster(); - float x = dest._position.GetPositionX(); - float y = dest._position.GetPositionY(); - float angle = summoner->GetAngle(x, y); - if (dest._position.GetExactDist2d(summoner) > 35.0f && x > 4585.0f && y > 2716.0f && y < 2822.0f) - return; - - for (uint8 a = 0; a < 2; ++a) - for (uint8 i = 6; i > 0; --i) - { - float destX = summoner->GetPositionX() + cos(angle + a * M_PI) * i * 10.0f; - float destY = summoner->GetPositionY() + std::sin(angle + a * M_PI) * i * 10.0f; - if (summoner->GetMap()->isInLineOfSight(summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ() + 10.0f, destX, destY, - summoner->GetPositionZ() + 10.0f, summoner->GetPhaseMask(), LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::Nothing) && - destX > 4585.0f && destY > 2716.0f && destY < 2822.0f) + float destZ = summoner->GetMapHeight(summoner->GetPhaseMask(), destX, destY, summoner->GetPositionZ()); + if (std::fabs(destZ - summoner->GetPositionZ()) < 10.0f) // valid z found { - float destZ = summoner->GetMapHeight(summoner->GetPhaseMask(), destX, destY, summoner->GetPositionZ()); - if (std::fabs(destZ - summoner->GetPositionZ()) < 10.0f) // valid z found - { - dest._position.Relocate(destX, destY, destZ); - return; - } + dest._position.Relocate(destX, destY, destZ); + return; } } + } - dest._position.Relocate(summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()); - } + dest._position.Relocate(summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()); + } - void Register() override - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_blood_council_summon_shadow_resonance_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_blood_council_summon_shadow_resonance_SpellScript(); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_blood_council_summon_shadow_resonance::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM); } }; @@ -1804,15 +1699,15 @@ void AddSC_boss_blood_prince_council() new npc_dark_nucleus(); new npc_ball_of_flame(); new npc_kinetic_bomb(); - new spell_blood_council_shadow_prison(); - new spell_blood_council_shadow_prison_damage(); - new spell_taldaram_glittering_sparks(); - new spell_taldaram_summon_flame_ball(); - new spell_taldaram_ball_of_inferno_flame(); - new spell_valanar_kinetic_bomb(); - new spell_valanar_kinetic_bomb_absorb(); - new spell_valanar_kinetic_bomb_knockback(); - new spell_valanar_kinetic_bomb_summon(); - new spell_blood_council_summon_shadow_resonance(); + RegisterSpellScript(spell_blood_council_shadow_prison_aura); + RegisterSpellScript(spell_blood_council_shadow_prison_damage); + RegisterSpellScript(spell_taldaram_glittering_sparks); + RegisterSpellScript(spell_taldaram_summon_flame_ball); + RegisterSpellScript(spell_taldaram_ball_of_inferno_flame); + RegisterSpellAndAuraScriptPair(spell_valanar_kinetic_bomb, spell_valanar_kinetic_bomb_aura); + RegisterSpellScript(spell_valanar_kinetic_bomb_absorb_aura); + RegisterSpellScript(spell_valanar_kinetic_bomb_knockback); + RegisterSpellScript(spell_valanar_kinetic_bomb_summon); + RegisterSpellScript(spell_blood_council_summon_shadow_resonance); } 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 275b5f25b..3b1dd9843 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 @@ -587,114 +587,81 @@ public: // shortened version for clear code typedef boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI LanaThelAI; -class spell_blood_queen_pact_of_the_darkfallen_dmg : public SpellScriptLoader +class spell_blood_queen_pact_of_the_darkfallen_dmg_aura : public AuraScript { -public: - spell_blood_queen_pact_of_the_darkfallen_dmg() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen_dmg") { } + PrepareAuraScript(spell_blood_queen_pact_of_the_darkfallen_dmg_aura); - class spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareAuraScript(spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript); + return ValidateSpellInfo({ SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE }); - } - - // this is an additional effect to be executed - void PeriodicTick(AuraEffect const* aurEff) - { - if ((aurEff->GetTickNumber() % 2) == 0) - return; - SpellInfo const* damageSpell = sSpellMgr->AssertSpellInfo(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE); - int32 damage = damageSpell->Effects[EFFECT_0].CalcValue(); - float herobonus = ((GetTarget()->FindMap() && GetTarget()->FindMap()->IsHeroic()) ? 0.2f : 0.0f); - float multiplier = 0.5f + herobonus + 0.1f * uint32(aurEff->GetTickNumber() / 10); // do not convert to 0.01f - we need tick number/10 as INT (damage increases every 10 ticks) - damage = int32(damage * multiplier); - GetTarget()->CastCustomSpell(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + // this is an additional effect to be executed + void PeriodicTick(AuraEffect const* aurEff) { - return new spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript(); + if ((aurEff->GetTickNumber() % 2) == 0) + return; + SpellInfo const* damageSpell = sSpellMgr->AssertSpellInfo(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE); + int32 damage = damageSpell->Effects[EFFECT_0].CalcValue(); + float herobonus = ((GetTarget()->FindMap() && GetTarget()->FindMap()->IsHeroic()) ? 0.2f : 0.0f); + float multiplier = 0.5f + herobonus + 0.1f * uint32(aurEff->GetTickNumber() / 10); // do not convert to 0.01f - we need tick number/10 as INT (damage increases every 10 ticks) + damage = int32(damage * multiplier); + GetTarget()->CastCustomSpell(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_blood_queen_pact_of_the_darkfallen : public SpellScriptLoader +class spell_blood_queen_pact_of_the_darkfallen : public SpellScript { -public: - spell_blood_queen_pact_of_the_darkfallen() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen") { } + PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen); - class spell_blood_queen_pact_of_the_darkfallen_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen_SpellScript); + targets.remove_if(Acore::UnitAuraCheck(false, SPELL_PACT_OF_THE_DARKFALLEN)); - void FilterTargets(std::list& targets) + bool remove = true; + std::list::const_iterator itr, itr2, itrEnd = targets.end(); + for (itr = targets.begin(); itr != itrEnd && remove; ++itr) { - targets.remove_if(Acore::UnitAuraCheck(false, SPELL_PACT_OF_THE_DARKFALLEN)); + if (GetCaster()->GetExactDist2d(*itr) > 5.0f) + remove = false; - bool remove = true; - std::list::const_iterator itr, itr2, itrEnd = targets.end(); - for (itr = targets.begin(); itr != itrEnd && remove; ++itr) - { - if (GetCaster()->GetExactDist2d(*itr) > 5.0f) + for (itr2 = targets.begin(); itr2 != itrEnd && remove; ++itr2) + if (itr != itr2 && (*itr2)->GetExactDist2d(*itr) > 5.0f) remove = false; + } - for (itr2 = targets.begin(); itr2 != itrEnd && remove; ++itr2) - if (itr != itr2 && (*itr2)->GetExactDist2d(*itr) > 5.0f) - remove = false; + if (remove) + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + { + targets.clear(); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); } + } - if (remove) - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - { - targets.clear(); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_pact_of_the_darkfallen_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_blood_queen_pact_of_the_darkfallen_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_pact_of_the_darkfallen::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); } }; -class spell_blood_queen_pact_of_the_darkfallen_dmg_target : public SpellScriptLoader +class spell_blood_queen_pact_of_the_darkfallen_dmg_target : public SpellScript { -public: - spell_blood_queen_pact_of_the_darkfallen_dmg_target() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen_dmg_target") { } + PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen_dmg_target); - class spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript : public SpellScript + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript); + unitList.remove_if(Acore::UnitAuraCheck(true, SPELL_PACT_OF_THE_DARKFALLEN)); + unitList.push_back(GetCaster()); + } - void FilterTargets(std::list& unitList) - { - unitList.remove_if(Acore::UnitAuraCheck(true, SPELL_PACT_OF_THE_DARKFALLEN)); - unitList.push_back(GetCaster()); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_pact_of_the_darkfallen_dmg_target::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); } }; @@ -712,283 +679,222 @@ private: LanaThelAI* _ai; }; -class spell_blood_queen_bloodbolt : public SpellScriptLoader +class spell_blood_queen_bloodbolt : public SpellScript { -public: - spell_blood_queen_bloodbolt() : SpellScriptLoader("spell_blood_queen_bloodbolt") { } + PrepareSpellScript(spell_blood_queen_bloodbolt); - class spell_blood_queen_bloodbolt_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_blood_queen_bloodbolt_SpellScript); + return ValidateSpellInfo({ SPELL_TWILIGHT_BLOODBOLT_FROM_WHIRL }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_TWILIGHT_BLOODBOLT_FROM_WHIRL }); - } - - bool Load() override - { - return GetCaster()->GetEntry() == NPC_BLOOD_QUEEN_LANA_THEL; - } - - void FilterTargets(std::list& targets) - { - uint32 targetCount = (targets.size() + 2) / 3; - targets.remove_if(BloodboltHitCheck(static_cast(GetCaster()->GetAI()))); - Acore::Containers::RandomResize(targets, targetCount); - // mark targets now, effect hook has missile travel time delay (might cast next in that time) - for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - GetCaster()->GetAI()->SetGUID((*itr)->GetGUID(), GUID_BLOODBOLT); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetHitUnit(), SPELL_TWILIGHT_BLOODBOLT_FROM_WHIRL, true); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_bloodbolt_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_blood_queen_bloodbolt_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + bool Load() override { - return new spell_blood_queen_bloodbolt_SpellScript(); + return GetCaster()->GetEntry() == NPC_BLOOD_QUEEN_LANA_THEL; + } + + void FilterTargets(std::list& targets) + { + uint32 targetCount = (targets.size() + 2) / 3; + targets.remove_if(BloodboltHitCheck(static_cast(GetCaster()->GetAI()))); + Acore::Containers::RandomResize(targets, targetCount); + // mark targets now, effect hook has missile travel time delay (might cast next in that time) + for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + GetCaster()->GetAI()->SetGUID((*itr)->GetGUID(), GUID_BLOODBOLT); + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit(), SPELL_TWILIGHT_BLOODBOLT_FROM_WHIRL, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_bloodbolt::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_blood_queen_bloodbolt::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_blood_queen_frenzied_bloodthirst : public SpellScriptLoader +class spell_blood_queen_frenzied_bloodthirst_aura : public AuraScript { -public: - spell_blood_queen_frenzied_bloodthirst() : SpellScriptLoader("spell_blood_queen_frenzied_bloodthirst") { } + PrepareAuraScript(spell_blood_queen_frenzied_bloodthirst_aura); - class spell_blood_queen_frenzied_bloodthirst_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_blood_queen_frenzied_bloodthirst_AuraScript); + return ValidateSpellInfo({ SPELL_UNCONTROLLABLE_FRENZY }); + } - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (InstanceScript* instance = GetTarget()->GetInstanceScript()) - if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetTarget(), instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL))) - bloodQueen->AI()->Talk(EMOTE_BLOODTHIRST, GetTarget()); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* bloodQueen = ObjectAccessor::GetCreature(*target, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL))) - if (bloodQueen->IsAlive() && bloodQueen->IsInCombat()) - { - // this needs to be done BEFORE charm aura or we hit an assert in Unit::SetCharmedBy - if (target->GetVehicleKit()) - target->RemoveVehicleKit(); - - bloodQueen->AI()->Talk(SAY_MIND_CONTROL); - bloodQueen->CastSpell(target, SPELL_UNCONTROLLABLE_FRENZY, true); - } - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_blood_queen_frenzied_bloodthirst_AuraScript::OnApply, EFFECT_0, SPELL_AURA_OVERRIDE_SPELLS, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_blood_queen_frenzied_bloodthirst_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_OVERRIDE_SPELLS, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_blood_queen_frenzied_bloodthirst_AuraScript(); + if (InstanceScript* instance = GetTarget()->GetInstanceScript()) + if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetTarget(), instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL))) + bloodQueen->AI()->Talk(EMOTE_BLOODTHIRST, GetTarget()); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* bloodQueen = ObjectAccessor::GetCreature(*target, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL))) + if (bloodQueen->IsAlive() && bloodQueen->IsInCombat()) + { + // this needs to be done BEFORE charm aura or we hit an assert in Unit::SetCharmedBy + if (target->GetVehicleKit()) + target->RemoveVehicleKit(); + + bloodQueen->AI()->Talk(SAY_MIND_CONTROL); + bloodQueen->CastSpell(target, SPELL_UNCONTROLLABLE_FRENZY, true); + } + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_blood_queen_frenzied_bloodthirst_aura::OnApply, EFFECT_0, SPELL_AURA_OVERRIDE_SPELLS, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_blood_queen_frenzied_bloodthirst_aura::OnRemove, EFFECT_0, SPELL_AURA_OVERRIDE_SPELLS, AURA_EFFECT_HANDLE_REAL); } }; -class spell_blood_queen_essence_of_the_blood_queen : public SpellScriptLoader +class spell_blood_queen_essence_of_the_blood_queen_aura : public AuraScript { -public: - spell_blood_queen_essence_of_the_blood_queen() : SpellScriptLoader("spell_blood_queen_essence_of_the_blood_queen") { } + PrepareAuraScript(spell_blood_queen_essence_of_the_blood_queen_aura); - class spell_blood_queen_essence_of_the_blood_queen_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_blood_queen_essence_of_the_blood_queen_AuraScript); + return ValidateSpellInfo({ SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + + if (!damageInfo || !damageInfo->GetDamage()) { - return ValidateSpellInfo({ SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL }); + return; } - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + int32 heal = CalculatePct(static_cast(damageInfo->GetDamage()), aurEff->GetAmount()); + GetTarget()->CastCustomSpell(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), TRIGGERED_FULL_MASK, nullptr, aurEff); + } - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_blood_queen_essence_of_the_blood_queen_aura::OnProc, EFFECT_1, SPELL_AURA_DUMMY); + } +}; - if (!damageInfo || !damageInfo->GetDamage()) +class spell_blood_queen_vampiric_bite : public SpellScript +{ + PrepareSpellScript(spell_blood_queen_vampiric_bite); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo( { - return; - } - - int32 heal = CalculatePct(static_cast(damageInfo->GetDamage()), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), TRIGGERED_FULL_MASK, nullptr, aurEff); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_blood_queen_essence_of_the_blood_queen_AuraScript::OnProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_blood_queen_essence_of_the_blood_queen_AuraScript(); + SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR, + SPELL_FRENZIED_BLOODTHIRST, + SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY + }); } -}; -class spell_blood_queen_vampiric_bite : public SpellScriptLoader -{ -public: - spell_blood_queen_vampiric_bite() : SpellScriptLoader("spell_blood_queen_vampiric_bite") { } - - class spell_blood_queen_vampiric_bite_SpellScript : public SpellScript + SpellCastResult CheckTarget() { - PrepareSpellScript(spell_blood_queen_vampiric_bite_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo( - { - SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR, - SPELL_FRENZIED_BLOODTHIRST, - SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY - }); - } - - SpellCastResult CheckTarget() - { - if (GetExplTargetUnit()->GetMapId() != 631) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - if (IsVampire(GetExplTargetUnit())) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES); - return SPELL_FAILED_CUSTOM_ERROR; - } - if (InstanceScript* instance = GetExplTargetUnit()->GetInstanceScript()) - if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS) - return SPELL_CAST_OK; - + if (GetExplTargetUnit()->GetMapId() != 631) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - } - - void OnCast(SpellMissInfo missInfo) + if (IsVampire(GetExplTargetUnit())) { - if (missInfo != SPELL_MISS_NONE) - { - return; - } - - if (GetCaster()->GetTypeId() != TYPEID_PLAYER || GetCaster()->GetMapId() != 631) - return; - InstanceScript* instance = GetCaster()->GetInstanceScript(); - if (!instance || instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != IN_PROGRESS) - return; - - uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_FRENZIED_BLOODTHIRST, GetCaster()); - GetCaster()->RemoveAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_ENEMY_SPELL); - GetCaster()->CastSpell(GetCaster(), SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR, TRIGGERED_FULL_MASK); - - if (Aura* aura = GetCaster()->GetAura(SPELL_GUSHING_WOUND)) - { - if (aura->GetStackAmount() == 3) - { - GetCaster()->CastSpell(GetCaster(), SPELL_THIRST_QUENCHED, TRIGGERED_FULL_MASK); - GetCaster()->RemoveAura(aura); - } - else - GetCaster()->CastSpell(GetCaster(), SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK); - } - - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL))) - bloodQueen->AI()->SetGUID(GetHitUnit()->GetGUID(), GUID_VAMPIRE); + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES); + return SPELL_FAILED_CUSTOM_ERROR; } + if (InstanceScript* instance = GetExplTargetUnit()->GetInstanceScript()) + if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS) + return SPELL_CAST_OK; - void HandlePresence(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY, TRIGGERED_FULL_MASK); - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN_SE, TRIGGERED_FULL_MASK); - } + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + } - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_blood_queen_vampiric_bite_SpellScript::CheckTarget); - BeforeHit += BeforeSpellHitFn(spell_blood_queen_vampiric_bite_SpellScript::OnCast); - OnEffectHitTarget += SpellEffectFn(spell_blood_queen_vampiric_bite_SpellScript::HandlePresence, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); - } - }; - - SpellScript* GetSpellScript() const override + void OnCast(SpellMissInfo missInfo) { - return new spell_blood_queen_vampiric_bite_SpellScript(); + if (missInfo != SPELL_MISS_NONE) + { + return; + } + + if (GetCaster()->GetTypeId() != TYPEID_PLAYER || GetCaster()->GetMapId() != 631) + return; + InstanceScript* instance = GetCaster()->GetInstanceScript(); + if (!instance || instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != IN_PROGRESS) + return; + + uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_FRENZIED_BLOODTHIRST, GetCaster()); + GetCaster()->RemoveAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_ENEMY_SPELL); + GetCaster()->CastSpell(GetCaster(), SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR, TRIGGERED_FULL_MASK); + + if (Aura* aura = GetCaster()->GetAura(SPELL_GUSHING_WOUND)) + { + if (aura->GetStackAmount() == 3) + { + GetCaster()->CastSpell(GetCaster(), SPELL_THIRST_QUENCHED, TRIGGERED_FULL_MASK); + GetCaster()->RemoveAura(aura); + } + else + GetCaster()->CastSpell(GetCaster(), SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK); + } + + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL))) + bloodQueen->AI()->SetGUID(GetHitUnit()->GetGUID(), GUID_VAMPIRE); + } + + void HandlePresence(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY, TRIGGERED_FULL_MASK); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN_SE, TRIGGERED_FULL_MASK); + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_blood_queen_vampiric_bite::CheckTarget); + BeforeHit += BeforeSpellHitFn(spell_blood_queen_vampiric_bite::OnCast); + OnEffectHitTarget += SpellEffectFn(spell_blood_queen_vampiric_bite::HandlePresence, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); } }; -class spell_blood_queen_swarming_shadows_floor_dmg : public SpellScriptLoader +class spell_blood_queen_swarming_shadows_floor_dmg : public SpellScript { -public: - spell_blood_queen_swarming_shadows_floor_dmg() : SpellScriptLoader("spell_blood_queen_swarming_shadows_floor_dmg") { } + PrepareSpellScript(spell_blood_queen_swarming_shadows_floor_dmg); - class spell_blood_queen_swarming_shadows_floor_dmg_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_blood_queen_swarming_shadows_floor_dmg_SpellScript); + targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), GetSpellInfo()->Effects[0].CalcRadius(), true)); + } - void FilterTargets(std::list& targets) - { - targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), GetSpellInfo()->Effects[0].CalcRadius(), true)); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_swarming_shadows_floor_dmg_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_blood_queen_swarming_shadows_floor_dmg_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_swarming_shadows_floor_dmg::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; -class spell_blood_queen_presence_of_the_darkfallen : public SpellScriptLoader +class spell_blood_queen_presence_of_the_darkfallen : public SpellScript { -public: - spell_blood_queen_presence_of_the_darkfallen() : SpellScriptLoader("spell_blood_queen_presence_of_the_darkfallen") { } + PrepareSpellScript(spell_blood_queen_presence_of_the_darkfallen); - class spell_blood_queen_presence_of_the_darkfallen_SpellScript : public SpellScript + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_blood_queen_presence_of_the_darkfallen_SpellScript); + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()) + return; - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()) - return; + if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) + GetHitUnit()->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL)); + } - if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) - GetHitUnit()->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL)); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_blood_queen_presence_of_the_darkfallen_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_blood_queen_presence_of_the_darkfallen_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_blood_queen_presence_of_the_darkfallen::HandleScript, EFFECT_0, SPELL_EFFECT_FORCE_CAST); } }; @@ -1014,15 +920,15 @@ public: void AddSC_boss_blood_queen_lana_thel() { new boss_blood_queen_lana_thel(); - new spell_blood_queen_pact_of_the_darkfallen_dmg(); - new spell_blood_queen_pact_of_the_darkfallen(); - new spell_blood_queen_pact_of_the_darkfallen_dmg_target(); - new spell_blood_queen_bloodbolt(); - new spell_blood_queen_frenzied_bloodthirst(); - new spell_blood_queen_essence_of_the_blood_queen(); - new spell_blood_queen_vampiric_bite(); - new spell_blood_queen_swarming_shadows_floor_dmg(); - new spell_blood_queen_presence_of_the_darkfallen(); + RegisterSpellScript(spell_blood_queen_pact_of_the_darkfallen_dmg_aura); + RegisterSpellScript(spell_blood_queen_pact_of_the_darkfallen); + RegisterSpellScript(spell_blood_queen_pact_of_the_darkfallen_dmg_target); + RegisterSpellScript(spell_blood_queen_bloodbolt); + RegisterSpellScript(spell_blood_queen_frenzied_bloodthirst_aura); + RegisterSpellScript(spell_blood_queen_essence_of_the_blood_queen_aura); + RegisterSpellScript(spell_blood_queen_vampiric_bite); + RegisterSpellScript(spell_blood_queen_swarming_shadows_floor_dmg); + RegisterSpellScript(spell_blood_queen_presence_of_the_darkfallen); new achievement_once_bitten_twice_shy("achievement_once_bitten_twice_shy_n_10", 0, false); new achievement_once_bitten_twice_shy("achievement_once_bitten_twice_shy_v_10", 0, true); new achievement_once_bitten_twice_shy("achievement_once_bitten_twice_shy_n_25", 1, false); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index c99a924a0..08058a970 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -1042,307 +1042,245 @@ public: } }; -class spell_deathbringer_blood_link_aura : public SpellScriptLoader +class spell_deathbringer_blood_link_aura : public AuraScript { -public: - spell_deathbringer_blood_link_aura() : SpellScriptLoader("spell_deathbringer_blood_link_aura") { } + PrepareAuraScript(spell_deathbringer_blood_link_aura); - class spell_deathbringer_blood_link_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_deathbringer_blood_link_AuraScript); + return ValidateSpellInfo({ SPELL_BLOOD_LINK_DUMMY }); + } - void HandlePeriodicTick(AuraEffect const* /*aurEff*/) + void HandlePeriodicTick(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + if (GetUnitOwner()->getPowerType() == POWER_ENERGY && GetUnitOwner()->GetPower(POWER_ENERGY) == GetUnitOwner()->GetMaxPower(POWER_ENERGY)) + if (Creature* saurfang = GetUnitOwner()->ToCreature()) + saurfang->AI()->DoAction(ACTION_MARK_OF_THE_FALLEN_CHAMPION); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + SpellInfo const* procSpell = eventInfo.GetSpellInfo(); + return eventInfo.GetActor() && eventInfo.GetActionTarget() && ((damageInfo && damageInfo->GetDamage()) || eventInfo.GetHitMask() & PROC_EX_ABSORB) && procSpell && procSpell->SpellIconID != 2731; // Xinef: Mark of the Fallen Champion + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* victim = eventInfo.GetActionTarget(); + SpellInfo const* procSpell = eventInfo.GetSpellInfo(); + + //uint32 markCount = 0; + //if (Creature* saurfang = eventInfo.GetActor()->ToCreature()) + //markCount = saurfang->IsAIEnabled ? saurfang->AI()->GetData(123456 /*FALLEN_CHAMPION_CAST_COUNT*/) : 0; + int32 basepoints = int32(1.0f /*+ 0.5f + 0.5f*markCount*/); + switch (procSpell->Id) // some spells give more Blood Power { - PreventDefaultAction(); - if (GetUnitOwner()->getPowerType() == POWER_ENERGY && GetUnitOwner()->GetPower(POWER_ENERGY) == GetUnitOwner()->GetMaxPower(POWER_ENERGY)) - if (Creature* saurfang = GetUnitOwner()->ToCreature()) - saurfang->AI()->DoAction(ACTION_MARK_OF_THE_FALLEN_CHAMPION); + case 72380: + case 72438: + case 72439: + case 72440: // Blood Nova + basepoints = int32(2.0f /*+ 0.5f + 0.75f*markCount*/); + break; } - bool CheckProc(ProcEventInfo& eventInfo) - { - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - SpellInfo const* procSpell = eventInfo.GetSpellInfo(); - return eventInfo.GetActor() && eventInfo.GetActionTarget() && ((damageInfo && damageInfo->GetDamage()) || eventInfo.GetHitMask() & PROC_EX_ABSORB) && procSpell && procSpell->SpellIconID != 2731; // Xinef: Mark of the Fallen Champion - } + victim->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActor(), true); + return; + } - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - Unit* victim = eventInfo.GetActionTarget(); - SpellInfo const* procSpell = eventInfo.GetSpellInfo(); + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_deathbringer_blood_link_aura::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_link_aura::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_deathbringer_blood_link_aura::HandlePeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } +}; - //uint32 markCount = 0; - //if (Creature* saurfang = eventInfo.GetActor()->ToCreature()) - //markCount = saurfang->IsAIEnabled ? saurfang->AI()->GetData(123456 /*FALLEN_CHAMPION_CAST_COUNT*/) : 0; - int32 basepoints = int32(1.0f /*+ 0.5f + 0.5f*markCount*/); - switch (procSpell->Id) // some spells give more Blood Power - { - case 72380: - case 72438: - case 72439: - case 72440: // Blood Nova - basepoints = int32(2.0f /*+ 0.5f + 0.75f*markCount*/); - break; - } +class spell_deathbringer_blood_link_blood_beast_aura : public AuraScript +{ + PrepareAuraScript(spell_deathbringer_blood_link_blood_beast_aura); - victim->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActor(), true); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BLOOD_LINK_DUMMY }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + SpellInfo const* procSpell = eventInfo.GetSpellInfo(); + return eventInfo.GetActor() && eventInfo.GetActionTarget() && ((damageInfo && damageInfo->GetDamage()) || eventInfo.GetHitMask() & PROC_EX_ABSORB) && (!procSpell || procSpell->SpellIconID != 2731); // Xinef: Mark of the Fallen Champion + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + /* + uint32 markCount = 0; + if (Map* map = eventInfo.GetActor()->FindMap()) + if (InstanceMap* imap = map->ToInstanceMap()) + if (InstanceScript* isc = imap->GetInstanceScript()) + if (ObjectGuid sguid = isc->GetGuidData(3) //DATA_DEATHBRINGER_SAURFANG + if (Creature* saurfang = ObjectAccessor::GetCreature(*eventInfo.GetActor(), sguid)) + markCount = saurfang->IsAIEnabled ? saurfang->AI()->GetData(123456) : 0; //FALLEN_CHAMPION_CAST_COUNT + */ + int32 basepoints = int32(3.0f /*+ 0.5f + 0.5f*markCount*/); + + eventInfo.GetActor()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActionTarget(), true); + return; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_deathbringer_blood_link_blood_beast_aura::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_link_blood_beast_aura::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + +class spell_deathbringer_blood_link : public SpellScript +{ + PrepareSpellScript(spell_deathbringer_blood_link); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BLOOD_LINK_POWER }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_POWER, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), true); + if (Aura* bloodPower = GetHitUnit()->GetAura(SPELL_BLOOD_POWER)) + bloodPower->RecalculateAmountOfEffects(); + PreventHitDefaultEffect(EFFECT_0); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_deathbringer_blood_link::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_deathbringer_blood_power : public SpellScript +{ + PrepareSpellScript(spell_deathbringer_blood_power); + + void ModAuraValue() + { + if (Aura* aura = GetHitAura()) + aura->RecalculateAmountOfEffects(); + } + + void Register() override + { + AfterHit += SpellHitFn(spell_deathbringer_blood_power::ModAuraValue); + } +}; + +class spell_deathbringer_blood_power_aura : public AuraScript +{ + PrepareAuraScript(spell_deathbringer_blood_power_aura); + + void RecalculateHook(AuraEffect const* /*aurEffect*/, int32& amount, bool& canBeRecalculated) + { + amount = int32(GetUnitOwner()->GetPower(POWER_ENERGY)); + canBeRecalculated = true; + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_aura::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_SCALE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_aura::RecalculateHook, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + } +}; + +class spell_deathbringer_blood_nova_targeting : public SpellScript +{ + PrepareSpellScript(spell_deathbringer_blood_nova_targeting); + + bool Load() override + { + // initialize variable + _target = nullptr; + return true; + } + + void FilterTargetsInitial(std::list& targets) + { + // select one random target, with preference of ranged targets + uint32 targetsAtRange = 0; + uint32 const minTargets = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 10 : 4); + targets.sort(Acore::ObjectDistanceOrderPred(GetCaster(), false)); + + // get target count at range + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr, ++targetsAtRange) + if ((*itr)->GetDistance(GetCaster()) < 12.0f) + break; + + // set the upper cap + if (targetsAtRange < minTargets) + targetsAtRange = std::min(targets.size(), minTargets); + + if (!targetsAtRange) return; - } - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_deathbringer_blood_link_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_link_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_deathbringer_blood_link_AuraScript::HandlePeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_deathbringer_blood_link_AuraScript(); + std::list::iterator itrTarget = targets.begin(); + std::advance(itrTarget, urand(0, targetsAtRange - 1)); + _target = *itrTarget; + targets.clear(); + targets.push_back(_target); } -}; -class spell_deathbringer_blood_link_blood_beast_aura : public SpellScriptLoader -{ -public: - spell_deathbringer_blood_link_blood_beast_aura() : SpellScriptLoader("spell_deathbringer_blood_link_blood_beast_aura") { } - - class spell_deathbringer_blood_link_blood_beast_aura_AuraScript : public AuraScript + // use the same target for first and second effect + void FilterTargetsSubsequent(std::list& targets) { - PrepareAuraScript(spell_deathbringer_blood_link_blood_beast_aura_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - SpellInfo const* procSpell = eventInfo.GetSpellInfo(); - return eventInfo.GetActor() && eventInfo.GetActionTarget() && ((damageInfo && damageInfo->GetDamage()) || eventInfo.GetHitMask() & PROC_EX_ABSORB) && (!procSpell || procSpell->SpellIconID != 2731); // Xinef: Mark of the Fallen Champion - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - /* - uint32 markCount = 0; - if (Map* map = eventInfo.GetActor()->FindMap()) - if (InstanceMap* imap = map->ToInstanceMap()) - if (InstanceScript* isc = imap->GetInstanceScript()) - if (ObjectGuid sguid = isc->GetGuidData(3) //DATA_DEATHBRINGER_SAURFANG - if (Creature* saurfang = ObjectAccessor::GetCreature(*eventInfo.GetActor(), sguid)) - markCount = saurfang->IsAIEnabled ? saurfang->AI()->GetData(123456) : 0; //FALLEN_CHAMPION_CAST_COUNT - */ - int32 basepoints = int32(3.0f /*+ 0.5f + 0.5f*markCount*/); - - eventInfo.GetActor()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActionTarget(), true); + if (!_target) return; - } - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_deathbringer_blood_link_blood_beast_aura_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_link_blood_beast_aura_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_deathbringer_blood_link_blood_beast_aura_AuraScript(); + targets.clear(); + targets.push_back(_target); } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting::FilterTargetsSubsequent, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + } + +private: + WorldObject* _target; }; -class spell_deathbringer_blood_link : public SpellScriptLoader +class spell_deathbringer_boiling_blood : public SpellScript { -public: - spell_deathbringer_blood_link() : SpellScriptLoader("spell_deathbringer_blood_link") { } + PrepareSpellScript(spell_deathbringer_boiling_blood); - class spell_deathbringer_blood_link_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_deathbringer_blood_link_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_POWER, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), true); - if (Aura* bloodPower = GetHitUnit()->GetAura(SPELL_BLOOD_POWER)) - bloodPower->RecalculateAmountOfEffects(); - PreventHitDefaultEffect(EFFECT_0); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_deathbringer_blood_link_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_deathbringer_blood_link_SpellScript(); - } -}; - -class spell_deathbringer_blood_power : public SpellScriptLoader -{ -public: - spell_deathbringer_blood_power() : SpellScriptLoader("spell_deathbringer_blood_power") { } - - class spell_deathbringer_blood_power_SpellScript : public SpellScript - { - PrepareSpellScript(spell_deathbringer_blood_power_SpellScript); - - void ModAuraValue() - { - if (Aura* aura = GetHitAura()) - aura->RecalculateAmountOfEffects(); - } - - void Register() override - { - AfterHit += SpellHitFn(spell_deathbringer_blood_power_SpellScript::ModAuraValue); - } - }; - - class spell_deathbringer_blood_power_AuraScript : public AuraScript - { - PrepareAuraScript(spell_deathbringer_blood_power_AuraScript); - - void RecalculateHook(AuraEffect const* /*aurEffect*/, int32& amount, bool& canBeRecalculated) - { - amount = int32(GetUnitOwner()->GetPower(POWER_ENERGY)); - canBeRecalculated = true; - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_SCALE); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - } - - bool Load() override - { - if (GetUnitOwner()->getPowerType() != POWER_ENERGY) - return false; - return true; - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_deathbringer_blood_power_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } - AuraScript* GetAuraScript() const override + void FilterTargets(std::list& targets) { - return new spell_deathbringer_blood_power_AuraScript(); - } -}; + targets.remove(GetCaster()->GetVictim()); + if (targets.empty()) + return; -class spell_deathbringer_blood_nova_targeting : public SpellScriptLoader -{ -public: - spell_deathbringer_blood_nova_targeting() : SpellScriptLoader("spell_deathbringer_blood_nova_targeting") { } - - class spell_deathbringer_blood_nova_targeting_SpellScript : public SpellScript - { - PrepareSpellScript(spell_deathbringer_blood_nova_targeting_SpellScript); - - bool Load() override + if (GetSpellInfo()->Id == 72385 || GetSpellInfo()->Id == 72442) // 10n, 10h { - // initialize variable - target = nullptr; - return true; - } - - void FilterTargetsInitial(std::list& targets) - { - // select one random target, with preference of ranged targets - uint32 targetsAtRange = 0; - uint32 const minTargets = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 10 : 4); - targets.sort(Acore::ObjectDistanceOrderPred(GetCaster(), false)); - - // get target count at range - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr, ++targetsAtRange) - if ((*itr)->GetDistance(GetCaster()) < 12.0f) - break; - - // set the upper cap - if (targetsAtRange < minTargets) - targetsAtRange = std::min(targets.size(), minTargets); - - if (!targetsAtRange) - return; - - std::list::iterator itrTarget = targets.begin(); - std::advance(itrTarget, urand(0, targetsAtRange - 1)); - target = *itrTarget; + WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); targets.clear(); targets.push_back(target); } - - // use the same target for first and second effect - void FilterTargetsSubsequent(std::list& targets) - { - if (!target) - return; - - targets.clear(); - targets.push_back(target); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - } - - WorldObject* target; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_deathbringer_blood_nova_targeting_SpellScript(); + else + Acore::Containers::RandomResize(targets, 3); } -}; -class spell_deathbringer_boiling_blood : public SpellScriptLoader -{ -public: - spell_deathbringer_boiling_blood() : SpellScriptLoader("spell_deathbringer_boiling_blood") { } - - class spell_deathbringer_boiling_blood_SpellScript : public SpellScript + void Register() override { - PrepareSpellScript(spell_deathbringer_boiling_blood_SpellScript); - - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void FilterTargets(std::list& targets) - { - targets.remove(GetCaster()->GetVictim()); - if (targets.empty()) - return; - - if (GetSpellInfo()->Id == 72385 || GetSpellInfo()->Id == 72442) // 10n, 10h - { - WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - else - Acore::Containers::RandomResize(targets, 3); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_boiling_blood_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_deathbringer_boiling_blood_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_boiling_blood::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; @@ -1412,12 +1350,12 @@ void AddSC_boss_deathbringer_saurfang() new npc_high_overlord_saurfang_icc(); new npc_muradin_bronzebeard_icc(); new npc_saurfang_event(); - new spell_deathbringer_blood_link_aura(); - new spell_deathbringer_blood_link_blood_beast_aura(); - new spell_deathbringer_blood_link(); - new spell_deathbringer_blood_power(); - new spell_deathbringer_blood_nova_targeting(); - new spell_deathbringer_boiling_blood(); + RegisterSpellScript(spell_deathbringer_blood_link_aura); + RegisterSpellScript(spell_deathbringer_blood_link_blood_beast_aura); + RegisterSpellScript(spell_deathbringer_blood_link); + RegisterSpellAndAuraScriptPair(spell_deathbringer_blood_power, spell_deathbringer_blood_power_aura); + RegisterSpellScript(spell_deathbringer_blood_nova_targeting); + RegisterSpellScript(spell_deathbringer_boiling_blood); new achievement_ive_gone_and_made_a_mess(); new npc_icc_blood_beast(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index 0bd29e02c..de01ce804 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -284,128 +284,95 @@ public: } }; -class spell_festergut_pungent_blight : public SpellScriptLoader +class spell_festergut_pungent_blight : public SpellScript { -public: - spell_festergut_pungent_blight() : SpellScriptLoader("spell_festergut_pungent_blight") { } + PrepareSpellScript(spell_festergut_pungent_blight); - class spell_festergut_pungent_blight_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_festergut_pungent_blight_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_UNIT) - return; - - // Get Inhaled Blight id for our difficulty - uint32 blightId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), caster); - - // ...and remove it - caster->RemoveAurasDueToSpell(blightId); - caster->ToCreature()->AI()->Talk(EMOTE_PUNGENT_BLIGHT); - - if (InstanceScript* inst = caster->GetInstanceScript()) - if (Creature* professor = ObjectAccessor::GetCreature(*caster, inst->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) - professor->AI()->DoAction(ACTION_FESTERGUT_GAS); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_festergut_pungent_blight_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex /*effIndex*/) { - return new spell_festergut_pungent_blight_SpellScript(); + Unit* caster = GetCaster(); + if (caster->GetTypeId() != TYPEID_UNIT) + return; + + // Get Inhaled Blight id for our difficulty + uint32 blightId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), caster); + + // ...and remove it + caster->RemoveAurasDueToSpell(blightId); + caster->ToCreature()->AI()->Talk(EMOTE_PUNGENT_BLIGHT); + + if (InstanceScript* inst = caster->GetInstanceScript()) + if (Creature* professor = ObjectAccessor::GetCreature(*caster, inst->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) + professor->AI()->DoAction(ACTION_FESTERGUT_GAS); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_festergut_pungent_blight::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_festergut_blighted_spores : public SpellScriptLoader +class spell_festergut_blighted_spores_aura : public AuraScript { -public: - spell_festergut_blighted_spores() : SpellScriptLoader("spell_festergut_blighted_spores") { } + PrepareAuraScript(spell_festergut_blighted_spores_aura); - class spell_festergut_blighted_spores_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareAuraScript(spell_festergut_blighted_spores_AuraScript); + return ValidateSpellInfo({ SPELL_INOCULATED }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_INOCULATED }); - } - - void ExtraEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Aura* a = aurEff->GetBase()) - if (a->GetDuration() > a->GetMaxDuration() - 1000) // this does not stack for different casters and previous is removed by new DoT, prevent it from giving inoculation in such case - return; - uint32 inoculatedId = sSpellMgr->GetSpellIdForDifficulty(SPELL_INOCULATED, GetTarget()); - uint8 inoculatedStack = 1; - if (Aura* a = GetTarget()->GetAura(inoculatedId)) - { - inoculatedStack += a->GetStackAmount(); - if (a->GetDuration() > a->GetMaxDuration() - 10000) // player may gain only one stack at a time, no matter how many spores explode near him - return; - } - GetTarget()->CastSpell(GetTarget(), SPELL_INOCULATED, true); - if (InstanceScript* instance = GetTarget()->GetInstanceScript()) - if (Creature* festergut = ObjectAccessor::GetCreature(*GetTarget(), instance->GetGuidData(DATA_FESTERGUT))) - festergut->AI()->SetData(DATA_INOCULATED_STACK, inoculatedStack); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_festergut_blighted_spores_AuraScript::ExtraEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void ExtraEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - return new spell_festergut_blighted_spores_AuraScript(); + if (Aura* a = aurEff->GetBase()) + if (a->GetDuration() > a->GetMaxDuration() - 1000) // this does not stack for different casters and previous is removed by new DoT, prevent it from giving inoculation in such case + return; + uint32 inoculatedId = sSpellMgr->GetSpellIdForDifficulty(SPELL_INOCULATED, GetTarget()); + uint8 inoculatedStack = 1; + if (Aura* a = GetTarget()->GetAura(inoculatedId)) + { + inoculatedStack += a->GetStackAmount(); + if (a->GetDuration() > a->GetMaxDuration() - 10000) // player may gain only one stack at a time, no matter how many spores explode near him + return; + } + GetTarget()->CastSpell(GetTarget(), SPELL_INOCULATED, true); + if (InstanceScript* instance = GetTarget()->GetInstanceScript()) + if (Creature* festergut = ObjectAccessor::GetCreature(*GetTarget(), instance->GetGuidData(DATA_FESTERGUT))) + festergut->AI()->SetData(DATA_INOCULATED_STACK, inoculatedStack); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_festergut_blighted_spores_aura::ExtraEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } }; -class spell_festergut_gastric_bloat : public SpellScriptLoader +class spell_festergut_gastric_bloat : public SpellScript { -public: - spell_festergut_gastric_bloat() : SpellScriptLoader("spell_festergut_gastric_bloat") { } + PrepareSpellScript(spell_festergut_gastric_bloat); - class spell_festergut_gastric_bloat_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_festergut_gastric_bloat_SpellScript); + return ValidateSpellInfo({ SPELL_GASTRIC_EXPLOSION }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_GASTRIC_EXPLOSION }); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Aura const* aura = GetHitUnit()->GetAura(GetSpellInfo()->Id); - if (!(aura && aura->GetStackAmount() == 10)) - return; - - GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Id); - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GASTRIC_EXPLOSION, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_festergut_gastric_bloat_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex /*effIndex*/) { - return new spell_festergut_gastric_bloat_SpellScript(); + Aura const* aura = GetHitUnit()->GetAura(GetSpellInfo()->Id); + if (!(aura && aura->GetStackAmount() == 10)) + return; + + GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Id); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GASTRIC_EXPLOSION, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_festergut_gastric_bloat::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -496,9 +463,9 @@ public: void AddSC_boss_festergut() { new boss_festergut(); - new spell_festergut_pungent_blight(); - new spell_festergut_blighted_spores(); - new spell_festergut_gastric_bloat(); + RegisterSpellScript(spell_festergut_pungent_blight); + RegisterSpellScript(spell_festergut_blighted_spores_aura); + RegisterSpellScript(spell_festergut_gastric_bloat); new achievement_flu_shot_shortage(); new npc_stinky_icc(); 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 51bf4d127..5edeaa542 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -1974,254 +1974,195 @@ public: } }; -class spell_igb_rocket_pack : public SpellScriptLoader +class spell_igb_rocket_pack_aura : public AuraScript { -public: - spell_igb_rocket_pack() : SpellScriptLoader("spell_igb_rocket_pack") { } + PrepareAuraScript(spell_igb_rocket_pack_aura); - class spell_igb_rocket_pack_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_igb_rocket_pack_AuraScript); + return ValidateSpellInfo( + { + SPELL_ROCKET_PACK_DAMAGE, + SPELL_ROCKET_BURST + }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_ROCKET_PACK_DAMAGE, - SPELL_ROCKET_BURST - }); - } - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - if (GetTarget()->movespline->Finalized()) - Remove(AURA_REMOVE_BY_EXPIRE); - } - - void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - SpellInfo const* damageInfo = sSpellMgr->AssertSpellInfo(SPELL_ROCKET_PACK_DAMAGE); - GetTarget()->CastCustomSpell(SPELL_ROCKET_PACK_DAMAGE, SPELLVALUE_BASE_POINT0, 2 * (damageInfo->Effects[EFFECT_0].CalcValue() + aurEff->GetTickNumber() * aurEff->GetAmplitude()), nullptr, true); - GetTarget()->CastSpell((Unit*)nullptr, SPELL_ROCKET_BURST, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_rocket_pack_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - OnEffectRemove += AuraEffectRemoveFn(spell_igb_rocket_pack_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - return new spell_igb_rocket_pack_AuraScript(); + if (GetTarget()->movespline->Finalized()) + Remove(AURA_REMOVE_BY_EXPIRE); + } + + void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + SpellInfo const* damageInfo = sSpellMgr->AssertSpellInfo(SPELL_ROCKET_PACK_DAMAGE); + GetTarget()->CastCustomSpell(SPELL_ROCKET_PACK_DAMAGE, SPELLVALUE_BASE_POINT0, 2 * (damageInfo->Effects[EFFECT_0].CalcValue() + aurEff->GetTickNumber() * aurEff->GetAmplitude()), nullptr, true); + GetTarget()->CastSpell((Unit*)nullptr, SPELL_ROCKET_BURST, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_rocket_pack_aura::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectRemove += AuraEffectRemoveFn(spell_igb_rocket_pack_aura::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; -class spell_igb_rocket_pack_useable : public SpellScriptLoader +class spell_igb_rocket_pack_useable_aura : public AuraScript { -public: - spell_igb_rocket_pack_useable() : SpellScriptLoader("spell_igb_rocket_pack_useable") { } + PrepareAuraScript(spell_igb_rocket_pack_useable_aura); - class spell_igb_rocket_pack_useable_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_igb_rocket_pack_useable_AuraScript); + return GetOwner()->GetInstanceScript(); + } - bool Load() override - { - return GetOwner()->GetInstanceScript(); - } - - bool CheckAreaTarget(Unit* target) - { - return target->GetTypeId() == TYPEID_PLAYER && GetOwner()->GetInstanceScript()->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE; - } - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* owner = GetOwner()->ToCreature()) - if (Player* target = GetTarget()->ToPlayer()) - if (target->HasItemCount(ITEM_GOBLIN_ROCKET_PACK, 1)) - sCreatureTextMgr->SendChat(owner, SAY_ZAFOD_ROCKET_PACK_ACTIVE, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_NEUTRAL, false, target); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* owner = GetOwner()->ToCreature()) - if (Player* target = GetTarget()->ToPlayer()) - if (target->HasItemCount(ITEM_GOBLIN_ROCKET_PACK, 1)) - sCreatureTextMgr->SendChat(owner, SAY_ZAFOD_ROCKET_PACK_DISABLED, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_NEUTRAL, false, target); - } - - void Register() override - { - DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_igb_rocket_pack_useable_AuraScript::CheckAreaTarget); - AfterEffectApply += AuraEffectApplyFn(spell_igb_rocket_pack_useable_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_igb_rocket_pack_useable_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + bool CheckAreaTarget(Unit* target) { - return new spell_igb_rocket_pack_useable_AuraScript(); + return target->GetTypeId() == TYPEID_PLAYER && GetOwner()->GetInstanceScript()->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE; + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* owner = GetOwner()->ToCreature()) + if (Player* target = GetTarget()->ToPlayer()) + if (target->HasItemCount(ITEM_GOBLIN_ROCKET_PACK, 1)) + sCreatureTextMgr->SendChat(owner, SAY_ZAFOD_ROCKET_PACK_ACTIVE, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_NEUTRAL, false, target); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* owner = GetOwner()->ToCreature()) + if (Player* target = GetTarget()->ToPlayer()) + if (target->HasItemCount(ITEM_GOBLIN_ROCKET_PACK, 1)) + sCreatureTextMgr->SendChat(owner, SAY_ZAFOD_ROCKET_PACK_DISABLED, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_NEUTRAL, false, target); + } + + void Register() override + { + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_igb_rocket_pack_useable_aura::CheckAreaTarget); + AfterEffectApply += AuraEffectApplyFn(spell_igb_rocket_pack_useable_aura::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_igb_rocket_pack_useable_aura::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; -class spell_igb_teleport_to_enemy_ship : public SpellScriptLoader +class spell_igb_teleport_to_enemy_ship : public SpellScript { -public: - spell_igb_teleport_to_enemy_ship() : SpellScriptLoader("spell_igb_teleport_to_enemy_ship") { } + PrepareSpellScript(spell_igb_teleport_to_enemy_ship); - class spell_igb_teleport_to_enemy_ship_SpellScript : public SpellScript + void RelocateTransportOffset(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_igb_teleport_to_enemy_ship_SpellScript); + WorldLocation const* dest = GetHitDest(); + Unit* target = GetHitUnit(); + if (!dest || !target || !target->GetTransport()) + return; - void RelocateTransportOffset(SpellEffIndex /*effIndex*/) - { - WorldLocation const* dest = GetHitDest(); - Unit* target = GetHitUnit(); - if (!dest || !target || !target->GetTransport()) - return; + float x, y, z, o; + dest->GetPosition(x, y, z, o); + target->GetTransport()->CalculatePassengerOffset(x, y, z, &o); + target->m_movementInfo.transport.pos.Relocate(x, y, z, o); + } - float x, y, z, o; - dest->GetPosition(x, y, z, o); - target->GetTransport()->CalculatePassengerOffset(x, y, z, &o); - target->m_movementInfo.transport.pos.Relocate(x, y, z, o); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_igb_teleport_to_enemy_ship_SpellScript::RelocateTransportOffset, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_igb_teleport_to_enemy_ship_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_igb_teleport_to_enemy_ship::RelocateTransportOffset, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); } }; -class spell_igb_check_for_players : public SpellScriptLoader +class spell_igb_check_for_players : public SpellScript { -public: - spell_igb_check_for_players() : SpellScriptLoader("spell_igb_check_for_players") { } + PrepareSpellScript(spell_igb_check_for_players); - class spell_igb_check_for_players_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_igb_check_for_players_SpellScript); + return ValidateSpellInfo({ SPELL_GUNSHIP_FALL_TELEPORT }); + } - bool Load() override - { - _playerCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void CountTargets(std::list& targets) - { - _playerCount = targets.size(); - } - - void TriggerWipe() - { - if (!_playerCount) - GetCaster()->ToCreature()->AI()->JustDied(nullptr); - } - - void TeleportPlayer(SpellEffIndex /*effIndex*/) - { - if (GetHitUnit()->GetPositionZ() < GetCaster()->GetPositionZ() - 10.0f) - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GUNSHIP_FALL_TELEPORT, true); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_check_for_players_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - AfterCast += SpellCastFn(spell_igb_check_for_players_SpellScript::TriggerWipe); - OnEffectHitTarget += SpellEffectFn(spell_igb_check_for_players_SpellScript::TeleportPlayer, EFFECT_0, SPELL_EFFECT_DUMMY); - } - - uint32 _playerCount; - }; - - SpellScript* GetSpellScript() const override + bool Load() override { - return new spell_igb_check_for_players_SpellScript(); + _playerCount = 0; + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void CountTargets(std::list& targets) + { + _playerCount = targets.size(); + } + + void TriggerWipe() + { + if (!_playerCount) + GetCaster()->ToCreature()->AI()->JustDied(nullptr); + } + + void TeleportPlayer(SpellEffIndex /*effIndex*/) + { + if (GetHitUnit()->GetPositionZ() < GetCaster()->GetPositionZ() - 10.0f) + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GUNSHIP_FALL_TELEPORT, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_check_for_players::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + AfterCast += SpellCastFn(spell_igb_check_for_players::TriggerWipe); + OnEffectHitTarget += SpellEffectFn(spell_igb_check_for_players::TeleportPlayer, EFFECT_0, SPELL_EFFECT_DUMMY); + } + +private: + uint32 _playerCount; +}; + +class spell_igb_gunship_fall_teleport : public SpellScript +{ + PrepareSpellScript(spell_igb_gunship_fall_teleport); + + bool Load() override + { + return GetCaster()->GetInstanceScript(); + } + + void SelectTransport(WorldObject*& target) + { + if (InstanceScript* instance = target->GetInstanceScript()) + target = instance->instance->GetTransport(instance->GetGuidData(DATA_ICECROWN_GUNSHIP_BATTLE)); + } + + void RelocateDest(SpellEffIndex /*effIndex*/) + { + Position offset = {0.0f, 0.0f, 0.0f, 0.0f}; + offset.m_positionZ = GetCaster()->GetInstanceScript()->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? 36.0f : 21.0f; + GetHitDest()->RelocateOffset(offset); + } + + void Register() override + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_igb_gunship_fall_teleport::SelectTransport, EFFECT_0, TARGET_DEST_NEARBY_ENTRY); + OnEffectLaunch += SpellEffectFn(spell_igb_gunship_fall_teleport::RelocateDest, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); } }; -class spell_igb_gunship_fall_teleport : public SpellScriptLoader +class spell_igb_explosion_main_aura : public AuraScript { -public: - spell_igb_gunship_fall_teleport() : SpellScriptLoader("spell_igb_gunship_fall_teleport") { } + PrepareAuraScript(spell_igb_explosion_main_aura); - class spell_igb_gunship_fall_teleport_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_igb_gunship_fall_teleport_SpellScript); - - bool Load() override - { - return GetCaster()->GetInstanceScript(); - } - - void SelectTransport(WorldObject*& target) - { - if (InstanceScript* instance = target->GetInstanceScript()) - target = instance->instance->GetTransport(instance->GetGuidData(DATA_ICECROWN_GUNSHIP_BATTLE)); - } - - void RelocateDest(SpellEffIndex /*effIndex*/) - { - Position offset = {0.0f, 0.0f, 0.0f, 0.0f}; - offset.m_positionZ = GetCaster()->GetInstanceScript()->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? 36.0f : 21.0f; - GetHitDest()->RelocateOffset(offset); - } - - void Register() override - { - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_igb_gunship_fall_teleport_SpellScript::SelectTransport, EFFECT_0, TARGET_DEST_NEARBY_ENTRY); - OnEffectLaunch += SpellEffectFn(spell_igb_gunship_fall_teleport_SpellScript::RelocateDest, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_igb_gunship_fall_teleport_SpellScript(); + _tickNo = urand(0, 3); + return true; } -}; -class spell_igb_explosion_main : public SpellScriptLoader -{ -public: - spell_igb_explosion_main() : SpellScriptLoader("spell_igb_explosion_main") { } - - class spell_igb_explosion_main_AuraScript : public AuraScript + void PeriodicTick(AuraEffect const* aurEff) { - PrepareAuraScript(spell_igb_explosion_main_AuraScript); - - bool Load() override - { - tickNo = urand(0, 3); - return true; - } - - void PeriodicTick(AuraEffect const* aurEff) - { - if ((aurEff->GetTickNumber() % 4) != tickNo) - PreventDefaultAction(); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_explosion_main_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - - uint32 tickNo; - }; - - AuraScript* GetAuraScript() const override - { - return new spell_igb_explosion_main_AuraScript(); + if ((aurEff->GetTickNumber() % 4) != _tickNo) + PreventDefaultAction(); } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_explosion_main_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + +private: + uint32 _tickNo; }; class IgbExplosionCheck @@ -2238,30 +2179,19 @@ private: Unit* _source; }; -class spell_igb_explosion : public SpellScriptLoader +class spell_igb_explosion : public SpellScript { -public: - spell_igb_explosion() : SpellScriptLoader("spell_igb_explosion") { } + PrepareSpellScript(spell_igb_explosion); - class spell_igb_explosion_SpellScript : public SpellScript + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_igb_explosion_SpellScript); + targets.remove_if(IgbExplosionCheck(GetCaster())); + Acore::Containers::RandomResize(targets, 1); + } - void SelectTarget(std::list& targets) - { - targets.remove_if(IgbExplosionCheck(GetCaster())); - Acore::Containers::RandomResize(targets, 1); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_explosion_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_igb_explosion_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_explosion::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); } }; @@ -2279,234 +2209,185 @@ private: InstanceScript* _inst; }; -class spell_igb_teleport_players_on_victory : public SpellScriptLoader +class spell_igb_teleport_players_on_victory : public SpellScript { -public: - spell_igb_teleport_players_on_victory() : SpellScriptLoader("spell_igb_teleport_players_on_victory") { } + PrepareSpellScript(spell_igb_teleport_players_on_victory); - class spell_igb_teleport_players_on_victory_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_igb_teleport_players_on_victory_SpellScript); + return GetCaster()->GetInstanceScript(); + } - bool Load() override - { - return GetCaster()->GetInstanceScript(); - } - - void FilterTargets(std::list& targets) - { - InstanceScript* instance = GetCaster()->GetInstanceScript(); - targets.remove_if(IgbTeleportOnVictoryCheck(instance)); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_teleport_players_on_victory_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const override + void FilterTargets(std::list& targets) { - return new spell_igb_teleport_players_on_victory_SpellScript(); + InstanceScript* instance = GetCaster()->GetInstanceScript(); + targets.remove_if(IgbTeleportOnVictoryCheck(instance)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_teleport_players_on_victory::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); } }; -class spell_igb_periodic_trigger_with_power_cost : public SpellScriptLoader +class spell_igb_periodic_trigger_with_power_cost_aura : public AuraScript { -public: - spell_igb_periodic_trigger_with_power_cost() : SpellScriptLoader("spell_igb_periodic_trigger_with_power_cost") { } + PrepareAuraScript(spell_igb_periodic_trigger_with_power_cost_aura); - class spell_igb_periodic_trigger_with_power_cost_AuraScript : public AuraScript + void HandlePeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_igb_periodic_trigger_with_power_cost_AuraScript); + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); + } - void HandlePeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_periodic_trigger_with_power_cost_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_igb_periodic_trigger_with_power_cost_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_igb_overheat : public SpellScriptLoader +class spell_igb_overheat_aura : public AuraScript { -public: - spell_igb_overheat() : SpellScriptLoader("spell_igb_overheat") { } + PrepareAuraScript(spell_igb_overheat_aura); - class spell_igb_overheat_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_igb_overheat_AuraScript); + if (GetAura()->GetType() != UNIT_AURA_TYPE) + return false; + return GetUnitOwner()->IsVehicle(); + } - bool Load() override + void SendClientControl(uint8 value) + { + if (Vehicle* vehicle = GetUnitOwner()->GetVehicleKit()) { - if (GetAura()->GetType() != UNIT_AURA_TYPE) - return false; - return GetUnitOwner()->IsVehicle(); - } - - void SendClientControl(uint8 value) - { - if (Vehicle* vehicle = GetUnitOwner()->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(0)) { - if (Unit* passenger = vehicle->GetPassenger(0)) + if (Player* player = passenger->ToPlayer()) { - if (Player* player = passenger->ToPlayer()) - { - WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, GetUnitOwner()->GetPackGUID().size() + 1); - data << GetUnitOwner()->GetPackGUID(); - data << uint8(value); - player->GetSession()->SendPacket(&data); - } + WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, GetUnitOwner()->GetPackGUID().size() + 1); + data << GetUnitOwner()->GetPackGUID(); + data << uint8(value); + player->GetSession()->SendPacket(&data); } } } + } - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - SendClientControl(0); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - SendClientControl(1); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_igb_overheat_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_igb_overheat_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_igb_overheat_AuraScript(); + SendClientControl(0); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + SendClientControl(1); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_igb_overheat_aura::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_igb_overheat_aura::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); } }; -class spell_igb_cannon_blast : public SpellScriptLoader +class spell_igb_cannon_blast : public SpellScript { -public: - spell_igb_cannon_blast() : SpellScriptLoader("spell_igb_cannon_blast") { } + PrepareSpellScript(spell_igb_cannon_blast); - class spell_igb_cannon_blast_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_igb_cannon_blast_SpellScript); + return ValidateSpellInfo({ SPELL_OVERHEAT }); + } - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void CalculatePower() - { - Unit* caster = GetCaster(); - if (!caster) - return; - - SpellInfo const* spellInfo = GetSpellInfo(); - if (!spellInfo) - return; - - // Check if the effect is energize - if (spellInfo->Effects[EFFECT_1].Effect == SPELL_EFFECT_ENERGIZE) - { - int32 energizeAmount = spellInfo->Effects[EFFECT_1].CalcValue(caster); - - // Apply the power gain directly to the caster - caster->ModifyPower(POWER_ENERGY, energizeAmount); - } - - if (caster->GetPower(POWER_ENERGY) >= 100) - { - caster->CastSpell(caster, SPELL_OVERHEAT, true); - if (Vehicle* vehicle = caster->GetVehicleKit()) - if (Unit* passenger = vehicle->GetPassenger(0)) - sCreatureTextMgr->SendChat(caster->ToCreature(), SAY_OVERHEAT, passenger); - } - - } - - void PreventPowerGainOnHit(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - } - - void Register() override - { - OnCast += SpellCastFn(spell_igb_cannon_blast_SpellScript::CalculatePower); - OnEffectHitTarget += SpellEffectFn(spell_igb_cannon_blast_SpellScript::PreventPowerGainOnHit, EFFECT_1, SPELL_EFFECT_ENERGIZE); - - } - }; - - SpellScript* GetSpellScript() const override + bool Load() override { - return new spell_igb_cannon_blast_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void CalculatePower() + { + Unit* caster = GetCaster(); + if (!caster) + return; + + SpellInfo const* spellInfo = GetSpellInfo(); + if (!spellInfo) + return; + + // Check if the effect is energize + if (spellInfo->Effects[EFFECT_1].Effect == SPELL_EFFECT_ENERGIZE) + { + int32 energizeAmount = spellInfo->Effects[EFFECT_1].CalcValue(caster); + + // Apply the power gain directly to the caster + caster->ModifyPower(POWER_ENERGY, energizeAmount); + } + + if (caster->GetPower(POWER_ENERGY) >= 100) + { + caster->CastSpell(caster, SPELL_OVERHEAT, true); + if (Vehicle* vehicle = caster->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(0)) + sCreatureTextMgr->SendChat(caster->ToCreature(), SAY_OVERHEAT, passenger); + } + + } + + void PreventPowerGainOnHit(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + } + + void Register() override + { + OnCast += SpellCastFn(spell_igb_cannon_blast::CalculatePower); + OnEffectHitTarget += SpellEffectFn(spell_igb_cannon_blast::PreventPowerGainOnHit, EFFECT_1, SPELL_EFFECT_ENERGIZE); + } }; -class spell_igb_incinerating_blast : public SpellScriptLoader +class spell_igb_incinerating_blast : public SpellScript { -public: - spell_igb_incinerating_blast() : SpellScriptLoader("spell_igb_incinerating_blast") { } + PrepareSpellScript(spell_igb_incinerating_blast); - class spell_igb_incinerating_blast_SpellScript : public SpellScript + void StoreEnergy() { - PrepareSpellScript(spell_igb_incinerating_blast_SpellScript); - - void StoreEnergy() - { - _energyLeft = GetCaster()->GetPower(POWER_ENERGY) - 10; - } - - void RemoveEnergy() - { - GetCaster()->SetPower(POWER_ENERGY, 0); - } - - void CalculateDamage(SpellEffIndex /*effIndex*/) - { - PreventHitEffect(EFFECT_0); - SpellInfo const* si = sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[0].TriggerSpell); - if (!si) - return; - SpellCastTargets targets; - Position dest = GetExplTargetDest()->GetPosition(); - targets.SetDst(dest); - CustomSpellValues values; - int32 damage = si->Effects[0].CalcValue() + _energyLeft * _energyLeft * 8; - values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); - GetCaster()->CastSpell(targets, si, &values, TRIGGERED_FULL_MASK); - //SetEffectValue(GetEffectValue() + _energyLeft * _energyLeft * 8); - } - - void Register() override - { - OnCast += SpellCastFn(spell_igb_incinerating_blast_SpellScript::StoreEnergy); - AfterCast += SpellCastFn(spell_igb_incinerating_blast_SpellScript::RemoveEnergy); - OnEffectHit += SpellEffectFn(spell_igb_incinerating_blast_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); - } - - uint32 _energyLeft; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_igb_incinerating_blast_SpellScript(); + _energyLeft = GetCaster()->GetPower(POWER_ENERGY) - 10; } + + void RemoveEnergy() + { + GetCaster()->SetPower(POWER_ENERGY, 0); + } + + void CalculateDamage(SpellEffIndex /*effIndex*/) + { + PreventHitEffect(EFFECT_0); + SpellInfo const* si = sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[0].TriggerSpell); + if (!si) + return; + SpellCastTargets targets; + Position dest = GetExplTargetDest()->GetPosition(); + targets.SetDst(dest); + CustomSpellValues values; + int32 damage = si->Effects[0].CalcValue() + _energyLeft * _energyLeft * 8; + values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); + GetCaster()->CastSpell(targets, si, &values, TRIGGERED_FULL_MASK); + //SetEffectValue(GetEffectValue() + _energyLeft * _energyLeft * 8); + } + + void Register() override + { + OnCast += SpellCastFn(spell_igb_incinerating_blast::StoreEnergy); + AfterCast += SpellCastFn(spell_igb_incinerating_blast::RemoveEnergy); + OnEffectHit += SpellEffectFn(spell_igb_incinerating_blast::CalculateDamage, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); + } + +private: + uint32 _energyLeft; }; class BurningPitchFilterCheck @@ -2525,74 +2406,57 @@ private: uint32 _entry; }; -class spell_igb_burning_pitch_selector : public SpellScriptLoader +class spell_igb_burning_pitch_selector : public SpellScript { -public: - spell_igb_burning_pitch_selector() : SpellScriptLoader("spell_igb_burning_pitch_selector") { } + PrepareSpellScript(spell_igb_burning_pitch_selector); - class spell_igb_burning_pitch_selector_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_igb_burning_pitch_selector_SpellScript); + TeamId teamId = TEAM_HORDE; + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + teamId = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); - void FilterTargets(std::list& targets) + targets.remove_if(BurningPitchFilterCheck(teamId == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A)); + if (!targets.empty()) { - TeamId teamId = TEAM_HORDE; - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - teamId = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); - - targets.remove_if(BurningPitchFilterCheck(teamId == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A)); - if (!targets.empty()) - { - WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } + WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); } + } - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), TRIGGERED_NONE); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_burning_pitch_selector_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_igb_burning_pitch_selector_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void HandleDummy(SpellEffIndex effIndex) { - return new spell_igb_burning_pitch_selector_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), TRIGGERED_NONE); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_burning_pitch_selector::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_igb_burning_pitch_selector::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; -class spell_igb_burning_pitch : public SpellScriptLoader +class spell_igb_burning_pitch : public SpellScript { -public: - spell_igb_burning_pitch() : SpellScriptLoader("spell_igb_burning_pitch") { } + PrepareSpellScript(spell_igb_burning_pitch); - class spell_igb_burning_pitch_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_igb_burning_pitch_SpellScript); + return ValidateSpellInfo({ 8000, SPELL_BURNING_PITCH }); + } - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastCustomSpell(uint32(GetEffectValue()), SPELLVALUE_BASE_POINT0, 8000, nullptr, TRIGGERED_FULL_MASK); - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_BURNING_PITCH, TRIGGERED_FULL_MASK); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_igb_burning_pitch_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void HandleDummy(SpellEffIndex effIndex) { - return new spell_igb_burning_pitch_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->CastCustomSpell(uint32(GetEffectValue()), SPELLVALUE_BASE_POINT0, 8000, nullptr, TRIGGERED_FULL_MASK); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_BURNING_PITCH, TRIGGERED_FULL_MASK); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_igb_burning_pitch::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -2611,153 +2475,120 @@ private: uint32 _entry; }; -class spell_igb_rocket_artillery : public SpellScriptLoader +class spell_igb_rocket_artillery : public SpellScript { -public: - spell_igb_rocket_artillery() : SpellScriptLoader("spell_igb_rocket_artillery") { } + PrepareSpellScript(spell_igb_rocket_artillery); - class spell_igb_rocket_artillery_SpellScript : public SpellScript + void SelectRandomTarget(std::list& targets) { - PrepareSpellScript(spell_igb_rocket_artillery_SpellScript); + TeamId teamId = TEAM_HORDE; + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + teamId = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); + targets.remove_if(IgbArtilleryCheck(teamId == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A)); - void SelectRandomTarget(std::list& targets) + if (!targets.empty()) { - TeamId teamId = TEAM_HORDE; - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - teamId = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); - targets.remove_if(IgbArtilleryCheck(teamId == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A)); - - if (!targets.empty()) - { - WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } + WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); } + } - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetHitUnit()->GetPositionX(), GetHitUnit()->GetPositionY(), - GetHitUnit()->GetMapHeight(GetCaster()->GetPhaseMask(), GetHitUnit()->GetPositionX(), GetHitUnit()->GetPositionY(), GetHitUnit()->GetPositionZ()), - uint32(GetEffectValue()), TRIGGERED_NONE); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_rocket_artillery_SpellScript::SelectRandomTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_igb_rocket_artillery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex effIndex) { - return new spell_igb_rocket_artillery_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit()->GetPositionX(), GetHitUnit()->GetPositionY(), + GetHitUnit()->GetMapHeight(GetCaster()->GetPhaseMask(), GetHitUnit()->GetPositionX(), GetHitUnit()->GetPositionY(), GetHitUnit()->GetPositionZ()), + uint32(GetEffectValue()), TRIGGERED_NONE); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_rocket_artillery::SelectRandomTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_igb_rocket_artillery::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_igb_rocket_artillery_explosion : public SpellScriptLoader +class spell_igb_rocket_artillery_explosion : public SpellScript { -public: - spell_igb_rocket_artillery_explosion() : SpellScriptLoader("spell_igb_rocket_artillery_explosion") { } + PrepareSpellScript(spell_igb_rocket_artillery_explosion); - class spell_igb_rocket_artillery_explosion_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_igb_rocket_artillery_explosion_SpellScript); + return ValidateSpellInfo({ SPELL_BURNING_PITCH_DAMAGE_A, SPELL_BURNING_PITCH_DAMAGE_H, 5000 }); + } - void DamageGunship(SpellEffIndex /*effIndex*/) - { - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - GetCaster()->CastCustomSpell(instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? SPELL_BURNING_PITCH_DAMAGE_A : SPELL_BURNING_PITCH_DAMAGE_H, SPELLVALUE_BASE_POINT0, 5000, nullptr, TRIGGERED_FULL_MASK); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_igb_rocket_artillery_explosion_SpellScript::DamageGunship, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); - } - }; - - SpellScript* GetSpellScript() const override + void DamageGunship(SpellEffIndex /*effIndex*/) { - return new spell_igb_rocket_artillery_explosion_SpellScript(); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + GetCaster()->CastCustomSpell(instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? SPELL_BURNING_PITCH_DAMAGE_A : SPELL_BURNING_PITCH_DAMAGE_H, SPELLVALUE_BASE_POINT0, 5000, nullptr, TRIGGERED_FULL_MASK); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_igb_rocket_artillery_explosion::DamageGunship, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); } }; -class spell_igb_below_zero : public SpellScriptLoader +class spell_igb_below_zero : public SpellScript { -public: - spell_igb_below_zero() : SpellScriptLoader("spell_igb_below_zero") { } + PrepareSpellScript(spell_igb_below_zero); - class spell_igb_below_zero_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_igb_below_zero_SpellScript); + return ValidateSpellInfo({ SPELL_EJECT_ALL_PASSENGERS }); + } - void RemovePassengers(SpellMissInfo missInfo) + void RemovePassengers(SpellMissInfo missInfo) + { + if (missInfo != SPELL_MISS_NONE) { - if (missInfo != SPELL_MISS_NONE) - { - return; - } - - GetHitUnit()->SetPower(POWER_ENERGY, 0); - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_EJECT_ALL_PASSENGERS, TRIGGERED_FULL_MASK); + return; } - void Register() override - { - BeforeHit += BeforeSpellHitFn(spell_igb_below_zero_SpellScript::RemovePassengers); - } - }; + GetHitUnit()->SetPower(POWER_ENERGY, 0); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_EJECT_ALL_PASSENGERS, TRIGGERED_FULL_MASK); + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_igb_below_zero_SpellScript(); + BeforeHit += BeforeSpellHitFn(spell_igb_below_zero::RemovePassengers); } }; -class spell_igb_on_gunship_deck : public SpellScriptLoader +class spell_igb_on_gunship_deck_aura : public AuraScript { -public: - spell_igb_on_gunship_deck() : SpellScriptLoader("spell_igb_on_gunship_deck") { } + PrepareAuraScript(spell_igb_on_gunship_deck_aura); - class spell_igb_on_gunship_deck_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_igb_on_gunship_deck_AuraScript); - - bool Load() override - { - if (InstanceScript* instance = GetOwner()->GetInstanceScript()) - _teamIdInInstance = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); - else - _teamIdInInstance = TEAM_ALLIANCE; - return true; - } - - bool CheckAreaTarget(Unit* unit) - { - return unit->GetTypeId() == TYPEID_PLAYER; - } - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - bool enemy = GetSpellInfo()->Id == uint32(_teamIdInInstance == TEAM_HORDE ? SPELL_ON_SKYBREAKER_DECK : SPELL_ON_ORGRIMS_HAMMER_DECK); - if (Creature* gunship = GetOwner()->FindNearestCreature(_teamIdInInstance == TEAM_HORDE ? NPC_ORGRIMS_HAMMER : NPC_THE_SKYBREAKER, 200.0f)) - gunship->AI()->SetGUID(GetTarget()->GetGUID(), enemy ? ACTION_SHIP_VISITS_ENEMY : ACTION_SHIP_VISITS_SELF); - } - - void Register() override - { - DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_igb_on_gunship_deck_AuraScript::CheckAreaTarget); - AfterEffectApply += AuraEffectApplyFn(spell_igb_on_gunship_deck_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - TeamId _teamIdInInstance; - }; - - AuraScript* GetAuraScript() const override - { - return new spell_igb_on_gunship_deck_AuraScript(); + if (InstanceScript* instance = GetOwner()->GetInstanceScript()) + _teamIdInInstance = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); + else + _teamIdInInstance = TEAM_ALLIANCE; + return true; } + + bool CheckAreaTarget(Unit* unit) + { + return unit->GetTypeId() == TYPEID_PLAYER; + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + bool enemy = GetSpellInfo()->Id == uint32(_teamIdInInstance == TEAM_HORDE ? SPELL_ON_SKYBREAKER_DECK : SPELL_ON_ORGRIMS_HAMMER_DECK); + if (Creature* gunship = GetOwner()->FindNearestCreature(_teamIdInInstance == TEAM_HORDE ? NPC_ORGRIMS_HAMMER : NPC_THE_SKYBREAKER, 200.0f)) + gunship->AI()->SetGUID(GetTarget()->GetGUID(), enemy ? ACTION_SHIP_VISITS_ENEMY : ACTION_SHIP_VISITS_SELF); + } + + void Register() override + { + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_igb_on_gunship_deck_aura::CheckAreaTarget); + AfterEffectApply += AuraEffectApplyFn(spell_igb_on_gunship_deck_aura::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + +private: + TeamId _teamIdInInstance; }; class achievement_im_on_a_boat : public AchievementCriteriaScript @@ -2799,24 +2630,24 @@ void AddSC_boss_icecrown_gunship_battle() new npc_gunship_mage(); new npc_gunship_gunner(); new npc_gunship_rocketeer(); - new spell_igb_rocket_pack(); - new spell_igb_rocket_pack_useable(); - new spell_igb_teleport_to_enemy_ship(); - new spell_igb_check_for_players(); - new spell_igb_gunship_fall_teleport(); - new spell_igb_explosion_main(); - new spell_igb_explosion(); - new spell_igb_teleport_players_on_victory(); - new spell_igb_periodic_trigger_with_power_cost(); - new spell_igb_overheat(); - new spell_igb_cannon_blast(); - new spell_igb_incinerating_blast(); - new spell_igb_burning_pitch_selector(); - new spell_igb_burning_pitch(); - new spell_igb_rocket_artillery(); - new spell_igb_rocket_artillery_explosion(); - new spell_igb_below_zero(); - new spell_igb_on_gunship_deck(); + RegisterSpellScript(spell_igb_rocket_pack_aura); + RegisterSpellScript(spell_igb_rocket_pack_useable_aura); + RegisterSpellScript(spell_igb_teleport_to_enemy_ship); + RegisterSpellScript(spell_igb_check_for_players); + RegisterSpellScript(spell_igb_gunship_fall_teleport); + RegisterSpellScript(spell_igb_explosion_main_aura); + RegisterSpellScript(spell_igb_explosion); + RegisterSpellScript(spell_igb_teleport_players_on_victory); + RegisterSpellScript(spell_igb_periodic_trigger_with_power_cost_aura); + RegisterSpellScript(spell_igb_overheat_aura); + RegisterSpellScript(spell_igb_cannon_blast); + RegisterSpellScript(spell_igb_incinerating_blast); + RegisterSpellScript(spell_igb_burning_pitch_selector); + RegisterSpellScript(spell_igb_burning_pitch); + RegisterSpellScript(spell_igb_rocket_artillery); + RegisterSpellScript(spell_igb_rocket_artillery_explosion); + RegisterSpellScript(spell_igb_below_zero); + RegisterSpellScript(spell_igb_on_gunship_deck_aura); new achievement_im_on_a_boat(); RegisterSpellScript(spell_igb_battle_experience_check); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index cc62e50a9..4e28ec371 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -1113,35 +1113,24 @@ public: } }; -class spell_deathwhisper_mana_barrier : public SpellScriptLoader +class spell_deathwhisper_mana_barrier_aura : public AuraScript { -public: - spell_deathwhisper_mana_barrier() : SpellScriptLoader("spell_deathwhisper_mana_barrier") { } + PrepareAuraScript(spell_deathwhisper_mana_barrier_aura); - class spell_deathwhisper_mana_barrier_AuraScript : public AuraScript + void HandlePeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_deathwhisper_mana_barrier_AuraScript); - - void HandlePeriodicTick(AuraEffect const* /*aurEff*/) + PreventDefaultAction(); + if (Unit* caster = GetCaster()) { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - { - int32 missingHealth = int32(caster->GetMaxHealth() - caster->GetHealth()); - caster->ModifyHealth(missingHealth); - caster->ModifyPower(POWER_MANA, -missingHealth); - } + int32 missingHealth = int32(caster->GetMaxHealth() - caster->GetHealth()); + caster->ModifyHealth(missingHealth); + caster->ModifyPower(POWER_MANA, -missingHealth); } + } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_deathwhisper_mana_barrier_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_deathwhisper_mana_barrier_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_deathwhisper_mana_barrier_aura::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -1197,7 +1186,7 @@ void AddSC_boss_lady_deathwhisper() new npc_darnavan(); // Spells - new spell_deathwhisper_mana_barrier(); + RegisterSpellScript(spell_deathwhisper_mana_barrier_aura); RegisterSpellScript(spell_deathwhisper_dark_reckoning); // AreaTriggers diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 3c6c04ed0..b27a314ad 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -475,229 +475,180 @@ public: } }; -class spell_marrowgar_coldflame : public SpellScriptLoader +class spell_marrowgar_coldflame : public SpellScript { -public: - spell_marrowgar_coldflame() : SpellScriptLoader("spell_marrowgar_coldflame") { } + PrepareSpellScript(spell_marrowgar_coldflame); - class spell_marrowgar_coldflame_SpellScript : public SpellScript + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_marrowgar_coldflame_SpellScript); + targets.clear(); + Unit* target = GetCaster()->GetAI()->SelectTarget(SelectTargetMethod::Random, 1, -1.0f, true,true, -SPELL_IMPALED); // -1.0f as it takes into account object size + if (!target) + target = GetCaster()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true); // if only tank or noone outside of boss' model + if (!target) + return; - void SelectTarget(std::list& targets) + targets.push_back(target); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + float angle = caster->GetAngle(GetHitUnit()); + float dist = caster->GetObjectSize() / 2.0f; + float z = caster->GetPositionZ() + 2.5f; + float nx = caster->GetPositionX() + dist * cos(angle); + float ny = caster->GetPositionY() + dist * std::sin(angle); + + if (!caster->IsWithinLOS(nx, ny, z)) { - targets.clear(); - Unit* target = GetCaster()->GetAI()->SelectTarget(SelectTargetMethod::Random, 1, -1.0f, true,true, -SPELL_IMPALED); // -1.0f as it takes into account object size - if (!target) - target = GetCaster()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true); // if only tank or noone outside of boss' model - if (!target) - return; - - targets.push_back(target); + nx = caster->GetPositionX() + 0.5f * cos(angle); + ny = caster->GetPositionY() + 0.5f * std::sin(angle); } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (caster->IsWithinLOS(nx, ny, z)) { - Unit* caster = GetCaster(); - float angle = caster->GetAngle(GetHitUnit()); - float dist = caster->GetObjectSize() / 2.0f; - float z = caster->GetPositionZ() + 2.5f; - float nx = caster->GetPositionX() + dist * cos(angle); - float ny = caster->GetPositionY() + dist * std::sin(angle); + caster->SetOrientation(angle); + caster->CastSpell(nx, ny, z, uint32(GetEffectValue()), true); + } + } - if (!caster->IsWithinLOS(nx, ny, z)) + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_marrowgar_coldflame::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_marrowgar_coldflame::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_marrowgar_bone_spike_graveyard : public SpellScript +{ + PrepareSpellScript(spell_marrowgar_bone_spike_graveyard); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_IMPALED }); + } + + void HandleSpikes(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Creature* marrowgar = GetCaster()->ToCreature()) + { + bool didHit = false; + CreatureAI* marrowgarAI = marrowgar->AI(); + uint8 boneSpikeCount = uint8(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1); + + std::vector validPlayers; + Map::PlayerList const& pList = marrowgar->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) + if (Player* plr = itr->GetSource()) + if (plr->IsAlive() && !plr->IsGameMaster() && plr->GetExactDist2dSq(marrowgar) < (150.0f * 150.0f) && !plr->HasAura(SPELL_IMPALED)) + if (!marrowgar->GetVictim() || marrowgar->GetVictim()->GetGUID() != plr->GetGUID()) + if (plr->GetGUID() != marrowgarAI->GetGUID(0) && plr->GetGUID() != marrowgarAI->GetGUID(1) && plr->GetGUID() != marrowgarAI->GetGUID(2)) // not a bone slice target + validPlayers.push_back(plr); + + std::vector::iterator begin = validPlayers.begin(), end = validPlayers.end(); + + std::random_device rd; + std::shuffle(begin, end, std::default_random_engine{rd()}); + + for (uint8 i = 0; i < boneSpikeCount && i < validPlayers.size(); ++i) { - nx = caster->GetPositionX() + 0.5f * cos(angle); - ny = caster->GetPositionY() + 0.5f * std::sin(angle); + Unit* target = validPlayers[i]; + didHit = true; + //target->CastCustomSpell(boneSpikeSummonId[i], SPELLVALUE_BASE_POINT0, 0, target, true); + target->CastSpell(target, boneSpikeSummonId[i], true); } + if (didHit) + marrowgarAI->Talk(SAY_BONESPIKE); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_marrowgar_bone_spike_graveyard::HandleSpikes, EFFECT_1, SPELL_EFFECT_APPLY_AURA); + } +}; + +class spell_marrowgar_coldflame_bonestorm : public SpellScript +{ + PrepareSpellScript(spell_marrowgar_coldflame_bonestorm); + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Unit* caster = GetCaster(); + float x = caster->GetPositionX(); + float y = caster->GetPositionY(); + float z = caster->GetPositionZ() + 2.5f; + for (uint8 i = 0; i < 4; ++i) + { + float nx = x + 2.5f * cos((M_PI / 4) + (i * (M_PI / 2))); + float ny = y + 2.5f * std::sin((M_PI / 4) + (i * (M_PI / 2))); if (caster->IsWithinLOS(nx, ny, z)) { - caster->SetOrientation(angle); - caster->CastSpell(nx, ny, z, uint32(GetEffectValue()), true); + caster->SetOrientation((M_PI / 4) + (i * (M_PI / 2))); + caster->CastSpell(nx, ny, z, uint32(GetEffectValue() + i), true); } } + } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_marrowgar_coldflame_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_marrowgar_coldflame_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_marrowgar_coldflame_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_marrowgar_coldflame_bonestorm::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_marrowgar_bone_spike_graveyard : public SpellScriptLoader +class spell_marrowgar_bone_storm : public SpellScript { -public: - spell_marrowgar_bone_spike_graveyard() : SpellScriptLoader("spell_marrowgar_bone_spike_graveyard") { } + PrepareSpellScript(spell_marrowgar_bone_storm); - class spell_marrowgar_bone_spike_graveyard_SpellScript : public SpellScript + void RecalculateDamage() { - PrepareSpellScript(spell_marrowgar_bone_spike_graveyard_SpellScript); + float dist = GetHitUnit()->GetExactDist2d(GetCaster()); + if (dist >= 9.0f) dist -= 9.0f; + else dist = 0.0f; + SetHitDamage(int32(GetHitDamage() / std::max(sqrtf(dist), 1.0f))); + } - void HandleSpikes(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Creature* marrowgar = GetCaster()->ToCreature()) - { - bool didHit = false; - CreatureAI* marrowgarAI = marrowgar->AI(); - uint8 boneSpikeCount = uint8(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1); - - std::vector validPlayers; - Map::PlayerList const& pList = marrowgar->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - if (Player* plr = itr->GetSource()) - if (plr->IsAlive() && !plr->IsGameMaster() && plr->GetExactDist2dSq(marrowgar) < (150.0f * 150.0f) && !plr->HasAura(SPELL_IMPALED)) - if (!marrowgar->GetVictim() || marrowgar->GetVictim()->GetGUID() != plr->GetGUID()) - if (plr->GetGUID() != marrowgarAI->GetGUID(0) && plr->GetGUID() != marrowgarAI->GetGUID(1) && plr->GetGUID() != marrowgarAI->GetGUID(2)) // not a bone slice target - validPlayers.push_back(plr); - - std::vector::iterator begin = validPlayers.begin(), end = validPlayers.end(); - - std::random_device rd; - std::shuffle(begin, end, std::default_random_engine{rd()}); - - for (uint8 i = 0; i < boneSpikeCount && i < validPlayers.size(); ++i) - { - Unit* target = validPlayers[i]; - didHit = true; - //target->CastCustomSpell(boneSpikeSummonId[i], SPELLVALUE_BASE_POINT0, 0, target, true); - target->CastSpell(target, boneSpikeSummonId[i], true); - } - - if (didHit) - marrowgarAI->Talk(SAY_BONESPIKE); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_marrowgar_bone_spike_graveyard_SpellScript::HandleSpikes, EFFECT_1, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_marrowgar_bone_spike_graveyard_SpellScript(); + OnHit += SpellHitFn(spell_marrowgar_bone_storm::RecalculateDamage); } }; -class spell_marrowgar_coldflame_bonestorm : public SpellScriptLoader +class spell_marrowgar_bone_slice : public SpellScript { -public: - spell_marrowgar_coldflame_bonestorm() : SpellScriptLoader("spell_marrowgar_coldflame_bonestorm") { } + PrepareSpellScript(spell_marrowgar_bone_slice); - class spell_marrowgar_coldflame_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_marrowgar_coldflame_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Unit* caster = GetCaster(); - float x = caster->GetPositionX(); - float y = caster->GetPositionY(); - float z = caster->GetPositionZ() + 2.5f; - for (uint8 i = 0; i < 4; ++i) - { - float nx = x + 2.5f * cos((M_PI / 4) + (i * (M_PI / 2))); - float ny = y + 2.5f * std::sin((M_PI / 4) + (i * (M_PI / 2))); - if (caster->IsWithinLOS(nx, ny, z)) - { - caster->SetOrientation((M_PI / 4) + (i * (M_PI / 2))); - caster->CastSpell(nx, ny, z, uint32(GetEffectValue() + i), true); - } - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_marrowgar_coldflame_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_marrowgar_coldflame_SpellScript(); + _targetCount = 0; + return true; } -}; -class spell_marrowgar_bone_storm : public SpellScriptLoader -{ -public: - spell_marrowgar_bone_storm() : SpellScriptLoader("spell_marrowgar_bone_storm") { } - - class spell_marrowgar_bone_storm_SpellScript : public SpellScript + void CountTargets(std::list& targets) { - PrepareSpellScript(spell_marrowgar_bone_storm_SpellScript); - - void RecalculateDamage() - { - float dist = GetHitUnit()->GetExactDist2d(GetCaster()); - if (dist >= 9.0f) dist -= 9.0f; - else dist = 0.0f; - SetHitDamage(int32(GetHitDamage() / std::max(sqrtf(dist), 1.0f))); - } - - void Register() override - { - OnHit += SpellHitFn(spell_marrowgar_bone_storm_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_marrowgar_bone_storm_SpellScript(); + _targetCount = std::min(targets.size(), GetSpellInfo()->MaxAffectedTargets); } -}; -class spell_marrowgar_bone_slice : public SpellScriptLoader -{ -public: - spell_marrowgar_bone_slice() : SpellScriptLoader("spell_marrowgar_bone_slice") { } - - class spell_marrowgar_bone_slice_SpellScript : public SpellScript + void SplitDamage() { - PrepareSpellScript(spell_marrowgar_bone_slice_SpellScript); + if (!_targetCount) + return; // This spell can miss all targets - bool Load() override - { - _targetCount = 0; - return true; - } - - void CountTargets(std::list& targets) - { - _targetCount = std::min(targets.size(), GetSpellInfo()->MaxAffectedTargets); - } - - void SplitDamage() - { - if (!_targetCount) - return; // This spell can miss all targets - - SetHitDamage(GetHitDamage() / _targetCount); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_marrowgar_bone_slice_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - OnHit += SpellHitFn(spell_marrowgar_bone_slice_SpellScript::SplitDamage); - } - - uint32 _targetCount; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_marrowgar_bone_slice_SpellScript(); + SetHitDamage(GetHitDamage() / _targetCount); } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_marrowgar_bone_slice::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnHit += SpellHitFn(spell_marrowgar_bone_slice::SplitDamage); + } + +private: + uint32 _targetCount; }; void AddSC_boss_lord_marrowgar() @@ -705,10 +656,10 @@ void AddSC_boss_lord_marrowgar() RegisterIcecrownCitadelCreatureAI(boss_lord_marrowgar); new npc_coldflame(); new npc_bone_spike(); - new spell_marrowgar_coldflame(); - new spell_marrowgar_coldflame_bonestorm(); - new spell_marrowgar_bone_spike_graveyard(); - new spell_marrowgar_bone_storm(); - new spell_marrowgar_bone_slice(); + RegisterSpellScript(spell_marrowgar_coldflame); + RegisterSpellScript(spell_marrowgar_coldflame_bonestorm); + RegisterSpellScript(spell_marrowgar_bone_spike_graveyard); + RegisterSpellScript(spell_marrowgar_bone_storm); + RegisterSpellScript(spell_marrowgar_bone_slice); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 491d951c5..242866a20 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -873,835 +873,652 @@ public: } }; -class spell_putricide_slime_puddle : public SpellScriptLoader +class spell_putricide_slime_puddle : public SpellScript { -public: - spell_putricide_slime_puddle() : SpellScriptLoader("spell_putricide_slime_puddle") { } + PrepareSpellScript(spell_putricide_slime_puddle); - class spell_putricide_slime_puddle_SpellScript : public SpellScript + void ScaleRange(std::list& targets) { - PrepareSpellScript(spell_putricide_slime_puddle_SpellScript); + targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 2.5f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X), true)); + } - void ScaleRange(std::list& targets) + // big hax to unlock Abomination Eat Ooze ability, requires caster aura spell from difficulty X, but unlocks clientside when got base aura + void HandleScript(SpellEffIndex /*effIndex*/) + { + SpellInfo const* s1 = sSpellMgr->GetSpellInfo(70346); + SpellInfo const* s2 = sSpellMgr->GetSpellInfo(72456); + if (s1 && s2) + if (Unit* target = GetHitUnit()) + { + Aura::TryRefreshStackOrCreate(s1, MAX_EFFECT_MASK, target, target); + Aura::TryRefreshStackOrCreate(s2, MAX_EFFECT_MASK, target, target); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_slime_puddle::ScaleRange, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_slime_puddle::ScaleRange, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_putricide_slime_puddle::HandleScript, EFFECT_1, SPELL_EFFECT_APPLY_AURA); + } +}; + +class spell_putricide_slime_puddle_spawn : public SpellScript +{ + PrepareSpellScript(spell_putricide_slime_puddle_spawn); + + void SelectDest() + { + if (Position* dest = const_cast(GetExplTargetDest())) { - targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 2.5f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X), true)); + float destZ = 395.0f; // random number close to ground, get exact in next call + GetCaster()->UpdateGroundPositionZ(dest->GetPositionX(), dest->GetPositionY(), destZ); + dest->m_positionZ = destZ; + } + } + + void Register() override + { + BeforeCast += SpellCastFn(spell_putricide_slime_puddle_spawn::SelectDest); + } +}; + +class spell_putricide_grow_stacker_aura : public AuraScript +{ + PrepareAuraScript(spell_putricide_grow_stacker_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TEAR_GAS_CREATURE }); + } + + void HandleTriggerSpell(AuraEffect const* /*aurEff*/) + { + if (Unit* target = GetTarget()) + if (target->HasAura(SPELL_TEAR_GAS_CREATURE)) + PreventDefaultAction(); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_grow_stacker_aura::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_putricide_unstable_experiment : public SpellScript +{ + PrepareSpellScript(spell_putricide_unstable_experiment); + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (GetCaster()->GetTypeId() != TYPEID_UNIT) + return; + + Creature* creature = GetCaster()->ToCreature(); + + uint8 stage = creature->AI()->GetData(DATA_EXPERIMENT_STAGE); + creature->AI()->SetData(DATA_EXPERIMENT_STAGE, stage ? 0 : 1); + + Creature* target = nullptr; + std::list creList; + GetCreatureListWithEntryInGrid(creList, GetCaster(), NPC_ABOMINATION_WING_MAD_SCIENTIST_STALKER, 200.0f); + for (std::list::iterator itr = creList.begin(); itr != creList.end(); ++itr) + if (((*itr)->GetPositionX() > 4350.0f && stage == 0) || ((*itr)->GetPositionX() < 4350.0f && stage == 1)) + { + target = (*itr); + break; + } + + if (target) + { + if (Aura* aura = target->GetAura(uint32(GetSpellInfo()->Effects[stage].CalcValue()))) + if (aura->GetOwner() == target) // avoid assert(false) at any cost + aura->UpdateOwner(5000, target); // update whole aura so previous periodic ticks before refreshed by new one } - // big hax to unlock Abomination Eat Ooze ability, requires caster aura spell from difficulty X, but unlocks clientside when got base aura - void HandleScript(SpellEffIndex /*effIndex*/) + GetCaster()->CastSpell(target, uint32(GetSpellInfo()->Effects[stage].CalcValue()), true, nullptr, nullptr, GetCaster()->GetGUID()); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_putricide_unstable_experiment::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_putricide_tear_gas_effect : public SpellScript +{ + PrepareSpellScript(spell_putricide_tear_gas_effect); + + void FilterTargets(std::list& targets) + { + // vanish rank 1-3, mage invisibility + targets.remove_if(Acore::UnitAuraCheck(true, 11327)); + targets.remove_if(Acore::UnitAuraCheck(true, 11329)); + targets.remove_if(Acore::UnitAuraCheck(true, 26888)); + targets.remove_if(Acore::UnitAuraCheck(true, 32612)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_tear_gas_effect::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_tear_gas_effect::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + } +}; + +class spell_putricide_gaseous_bloat_aura : public AuraScript +{ + PrepareAuraScript(spell_putricide_gaseous_bloat_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_GASEOUS_BLOAT }); + } + + void HandleExtraEffect(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + target->RemoveAuraFromStack(GetSpellInfo()->Id, GetCasterGUID()); + /*if (!target->HasAura(GetId())) + if (Unit* caster = GetCaster()) + caster->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, caster, false);*/ + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_gaseous_bloat_aura::HandleExtraEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } +}; + +class spell_putricide_ooze_channel : public SpellScript +{ + PrepareSpellScript(spell_putricide_ooze_channel); + + bool Validate(SpellInfo const* spell) override + { + return ValidateSpellInfo({ spell->ExcludeTargetAuraSpell }); + } + + // set up initial variables and check if caster is creature + // this will let use safely use ToCreature() casts in entire script + bool Load() override + { + _target = nullptr; + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void SelectTarget(std::list& targets) + { + // dbc has only 1 field for excluding, this will prevent anyone from getting both at the same time + targets.remove_if(Acore::UnitAuraCheck(true, SPELL_VOLATILE_OOZE_PROTECTION)); + targets.remove_if(Acore::UnitAuraCheck(true, SPELL_GASEOUS_BLOAT_PROTECTION)); + + if (targets.empty()) { - SpellInfo const* s1 = sSpellMgr->GetSpellInfo(70346); - SpellInfo const* s2 = sSpellMgr->GetSpellInfo(72456); - if (s1 && s2) - if (Unit* target = GetHitUnit()) + FinishCast(SPELL_FAILED_NO_VALID_TARGETS); + GetCaster()->ToCreature()->DespawnOrUnsummon(1); // despawn next update + return; + } + + WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + _target = target; + } + + void SetTarget(std::list& targets) + { + targets.clear(); + if (_target) + targets.push_back(_target); + } + + void StartAttack() + { + GetCaster()->ClearUnitState(UNIT_STATE_CASTING); + GetCaster()->GetThreatMgr().ClearAllThreat(); + GetCaster()->ToCreature()->SetInCombatWithZone(); + GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); + GetCaster()->AddThreat(GetHitUnit(), 500000000.0f); // value seen in sniff + if (Creature* c = GetCaster()->ToCreature()) + c->AI()->SetGUID(GetHitUnit()->GetGUID(), -1); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel::SetTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel::SetTarget, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); + AfterHit += SpellHitFn(spell_putricide_ooze_channel::StartAttack); + } + +private: + WorldObject* _target; +}; + +class spell_putricide_ooze_eruption_searcher : public SpellScript +{ + PrepareSpellScript(spell_putricide_ooze_eruption_searcher); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_OOZE_ERUPTION }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + uint32 adhesiveId = sSpellMgr->GetSpellIdForDifficulty(SPELL_VOLATILE_OOZE_ADHESIVE, GetCaster()); + if (GetHitUnit()->HasAura(adhesiveId)) + { + GetHitUnit()->RemoveAurasDueToSpell(adhesiveId, GetCaster()->GetGUID(), 0, AURA_REMOVE_BY_ENEMY_SPELL); + GetCaster()->CastSpell(GetHitUnit(), SPELL_OOZE_ERUPTION, true); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_putricide_ooze_eruption_searcher::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_putricide_mutated_plague_aura : public AuraScript +{ + PrepareAuraScript(spell_putricide_mutated_plague_aura); + + void HandleTriggerSpell(AuraEffect const* aurEff) + { + PreventDefaultAction(); + Unit* caster = GetCaster(); + if (!caster) + return; + + uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + SpellInfo const* spell = sSpellMgr->AssertSpellInfo(triggerSpell); + spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, caster); + + int32 damage = spell->Effects[EFFECT_0].CalcValue(caster); + damage = damage * pow(2.5f, GetStackAmount()); + + GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true, nullptr, aurEff, GetCasterGUID()); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + uint32 healSpell = uint32(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); + SpellInfo const* spell = sSpellMgr->GetSpellInfo(healSpell); + if (!spell) + return; + spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, GetTarget()); + int32 healAmount = spell->Effects[EFFECT_0].CalcValue(); + healAmount *= GetStackAmount(); + GetTarget()->CastCustomSpell(healSpell, SPELLVALUE_BASE_POINT0, healAmount, GetTarget(), TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_mutated_plague_aura::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutated_plague_aura::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_putricide_unbound_plague : public SpellScript +{ + PrepareSpellScript(spell_putricide_unbound_plague); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_UNBOUND_PLAGUE, SPELL_UNBOUND_PLAGUE_SEARCHER }); + } + + void FilterTargets(std::list& targets) + { + if (AuraEffect const* eff = GetCaster()->GetAuraEffect(SPELL_UNBOUND_PLAGUE_SEARCHER, EFFECT_0)) + { + if (eff->GetTickNumber() < 2) + { + targets.clear(); + return; + } + } + + targets.remove_if(Acore::UnitAuraCheck(true, sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()))); + Acore::Containers::RandomResize(targets, 1); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (!GetHitUnit()) + return; + + InstanceScript* instance = GetCaster()->GetInstanceScript(); + if (!instance) + return; + + uint32 plagueId = sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()); + + if (!GetHitUnit()->HasAura(plagueId)) + { + if (Creature* professor = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) + { + if (Aura* oldPlague = GetCaster()->GetAura(plagueId, professor->GetGUID())) { - Aura::TryRefreshStackOrCreate(s1, MAX_EFFECT_MASK, target, target); - Aura::TryRefreshStackOrCreate(s2, MAX_EFFECT_MASK, target, target); - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_slime_puddle_SpellScript::ScaleRange, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_slime_puddle_SpellScript::ScaleRange, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_putricide_slime_puddle_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_slime_puddle_SpellScript(); - } -}; - -class spell_putricide_slime_puddle_spawn : public SpellScriptLoader -{ -public: - spell_putricide_slime_puddle_spawn() : SpellScriptLoader("spell_putricide_slime_puddle_spawn") { } - - class spell_putricide_slime_puddle_spawn_SpellScript : public SpellScript - { - PrepareSpellScript(spell_putricide_slime_puddle_spawn_SpellScript); - - void SelectDest() - { - if (Position* dest = const_cast(GetExplTargetDest())) - { - float destZ = 395.0f; // random number close to ground, get exact in next call - GetCaster()->UpdateGroundPositionZ(dest->GetPositionX(), dest->GetPositionY(), destZ); - dest->m_positionZ = destZ; - } - } - - void Register() override - { - BeforeCast += SpellCastFn(spell_putricide_slime_puddle_spawn_SpellScript::SelectDest); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_slime_puddle_spawn_SpellScript(); - } -}; - -class spell_putricide_grow_stacker : public SpellScriptLoader -{ -public: - spell_putricide_grow_stacker() : SpellScriptLoader("spell_putricide_grow_stacker") { } - - class spell_putricide_grow_stacker_AuraScript : public AuraScript - { - PrepareAuraScript(spell_putricide_grow_stacker_AuraScript); - - void HandleTriggerSpell(AuraEffect const* /*aurEff*/) - { - if (Unit* target = GetTarget()) - if (target->HasAura(SPELL_TEAR_GAS_CREATURE)) - PreventDefaultAction(); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_grow_stacker_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_putricide_grow_stacker_AuraScript(); - } -}; - -class spell_putricide_unstable_experiment : public SpellScriptLoader -{ -public: - spell_putricide_unstable_experiment() : SpellScriptLoader("spell_putricide_unstable_experiment") { } - - class spell_putricide_unstable_experiment_SpellScript : public SpellScript - { - PrepareSpellScript(spell_putricide_unstable_experiment_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (GetCaster()->GetTypeId() != TYPEID_UNIT) - return; - - Creature* creature = GetCaster()->ToCreature(); - - uint8 stage = creature->AI()->GetData(DATA_EXPERIMENT_STAGE); - creature->AI()->SetData(DATA_EXPERIMENT_STAGE, stage ? 0 : 1); - - Creature* target = nullptr; - std::list creList; - GetCreatureListWithEntryInGrid(creList, GetCaster(), NPC_ABOMINATION_WING_MAD_SCIENTIST_STALKER, 200.0f); - for (std::list::iterator itr = creList.begin(); itr != creList.end(); ++itr) - if (((*itr)->GetPositionX() > 4350.0f && stage == 0) || ((*itr)->GetPositionX() < 4350.0f && stage == 1)) - { - target = (*itr); - break; - } - - if (target) - { - if (Aura* aura = target->GetAura(uint32(GetSpellInfo()->Effects[stage].CalcValue()))) - if (aura->GetOwner() == target) // avoid assert(false) at any cost - aura->UpdateOwner(5000, target); // update whole aura so previous periodic ticks before refreshed by new one - } - - GetCaster()->CastSpell(target, uint32(GetSpellInfo()->Effects[stage].CalcValue()), true, nullptr, nullptr, GetCaster()->GetGUID()); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_unstable_experiment_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_unstable_experiment_SpellScript(); - } -}; - -class spell_putricide_tear_gas_effect : public SpellScriptLoader -{ -public: - spell_putricide_tear_gas_effect() : SpellScriptLoader("spell_putricide_tear_gas_effect") { } - - class spell_putricide_tear_gas_effect_SpellScript : public SpellScript - { - PrepareSpellScript(spell_putricide_tear_gas_effect_SpellScript); - - void FilterTargets(std::list& targets) - { - // vanish rank 1-3, mage invisibility - targets.remove_if(Acore::UnitAuraCheck(true, 11327)); - targets.remove_if(Acore::UnitAuraCheck(true, 11329)); - targets.remove_if(Acore::UnitAuraCheck(true, 26888)); - targets.remove_if(Acore::UnitAuraCheck(true, 32612)); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_tear_gas_effect_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_tear_gas_effect_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_tear_gas_effect_SpellScript(); - } -}; - -class spell_putricide_gaseous_bloat : public SpellScriptLoader -{ -public: - spell_putricide_gaseous_bloat() : SpellScriptLoader("spell_putricide_gaseous_bloat") { } - - class spell_putricide_gaseous_bloat_AuraScript : public AuraScript - { - PrepareAuraScript(spell_putricide_gaseous_bloat_AuraScript); - - void HandleExtraEffect(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - target->RemoveAuraFromStack(GetSpellInfo()->Id, GetCasterGUID()); - /*if (!target->HasAura(GetId())) - if (Unit* caster = GetCaster()) - caster->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, caster, false);*/ - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_gaseous_bloat_AuraScript::HandleExtraEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_putricide_gaseous_bloat_AuraScript(); - } -}; - -class spell_putricide_ooze_channel : public SpellScriptLoader -{ -public: - spell_putricide_ooze_channel() : SpellScriptLoader("spell_putricide_ooze_channel") { } - - class spell_putricide_ooze_channel_SpellScript : public SpellScript - { - PrepareSpellScript(spell_putricide_ooze_channel_SpellScript); - - bool Validate(SpellInfo const* spell) override - { - return ValidateSpellInfo({ spell->ExcludeTargetAuraSpell }); - } - - // set up initial variables and check if caster is creature - // this will let use safely use ToCreature() casts in entire script - bool Load() override - { - _target = nullptr; - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void SelectTarget(std::list& targets) - { - // dbc has only 1 field for excluding, this will prevent anyone from getting both at the same time - targets.remove_if(Acore::UnitAuraCheck(true, SPELL_VOLATILE_OOZE_PROTECTION)); - targets.remove_if(Acore::UnitAuraCheck(true, SPELL_GASEOUS_BLOAT_PROTECTION)); - - if (targets.empty()) - { - FinishCast(SPELL_FAILED_NO_VALID_TARGETS); - GetCaster()->ToCreature()->DespawnOrUnsummon(1); // despawn next update - return; - } - - WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - _target = target; - } - - void SetTarget(std::list& targets) - { - targets.clear(); - if (_target) - targets.push_back(_target); - } - - void StartAttack() - { - GetCaster()->ClearUnitState(UNIT_STATE_CASTING); - GetCaster()->GetThreatMgr().ClearAllThreat(); - GetCaster()->ToCreature()->SetInCombatWithZone(); - GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); - GetCaster()->AddThreat(GetHitUnit(), 500000000.0f); // value seen in sniff - if (Creature* c = GetCaster()->ToCreature()) - c->AI()->SetGUID(GetHitUnit()->GetGUID(), -1); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); - AfterHit += SpellHitFn(spell_putricide_ooze_channel_SpellScript::StartAttack); - } - - WorldObject* _target; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_ooze_channel_SpellScript(); - } -}; - -class spell_putricide_ooze_eruption_searcher : public SpellScriptLoader -{ -public: - spell_putricide_ooze_eruption_searcher() : SpellScriptLoader("spell_putricide_ooze_eruption_searcher") { } - - class spell_putricide_ooze_eruption_searcher_SpellScript : public SpellScript - { - PrepareSpellScript(spell_putricide_ooze_eruption_searcher_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - uint32 adhesiveId = sSpellMgr->GetSpellIdForDifficulty(SPELL_VOLATILE_OOZE_ADHESIVE, GetCaster()); - if (GetHitUnit()->HasAura(adhesiveId)) - { - GetHitUnit()->RemoveAurasDueToSpell(adhesiveId, GetCaster()->GetGUID(), 0, AURA_REMOVE_BY_ENEMY_SPELL); - GetCaster()->CastSpell(GetHitUnit(), SPELL_OOZE_ERUPTION, true); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_ooze_eruption_searcher_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_ooze_eruption_searcher_SpellScript(); - } -}; - -class spell_putricide_mutated_plague : public SpellScriptLoader -{ -public: - spell_putricide_mutated_plague() : SpellScriptLoader("spell_putricide_mutated_plague") { } - - class spell_putricide_mutated_plague_AuraScript : public AuraScript - { - PrepareAuraScript(spell_putricide_mutated_plague_AuraScript); - - void HandleTriggerSpell(AuraEffect const* aurEff) - { - PreventDefaultAction(); - Unit* caster = GetCaster(); - if (!caster) - return; - - uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; - SpellInfo const* spell = sSpellMgr->AssertSpellInfo(triggerSpell); - spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, caster); - - int32 damage = spell->Effects[EFFECT_0].CalcValue(caster); - damage = damage * pow(2.5f, GetStackAmount()); - - GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true, nullptr, aurEff, GetCasterGUID()); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - uint32 healSpell = uint32(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); - SpellInfo const* spell = sSpellMgr->GetSpellInfo(healSpell); - if (!spell) - return; - spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, GetTarget()); - int32 healAmount = spell->Effects[EFFECT_0].CalcValue(); - healAmount *= GetStackAmount(); - GetTarget()->CastCustomSpell(healSpell, SPELLVALUE_BASE_POINT0, healAmount, GetTarget(), TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_mutated_plague_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutated_plague_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_putricide_mutated_plague_AuraScript(); - } -}; - -class spell_putricide_unbound_plague : public SpellScriptLoader -{ -public: - spell_putricide_unbound_plague() : SpellScriptLoader("spell_putricide_unbound_plague") { } - - class spell_putricide_unbound_plague_SpellScript : public SpellScript - { - PrepareSpellScript(spell_putricide_unbound_plague_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_UNBOUND_PLAGUE, SPELL_UNBOUND_PLAGUE_SEARCHER }); - } - - void FilterTargets(std::list& targets) - { - if (AuraEffect const* eff = GetCaster()->GetAuraEffect(SPELL_UNBOUND_PLAGUE_SEARCHER, EFFECT_0)) - { - if (eff->GetTickNumber() < 2) - { - targets.clear(); - return; - } - } - - targets.remove_if(Acore::UnitAuraCheck(true, sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()))); - Acore::Containers::RandomResize(targets, 1); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (!GetHitUnit()) - return; - - InstanceScript* instance = GetCaster()->GetInstanceScript(); - if (!instance) - return; - - uint32 plagueId = sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()); - - if (!GetHitUnit()->HasAura(plagueId)) - { - if (Creature* professor = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) - { - if (Aura* oldPlague = GetCaster()->GetAura(plagueId, professor->GetGUID())) + if (Aura* newPlague = professor->AddAura(plagueId, GetHitUnit())) { - if (Aura* newPlague = professor->AddAura(plagueId, GetHitUnit())) - { - newPlague->SetMaxDuration(oldPlague->GetMaxDuration()); - newPlague->SetDuration(oldPlague->GetDuration()); - oldPlague->Remove(); - GetCaster()->RemoveAurasDueToSpell(SPELL_UNBOUND_PLAGUE_SEARCHER); - GetCaster()->CastSpell(GetCaster(), SPELL_PLAGUE_SICKNESS, true); - GetCaster()->CastSpell(GetCaster(), SPELL_UNBOUND_PLAGUE_PROTECTION, true); - professor->CastSpell(GetHitUnit(), SPELL_UNBOUND_PLAGUE_SEARCHER, true); - } + newPlague->SetMaxDuration(oldPlague->GetMaxDuration()); + newPlague->SetDuration(oldPlague->GetDuration()); + oldPlague->Remove(); + GetCaster()->RemoveAurasDueToSpell(SPELL_UNBOUND_PLAGUE_SEARCHER); + GetCaster()->CastSpell(GetCaster(), SPELL_PLAGUE_SICKNESS, true); + GetCaster()->CastSpell(GetCaster(), SPELL_UNBOUND_PLAGUE_PROTECTION, true); + professor->CastSpell(GetHitUnit(), SPELL_UNBOUND_PLAGUE_SEARCHER, true); } } } } + } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_unbound_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - OnEffectHitTarget += SpellEffectFn(spell_putricide_unbound_plague_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_putricide_unbound_plague_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_unbound_plague::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + OnEffectHitTarget += SpellEffectFn(spell_putricide_unbound_plague::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_putricide_unbound_plague_dmg : public SpellScriptLoader +class spell_putricide_unbound_plague_dmg_aura : public AuraScript { -public: - spell_putricide_unbound_plague_dmg() : SpellScriptLoader("spell_putricide_unbound_plague_dmg") { } + PrepareAuraScript(spell_putricide_unbound_plague_dmg_aura); - class spell_putricide_unbound_plague_dmg_AuraScript : public AuraScript + void HandlePeriodic(AuraEffect* aurEff) { - PrepareAuraScript(spell_putricide_unbound_plague_dmg_AuraScript); + int32 baseAmt = aurEff->GetSpellInfo()->Effects[0].CalcValue(); + int32 dmg = int32(baseAmt * pow(1.25f, float(aurEff->GetTickNumber()))); + if (dmg <= 0) // safety check, impossible + return; + aurEff->SetAmount(dmg); + } - void HandlePeriodic(AuraEffect* aurEff) - { - int32 baseAmt = aurEff->GetSpellInfo()->Effects[0].CalcValue(); - int32 dmg = int32(baseAmt * pow(1.25f, float(aurEff->GetTickNumber()))); - if (dmg <= 0) // safety check, impossible - return; - aurEff->SetAmount(dmg); - } - - void Register() override - { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_putricide_unbound_plague_dmg_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_putricide_unbound_plague_dmg_AuraScript(); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_putricide_unbound_plague_dmg_aura::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); } }; -class spell_putricide_choking_gas_bomb : public SpellScriptLoader +class spell_putricide_choking_gas_bomb : public SpellScript { -public: - spell_putricide_choking_gas_bomb() : SpellScriptLoader("spell_putricide_choking_gas_bomb") { } + PrepareSpellScript(spell_putricide_choking_gas_bomb); - class spell_putricide_choking_gas_bomb_SpellScript : public SpellScript + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_putricide_choking_gas_bomb_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + uint32 skipIndex = urand(0, 2); + for (uint32 i = 0; i < 3; ++i) { - uint32 skipIndex = urand(0, 2); - for (uint32 i = 0; i < 3; ++i) - { - if (i == skipIndex) - continue; + if (i == skipIndex) + continue; - uint32 spellId = uint32(GetSpellInfo()->Effects[i].CalcValue()); - GetCaster()->CastSpell(GetCaster(), spellId, true, nullptr, nullptr, GetCaster()->GetGUID()); - } + uint32 spellId = uint32(GetSpellInfo()->Effects[i].CalcValue()); + GetCaster()->CastSpell(GetCaster(), spellId, true, nullptr, nullptr, GetCaster()->GetGUID()); } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_choking_gas_bomb_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_putricide_choking_gas_bomb_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_putricide_choking_gas_bomb::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; // Removes aura with id stored in effect value -class spell_putricide_clear_aura_effect_value : public SpellScriptLoader +class spell_putricide_clear_aura_effect_value : public SpellScript { -public: - spell_putricide_clear_aura_effect_value() : SpellScriptLoader("spell_putricide_clear_aura_effect_value") { } + PrepareSpellScript(spell_putricide_clear_aura_effect_value); - class spell_putricide_clear_aura_effect_value_SpellScript : public SpellScript + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_putricide_clear_aura_effect_value_SpellScript); + PreventHitDefaultEffect(effIndex); + uint32 auraId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), GetCaster()); + GetHitUnit()->RemoveAurasDueToSpell(auraId); + } - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - uint32 auraId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), GetCaster()); - GetHitUnit()->RemoveAurasDueToSpell(auraId); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_clear_aura_effect_value_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_putricide_clear_aura_effect_value_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_putricide_clear_aura_effect_value::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_putricide_mutation_init : public SpellScriptLoader +class spell_putricide_mutation_init : public SpellScript { -public: - spell_putricide_mutation_init() : SpellScriptLoader("spell_putricide_mutation_init") { } + PrepareSpellScript(spell_putricide_mutation_init); - class spell_putricide_mutation_init_SpellScript : public SpellScript + SpellCastResult CheckRequirementInternal(SpellCustomErrors& extendedError) { - PrepareSpellScript(spell_putricide_mutation_init_SpellScript); + InstanceScript* instance = GetExplTargetUnit()->GetInstanceScript(); + if (!instance) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - SpellCastResult CheckRequirementInternal(SpellCustomErrors& extendedError) + Creature* professor = ObjectAccessor::GetCreature(*GetExplTargetUnit(), instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE)); + if (!professor) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + + if (professor->AI()->GetData(DATA_PHASE) == 3 || !professor->IsAlive()) { - InstanceScript* instance = GetExplTargetUnit()->GetInstanceScript(); - if (!instance) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + extendedError = SPELL_CUSTOM_ERROR_ALL_POTIONS_USED; + return SPELL_FAILED_CUSTOM_ERROR; + } - Creature* professor = ObjectAccessor::GetCreature(*GetExplTargetUnit(), instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE)); - if (!professor) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + if (professor->AI()->GetData(DATA_ABOMINATION)) + { + extendedError = SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS; + return SPELL_FAILED_CUSTOM_ERROR; + } - if (professor->AI()->GetData(DATA_PHASE) == 3 || !professor->IsAlive()) + return SPELL_CAST_OK; + } + + SpellCastResult CheckRequirement() + { + if (!GetExplTargetUnit()) + return SPELL_FAILED_BAD_TARGETS; + + if (GetExplTargetUnit()->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_TARGET_NOT_PLAYER; + + SpellCustomErrors extension = SPELL_CUSTOM_ERROR_NONE; + SpellCastResult result = CheckRequirementInternal(extension); + if (result != SPELL_CAST_OK) + { + Spell::SendCastResult(GetExplTargetUnit()->ToPlayer(), GetSpellInfo(), 0, result, extension); + return result; + } + + return SPELL_CAST_OK; + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_putricide_mutation_init::CheckRequirement); + } +}; + +class spell_putricide_mutation_init_aura : public AuraScript +{ + PrepareAuraScript(spell_putricide_mutation_init_aura); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + uint32 spellId = 70311; + if (GetTarget()->GetMap()->GetSpawnMode() & 1) + spellId = 71503; + + GetTarget()->CastSpell(GetTarget(), spellId, true); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutation_init_aura::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_putricide_mutated_transformation : public SpellScript +{ + PrepareSpellScript(spell_putricide_mutated_transformation); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ + SPELL_ABOMINATION_VEHICLE_POWER_DRAIN, + SPELL_MUTATED_TRANSFORMATION_DAMAGE, + SPELL_MUTATED_TRANSFORMATION_NAME, + VEHICLE_SPELL_RIDE_HARDCODED + }); + } + + void HandleSummon(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Unit* caster = GetOriginalCaster(); + if (!caster) + return; + + InstanceScript* instance = caster->GetInstanceScript(); + if (!instance) + return; + + Creature* putricide = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE)); + if (!putricide) + return; + + if (putricide->AI()->GetData(DATA_ABOMINATION)) + { + if (Player* player = caster->ToPlayer()) + Spell::SendCastResult(player, GetSpellInfo(), 0, SPELL_FAILED_CUSTOM_ERROR, SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS); + return; + } + + if (!putricide->IsInCombat()) + putricide->SetInCombatWithZone(); + + uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); + SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->Effects[effIndex].MiscValueB)); + uint32 duration = uint32(GetSpellInfo()->GetDuration()); + + Position pos = caster->GetPosition(); + TempSummon* summon = caster->GetMap()->SummonCreature(entry, pos, properties, duration, caster, GetSpellInfo()->Id); + if (!summon || !summon->IsVehicle()) + return; + + summon->CastSpell(summon, SPELL_ABOMINATION_VEHICLE_POWER_DRAIN, true); + summon->CastSpell(summon, SPELL_MUTATED_TRANSFORMATION_DAMAGE, true); + caster->CastSpell(summon, SPELL_MUTATED_TRANSFORMATION_NAME, true); + + //EnterVehicle(summon, 0); // VEHICLE_SPELL_RIDE_HARDCODED is used according to sniff, this is ok + caster->CastCustomSpell(VEHICLE_SPELL_RIDE_HARDCODED, SPELLVALUE_BASE_POINT0, 1, summon, TRIGGERED_FULL_MASK); + summon->SetCreatorGUID(caster->GetGUID()); + putricide->AI()->JustSummoned(summon); + + summon->setPowerType(POWER_ENERGY); + summon->SetMaxPower(POWER_ENERGY, 100); + summon->SetPower(POWER_ENERGY, 0); + summon->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, 0); + summon->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, 0); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_putricide_mutated_transformation::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); + } +}; + +class spell_putricide_mutated_transformation_dismiss_aura : public AuraScript +{ + PrepareAuraScript(spell_putricide_mutated_transformation_dismiss_aura); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Vehicle* veh = GetTarget()->GetVehicleKit()) + veh->RemoveAllPassengers(); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutated_transformation_dismiss_aura::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_putricide_mutated_transformation_dmg : public SpellScript +{ + PrepareSpellScript(spell_putricide_mutated_transformation_dmg); + + void FilterTargetsInitial(std::list& targets) + { + if (Unit* owner = ObjectAccessor::GetUnit(*GetCaster(), GetCaster()->GetCreatorGUID())) + targets.remove(owner); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_mutated_transformation_dmg::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } +}; + +class spell_putricide_eat_ooze : public SpellScript +{ + PrepareSpellScript(spell_putricide_eat_ooze); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_GROW_STACKER }); + } + + void SelectTarget(std::list& targets) + { + if (targets.empty()) + return; + + targets.sort(Acore::ObjectDistanceOrderPred(GetCaster())); + WorldObject* target = targets.front(); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Creature* target = GetHitCreature(); + if (!target) + return; + + if (Aura* grow = target->GetAura(uint32(GetEffectValue()))) + { + if (grow->GetStackAmount() <= 4) { - extendedError = SPELL_CUSTOM_ERROR_ALL_POTIONS_USED; - return SPELL_FAILED_CUSTOM_ERROR; + target->RemoveAurasDueToSpell(SPELL_GROW_STACKER); + target->RemoveAura(grow); + target->DespawnOrUnsummon(1); } - - if (professor->AI()->GetData(DATA_ABOMINATION)) - { - extendedError = SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS; - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; + else + grow->ModStackAmount(-4); } - - SpellCastResult CheckRequirement() - { - if (!GetExplTargetUnit()) - return SPELL_FAILED_BAD_TARGETS; - - if (GetExplTargetUnit()->GetTypeId() != TYPEID_PLAYER) - return SPELL_FAILED_TARGET_NOT_PLAYER; - - SpellCustomErrors extension = SPELL_CUSTOM_ERROR_NONE; - SpellCastResult result = CheckRequirementInternal(extension); - if (result != SPELL_CAST_OK) - { - Spell::SendCastResult(GetExplTargetUnit()->ToPlayer(), GetSpellInfo(), 0, result, extension); - return result; - } - - return SPELL_CAST_OK; - } - - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_putricide_mutation_init_SpellScript::CheckRequirement); - } - }; - - class spell_putricide_mutation_init_AuraScript : public AuraScript - { - PrepareAuraScript(spell_putricide_mutation_init_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - uint32 spellId = 70311; - if (GetTarget()->GetMap()->GetSpawnMode() & 1) - spellId = 71503; - - GetTarget()->CastSpell(GetTarget(), spellId, true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutation_init_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_mutation_init_SpellScript(); } - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_putricide_mutation_init_AuraScript(); + OnEffectHitTarget += SpellEffectFn(spell_putricide_eat_ooze::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_eat_ooze::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); } }; -class spell_putricide_mutated_transformation : public SpellScriptLoader +class spell_putricide_regurgitated_ooze : public SpellScript { -public: - spell_putricide_mutated_transformation() : SpellScriptLoader("spell_putricide_mutated_transformation") { } + PrepareSpellScript(spell_putricide_regurgitated_ooze); - class spell_putricide_mutated_transformation_SpellScript : public SpellScript + // the only purpose of this hook is to fail the achievement + void ExtraEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_putricide_mutated_transformation_SpellScript); - - void HandleSummon(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Unit* caster = GetOriginalCaster(); - if (!caster) - return; - - InstanceScript* instance = caster->GetInstanceScript(); - if (!instance) - return; - - Creature* putricide = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE)); - if (!putricide) - return; - - if (putricide->AI()->GetData(DATA_ABOMINATION)) - { - if (Player* player = caster->ToPlayer()) - Spell::SendCastResult(player, GetSpellInfo(), 0, SPELL_FAILED_CUSTOM_ERROR, SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS); - return; - } - - if (!putricide->IsInCombat()) - putricide->SetInCombatWithZone(); - - uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); - SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->Effects[effIndex].MiscValueB)); - uint32 duration = uint32(GetSpellInfo()->GetDuration()); - - Position pos = caster->GetPosition(); - TempSummon* summon = caster->GetMap()->SummonCreature(entry, pos, properties, duration, caster, GetSpellInfo()->Id); - if (!summon || !summon->IsVehicle()) - return; - - summon->CastSpell(summon, SPELL_ABOMINATION_VEHICLE_POWER_DRAIN, true); - summon->CastSpell(summon, SPELL_MUTATED_TRANSFORMATION_DAMAGE, true); - caster->CastSpell(summon, SPELL_MUTATED_TRANSFORMATION_NAME, true); - - //EnterVehicle(summon, 0); // VEHICLE_SPELL_RIDE_HARDCODED is used according to sniff, this is ok - caster->CastCustomSpell(VEHICLE_SPELL_RIDE_HARDCODED, SPELLVALUE_BASE_POINT0, 1, summon, TRIGGERED_FULL_MASK); - summon->SetCreatorGUID(caster->GetGUID()); - putricide->AI()->JustSummoned(summon); - - summon->setPowerType(POWER_ENERGY); - summon->SetMaxPower(POWER_ENERGY, 100); - summon->SetPower(POWER_ENERGY, 0); - summon->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, 0); - summon->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, 0); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_putricide_mutated_transformation_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_mutated_transformation_SpellScript(); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + instance->SetData(DATA_NAUSEA_ACHIEVEMENT, uint32(false)); } -}; -class spell_putricide_mutated_transformation_dismiss : public SpellScriptLoader -{ -public: - spell_putricide_mutated_transformation_dismiss() : SpellScriptLoader("spell_putricide_mutated_transformation_dismiss") { } - - class spell_putricide_mutated_transformation_dismiss_AuraScript : public AuraScript + void Register() override { - PrepareAuraScript(spell_putricide_mutated_transformation_dismiss_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Vehicle* veh = GetTarget()->GetVehicleKit()) - veh->RemoveAllPassengers(); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutated_transformation_dismiss_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_putricide_mutated_transformation_dismiss_AuraScript(); - } -}; - -class spell_putricide_mutated_transformation_dmg : public SpellScriptLoader -{ -public: - spell_putricide_mutated_transformation_dmg() : SpellScriptLoader("spell_putricide_mutated_transformation_dmg") { } - - class spell_putricide_mutated_transformation_dmg_SpellScript : public SpellScript - { - PrepareSpellScript(spell_putricide_mutated_transformation_dmg_SpellScript); - - void FilterTargetsInitial(std::list& targets) - { - if (Unit* owner = ObjectAccessor::GetUnit(*GetCaster(), GetCaster()->GetCreatorGUID())) - targets.remove(owner); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_mutated_transformation_dmg_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_mutated_transformation_dmg_SpellScript(); - } -}; - -class spell_putricide_eat_ooze : public SpellScriptLoader -{ -public: - spell_putricide_eat_ooze() : SpellScriptLoader("spell_putricide_eat_ooze") { } - - class spell_putricide_eat_ooze_SpellScript : public SpellScript - { - PrepareSpellScript(spell_putricide_eat_ooze_SpellScript); - - void SelectTarget(std::list& targets) - { - if (targets.empty()) - return; - - targets.sort(Acore::ObjectDistanceOrderPred(GetCaster())); - WorldObject* target = targets.front(); - targets.clear(); - targets.push_back(target); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Creature* target = GetHitCreature(); - if (!target) - return; - - if (Aura* grow = target->GetAura(uint32(GetEffectValue()))) - { - if (grow->GetStackAmount() <= 4) - { - target->RemoveAurasDueToSpell(SPELL_GROW_STACKER); - target->RemoveAura(grow); - target->DespawnOrUnsummon(1); - } - else - grow->ModStackAmount(-4); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_eat_ooze_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_eat_ooze_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_eat_ooze_SpellScript(); - } -}; - -class spell_putricide_regurgitated_ooze : public SpellScriptLoader -{ -public: - spell_putricide_regurgitated_ooze() : SpellScriptLoader("spell_putricide_regurgitated_ooze") { } - - class spell_putricide_regurgitated_ooze_SpellScript : public SpellScript - { - PrepareSpellScript(spell_putricide_regurgitated_ooze_SpellScript); - - // the only purpose of this hook is to fail the achievement - void ExtraEffect(SpellEffIndex /*effIndex*/) - { - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - instance->SetData(DATA_NAUSEA_ACHIEVEMENT, uint32(false)); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_regurgitated_ooze_SpellScript::ExtraEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_putricide_regurgitated_ooze_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_putricide_regurgitated_ooze::ExtraEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); } }; @@ -1710,24 +1527,24 @@ void AddSC_boss_professor_putricide() new boss_professor_putricide(); new npc_volatile_ooze(); new npc_gas_cloud(); - new spell_putricide_slime_puddle(); - new spell_putricide_slime_puddle_spawn(); - new spell_putricide_grow_stacker(); - new spell_putricide_unstable_experiment(); - new spell_putricide_tear_gas_effect(); - new spell_putricide_gaseous_bloat(); - new spell_putricide_ooze_channel(); - new spell_putricide_ooze_eruption_searcher(); - new spell_putricide_mutated_plague(); - new spell_putricide_unbound_plague(); - new spell_putricide_unbound_plague_dmg(); - new spell_putricide_choking_gas_bomb(); - new spell_putricide_clear_aura_effect_value(); - new spell_putricide_mutation_init(); - new spell_putricide_mutated_transformation(); - new spell_putricide_mutated_transformation_dismiss(); - new spell_putricide_mutated_transformation_dmg(); - new spell_putricide_eat_ooze(); - new spell_putricide_regurgitated_ooze(); + RegisterSpellScript(spell_putricide_slime_puddle); + RegisterSpellScript(spell_putricide_slime_puddle_spawn); + RegisterSpellScript(spell_putricide_grow_stacker_aura); + RegisterSpellScript(spell_putricide_unstable_experiment); + RegisterSpellScript(spell_putricide_tear_gas_effect); + RegisterSpellScript(spell_putricide_gaseous_bloat_aura); + RegisterSpellScript(spell_putricide_ooze_channel); + RegisterSpellScript(spell_putricide_ooze_eruption_searcher); + RegisterSpellScript(spell_putricide_mutated_plague_aura); + RegisterSpellScript(spell_putricide_unbound_plague); + RegisterSpellScript(spell_putricide_unbound_plague_dmg_aura); + RegisterSpellScript(spell_putricide_choking_gas_bomb); + RegisterSpellScript(spell_putricide_clear_aura_effect_value); + RegisterSpellAndAuraScriptPair(spell_putricide_mutation_init, spell_putricide_mutation_init_aura); + RegisterSpellScript(spell_putricide_mutated_transformation); + RegisterSpellScript(spell_putricide_mutated_transformation_dismiss_aura); + RegisterSpellScript(spell_putricide_mutated_transformation_dmg); + RegisterSpellScript(spell_putricide_eat_ooze); + RegisterSpellScript(spell_putricide_regurgitated_ooze); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 9fa5a9354..f9ae6e1d9 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -506,158 +506,194 @@ public: } }; -class spell_rotface_mutated_infection : public SpellScriptLoader +class spell_rotface_mutated_infection : public SpellScript { -public: - spell_rotface_mutated_infection() : SpellScriptLoader("spell_rotface_mutated_infection") { } + PrepareSpellScript(spell_rotface_mutated_infection); - class spell_rotface_mutated_infection_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_rotface_mutated_infection_SpellScript); - - bool Load() override - { - _target = nullptr; - return true; - } - - void FilterTargets(std::list& targets) - { - // remove targets with this aura already - // tank is not on this list - targets.remove_if(Acore::UnitAuraCheck(true, GetSpellInfo()->Id)); - targets.remove(GetCaster()->GetVictim()); - if (targets.empty()) - return; - - WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - _target = target; - } - - void ReplaceTargets(std::list& targets) - { - targets.clear(); - if (_target) - targets.push_back(_target); - } - - void NotifyTargets() - { - if (Creature* caster = GetCaster()->ToCreature()) - if (Unit* target = GetHitUnit()) - caster->AI()->Talk(EMOTE_MUTATED_INFECTION, target); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); - AfterHit += SpellHitFn(spell_rotface_mutated_infection_SpellScript::NotifyTargets); - } - - WorldObject* _target; - }; - - class spell_rotface_mutated_infection_AuraScript : public AuraScript - { - PrepareAuraScript(spell_rotface_mutated_infection_AuraScript); - - void ExtraRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[2].CalcValue(), true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_rotface_mutated_infection_AuraScript::ExtraRemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_rotface_mutated_infection_SpellScript(); + _target = nullptr; + return true; } - AuraScript* GetAuraScript() const override + void FilterTargets(std::list& targets) { - return new spell_rotface_mutated_infection_AuraScript(); + // remove targets with this aura already + // tank is not on this list + targets.remove_if(Acore::UnitAuraCheck(true, GetSpellInfo()->Id)); + targets.remove(GetCaster()->GetVictim()); + if (targets.empty()) + return; + + WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + _target = target; + } + + void ReplaceTargets(std::list& targets) + { + targets.clear(); + if (_target) + targets.push_back(_target); + } + + void NotifyTargets() + { + if (Creature* caster = GetCaster()->ToCreature()) + if (Unit* target = GetHitUnit()) + caster->AI()->Talk(EMOTE_MUTATED_INFECTION, target); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection::ReplaceTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection::ReplaceTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); + AfterHit += SpellHitFn(spell_rotface_mutated_infection::NotifyTargets); + } + +private: + WorldObject* _target; +}; + +class spell_rotface_mutated_infection_aura : public AuraScript +{ + PrepareAuraScript(spell_rotface_mutated_infection_aura); + + void ExtraRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[2].CalcValue(), true); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_rotface_mutated_infection_aura::ExtraRemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } }; -class spell_rotface_little_ooze_combine : public SpellScriptLoader +class spell_rotface_little_ooze_combine : public SpellScript { -public: - spell_rotface_little_ooze_combine() : SpellScriptLoader("spell_rotface_little_ooze_combine") { } + PrepareSpellScript(spell_rotface_little_ooze_combine); - class spell_rotface_little_ooze_combine_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_rotface_little_ooze_combine_SpellScript); + return ValidateSpellInfo({ SPELL_LITTLE_OOZE_COMBINE, SPELL_OOZE_MERGE }); + } - void HandleScript(SpellEffIndex /*effIndex*/) - { - // little targetting little - - if (!GetHitCreature() || !GetHitCreature()->IsAlive()) - return; - - GetCaster()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); - GetHitCreature()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); - GetHitCreature()->CastSpell(GetCaster(), SPELL_OOZE_MERGE, true); - GetHitCreature()->DespawnOrUnsummon(); - if (GetCaster()->ToCreature()) - GetCaster()->ToCreature()->DespawnOrUnsummon(); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_rotface_little_ooze_combine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex /*effIndex*/) { - return new spell_rotface_little_ooze_combine_SpellScript(); + // little targetting little + + if (!GetHitCreature() || !GetHitCreature()->IsAlive()) + return; + + GetCaster()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); + GetHitCreature()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); + GetHitCreature()->CastSpell(GetCaster(), SPELL_OOZE_MERGE, true); + GetHitCreature()->DespawnOrUnsummon(); + if (GetCaster()->ToCreature()) + GetCaster()->ToCreature()->DespawnOrUnsummon(); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_rotface_little_ooze_combine::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_rotface_large_ooze_combine : public SpellScriptLoader +class spell_rotface_large_ooze_combine : public SpellScript { -public: - spell_rotface_large_ooze_combine() : SpellScriptLoader("spell_rotface_large_ooze_combine") { } + PrepareSpellScript(spell_rotface_large_ooze_combine); - class spell_rotface_large_ooze_combine_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_rotface_large_ooze_combine_SpellScript); + return ValidateSpellInfo({ SPELL_UNSTABLE_OOZE, 69844, SPELL_LARGE_OOZE_BUFF_COMBINE, SPELL_LARGE_OOZE_COMBINE, SPELL_UNSTABLE_OOZE_EXPLOSION }); + } - void HandleScript(SpellEffIndex /*effIndex*/) + void HandleScript(SpellEffIndex /*effIndex*/) + { + // large targetting large + + if (!GetHitCreature() || !GetHitCreature()->IsAlive()) + return; + + uint8 casterStack = 1; + uint8 targetStack = 1; + Aura* casterAura = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE); + if (casterAura) + casterStack = casterAura->GetStackAmount(); + Aura* targetAura = GetHitCreature()->GetAura(SPELL_UNSTABLE_OOZE); + if (targetAura) + targetStack = targetAura->GetStackAmount(); + uint8 newStack = casterStack + targetStack; + if (newStack > 5) + newStack = 5; + if (casterAura) + casterAura->SetStackAmount(newStack); + else { - // large targetting large + GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE, true); + if (Aura* aur = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE)) + aur->SetStackAmount(newStack); + } - if (!GetHitCreature() || !GetHitCreature()->IsAlive()) - return; + // red color! + if (newStack >= 4) + GetCaster()->CastSpell(GetCaster(), 69844, true); - uint8 casterStack = 1; - uint8 targetStack = 1; - Aura* casterAura = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE); - if (casterAura) - casterStack = casterAura->GetStackAmount(); - Aura* targetAura = GetHitCreature()->GetAura(SPELL_UNSTABLE_OOZE); - if (targetAura) - targetStack = targetAura->GetStackAmount(); - uint8 newStack = casterStack + targetStack; - if (newStack > 5) - newStack = 5; - if (casterAura) - casterAura->SetStackAmount(newStack); - else - { - GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE, true); - if (Aura* aur = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE)) - aur->SetStackAmount(newStack); - } + // explode! + if (newStack >= 5) + { + GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE); + GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + if (Creature* rotface = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_ROTFACE))) + if (rotface->IsAlive()) + { + if (GetCaster()->GetTypeId() == TYPEID_UNIT) + GetCaster()->ToCreature()->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION); + rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION); + } + + if (Creature* cre = GetCaster()->ToCreature()) + cre->AI()->DoAction(EVENT_STICKY_OOZE); + GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE_EXPLOSION, false, nullptr, nullptr, GetCaster()->GetGUID()); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false)); + } + + GetHitCreature()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE); + GetHitCreature()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE); + GetHitCreature()->DespawnOrUnsummon(); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_rotface_large_ooze_combine::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_rotface_large_ooze_buff_combine : public SpellScript +{ + PrepareSpellScript(spell_rotface_large_ooze_buff_combine); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ 69844, SPELL_LARGE_OOZE_BUFF_COMBINE, SPELL_LARGE_OOZE_COMBINE, SPELL_UNSTABLE_OOZE_EXPLOSION, SPELL_LITTLE_OOZE_COMBINE }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + // large targetting little + + if (!GetHitCreature() || !GetHitCreature()->IsAlive()) + return; + + if (Aura* unstable = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE)) + { + uint8 newStack = uint8(unstable->GetStackAmount() + 1); + unstable->SetStackAmount(newStack); // red color! if (newStack >= 4) @@ -683,193 +719,91 @@ public: if (InstanceScript* instance = GetCaster()->GetInstanceScript()) instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false)); } - - GetHitCreature()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE); - GetHitCreature()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE); - GetHitCreature()->DespawnOrUnsummon(); } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_rotface_large_ooze_combine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + GetHitCreature()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); + GetHitCreature()->DespawnOrUnsummon(); + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_rotface_large_ooze_combine_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_rotface_large_ooze_buff_combine::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_rotface_large_ooze_buff_combine : public SpellScriptLoader +class spell_rotface_unstable_ooze_explosion_init : public SpellScript { -public: - spell_rotface_large_ooze_buff_combine() : SpellScriptLoader("spell_rotface_large_ooze_buff_combine") { } + PrepareSpellScript(spell_rotface_unstable_ooze_explosion_init); - class spell_rotface_large_ooze_buff_combine_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_rotface_large_ooze_buff_combine_SpellScript); + return ValidateSpellInfo({ SPELL_UNSTABLE_OOZE_EXPLOSION_TRIGGER }); + } - void HandleScript(SpellEffIndex /*effIndex*/) - { - // large targetting little - - if (!GetHitCreature() || !GetHitCreature()->IsAlive()) - return; - - if (Aura* unstable = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE)) - { - uint8 newStack = uint8(unstable->GetStackAmount() + 1); - unstable->SetStackAmount(newStack); - - // red color! - if (newStack >= 4) - GetCaster()->CastSpell(GetCaster(), 69844, true); - - // explode! - if (newStack >= 5) - { - GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE); - GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE); - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - if (Creature* rotface = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_ROTFACE))) - if (rotface->IsAlive()) - { - if (GetCaster()->GetTypeId() == TYPEID_UNIT) - GetCaster()->ToCreature()->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION); - rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION); - } - - if (Creature* cre = GetCaster()->ToCreature()) - cre->AI()->DoAction(EVENT_STICKY_OOZE); - GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE_EXPLOSION, false, nullptr, nullptr, GetCaster()->GetGUID()); - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false)); - } - } - - GetHitCreature()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); - GetHitCreature()->DespawnOrUnsummon(); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_rotface_large_ooze_buff_combine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleCast(SpellEffIndex effIndex) { - return new spell_rotface_large_ooze_buff_combine_SpellScript(); + PreventHitEffect(effIndex); + if (!GetHitUnit()) + return; + + float x, y, z; + GetHitUnit()->GetPosition(x, y, z); + Creature* dummy = GetCaster()->SummonCreature(NPC_UNSTABLE_EXPLOSION_STALKER, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); + GetCaster()->CastSpell(dummy, SPELL_UNSTABLE_OOZE_EXPLOSION_TRIGGER, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_rotface_unstable_ooze_explosion_init::HandleCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); } }; -class spell_rotface_unstable_ooze_explosion_init : public SpellScriptLoader +class spell_rotface_unstable_ooze_explosion : public SpellScript { -public: - spell_rotface_unstable_ooze_explosion_init() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion_init") { } + PrepareSpellScript(spell_rotface_unstable_ooze_explosion); - class spell_rotface_unstable_ooze_explosion_init_SpellScript : public SpellScript + void CheckTarget(SpellEffIndex effIndex) { - PrepareSpellScript(spell_rotface_unstable_ooze_explosion_init_SpellScript); + PreventHitDefaultEffect(EFFECT_0); + if (!GetExplTargetDest()) + return; - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_UNSTABLE_OOZE_EXPLOSION_TRIGGER }); - } + uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell; - void HandleCast(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (!GetHitUnit()) - return; + float x, y, z; + GetExplTargetDest()->GetPosition(x, y, z); + // let Rotface handle the cast - caster dies before this executes + if (InstanceScript* script = GetCaster()->GetInstanceScript()) + if (Creature* rotface = script->instance->GetCreature(script->GetGuidData(DATA_ROTFACE))) + rotface->CastSpell(x, y, z, triggered_spell_id, true/*, nullptr, nullptr, GetCaster()->GetGUID()*/); // caster not available on clientside, no log in such case + } - float x, y, z; - GetHitUnit()->GetPosition(x, y, z); - Creature* dummy = GetCaster()->SummonCreature(NPC_UNSTABLE_EXPLOSION_STALKER, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); - GetCaster()->CastSpell(dummy, SPELL_UNSTABLE_OOZE_EXPLOSION_TRIGGER, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_rotface_unstable_ooze_explosion_init_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_rotface_unstable_ooze_explosion_init_SpellScript(); + OnEffectHit += SpellEffectFn(spell_rotface_unstable_ooze_explosion::CheckTarget, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); } }; -class spell_rotface_unstable_ooze_explosion : public SpellScriptLoader +class spell_rotface_unstable_ooze_explosion_suicide_aura : public AuraScript { -public: - spell_rotface_unstable_ooze_explosion() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion") { } + PrepareAuraScript(spell_rotface_unstable_ooze_explosion_suicide_aura); - class spell_rotface_unstable_ooze_explosion_SpellScript : public SpellScript + void DespawnSelf(AuraEffect const* /*aurEff*/) { - PrepareSpellScript(spell_rotface_unstable_ooze_explosion_SpellScript); + PreventDefaultAction(); + Unit* target = GetTarget(); + if (target->GetTypeId() != TYPEID_UNIT) + return; - void CheckTarget(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(EFFECT_0); - if (!GetExplTargetDest()) - return; - - uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell; - - float x, y, z; - GetExplTargetDest()->GetPosition(x, y, z); - // let Rotface handle the cast - caster dies before this executes - if (InstanceScript* script = GetCaster()->GetInstanceScript()) - if (Creature* rotface = script->instance->GetCreature(script->GetGuidData(DATA_ROTFACE))) - rotface->CastSpell(x, y, z, triggered_spell_id, true/*, nullptr, nullptr, GetCaster()->GetGUID()*/); // caster not available on clientside, no log in such case - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_rotface_unstable_ooze_explosion_SpellScript::CheckTarget, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_rotface_unstable_ooze_explosion_SpellScript(); + target->SetVisible(false); + target->RemoveAllAuras(); + //target->ToCreature()->DespawnOrUnsummon(); + target->ToCreature()->DespawnOrUnsummon(60000); } -}; -class spell_rotface_unstable_ooze_explosion_suicide : public SpellScriptLoader -{ -public: - spell_rotface_unstable_ooze_explosion_suicide() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion_suicide") { } - - class spell_rotface_unstable_ooze_explosion_suicide_AuraScript : public AuraScript + void Register() override { - PrepareAuraScript(spell_rotface_unstable_ooze_explosion_suicide_AuraScript); - - void DespawnSelf(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - Unit* target = GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT) - return; - - target->SetVisible(false); - target->RemoveAllAuras(); - //target->ToCreature()->DespawnOrUnsummon(); - target->ToCreature()->DespawnOrUnsummon(60000); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_rotface_unstable_ooze_explosion_suicide_AuraScript::DespawnSelf, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_rotface_unstable_ooze_explosion_suicide_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -969,13 +903,13 @@ void AddSC_boss_rotface() new boss_rotface(); new npc_little_ooze(); new npc_big_ooze(); - new spell_rotface_mutated_infection(); - new spell_rotface_little_ooze_combine(); - new spell_rotface_large_ooze_combine(); - new spell_rotface_large_ooze_buff_combine(); - new spell_rotface_unstable_ooze_explosion_init(); - new spell_rotface_unstable_ooze_explosion(); - new spell_rotface_unstable_ooze_explosion_suicide(); + RegisterSpellAndAuraScriptPair(spell_rotface_mutated_infection, spell_rotface_mutated_infection_aura); + RegisterSpellScript(spell_rotface_little_ooze_combine); + RegisterSpellScript(spell_rotface_large_ooze_combine); + RegisterSpellScript(spell_rotface_large_ooze_buff_combine); + RegisterSpellScript(spell_rotface_unstable_ooze_explosion_init); + RegisterSpellScript(spell_rotface_unstable_ooze_explosion); + RegisterSpellScript(spell_rotface_unstable_ooze_explosion_suicide_aura); new npc_precious_icc(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index b9326859a..7f084643f 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -767,79 +767,69 @@ public: } }; -class spell_sindragosa_s_fury : public SpellScriptLoader +class spell_sindragosa_s_fury : public SpellScript { -public: - spell_sindragosa_s_fury() : SpellScriptLoader("spell_sindragosa_s_fury") { } + PrepareSpellScript(spell_sindragosa_s_fury); - class spell_sindragosa_s_fury_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_sindragosa_s_fury_SpellScript); + _targetCount = 0; - bool Load() override - { - _targetCount = 0; + // This script should execute only in Icecrown Citadel + if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(ICCScriptName)) + return true; - // This script should execute only in Icecrown Citadel - if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) - if (instance->GetInstanceScript()) - if (instance->GetScriptId() == sObjectMgr->GetScriptId(ICCScriptName)) - return true; - - return false; - } - - void SelectDest() - { - if (Position* dest = const_cast(GetExplTargetDest())) - { - float destX = float(rand_norm()) * 75.0f + 4350.0f; - float destY = float(rand_norm()) * 75.0f + 2450.0f; - float destZ = 205.0f; // random number close to ground, get exact in next call - GetCaster()->UpdateGroundPositionZ(destX, destY, destZ); - dest->Relocate(destX, destY, destZ); - } - } - - void CountTargets(std::list& targets) - { - _targetCount = targets.size(); - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - if (!GetHitUnit()->IsAlive() || (GetHitUnit()->GetTypeId() == TYPEID_PLAYER && GetHitUnit()->ToPlayer()->IsGameMaster()) || !_targetCount) - return; - - float resistance = float(GetHitUnit()->GetResistance(SpellSchoolMask(GetSpellInfo()->SchoolMask))); - float ResistFactor = ((resistance * 2.0f) / (resistance + 510.0f)); - if (ResistFactor > 0.9f) - ResistFactor = 0.9f; - - uint32 damage = uint32( (GetEffectValue() / _targetCount) * (1.0f - ResistFactor) ); - - SpellNonMeleeDamage damageInfo(GetCaster(), GetHitUnit(), GetSpellInfo(), GetSpellInfo()->SchoolMask); - damageInfo.damage = damage; - GetCaster()->SendSpellNonMeleeDamageLog(&damageInfo); - GetCaster()->DealSpellDamage(&damageInfo, false); - } - - void Register() override - { - BeforeCast += SpellCastFn(spell_sindragosa_s_fury_SpellScript::SelectDest); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_s_fury_SpellScript::CountTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_sindragosa_s_fury_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); - } - - uint32 _targetCount; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_sindragosa_s_fury_SpellScript(); + return false; } + + void SelectDest() + { + if (Position* dest = const_cast(GetExplTargetDest())) + { + float destX = float(rand_norm()) * 75.0f + 4350.0f; + float destY = float(rand_norm()) * 75.0f + 2450.0f; + float destZ = 205.0f; // random number close to ground, get exact in next call + GetCaster()->UpdateGroundPositionZ(destX, destY, destZ); + dest->Relocate(destX, destY, destZ); + } + } + + void CountTargets(std::list& targets) + { + _targetCount = targets.size(); + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + if (!GetHitUnit()->IsAlive() || (GetHitUnit()->GetTypeId() == TYPEID_PLAYER && GetHitUnit()->ToPlayer()->IsGameMaster()) || !_targetCount) + return; + + float resistance = float(GetHitUnit()->GetResistance(SpellSchoolMask(GetSpellInfo()->SchoolMask))); + float ResistFactor = ((resistance * 2.0f) / (resistance + 510.0f)); + if (ResistFactor > 0.9f) + ResistFactor = 0.9f; + + uint32 damage = uint32( (GetEffectValue() / _targetCount) * (1.0f - ResistFactor) ); + + SpellNonMeleeDamage damageInfo(GetCaster(), GetHitUnit(), GetSpellInfo(), GetSpellInfo()->SchoolMask); + damageInfo.damage = damage; + GetCaster()->SendSpellNonMeleeDamageLog(&damageInfo); + GetCaster()->DealSpellDamage(&damageInfo, false); + } + + void Register() override + { + BeforeCast += SpellCastFn(spell_sindragosa_s_fury::SelectDest); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_s_fury::CountTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_sindragosa_s_fury::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); + } + +private: + uint32 _targetCount; }; class UnchainedMagicTargetSelector @@ -895,170 +885,115 @@ class spell_sindragosa_unchained_magic : public SpellScript } }; -class spell_sindragosa_permeating_chill : public SpellScriptLoader +class spell_sindragosa_permeating_chill_aura : public AuraScript { -public: - spell_sindragosa_permeating_chill() : SpellScriptLoader("spell_sindragosa_permeating_chill") { } + PrepareAuraScript(spell_sindragosa_permeating_chill_aura); - class spell_sindragosa_permeating_chill_AuraScript : public AuraScript + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_sindragosa_permeating_chill_AuraScript); + return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->GetEntry() == NPC_SINDRAGOSA; + } - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->GetEntry() == NPC_SINDRAGOSA; - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_sindragosa_permeating_chill_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_sindragosa_permeating_chill_AuraScript(); + DoCheckProc += AuraCheckProcFn(spell_sindragosa_permeating_chill_aura::CheckProc); } }; -class spell_sindragosa_instability : public SpellScriptLoader +class spell_sindragosa_instability_aura : public AuraScript { -public: - spell_sindragosa_instability() : SpellScriptLoader("spell_sindragosa_instability") { } + PrepareAuraScript(spell_sindragosa_instability_aura); - class spell_sindragosa_instability_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareAuraScript(spell_sindragosa_instability_AuraScript); + return ValidateSpellInfo({ SPELL_BACKLASH }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_BACKLASH }); - } - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) - GetTarget()->CastCustomSpell(SPELL_BACKLASH, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, nullptr, aurEff, GetCasterGUID()); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_sindragosa_instability_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - return new spell_sindragosa_instability_AuraScript(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + GetTarget()->CastCustomSpell(SPELL_BACKLASH, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, nullptr, aurEff, GetCasterGUID()); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_sindragosa_instability_aura::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; -class spell_sindragosa_icy_grip : public SpellScriptLoader +class spell_sindragosa_icy_grip : public SpellScript { -public: - spell_sindragosa_icy_grip() : SpellScriptLoader("spell_sindragosa_icy_grip") { } + PrepareSpellScript(spell_sindragosa_icy_grip); - class spell_sindragosa_icy_grip_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_sindragosa_icy_grip_SpellScript); + return ValidateSpellInfo({ SPELL_ICY_GRIP_JUMP }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_ICY_GRIP_JUMP }); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()->IsWithinLOSInMap(GetCaster()) || GetHitUnit()->HasAura(SPELL_TANK_MARKER_AURA)) - return; - - GetHitUnit()->CastSpell(GetCaster(), SPELL_ICY_GRIP_JUMP, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_sindragosa_icy_grip_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex effIndex) { - return new spell_sindragosa_icy_grip_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()->IsWithinLOSInMap(GetCaster()) || GetHitUnit()->HasAura(SPELL_TANK_MARKER_AURA)) + return; + + GetHitUnit()->CastSpell(GetCaster(), SPELL_ICY_GRIP_JUMP, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_sindragosa_icy_grip::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_sindragosa_icy_grip_jump : public SpellScriptLoader +class spell_sindragosa_icy_grip_jump : public SpellScript { -public: - spell_sindragosa_icy_grip_jump() : SpellScriptLoader("spell_sindragosa_icy_grip_jump") { } + PrepareSpellScript(spell_sindragosa_icy_grip_jump); - class spell_sindragosa_icy_grip_jump_SpellScript : public SpellScript + void HandleSpecial(SpellEffIndex effIndex) { - PrepareSpellScript(spell_sindragosa_icy_grip_jump_SpellScript); + PreventHitDefaultEffect(effIndex); - void HandleSpecial(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); + float x = GetHitUnit()->GetPositionX(); + float y = GetHitUnit()->GetPositionY(); + float z = GetHitUnit()->GetPositionZ() + 0.1f; + float speedXY, speedZ; - float x = GetHitUnit()->GetPositionX(); - float y = GetHitUnit()->GetPositionY(); - float z = GetHitUnit()->GetPositionZ() + 0.1f; - float speedXY, speedZ; + if (GetSpellInfo()->Effects[effIndex].MiscValue) + speedZ = float(GetSpellInfo()->Effects[effIndex].MiscValue) / 10; + else if (GetSpellInfo()->Effects[effIndex].MiscValueB) + speedZ = float(GetSpellInfo()->Effects[effIndex].MiscValueB) / 10; + else + speedZ = 10.0f; + speedXY = GetCaster()->GetExactDist2d(x, y) * 10.0f / speedZ; - if (GetSpellInfo()->Effects[effIndex].MiscValue) - speedZ = float(GetSpellInfo()->Effects[effIndex].MiscValue) / 10; - else if (GetSpellInfo()->Effects[effIndex].MiscValueB) - speedZ = float(GetSpellInfo()->Effects[effIndex].MiscValueB) / 10; - else - speedZ = 10.0f; - speedXY = GetCaster()->GetExactDist2d(x, y) * 10.0f / speedZ; + GetCaster()->GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ); + } - GetCaster()->GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ); - } - - void Register() override - { - OnEffectLaunchTarget += SpellEffectFn(spell_sindragosa_icy_grip_jump_SpellScript::HandleSpecial, EFFECT_0, SPELL_EFFECT_JUMP); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_sindragosa_icy_grip_jump_SpellScript(); + OnEffectLaunchTarget += SpellEffectFn(spell_sindragosa_icy_grip_jump::HandleSpecial, EFFECT_0, SPELL_EFFECT_JUMP); } }; -class spell_sindragosa_frost_beacon : public SpellScriptLoader +class spell_sindragosa_frost_beacon_aura : public AuraScript { -public: - spell_sindragosa_frost_beacon() : SpellScriptLoader("spell_sindragosa_frost_beacon") { } + PrepareAuraScript(spell_sindragosa_frost_beacon_aura); - class spell_sindragosa_frost_beacon_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareAuraScript(spell_sindragosa_frost_beacon_AuraScript); + return ValidateSpellInfo({ SPELL_ICE_TOMB_DAMAGE }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_ICE_TOMB_DAMAGE }); - } - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_ICE_TOMB_DAMAGE, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_frost_beacon_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void PeriodicTick(AuraEffect const* /*aurEff*/) { - return new spell_sindragosa_frost_beacon_AuraScript(); + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), SPELL_ICE_TOMB_DAMAGE, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_frost_beacon_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -1076,109 +1011,88 @@ public: } }; -class spell_sindragosa_ice_tomb_filter : public SpellScriptLoader +class spell_sindragosa_ice_tomb_filter : public SpellScript { -public: - spell_sindragosa_ice_tomb_filter() : SpellScriptLoader("spell_sindragosa_ice_tomb_filter") { } + PrepareSpellScript(spell_sindragosa_ice_tomb_filter); - class spell_sindragosa_ice_tomb_filter_SpellScript : public SpellScript + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_sindragosa_ice_tomb_filter_SpellScript); + unitList.remove_if(SindragosaIceTombCheck()); + } - void FilterTargets(std::list& unitList) - { - unitList.remove_if(SindragosaIceTombCheck()); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_filter_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_sindragosa_ice_tomb_filter_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_filter::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; -class spell_sindragosa_ice_tomb : public SpellScriptLoader +class spell_sindragosa_ice_tomb_trap : public SpellScript { -public: - spell_sindragosa_ice_tomb() : SpellScriptLoader("spell_sindragosa_ice_tomb_trap") { } + PrepareSpellScript(spell_sindragosa_ice_tomb_trap); - class spell_sindragosa_ice_tomb_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_sindragosa_ice_tomb_SpellScript); - - std::list targetList; - - bool Validate(SpellInfo const* /*spell*/) override - { - if (!sObjectMgr->GetCreatureTemplate(NPC_ICE_TOMB)) - return false; - if (!sObjectMgr->GetGameObjectTemplate(GO_ICE_BLOCK)) - return false; - return true; - } - - void FilterTargets(std::list& unitList) - { - unitList.remove_if(Acore::UnitAuraCheck(true, GetSpellInfo()->Id)); - targetList.clear(); - targetList = unitList; - } - - void FilterTargetsSubseq(std::list& unitList) - { - unitList.clear(); - unitList = targetList; - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_SpellScript::FilterTargetsSubseq, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - class spell_sindragosa_ice_tomb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_sindragosa_ice_tomb_AuraScript); - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - } - - void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* c = GetCaster()) - GetTarget()->m_Events.AddEvent(new IceTombSummonEvent(GetTarget(), c->GetGUID()), GetTarget()->m_Events.CalculateTime(500)); - } - - void ExtraRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_ASPHYXIATION); - GetTarget()->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_ice_tomb_AuraScript::PeriodicTick, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - AfterEffectRemove += AuraEffectRemoveFn(spell_sindragosa_ice_tomb_AuraScript::ExtraRemoveEffect, EFFECT_1, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - AfterEffectApply += AuraEffectApplyFn(spell_sindragosa_ice_tomb_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_sindragosa_ice_tomb_SpellScript(); + if (!sObjectMgr->GetCreatureTemplate(NPC_ICE_TOMB)) + return false; + if (!sObjectMgr->GetGameObjectTemplate(GO_ICE_BLOCK)) + return false; + return true; } - AuraScript* GetAuraScript() const override + void FilterTargets(std::list& unitList) { - return new spell_sindragosa_ice_tomb_AuraScript(); + unitList.remove_if(Acore::UnitAuraCheck(true, GetSpellInfo()->Id)); + _targetList.clear(); + _targetList = unitList; + } + + void FilterTargetsSubseq(std::list& unitList) + { + unitList.clear(); + unitList = _targetList; + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_trap::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_trap::FilterTargetsSubseq, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY); + } + +private: + std::list _targetList; +}; + +class spell_sindragosa_ice_tomb_trap_aura : public AuraScript +{ + PrepareAuraScript(spell_sindragosa_ice_tomb_trap_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_ASPHYXIATION, SPELL_ICE_TOMB_UNTARGETABLE }); + } + + void PeriodicTick(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + } + + void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* c = GetCaster()) + GetTarget()->m_Events.AddEvent(new IceTombSummonEvent(GetTarget(), c->GetGUID()), GetTarget()->m_Events.CalculateTime(500)); + } + + void ExtraRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_ASPHYXIATION); + GetTarget()->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_ice_tomb_trap_aura::PeriodicTick, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + AfterEffectRemove += AuraEffectRemoveFn(spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect, EFFECT_1, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_sindragosa_ice_tomb_trap_aura::AfterApply, EFFECT_1, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); } }; @@ -1208,63 +1122,46 @@ private: Unit* _caster; }; -class spell_sindragosa_mystic_buffet : public SpellScriptLoader +class spell_sindragosa_mystic_buffet : public SpellScript { -public: - spell_sindragosa_mystic_buffet() : SpellScriptLoader("spell_sindragosa_mystic_buffet") { } + PrepareSpellScript(spell_sindragosa_mystic_buffet); - class spell_sindragosa_mystic_buffet_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_sindragosa_mystic_buffet_SpellScript); + targets.remove_if(MysticBuffetTargetFilter(GetCaster())); + } - void FilterTargets(std::list& targets) - { - targets.remove_if(MysticBuffetTargetFilter(GetCaster())); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_mystic_buffet_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_sindragosa_mystic_buffet_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_mystic_buffet::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; -class spell_sindragosa_soul_preservation : public SpellScriptLoader +class spell_sindragosa_soul_preservation_aura : public AuraScript { -public: - spell_sindragosa_soul_preservation() : SpellScriptLoader("spell_sindragosa_soul_preservation") { } + PrepareAuraScript(spell_sindragosa_soul_preservation_aura); - class spell_sindragosa_soul_preservation_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_sindragosa_soul_preservation_AuraScript); + return ValidateSpellInfo({ 72466, 72424 }); + } - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* s = GetTarget()) - if (GetStackAmount() >= (s->GetMap()->Is25ManRaid() ? 75 : 30)) - { - s->CastSpell(s, 72466, true); - s->RemoveAurasDueToSpell(72424); - if (s->GetTypeId() == TYPEID_UNIT) s->ToCreature()->SetLootMode(3); - SetDuration(1); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_soul_preservation_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void PeriodicTick(AuraEffect const* /*aurEff*/) { - return new spell_sindragosa_soul_preservation_AuraScript(); + PreventDefaultAction(); + if (Unit* s = GetTarget()) + if (GetStackAmount() >= (s->GetMap()->Is25ManRaid() ? 75 : 30)) + { + s->CastSpell(s, 72466, true); + s->RemoveAurasDueToSpell(72424); + if (s->GetTypeId() == TYPEID_UNIT) s->ToCreature()->SetLootMode(3); + SetDuration(1); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_soul_preservation_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; @@ -1597,37 +1494,26 @@ public: } }; -class spell_rimefang_icy_blast : public SpellScriptLoader +class spell_rimefang_icy_blast : public SpellScript { -public: - spell_rimefang_icy_blast() : SpellScriptLoader("spell_rimefang_icy_blast") { } + PrepareSpellScript(spell_rimefang_icy_blast); - class spell_rimefang_icy_blast_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_rimefang_icy_blast_SpellScript); + return ValidateSpellInfo({ SPELL_ICY_BLAST_AREA }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_ICY_BLAST_AREA }); - } - - void HandleTriggerMissile(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Position const* pos = GetExplTargetDest()) - if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 40000)) - summon->CastSpell(summon, SPELL_ICY_BLAST_AREA, true); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_rimefang_icy_blast_SpellScript::HandleTriggerMissile, EFFECT_1, SPELL_EFFECT_TRIGGER_MISSILE); - } - }; - - SpellScript* GetSpellScript() const override + void HandleTriggerMissile(SpellEffIndex effIndex) { - return new spell_rimefang_icy_blast_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Position const* pos = GetExplTargetDest()) + if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 40000)) + summon->CastSpell(summon, SPELL_ICY_BLAST_AREA, true); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_rimefang_icy_blast::HandleTriggerMissile, EFFECT_1, SPELL_EFFECT_TRIGGER_MISSILE); } }; @@ -1800,154 +1686,121 @@ private: Creature* _owner; }; -class spell_frostwarden_handler_order_whelp : public SpellScriptLoader +class spell_frostwarden_handler_order_whelp : public SpellScript { -public: - spell_frostwarden_handler_order_whelp() : SpellScriptLoader("spell_frostwarden_handler_order_whelp") { } + PrepareSpellScript(spell_frostwarden_handler_order_whelp); - class spell_frostwarden_handler_order_whelp_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_frostwarden_handler_order_whelp_SpellScript); + return ValidateSpellInfo({ SPELL_FOCUS_FIRE }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_FOCUS_FIRE }); - } - - void FilterTargets(std::list& targets) - { - targets.remove_if(Acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); - if (targets.empty()) - return; - - WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - - void HandleForcedCast(SpellEffIndex effIndex) - { - // caster is Frostwarden Handler, target is player, caster of triggered is whelp - PreventHitDefaultEffect(effIndex); - std::list unitList; - GetCreatureListWithEntryInGrid(unitList, GetCaster(), NPC_FROSTWING_WHELP, 150.0f); - if (Creature* creature = GetCaster()->ToCreature()) - unitList.remove_if(OrderWhelpTargetSelector(creature)); - - if (unitList.empty()) - return; - - Acore::Containers::SelectRandomContainerElement(unitList)->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_frostwarden_handler_order_whelp_SpellScript::HandleForcedCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frostwarden_handler_order_whelp_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void FilterTargets(std::list& targets) { - return new spell_frostwarden_handler_order_whelp_SpellScript(); + targets.remove_if(Acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); + if (targets.empty()) + return; + + WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleForcedCast(SpellEffIndex effIndex) + { + // caster is Frostwarden Handler, target is player, caster of triggered is whelp + PreventHitDefaultEffect(effIndex); + std::list unitList; + GetCreatureListWithEntryInGrid(unitList, GetCaster(), NPC_FROSTWING_WHELP, 150.0f); + if (Creature* creature = GetCaster()->ToCreature()) + unitList.remove_if(OrderWhelpTargetSelector(creature)); + + if (unitList.empty()) + return; + + Acore::Containers::SelectRandomContainerElement(unitList)->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_frostwarden_handler_order_whelp::HandleForcedCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frostwarden_handler_order_whelp::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); } }; -class spell_frostwarden_handler_focus_fire : public SpellScriptLoader +class spell_frostwarden_handler_focus_fire : public SpellScript { -public: - spell_frostwarden_handler_focus_fire() : SpellScriptLoader("spell_frostwarden_handler_focus_fire") { } + PrepareSpellScript(spell_frostwarden_handler_focus_fire); - class spell_frostwarden_handler_focus_fire_SpellScript : public SpellScript + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_frostwarden_handler_focus_fire_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->AddThreat(GetHitUnit(), float(GetEffectValue())); - GetCaster()->GetAI()->SetData(DATA_WHELP_MARKER, 1); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_frostwarden_handler_focus_fire_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - class spell_frostwarden_handler_focus_fire_AuraScript : public AuraScript - { - PrepareAuraScript(spell_frostwarden_handler_focus_fire_AuraScript); - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - { - caster->AddThreat(GetTarget(), -float(GetSpellInfo()->Effects[EFFECT_1].CalcValue())); - caster->GetAI()->SetData(DATA_WHELP_MARKER, 0); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_frostwarden_handler_focus_fire_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_frostwarden_handler_focus_fire_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->AddThreat(GetHitUnit(), float(GetEffectValue())); + GetCaster()->GetAI()->SetData(DATA_WHELP_MARKER, 1); } - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_frostwarden_handler_focus_fire_AuraScript(); + OnEffectHitTarget += SpellEffectFn(spell_frostwarden_handler_focus_fire::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_sindragosa_frost_breath : public SpellScriptLoader +class spell_frostwarden_handler_focus_fire_aura : public AuraScript { -public: - spell_sindragosa_frost_breath() : SpellScriptLoader("spell_sindragosa_frost_breath") { } + PrepareAuraScript(spell_frostwarden_handler_focus_fire_aura); - class spell_sindragosa_frost_breath_SpellScript : public SpellScript + void PeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareSpellScript(spell_sindragosa_frost_breath_SpellScript); - - void HandleInfusion() + PreventDefaultAction(); + if (Unit* caster = GetCaster()) { - Player* target = GetHitPlayer(); - if (!target) - return; - - // Check difficulty and quest status - if (!(target->GetRaidDifficulty() & RAID_DIFFICULTY_MASK_25MAN) || target->GetQuestStatus(QUEST_FROST_INFUSION) != QUEST_STATUS_INCOMPLETE) - return; - - // Check if player has Shadow's Edge equipped and not ready for infusion - if (!target->HasAura(SPELL_UNSATED_CRAVING) || target->HasAura(SPELL_FROST_IMBUED_BLADE)) - return; - - Aura* infusion = target->GetAura(SPELL_FROST_INFUSION, target->GetGUID()); - if (infusion && infusion->GetStackAmount() >= 3) - { - target->RemoveAura(infusion); - target->CastSpell(target, SPELL_FROST_IMBUED_BLADE, TRIGGERED_FULL_MASK); - } - else - target->CastSpell(target, SPELL_FROST_INFUSION, TRIGGERED_FULL_MASK); + caster->AddThreat(GetTarget(), -float(GetSpellInfo()->Effects[EFFECT_1].CalcValue())); + caster->GetAI()->SetData(DATA_WHELP_MARKER, 0); } + } - void Register() override - { - AfterHit += SpellHitFn(spell_sindragosa_frost_breath_SpellScript::HandleInfusion); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_sindragosa_frost_breath_SpellScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_frostwarden_handler_focus_fire_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +class spell_sindragosa_frost_breath : public SpellScript +{ + PrepareSpellScript(spell_sindragosa_frost_breath); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_UNSATED_CRAVING, SPELL_FROST_IMBUED_BLADE, SPELL_FROST_INFUSION }); + } + + void HandleInfusion() + { + Player* target = GetHitPlayer(); + if (!target) + return; + + // Check difficulty and quest status + if (!(target->GetRaidDifficulty() & RAID_DIFFICULTY_MASK_25MAN) || target->GetQuestStatus(QUEST_FROST_INFUSION) != QUEST_STATUS_INCOMPLETE) + return; + + // Check if player has Shadow's Edge equipped and not ready for infusion + if (!target->HasAura(SPELL_UNSATED_CRAVING) || target->HasAura(SPELL_FROST_IMBUED_BLADE)) + return; + + Aura* infusion = target->GetAura(SPELL_FROST_INFUSION, target->GetGUID()); + if (infusion && infusion->GetStackAmount() >= 3) + { + target->RemoveAura(infusion); + target->CastSpell(target, SPELL_FROST_IMBUED_BLADE, TRIGGERED_FULL_MASK); + } + else + target->CastSpell(target, SPELL_FROST_INFUSION, TRIGGERED_FULL_MASK); + } + + void Register() override + { + AfterHit += SpellHitFn(spell_sindragosa_frost_breath::HandleInfusion); } }; @@ -1955,29 +1808,29 @@ void AddSC_boss_sindragosa() { new boss_sindragosa(); new npc_ice_tomb(); - new spell_sindragosa_s_fury(); + RegisterSpellScript(spell_sindragosa_s_fury); RegisterSpellScript(spell_sindragosa_unchained_magic); - new spell_sindragosa_permeating_chill(); - new spell_sindragosa_instability(); - new spell_sindragosa_icy_grip(); - new spell_sindragosa_icy_grip_jump(); - new spell_sindragosa_ice_tomb_filter(); - new spell_trigger_spell_from_caster("spell_sindragosa_ice_tomb", SPELL_ICE_TOMB_DUMMY); - new spell_trigger_spell_from_caster("spell_sindragosa_ice_tomb_dummy", SPELL_FROST_BEACON); - new spell_sindragosa_frost_beacon(); - new spell_sindragosa_ice_tomb(); - new spell_sindragosa_mystic_buffet(); - new spell_sindragosa_soul_preservation(); + RegisterSpellScript(spell_sindragosa_permeating_chill_aura); + RegisterSpellScript(spell_sindragosa_instability_aura); + RegisterSpellScript(spell_sindragosa_icy_grip); + RegisterSpellScript(spell_sindragosa_icy_grip_jump); + RegisterSpellScript(spell_sindragosa_ice_tomb_filter); + RegisterSpellScriptWithArgs(spell_trigger_spell_from_caster, "spell_sindragosa_ice_tomb", SPELL_ICE_TOMB_DUMMY); + RegisterSpellScriptWithArgs(spell_trigger_spell_from_caster, "spell_sindragosa_ice_tomb_dummy", SPELL_FROST_BEACON); + RegisterSpellScript(spell_sindragosa_frost_beacon_aura); + RegisterSpellAndAuraScriptPair(spell_sindragosa_ice_tomb_trap, spell_sindragosa_ice_tomb_trap_aura); + RegisterSpellScript(spell_sindragosa_mystic_buffet); + RegisterSpellScript(spell_sindragosa_soul_preservation_aura); new achievement_all_you_can_eat(); new npc_spinestalker(); new npc_rimefang(); - new spell_rimefang_icy_blast(); + RegisterSpellScript(spell_rimefang_icy_blast); new at_sindragosa_lair(); new npc_sindragosa_trash(); - new spell_frostwarden_handler_order_whelp(); - new spell_frostwarden_handler_focus_fire(); + RegisterSpellScript(spell_frostwarden_handler_order_whelp); + RegisterSpellAndAuraScriptPair(spell_frostwarden_handler_focus_fire, spell_frostwarden_handler_focus_fire_aura); - new spell_sindragosa_frost_breath(); + RegisterSpellScript(spell_sindragosa_frost_breath); } 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 96ec7df6b..1a64dd1f6 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -1675,135 +1675,96 @@ public: } }; -class spell_the_lich_king_quake : public SpellScriptLoader +class spell_the_lich_king_quake : public SpellScript { -public: - spell_the_lich_king_quake() : SpellScriptLoader("spell_the_lich_king_quake") { } + PrepareSpellScript(spell_the_lich_king_quake); - class spell_the_lich_king_quake_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_the_lich_king_quake_SpellScript); + return GetCaster()->GetInstanceScript() != nullptr; + } - bool Load() override - { - return GetCaster()->GetInstanceScript() != nullptr; - } - - void FilterTargets(std::list& targets) - { - if (GameObject* platform = ObjectAccessor::GetGameObject(*GetCaster(), GetCaster()->GetInstanceScript()->GetGuidData(DATA_ARTHAS_PLATFORM))) - targets.remove_if(HeightDifferenceCheck(platform, 5.0f, false)); - } - - void HandleSendEvent(SpellEffIndex /*effIndex*/) - { - if (GetCaster()->IsAIEnabled) - GetCaster()->GetAI()->DoAction(ACTION_START_ATTACK); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_quake_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHit += SpellEffectFn(spell_the_lich_king_quake_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const override + void FilterTargets(std::list& targets) { - return new spell_the_lich_king_quake_SpellScript(); + if (GameObject* platform = ObjectAccessor::GetGameObject(*GetCaster(), GetCaster()->GetInstanceScript()->GetGuidData(DATA_ARTHAS_PLATFORM))) + targets.remove_if(HeightDifferenceCheck(platform, 5.0f, false)); + } + + void HandleSendEvent(SpellEffIndex /*effIndex*/) + { + if (GetCaster()->IsAIEnabled) + GetCaster()->GetAI()->DoAction(ACTION_START_ATTACK); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_quake::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHit += SpellEffectFn(spell_the_lich_king_quake::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); } }; -class spell_the_lich_king_jump : public SpellScriptLoader +class spell_the_lich_king_jump : public SpellScript { -public: - spell_the_lich_king_jump() : SpellScriptLoader("spell_the_lich_king_jump") { } + PrepareSpellScript(spell_the_lich_king_jump); - class spell_the_lich_king_jump_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_the_lich_king_jump_SpellScript); + return ValidateSpellInfo({ SPELL_RAISE_DEAD, SPELL_JUMP_2 }); + } - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->RemoveAurasDueToSpell(SPELL_RAISE_DEAD); - GetHitUnit()->InterruptNonMeleeSpells(true); - GetHitUnit()->CastSpell((Unit*)nullptr, SPELL_JUMP_2, true); - if (Creature* creature = GetHitCreature()) - creature->AI()->DoAction(ACTION_BREAK_FROSTMOURNE); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_jump_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex effIndex) { - return new spell_the_lich_king_jump_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->RemoveAurasDueToSpell(SPELL_RAISE_DEAD); + GetHitUnit()->InterruptNonMeleeSpells(true); + GetHitUnit()->CastSpell((Unit*)nullptr, SPELL_JUMP_2, true); + if (Creature* creature = GetHitCreature()) + creature->AI()->DoAction(ACTION_BREAK_FROSTMOURNE); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_jump::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_the_lich_king_jump_remove_aura : public SpellScriptLoader +class spell_the_lich_king_jump_remove_aura : public SpellScript { -public: - spell_the_lich_king_jump_remove_aura() : SpellScriptLoader("spell_the_lich_king_jump_remove_aura") { } + PrepareSpellScript(spell_the_lich_king_jump_remove_aura); - class spell_the_lich_king_jump_SpellScript : public SpellScript + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_the_lich_king_jump_SpellScript); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); + } - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_jump_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_the_lich_king_jump_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_jump_remove_aura::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_the_lich_king_play_movie : public SpellScriptLoader +class spell_the_lich_king_play_movie : public SpellScript { -public: - spell_the_lich_king_play_movie() : SpellScriptLoader("spell_the_lich_king_play_movie") { } + PrepareSpellScript(spell_the_lich_king_play_movie); - class spell_the_lich_king_play_movie_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_the_lich_king_play_movie_SpellScript); + if (!sMovieStore.LookupEntry(MOVIE_FALL_OF_THE_LICH_KING)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spell*/) override - { - if (!sMovieStore.LookupEntry(MOVIE_FALL_OF_THE_LICH_KING)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Player* player = GetHitPlayer()) - player->SendMovieStart(MOVIE_FALL_OF_THE_LICH_KING); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_play_movie_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex effIndex) { - return new spell_the_lich_king_play_movie_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Player* player = GetHitPlayer()) + player->SendMovieStart(MOVIE_FALL_OF_THE_LICH_KING); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_play_movie::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -1879,329 +1840,275 @@ public: } }; -class spell_the_lich_king_infest : public SpellScriptLoader +class spell_the_lich_king_infest_aura : public AuraScript { -public: - spell_the_lich_king_infest() : SpellScriptLoader("spell_the_lich_king_infest") { } + PrepareAuraScript(spell_the_lich_king_infest_aura); - class spell_the_lich_king_infest_AuraScript : public AuraScript + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_the_lich_king_infest_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) + if (GetUnitOwner()->HealthAbovePct(90)) { - if (GetUnitOwner()->HealthAbovePct(90)) - { - PreventDefaultAction(); - Remove(AURA_REMOVE_BY_ENEMY_SPELL); - } - } - - void OnUpdate(AuraEffect* aurEff) - { - // multiply, starting from 2nd tick - if (aurEff->GetTickNumber() == 1) - return; - - aurEff->SetAmount(int32(aurEff->GetAmount() * 1.15f)); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_infest_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_the_lich_king_infest_AuraScript::OnUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_the_lich_king_infest_AuraScript(); - } -}; - -class spell_the_lich_king_necrotic_plague : public SpellScriptLoader -{ -public: - spell_the_lich_king_necrotic_plague() : SpellScriptLoader("spell_the_lich_king_necrotic_plague") { } - - class spell_the_lich_king_necrotic_plague_AuraScript : public AuraScript - { - PrepareAuraScript(spell_the_lich_king_necrotic_plague_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_NECROTIC_PLAGUE_JUMP }); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - bool dispel = false; - switch (GetTargetApplication()->GetRemoveMode()) - { - case AURA_REMOVE_BY_ENEMY_SPELL: - dispel = true; - case AURA_REMOVE_BY_EXPIRE: - case AURA_REMOVE_BY_DEATH: - break; - default: - return; - } - - CustomSpellValues values; - if (dispel) - values.AddSpellMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) - GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_the_lich_king_necrotic_plague_AuraScript(); - } -}; - -class spell_the_lich_king_necrotic_plague_jump : public SpellScriptLoader -{ -public: - spell_the_lich_king_necrotic_plague_jump() : SpellScriptLoader("spell_the_lich_king_necrotic_plague_jump") { } - - class spell_the_lich_king_necrotic_plague_SpellScript : public SpellScript - { - PrepareSpellScript(spell_the_lich_king_necrotic_plague_SpellScript); - - bool Load() override - { - _hadJumpingAura = false; - _hadInitialAura = false; - return true; - } - - void FilterTargets(std::list& targets) - { - targets.sort(Acore::ObjectDistanceOrderPred(GetCaster())); - if (targets.size() <= 1) - return; - - targets.resize(1); - } - - void CheckAura(SpellMissInfo missInfo) - { - if (missInfo != SPELL_MISS_NONE) - { - return; - } - - if (GetHitUnit()->HasAura(GetSpellInfo()->Id)) - _hadJumpingAura = true; - else if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE, GetHitUnit())) - if (GetHitUnit()->HasAura(spellId)) - _hadInitialAura = true; - } - - void AddMissingStack() - { - if (GetHitAura() && !_hadJumpingAura) - { - uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE, GetHitUnit()); - if (GetSpellValue()->EffectBasePoints[EFFECT_1] != AURA_REMOVE_BY_ENEMY_SPELL || _hadInitialAura) - GetHitAura()->ModStackAmount(1); - if (_hadInitialAura) - if (Aura* a = GetHitUnit()->GetAura(spellId)) - a->Remove(AURA_REMOVE_BY_DEFAULT); - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_necrotic_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - BeforeHit += BeforeSpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::CheckAura); - OnHit += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::AddMissingStack); - } - - bool _hadJumpingAura; - bool _hadInitialAura; - }; - - class spell_the_lich_king_necrotic_plague_AuraScript : public AuraScript - { - PrepareAuraScript(spell_the_lich_king_necrotic_plague_AuraScript); - - bool Load() override - { - _lastAmount = 0; - return true; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (caster->GetAI()) - caster->GetAI()->SetData(DATA_PLAGUE_STACK, GetStackAmount()); - } - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - _lastAmount = aurEff->GetAmount(); - switch (GetTargetApplication()->GetRemoveMode()) - { - case AURA_REMOVE_BY_EXPIRE: - case AURA_REMOVE_BY_DEATH: - break; - default: - return; - } - - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); - GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); - } - - void OnDispel(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - _lastAmount = aurEff->GetAmount(); - } - - void AfterDispel(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // this means the stack increased so don't process as if dispelled - if (aurEff->GetAmount() > _lastAmount) - return; - - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); - values.AddSpellMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) - GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); - + PreventDefaultAction(); Remove(AURA_REMOVE_BY_ENEMY_SPELL); } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_the_lich_king_necrotic_plague_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_AuraScript::OnDispel, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); - AfterEffectApply += AuraEffectApplyFn(spell_the_lich_king_necrotic_plague_AuraScript::AfterDispel, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); - } - - int32 _lastAmount; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_the_lich_king_necrotic_plague_SpellScript(); } - AuraScript* GetAuraScript() const override + void OnUpdate(AuraEffect* aurEff) { - return new spell_the_lich_king_necrotic_plague_AuraScript(); + // multiply, starting from 2nd tick + if (aurEff->GetTickNumber() == 1) + return; + + aurEff->SetAmount(int32(aurEff->GetAmount() * 1.15f)); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_infest_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_the_lich_king_infest_aura::OnUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); } }; -class spell_the_lich_king_shadow_trap_visual : public SpellScriptLoader +class spell_the_lich_king_necrotic_plague_aura : public AuraScript { -public: - spell_the_lich_king_shadow_trap_visual() : SpellScriptLoader("spell_the_lich_king_shadow_trap_visual") { } + PrepareAuraScript(spell_the_lich_king_necrotic_plague_aura); - class spell_the_lich_king_shadow_trap_visual_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareAuraScript(spell_the_lich_king_shadow_trap_visual_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) - GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_TRAP_AURA, TRIGGERED_NONE); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_shadow_trap_visual_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_the_lich_king_shadow_trap_visual_AuraScript(); + return ValidateSpellInfo({ SPELL_NECROTIC_PLAGUE_JUMP }); } -}; -class spell_the_lich_king_shadow_trap_periodic : public SpellScriptLoader -{ -public: - spell_the_lich_king_shadow_trap_periodic() : SpellScriptLoader("spell_the_lich_king_shadow_trap_periodic") { } - - class spell_the_lich_king_shadow_trap_periodic_SpellScript : public SpellScript + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareSpellScript(spell_the_lich_king_shadow_trap_periodic_SpellScript); - - void CheckTargetCount(std::list& targets) + bool dispel = false; + switch (GetTargetApplication()->GetRemoveMode()) { - if (targets.empty()) + case AURA_REMOVE_BY_ENEMY_SPELL: + dispel = true; + case AURA_REMOVE_BY_EXPIRE: + case AURA_REMOVE_BY_DEATH: + break; + default: return; - - 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) - GetCaster()->ToCreature()->DespawnOrUnsummon(3000); } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_shadow_trap_periodic_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; + CustomSpellValues values; + if (dispel) + values.AddSpellMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) + GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - SpellScript* GetSpellScript() const override + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); + } + + void Register() override { - return new spell_the_lich_king_shadow_trap_periodic_SpellScript(); + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_aura::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } }; -class spell_the_lich_king_ice_burst_target_search : public SpellScriptLoader +class spell_the_lich_king_necrotic_plague_jump : public SpellScript { -public: - spell_the_lich_king_ice_burst_target_search() : SpellScriptLoader("spell_the_lich_king_ice_burst_target_search") { } + PrepareSpellScript(spell_the_lich_king_necrotic_plague_jump); - class spell_the_lich_king_ice_burst_target_search_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_the_lich_king_ice_burst_target_search_SpellScript); + _hadJumpingAura = false; + _hadInitialAura = false; + return true; + } - bool Validate(SpellInfo const* /*spell*/) override + void FilterTargets(std::list& targets) + { + targets.sort(Acore::ObjectDistanceOrderPred(GetCaster())); + if (targets.size() <= 1) + return; + + targets.resize(1); + } + + void CheckAura(SpellMissInfo missInfo) + { + if (missInfo != SPELL_MISS_NONE) { - return ValidateSpellInfo({ SPELL_ICE_BURST }); + return; } - void CheckTargetCount(std::list& unitList) + if (GetHitUnit()->HasAura(GetSpellInfo()->Id)) + _hadJumpingAura = true; + else if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE, GetHitUnit())) + if (GetHitUnit()->HasAura(spellId)) + _hadInitialAura = true; + } + + void AddMissingStack() + { + if (GetHitAura() && !_hadJumpingAura) { - if (unitList.empty()) + uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE, GetHitUnit()); + if (GetSpellValue()->EffectBasePoints[EFFECT_1] != AURA_REMOVE_BY_ENEMY_SPELL || _hadInitialAura) + GetHitAura()->ModStackAmount(1); + if (_hadInitialAura) + if (Aura* a = GetHitUnit()->GetAura(spellId)) + a->Remove(AURA_REMOVE_BY_DEFAULT); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_necrotic_plague_jump::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + BeforeHit += BeforeSpellHitFn(spell_the_lich_king_necrotic_plague_jump::CheckAura); + OnHit += SpellHitFn(spell_the_lich_king_necrotic_plague_jump::AddMissingStack); + } + +private: + bool _hadJumpingAura; + bool _hadInitialAura; +}; + +class spell_the_lich_king_necrotic_plague_jump_aura : public AuraScript +{ + PrepareAuraScript(spell_the_lich_king_necrotic_plague_jump_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_NECROTIC_PLAGUE_JUMP, SPELL_PLAGUE_SIPHON }); + } + + bool Load() override + { + _lastAmount = 0; + return true; + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (caster->GetAI()) + caster->GetAI()->SetData(DATA_PLAGUE_STACK, GetStackAmount()); + } + + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + _lastAmount = aurEff->GetAmount(); + switch (GetTargetApplication()->GetRemoveMode()) + { + case AURA_REMOVE_BY_EXPIRE: + case AURA_REMOVE_BY_DEATH: + break; + default: return; - - if (GetCaster()->GetTypeId() == TYPEID_UNIT) - GetCaster()->ToCreature()->AI()->DoAction(-1); } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_ice_burst_target_search_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; + CustomSpellValues values; + values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); + GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); + } - SpellScript* GetSpellScript() const override + void OnDispel(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - return new spell_the_lich_king_ice_burst_target_search_SpellScript(); + _lastAmount = aurEff->GetAmount(); + } + + void AfterDispel(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + // this means the stack increased so don't process as if dispelled + if (aurEff->GetAmount() > _lastAmount) + return; + + CustomSpellValues values; + values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); + values.AddSpellMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) + GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); + + Remove(AURA_REMOVE_BY_ENEMY_SPELL); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_the_lich_king_necrotic_plague_jump_aura::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_jump_aura::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_jump_aura::OnDispel, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); + AfterEffectApply += AuraEffectApplyFn(spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); + } + +private: + int32 _lastAmount; +}; + +class spell_the_lich_king_shadow_trap_visual_aura : public AuraScript +{ + PrepareAuraScript(spell_the_lich_king_shadow_trap_visual_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SHADOW_TRAP_AURA }); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_TRAP_AURA, TRIGGERED_NONE); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_shadow_trap_visual_aura::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_the_lich_king_shadow_trap_periodic : public SpellScript +{ + PrepareSpellScript(spell_the_lich_king_shadow_trap_periodic); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SHADOW_TRAP_KNOCKBACK }); + } + + void CheckTargetCount(std::list& targets) + { + if (targets.empty()) + return; + + 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) + GetCaster()->ToCreature()->DespawnOrUnsummon(3000); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_shadow_trap_periodic::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } +}; + +class spell_the_lich_king_ice_burst_target_search : public SpellScript +{ + PrepareSpellScript(spell_the_lich_king_ice_burst_target_search); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_ICE_BURST }); + } + + void CheckTargetCount(std::list& unitList) + { + if (unitList.empty()) + return; + + if (GetCaster()->GetTypeId() == TYPEID_UNIT) + GetCaster()->ToCreature()->AI()->DoAction(-1); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_ice_burst_target_search::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; @@ -2283,31 +2190,20 @@ public: } }; -class spell_the_lich_king_raging_spirit : public SpellScriptLoader +class spell_the_lich_king_raging_spirit : public SpellScript { -public: - spell_the_lich_king_raging_spirit() : SpellScriptLoader("spell_the_lich_king_raging_spirit") { } + PrepareSpellScript(spell_the_lich_king_raging_spirit); - class spell_the_lich_king_raging_spirit_SpellScript : public SpellScript + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_the_lich_king_raging_spirit_SpellScript); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, uint32(GetEffectValue()), true, 0, 0, target->GetGUID()); + } - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, uint32(GetEffectValue()), true, 0, 0, target->GetGUID()); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_raging_spirit_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_the_lich_king_raging_spirit_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_raging_spirit::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -2444,75 +2340,58 @@ public: } }; -class spell_the_lich_king_defile : public SpellScriptLoader +class spell_the_lich_king_defile : public SpellScript { -public: - spell_the_lich_king_defile() : SpellScriptLoader("spell_the_lich_king_defile") { } + PrepareSpellScript(spell_the_lich_king_defile); - class spell_the_lich_king_defile_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_the_lich_king_defile_SpellScript); + return ValidateSpellInfo({ SPELL_DEFILE_GROW }); + } - void CorrectRange(std::list& targets) - { - targets.remove_if(VehicleCheck()); - targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 10.0f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X), true)); - uint32 strangulatedAura[4] = {68980, 74325, 74296, 74297}; - targets.remove_if(Acore::UnitAuraCheck(true, strangulatedAura[GetCaster()->GetMap()->GetDifficulty()])); - } - - void ChangeDamageAndGrow() - { - SetHitDamage(int32(GetHitDamage() * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X))); - // HACK: target player should cast this spell on defile - // however with current aura handling auras cast by different units - // cannot stack on the same aura object increasing the stack count - GetCaster()->CastSpell(GetCaster(), SPELL_DEFILE_GROW, true); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_defile_SpellScript::CorrectRange, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_defile_SpellScript::CorrectRange, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnHit += SpellHitFn(spell_the_lich_king_defile_SpellScript::ChangeDamageAndGrow); - } - }; - - SpellScript* GetSpellScript() const override + void CorrectRange(std::list& targets) { - return new spell_the_lich_king_defile_SpellScript(); + targets.remove_if(VehicleCheck()); + targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 10.0f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X), true)); + uint32 strangulatedAura[4] = {68980, 74325, 74296, 74297}; + targets.remove_if(Acore::UnitAuraCheck(true, strangulatedAura[GetCaster()->GetMap()->GetDifficulty()])); + } + + void ChangeDamageAndGrow() + { + SetHitDamage(int32(GetHitDamage() * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X))); + // HACK: target player should cast this spell on defile + // however with current aura handling auras cast by different units + // cannot stack on the same aura object increasing the stack count + GetCaster()->CastSpell(GetCaster(), SPELL_DEFILE_GROW, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_defile::CorrectRange, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_defile::CorrectRange, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnHit += SpellHitFn(spell_the_lich_king_defile::ChangeDamageAndGrow); } }; -class spell_the_lich_king_soul_reaper : public SpellScriptLoader +class spell_the_lich_king_soul_reaper_aura : public AuraScript { -public: - spell_the_lich_king_soul_reaper() : SpellScriptLoader("spell_the_lich_king_soul_reaper") { } + PrepareAuraScript(spell_the_lich_king_soul_reaper_aura); - class spell_the_lich_king_soul_reaper_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareAuraScript(spell_the_lich_king_soul_reaper_AuraScript); + return ValidateSpellInfo({ SPELL_SOUL_REAPER_BUFF }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_SOUL_REAPER_BUFF }); - } - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* caster = GetCaster()) - GetTarget()->CastSpell(caster, SPELL_SOUL_REAPER_BUFF, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_soul_reaper_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override + void OnPeriodic(AuraEffect const* /*aurEff*/) { - return new spell_the_lich_king_soul_reaper_AuraScript(); + if (Unit* caster = GetCaster()) + GetTarget()->CastSpell(caster, SPELL_SOUL_REAPER_BUFF, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_soul_reaper_aura::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); } }; @@ -2725,395 +2604,297 @@ public: } }; -class spell_the_lich_king_summon_into_air : public SpellScriptLoader +class spell_the_lich_king_summon_into_air : public SpellScript { -public: - spell_the_lich_king_summon_into_air() : SpellScriptLoader("spell_the_lich_king_summon_into_air") { } + PrepareSpellScript(spell_the_lich_king_summon_into_air); - class spell_the_lich_king_summon_into_air_SpellScript : public SpellScript + void ModDestHeight(SpellEffIndex effIndex) { - PrepareSpellScript(spell_the_lich_king_summon_into_air_SpellScript); - - void ModDestHeight(SpellEffIndex effIndex) + float addZ; + switch (GetSpellInfo()->Effects[effIndex].MiscValue) { - float addZ; - switch (GetSpellInfo()->Effects[effIndex].MiscValue) - { - case NPC_SPIRIT_BOMB: - addZ = 30.0f; - break; - case NPC_VILE_SPIRIT: - addZ = 13.0f; - break; - default: - addZ = 15.0f; - break; - } - Position const offset = {0.0f, 0.0f, addZ, 0.0f}; - WorldLocation* dest = const_cast(GetExplTargetDest()); - dest->RelocateOffset(offset); - GetHitDest()->RelocateOffset(offset); + case NPC_SPIRIT_BOMB: + addZ = 30.0f; + break; + case NPC_VILE_SPIRIT: + addZ = 13.0f; + break; + default: + addZ = 15.0f; + break; } + Position const offset = {0.0f, 0.0f, addZ, 0.0f}; + WorldLocation* dest = const_cast(GetExplTargetDest()); + dest->RelocateOffset(offset); + GetHitDest()->RelocateOffset(offset); + } - void Register() override - { - OnEffectHit += SpellEffectFn(spell_the_lich_king_summon_into_air_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_the_lich_king_summon_into_air_SpellScript(); + OnEffectHit += SpellEffectFn(spell_the_lich_king_summon_into_air::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON); } }; -class spell_the_lich_king_teleport_to_frostmourne_hc : public SpellScriptLoader +class spell_the_lich_king_teleport_to_frostmourne_hc : public SpellScript { -public: - spell_the_lich_king_teleport_to_frostmourne_hc() : SpellScriptLoader("spell_the_lich_king_teleport_to_frostmourne_hc") { } + PrepareSpellScript(spell_the_lich_king_teleport_to_frostmourne_hc); - class spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript : public SpellScript + void ModDest(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript); + float dist = 2.0f + rand_norm() * 18.0f; + float angle = rand_norm() * 2 * M_PI; + Position const offset = {dist * cos(angle), dist * std::sin(angle), 0.0f, 0.0f}; + WorldLocation* dest = const_cast(GetExplTargetDest()); + dest->RelocateOffset(offset); + GetHitDest()->RelocateOffset(offset); + } - void ModDest(SpellEffIndex /*effIndex*/) - { - float dist = 2.0f + rand_norm() * 18.0f; - float angle = rand_norm() * 2 * M_PI; - Position const offset = {dist * cos(angle), dist * std::sin(angle), 0.0f, 0.0f}; - WorldLocation* dest = const_cast(GetExplTargetDest()); - dest->RelocateOffset(offset); - GetHitDest()->RelocateOffset(offset); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript::ModDest, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript(); + OnEffectHit += SpellEffectFn(spell_the_lich_king_teleport_to_frostmourne_hc::ModDest, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS); } }; -class spell_the_lich_king_valkyr_target_search : public SpellScriptLoader +class spell_the_lich_king_valkyr_target_search : public SpellScript { -public: - spell_the_lich_king_valkyr_target_search() : SpellScriptLoader("spell_the_lich_king_valkyr_target_search") { } + PrepareSpellScript(spell_the_lich_king_valkyr_target_search); - class spell_the_lich_king_valkyr_target_search_SpellScript : public SpellScript + WorldObject* _target; + + bool Load() override { - PrepareSpellScript(spell_the_lich_king_valkyr_target_search_SpellScript); + _target = nullptr; + return true; + } - WorldObject* _target; - - bool Load() override + void SelectTarget(std::list& targets) + { + if (targets.empty()) + return; + Creature* caster = GetCaster()->ToCreature(); + if (!caster) { - _target = nullptr; - return true; - } - - void SelectTarget(std::list& targets) - { - if (targets.empty()) - return; - Creature* caster = GetCaster()->ToCreature(); - if (!caster) - { - targets.clear(); - return; - } - targets.remove_if(Acore::UnitAuraCheck(true, GetSpellInfo()->Id)); - targets.remove_if(Acore::UnitAuraCheck(true, SPELL_BOSS_HITTIN_YA_AURA)); // done in dbc, but just to be sure xd - targets.remove_if(Acore::UnitAuraCheck(true, SPELL_HARVEST_SOUL_VALKYR)); - if (InstanceScript* _instance = caster->GetInstanceScript()) - if (Creature* lichKing = ObjectAccessor::GetCreature(*caster, _instance->GetGuidData(DATA_THE_LICH_KING))) - if (Spell* s = lichKing->GetCurrentSpell(CURRENT_GENERIC_SPELL)) - if (s->GetSpellInfo()->Id == SPELL_DEFILE && s->m_targets.GetUnitTarget()) - targets.remove(s->m_targets.GetUnitTarget()); - - if (targets.empty()) - return; - - _target = Acore::Containers::SelectRandomContainerElement(targets); targets.clear(); + return; + } + targets.remove_if(Acore::UnitAuraCheck(true, GetSpellInfo()->Id)); + targets.remove_if(Acore::UnitAuraCheck(true, SPELL_BOSS_HITTIN_YA_AURA)); // done in dbc, but just to be sure xd + targets.remove_if(Acore::UnitAuraCheck(true, SPELL_HARVEST_SOUL_VALKYR)); + if (InstanceScript* _instance = caster->GetInstanceScript()) + if (Creature* lichKing = ObjectAccessor::GetCreature(*caster, _instance->GetGuidData(DATA_THE_LICH_KING))) + if (Spell* s = lichKing->GetCurrentSpell(CURRENT_GENERIC_SPELL)) + if (s->GetSpellInfo()->Id == SPELL_DEFILE && s->m_targets.GetUnitTarget()) + targets.remove(s->m_targets.GetUnitTarget()); + + if (targets.empty()) + return; + + _target = Acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(_target); + if (Creature* caster = GetCaster()->ToCreature()) + caster->AI()->SetGUID(_target->GetGUID()); + } + + void ReplaceTarget(std::list& targets) + { + targets.clear(); + if (_target) targets.push_back(_target); - if (Creature* caster = GetCaster()->ToCreature()) - caster->AI()->SetGUID(_target->GetGUID()); - } + } - void ReplaceTarget(std::list& targets) - { - targets.clear(); - if (_target) - targets.push_back(_target); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - { - GetCaster()->GetMotionMaster()->MoveCharge(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 4.0f, 42.0f, EVENT_CHARGE); - GetCaster()->SetDisableGravity(true, true); - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_valkyr_target_search_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_valkyr_target_search_SpellScript::ReplaceTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_valkyr_target_search_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex effIndex) { - return new spell_the_lich_king_valkyr_target_search_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + { + GetCaster()->GetMotionMaster()->MoveCharge(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 4.0f, 42.0f, EVENT_CHARGE); + GetCaster()->SetDisableGravity(true, true); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_valkyr_target_search::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_valkyr_target_search::ReplaceTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_valkyr_target_search::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_the_lich_king_cast_back_to_caster : public SpellScriptLoader +class spell_the_lich_king_cast_back_to_caster : public SpellScript { -public: - spell_the_lich_king_cast_back_to_caster() : SpellScriptLoader("spell_the_lich_king_cast_back_to_caster") { } + PrepareSpellScript(spell_the_lich_king_cast_back_to_caster); - class spell_the_lich_king_cast_back_to_caster_SpellScript : public SpellScript + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_the_lich_king_cast_back_to_caster_SpellScript); + GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); + } - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_cast_back_to_caster_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_the_lich_king_cast_back_to_caster_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_cast_back_to_caster::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_the_lich_king_life_siphon : public SpellScriptLoader +class spell_the_lich_king_life_siphon : public SpellScript { -public: - spell_the_lich_king_life_siphon() : SpellScriptLoader("spell_the_lich_king_life_siphon") { } + PrepareSpellScript(spell_the_lich_king_life_siphon); - class spell_the_lich_king_life_siphon_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_the_lich_king_life_siphon_SpellScript); + return ValidateSpellInfo({ SPELL_LIFE_SIPHON_HEAL }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_LIFE_SIPHON_HEAL }); - } - - void TriggerHeal() - { - GetHitUnit()->CastCustomSpell(SPELL_LIFE_SIPHON_HEAL, SPELLVALUE_BASE_POINT0, GetHitDamage() * 10, GetCaster(), true); - } - - void Register() override - { - AfterHit += SpellHitFn(spell_the_lich_king_life_siphon_SpellScript::TriggerHeal); - } - }; - - SpellScript* GetSpellScript() const override + void TriggerHeal() { - return new spell_the_lich_king_life_siphon_SpellScript(); + GetHitUnit()->CastCustomSpell(SPELL_LIFE_SIPHON_HEAL, SPELLVALUE_BASE_POINT0, GetHitDamage() * 10, GetCaster(), true); + } + + void Register() override + { + AfterHit += SpellHitFn(spell_the_lich_king_life_siphon::TriggerHeal); } }; -class spell_the_lich_king_vile_spirits : public SpellScriptLoader +class spell_the_lich_king_vile_spirits_aura : public AuraScript { -public: - spell_the_lich_king_vile_spirits() : SpellScriptLoader("spell_the_lich_king_vile_spirits") { } + PrepareAuraScript(spell_the_lich_king_vile_spirits_aura); - class spell_the_lich_king_vile_spirits_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_the_lich_king_vile_spirits_AuraScript); + _is25Man = GetUnitOwner()->GetMap()->Is25ManRaid(); + return true; + } - bool Load() override - { - _is25Man = GetUnitOwner()->GetMap()->Is25ManRaid(); - return true; - } - - void OnPeriodic(AuraEffect const* aurEff) - { - if (_is25Man || ((aurEff->GetTickNumber() - 1) % 5)) - GetTarget()->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, nullptr, aurEff, GetCasterGUID()); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_vile_spirits_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - - bool _is25Man; - }; - - AuraScript* GetAuraScript() const override + void OnPeriodic(AuraEffect const* aurEff) { - return new spell_the_lich_king_vile_spirits_AuraScript(); + if (_is25Man || ((aurEff->GetTickNumber() - 1) % 5)) + GetTarget()->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, nullptr, aurEff, GetCasterGUID()); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_vile_spirits_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + +private: + bool _is25Man; +}; + +class spell_the_lich_king_vile_spirits_visual : public SpellScript +{ + PrepareSpellScript(spell_the_lich_king_vile_spirits_visual); + + void ModDestHeight(SpellEffIndex /*effIndex*/) + { + Position offset = {0.0f, 0.0f, 15.0f, 0.0f}; + const_cast(GetExplTargetDest())->RelocateOffset(offset); + } + + void Register() override + { + OnEffectLaunch += SpellEffectFn(spell_the_lich_king_vile_spirits_visual::ModDestHeight, EFFECT_0, SPELL_EFFECT_DUMMY); } }; -class spell_the_lich_king_vile_spirits_visual : public SpellScriptLoader +class spell_the_lich_king_vile_spirit_move_target_search : public SpellScript { -public: - spell_the_lich_king_vile_spirits_visual() : SpellScriptLoader("spell_the_lich_king_vile_spirits_visual") { } + PrepareSpellScript(spell_the_lich_king_vile_spirit_move_target_search); - class spell_the_lich_king_vile_spirits_visual_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_the_lich_king_vile_spirits_visual_SpellScript); + _target = nullptr; + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } - void ModDestHeight(SpellEffIndex /*effIndex*/) - { - Position offset = {0.0f, 0.0f, 15.0f, 0.0f}; - const_cast(GetExplTargetDest())->RelocateOffset(offset); - } - - void Register() override - { - OnEffectLaunch += SpellEffectFn(spell_the_lich_king_vile_spirits_visual_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void SelectTarget(std::list& targets) { - return new spell_the_lich_king_vile_spirits_visual_SpellScript(); + if (targets.empty()) + return; + + _target = Acore::Containers::SelectRandomContainerElement(targets); + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (GetHitUnit() != _target) + return; + + GetCaster()->ToCreature()->SetInCombatWithZone(); + GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); + GetCaster()->AddThreat(GetHitUnit(), GetCaster()->GetMaxHealth() * 0.2f); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_move_target_search::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_vile_spirit_move_target_search::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + +private: + WorldObject* _target; +}; + +class spell_the_lich_king_vile_spirit_damage_target_search : public SpellScript +{ + PrepareSpellScript(spell_the_lich_king_vile_spirit_damage_target_search); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_VILE_SPIRIT_DAMAGE_SEARCH, SPELL_SPIRIT_BURST }); + } + + void CheckTargetCount(std::list& targets) + { + if (targets.empty()) + return; + + if (TempSummon* summon = GetCaster()->ToTempSummon()) + if (Unit* summoner = summon->GetSummonerUnit()) + summoner->GetAI()->SetData(DATA_VILE, 1); + + if (Creature* c = GetCaster()->ToCreature()) + { + c->RemoveAurasDueToSpell(SPELL_VILE_SPIRIT_DAMAGE_SEARCH); + c->GetMotionMaster()->Clear(true); + c->StopMoving(); + c->CastSpell((Unit*)nullptr, SPELL_SPIRIT_BURST, true); + c->DespawnOrUnsummon(3000); + c->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_damage_target_search::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; -class spell_the_lich_king_vile_spirit_move_target_search : public SpellScriptLoader +class spell_the_lich_king_harvest_soul_aura : public AuraScript { -public: - spell_the_lich_king_vile_spirit_move_target_search() : SpellScriptLoader("spell_the_lich_king_vile_spirit_move_target_search") { } + PrepareAuraScript(spell_the_lich_king_harvest_soul_aura); - class spell_the_lich_king_vile_spirit_move_target_search_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_the_lich_king_vile_spirit_move_target_search_SpellScript); - - bool Load() override - { - _target = nullptr; - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void SelectTarget(std::list& targets) - { - if (targets.empty()) - return; - - _target = Acore::Containers::SelectRandomContainerElement(targets); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (GetHitUnit() != _target) - return; - - GetCaster()->ToCreature()->SetInCombatWithZone(); - GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); - GetCaster()->AddThreat(GetHitUnit(), GetCaster()->GetMaxHealth() * 0.2f); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_move_target_search_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_vile_spirit_move_target_search_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - - WorldObject* _target; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_the_lich_king_vile_spirit_move_target_search_SpellScript(); + return ValidateSpellInfo({ SPELL_HARVESTED_SOUL_LK_BUFF }); } -}; -class spell_the_lich_king_vile_spirit_damage_target_search : public SpellScriptLoader -{ -public: - spell_the_lich_king_vile_spirit_damage_target_search() : SpellScriptLoader("spell_the_lich_king_vile_spirit_damage_target_search") { } - - class spell_the_lich_king_vile_spirit_damage_target_search_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_the_lich_king_vile_spirit_damage_target_search_SpellScript); - - void CheckTargetCount(std::list& targets) - { - if (targets.empty()) - return; - - if (TempSummon* summon = GetCaster()->ToTempSummon()) - if (Unit* summoner = summon->GetSummonerUnit()) - summoner->GetAI()->SetData(DATA_VILE, 1); - - if (Creature* c = GetCaster()->ToCreature()) - { - c->RemoveAurasDueToSpell(SPELL_VILE_SPIRIT_DAMAGE_SEARCH); - c->GetMotionMaster()->Clear(true); - c->StopMoving(); - c->CastSpell((Unit*)nullptr, SPELL_SPIRIT_BURST, true); - c->DespawnOrUnsummon(3000); - c->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_damage_target_search_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_the_lich_king_vile_spirit_damage_target_search_SpellScript(); + return GetOwner()->GetInstanceScript() != nullptr; } -}; -class spell_the_lich_king_harvest_soul : public SpellScriptLoader -{ -public: - spell_the_lich_king_harvest_soul() : SpellScriptLoader("spell_the_lich_king_harvest_soul") { } - - class spell_the_lich_king_harvest_soul_AuraScript : public AuraScript + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_the_lich_king_harvest_soul_AuraScript); + // m_originalCaster to allow stacking from different casters, meh + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) + GetTarget()->CastSpell((Unit*)nullptr, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, GetTarget()->GetInstanceScript()->GetGuidData(DATA_THE_LICH_KING)); + } - bool Load() override - { - return GetOwner()->GetInstanceScript() != nullptr; - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - // m_originalCaster to allow stacking from different casters, meh - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) - GetTarget()->CastSpell((Unit*)nullptr, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, GetTarget()->GetInstanceScript()->GetGuidData(DATA_THE_LICH_KING)); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_harvest_soul_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_the_lich_king_harvest_soul_AuraScript(); + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_harvest_soul_aura::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } }; @@ -3389,94 +3170,78 @@ public: } }; -class spell_the_lich_king_lights_favor : public SpellScriptLoader +class spell_the_lich_king_lights_favor_aura : public AuraScript { -public: - spell_the_lich_king_lights_favor() : SpellScriptLoader("spell_the_lich_king_lights_favor") { } + PrepareAuraScript(spell_the_lich_king_lights_favor_aura); - class spell_the_lich_king_lights_favor_AuraScript : public AuraScript + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_the_lich_king_lights_favor_AuraScript); + if (Unit* caster = GetCaster()) + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) + effect->RecalculateAmount(caster); + } - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* caster = GetCaster()) - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) - effect->RecalculateAmount(caster); - } - - void CalculateBonus(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - canBeRecalculated = true; - amount = 0; - if (Unit* caster = GetCaster()) - amount = int32(caster->GetHealthPct()); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_lights_favor_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_the_lich_king_lights_favor_AuraScript::CalculateBonus, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - } - }; - - AuraScript* GetAuraScript() const override + void CalculateBonus(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) { - return new spell_the_lich_king_lights_favor_AuraScript(); + canBeRecalculated = true; + amount = 0; + if (Unit* caster = GetCaster()) + amount = int32(caster->GetHealthPct()); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_lights_favor_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_the_lich_king_lights_favor_aura::CalculateBonus, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); } }; -class spell_the_lich_king_restore_soul : public SpellScriptLoader +class spell_the_lich_king_restore_soul : public SpellScript { -public: - spell_the_lich_king_restore_soul() : SpellScriptLoader("spell_the_lich_king_restore_soul") { } + PrepareSpellScript(spell_the_lich_king_restore_soul); - class spell_the_lich_king_restore_soul_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_the_lich_king_restore_soul_SpellScript); - - bool Load() override - { - _instance = GetCaster()->GetInstanceScript(); - return _instance != nullptr; - } - - void FilterTargets(std::list& unitList) - { - for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) - if (Unit* target = (*itr)->ToUnit()) - target->RemoveAurasDueToSpell(target->GetMap()->IsHeroic() ? SPELL_HARVEST_SOULS_TELEPORT : SPELL_HARVEST_SOUL_TELEPORT); - if (Creature* lichKing = ObjectAccessor::GetCreature(*GetCaster(), _instance->GetGuidData(DATA_THE_LICH_KING))) - lichKing->AI()->DoAction(ACTION_TELEPORT_BACK); - if (Creature* spawner = GetCaster()->FindNearestCreature(NPC_WORLD_TRIGGER_INFINITE_AOI, 50.0f, true)) - { - spawner->RemoveAllAuras(); - spawner->m_Events.KillAllEvents(true); - } - - std::list spirits; - GetCaster()->GetCreatureListWithEntryInGrid(spirits, NPC_WICKED_SPIRIT, 200.0f); - for (std::list::iterator itr = spirits.begin(); itr != spirits.end(); ++itr) - { - (*itr)->m_Events.KillAllEvents(true); - (*itr)->RemoveAllAuras(); - (*itr)->AI()->EnterEvadeMode(); - (*itr)->SetReactState(REACT_PASSIVE); - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_restore_soul_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - } - - InstanceScript* _instance; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_the_lich_king_restore_soul_SpellScript(); + return ValidateSpellInfo({ SPELL_HARVEST_SOULS_TELEPORT, SPELL_HARVEST_SOUL_TELEPORT }); } + + bool Load() override + { + _instance = GetCaster()->GetInstanceScript(); + return _instance != nullptr; + } + + void FilterTargets(std::list& unitList) + { + for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) + if (Unit* target = (*itr)->ToUnit()) + target->RemoveAurasDueToSpell(target->GetMap()->IsHeroic() ? SPELL_HARVEST_SOULS_TELEPORT : SPELL_HARVEST_SOUL_TELEPORT); + if (Creature* lichKing = ObjectAccessor::GetCreature(*GetCaster(), _instance->GetGuidData(DATA_THE_LICH_KING))) + lichKing->AI()->DoAction(ACTION_TELEPORT_BACK); + if (Creature* spawner = GetCaster()->FindNearestCreature(NPC_WORLD_TRIGGER_INFINITE_AOI, 50.0f, true)) + { + spawner->RemoveAllAuras(); + spawner->m_Events.KillAllEvents(true); + } + + std::list spirits; + GetCaster()->GetCreatureListWithEntryInGrid(spirits, NPC_WICKED_SPIRIT, 200.0f); + for (std::list::iterator itr = spirits.begin(); itr != spirits.end(); ++itr) + { + (*itr)->m_Events.KillAllEvents(true); + (*itr)->RemoveAllAuras(); + (*itr)->AI()->EnterEvadeMode(); + (*itr)->SetReactState(REACT_PASSIVE); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_restore_soul::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } + +private: + InstanceScript* _instance; }; class npc_spirit_warden : public CreatureScript @@ -3526,73 +3291,56 @@ public: } }; -class spell_the_lich_king_dark_hunger : public SpellScriptLoader +class spell_the_lich_king_dark_hunger_aura : public AuraScript { -public: - spell_the_lich_king_dark_hunger() : SpellScriptLoader("spell_the_lich_king_dark_hunger") { } + PrepareAuraScript(spell_the_lich_king_dark_hunger_aura); - class spell_the_lich_king_dark_hunger_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_the_lich_king_dark_hunger_AuraScript); + return ValidateSpellInfo({ SPELL_DARK_HUNGER_HEAL }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DARK_HUNGER_HEAL }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - - if (!damageInfo || !damageInfo->GetDamage()) - { - return; - } - - int32 heal = static_cast(damageInfo->GetDamage() / 2); - GetTarget()->CastCustomSpell(SPELL_DARK_HUNGER_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), true, nullptr, aurEff); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_the_lich_king_dark_hunger_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { - return new spell_the_lich_king_dark_hunger_AuraScript(); + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + + if (!damageInfo || !damageInfo->GetDamage()) + { + return; + } + + int32 heal = static_cast(damageInfo->GetDamage() / 2); + GetTarget()->CastCustomSpell(SPELL_DARK_HUNGER_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_the_lich_king_dark_hunger_aura::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; -class spell_the_lich_king_soul_rip : public SpellScriptLoader +class spell_the_lich_king_soul_rip_aura : public AuraScript { -public: - spell_the_lich_king_soul_rip() : SpellScriptLoader("spell_the_lich_king_soul_rip") { } + PrepareAuraScript(spell_the_lich_king_soul_rip_aura); - class spell_the_lich_king_soul_rip_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_the_lich_king_soul_rip_AuraScript); + return ValidateSpellInfo({ SPELL_SOUL_RIP_DAMAGE, 5000 }); + } - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - // shouldn't be needed, this is channeled - if (Unit* caster = GetCaster()) - caster->CastCustomSpell(SPELL_SOUL_RIP_DAMAGE, SPELLVALUE_BASE_POINT0, 5000 * aurEff->GetTickNumber(), GetTarget(), true, nullptr, aurEff, GetCasterGUID()); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_soul_rip_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void OnPeriodic(AuraEffect const* aurEff) { - return new spell_the_lich_king_soul_rip_AuraScript(); + PreventDefaultAction(); + // shouldn't be needed, this is channeled + if (Unit* caster = GetCaster()) + caster->CastCustomSpell(SPELL_SOUL_RIP_DAMAGE, SPELLVALUE_BASE_POINT0, 5000 * aurEff->GetTickNumber(), GetTarget(), true, nullptr, aurEff, GetCasterGUID()); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_soul_rip_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; @@ -3617,30 +3365,19 @@ public: } }; -class spell_the_lich_king_summon_spirit_bomb : public SpellScriptLoader +class spell_the_lich_king_summon_spirit_bomb : public SpellScript { -public: - spell_the_lich_king_summon_spirit_bomb() : SpellScriptLoader("spell_the_lich_king_summon_spirit_bomb") { } + PrepareSpellScript(spell_the_lich_king_summon_spirit_bomb); - class spell_the_lich_king_summon_spirit_bomb_SpellScript : public SpellScript + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_the_lich_king_summon_spirit_bomb_SpellScript); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell((Unit*)nullptr, uint32(GetEffectValue()), true); + } - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->CastSpell((Unit*)nullptr, uint32(GetEffectValue()), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_summon_spirit_bomb_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_the_lich_king_summon_spirit_bomb_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_summon_spirit_bomb::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -3701,36 +3438,25 @@ public: } }; -class spell_the_lich_king_trigger_vile_spirit : public SpellScriptLoader +class spell_the_lich_king_trigger_vile_spirit : public SpellScript { -public: - spell_the_lich_king_trigger_vile_spirit() : SpellScriptLoader("spell_the_lich_king_trigger_vile_spirit") { } + PrepareSpellScript(spell_the_lich_king_trigger_vile_spirit); - class spell_the_lich_king_trigger_vile_spirit_SpellScript : public SpellScript + void ActivateSpirit() { - PrepareSpellScript(spell_the_lich_king_trigger_vile_spirit_SpellScript); + Creature* target = GetHitCreature(); + if (!target) + return; - void ActivateSpirit() - { - Creature* target = GetHitCreature(); - if (!target) - return; + target->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1); + target->SetImmuneToAll(false); + target->ForceValuesUpdateAtIndex(UNIT_FIELD_FLAGS); + VileSpiritActivateEvent(target).Execute(0, 0); + } - target->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1); - target->SetImmuneToAll(false); - target->ForceValuesUpdateAtIndex(UNIT_FIELD_FLAGS); - VileSpiritActivateEvent(target).Execute(0, 0); - } - - void Register() override - { - OnHit += SpellHitFn(spell_the_lich_king_trigger_vile_spirit_SpellScript::ActivateSpirit); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_the_lich_king_trigger_vile_spirit_SpellScript(); + OnHit += SpellHitFn(spell_the_lich_king_trigger_vile_spirit::ActivateSpirit); } }; @@ -3803,47 +3529,47 @@ void AddSC_boss_the_lich_king() { new boss_the_lich_king(); new npc_tirion_fordring_tft(); - new spell_the_lich_king_quake(); - new spell_the_lich_king_jump(); - new spell_the_lich_king_jump_remove_aura(); - new spell_trigger_spell_from_caster("spell_the_lich_king_mass_resurrection", SPELL_MASS_RESURRECTION_REAL); - new spell_the_lich_king_play_movie(); + RegisterSpellScript(spell_the_lich_king_quake); + RegisterSpellScript(spell_the_lich_king_jump); + RegisterSpellScript(spell_the_lich_king_jump_remove_aura); + RegisterSpellScriptWithArgs(spell_trigger_spell_from_caster, "spell_the_lich_king_mass_resurrection", SPELL_MASS_RESURRECTION_REAL); + RegisterSpellScript(spell_the_lich_king_play_movie); // fight stuff below new npc_shambling_horror_icc(); - new spell_the_lich_king_infest(); - new spell_the_lich_king_necrotic_plague(); - new spell_the_lich_king_necrotic_plague_jump(); - new spell_the_lich_king_shadow_trap_visual(); - new spell_the_lich_king_shadow_trap_periodic(); - new spell_the_lich_king_ice_burst_target_search(); + RegisterSpellScript(spell_the_lich_king_infest_aura); + RegisterSpellScript(spell_the_lich_king_necrotic_plague_aura); + RegisterSpellAndAuraScriptPair(spell_the_lich_king_necrotic_plague_jump, spell_the_lich_king_necrotic_plague_jump_aura); + RegisterSpellScript(spell_the_lich_king_shadow_trap_visual_aura); + RegisterSpellScript(spell_the_lich_king_shadow_trap_periodic); + RegisterSpellScript(spell_the_lich_king_ice_burst_target_search); new npc_icc_ice_sphere(); - new spell_the_lich_king_raging_spirit(); + RegisterSpellScript(spell_the_lich_king_raging_spirit); new npc_raging_spirit(); - new spell_the_lich_king_defile(); - new spell_the_lich_king_soul_reaper(); + RegisterSpellScript(spell_the_lich_king_defile); + RegisterSpellScript(spell_the_lich_king_soul_reaper_aura); new npc_valkyr_shadowguard(); - new spell_the_lich_king_summon_into_air(); - new spell_the_lich_king_teleport_to_frostmourne_hc(); - new spell_the_lich_king_valkyr_target_search(); - new spell_the_lich_king_cast_back_to_caster(); - new spell_the_lich_king_life_siphon(); - new spell_the_lich_king_vile_spirits(); - new spell_the_lich_king_vile_spirits_visual(); - new spell_the_lich_king_vile_spirit_move_target_search(); - new spell_the_lich_king_vile_spirit_damage_target_search(); - new spell_the_lich_king_harvest_soul(); + RegisterSpellScript(spell_the_lich_king_summon_into_air); + RegisterSpellScript(spell_the_lich_king_teleport_to_frostmourne_hc); + RegisterSpellScript(spell_the_lich_king_valkyr_target_search); + RegisterSpellScript(spell_the_lich_king_cast_back_to_caster); + RegisterSpellScript(spell_the_lich_king_life_siphon); + RegisterSpellScript(spell_the_lich_king_vile_spirits_aura); + RegisterSpellScript(spell_the_lich_king_vile_spirits_visual); + RegisterSpellScript(spell_the_lich_king_vile_spirit_move_target_search); + RegisterSpellScript(spell_the_lich_king_vile_spirit_damage_target_search); + RegisterSpellScript(spell_the_lich_king_harvest_soul_aura); new npc_strangulate_vehicle(); new npc_terenas_menethil(); - new spell_the_lich_king_lights_favor(); - new spell_the_lich_king_restore_soul(); + RegisterSpellScript(spell_the_lich_king_lights_favor_aura); + RegisterSpellScript(spell_the_lich_king_restore_soul); new npc_spirit_warden(); - new spell_the_lich_king_dark_hunger(); - new spell_the_lich_king_soul_rip(); + RegisterSpellScript(spell_the_lich_king_dark_hunger_aura); + RegisterSpellScript(spell_the_lich_king_soul_rip_aura); new npc_icc_lk_checktarget(); - new spell_the_lich_king_summon_spirit_bomb(); + RegisterSpellScript(spell_the_lich_king_summon_spirit_bomb); new npc_lk_spirit_bomb(); - new spell_the_lich_king_trigger_vile_spirit(); + RegisterSpellScript(spell_the_lich_king_trigger_vile_spirit); new npc_lk_wicked_spirit(); new achievement_been_waiting_long_time(); new achievement_neck_deep_in_vile(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 71beac42d..97485ee5b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -1138,372 +1138,280 @@ public: } }; -class spell_dreamwalker_summon_portal : public SpellScriptLoader +class spell_dreamwalker_summon_portal : public SpellScript { -public: - spell_dreamwalker_summon_portal() : SpellScriptLoader("spell_dreamwalker_summon_portal") { } + PrepareSpellScript(spell_dreamwalker_summon_portal); - class spell_dreamwalker_summon_portal_SpellScript : public SpellScript + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_dreamwalker_summon_portal_SpellScript); + PreventHitDefaultEffect(effIndex); + Unit* target = GetHitUnit(); + if (!target) + return; - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Unit* target = GetHitUnit(); - if (!target) - return; + uint32 spellId = (GetSpellInfo()->Id == 72224 ? 71301 : 71977); // spell implicit target replaced to TARGET_DEST_DEST + float minDist = 20.0f; + float maxDist = 30.0f; + float dist = (maxDist - minDist) * rand_norm() + minDist; + float startAngle = 3 * M_PI / 2; + float maxAddAngle = ((target->GetMap()->GetSpawnMode() % 2) == 0 ? M_PI : 2 * M_PI); + float angle = startAngle + rand_norm() * maxAddAngle; + target->CastSpell(target->GetPositionX() + cos(angle)*dist, target->GetPositionY() + std::sin(angle)*dist, target->GetPositionZ(), spellId, true); + } - uint32 spellId = (GetSpellInfo()->Id == 72224 ? 71301 : 71977); // spell implicit target replaced to TARGET_DEST_DEST - float minDist = 20.0f; - float maxDist = 30.0f; - float dist = (maxDist - minDist) * rand_norm() + minDist; - float startAngle = 3 * M_PI / 2; - float maxAddAngle = ((target->GetMap()->GetSpawnMode() % 2) == 0 ? M_PI : 2 * M_PI); - float angle = startAngle + rand_norm() * maxAddAngle; - target->CastSpell(target->GetPositionX() + cos(angle)*dist, target->GetPositionY() + std::sin(angle)*dist, target->GetPositionZ(), spellId, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summon_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_dreamwalker_summon_portal_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summon_portal::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_dreamwalker_twisted_nightmares : public SpellScriptLoader +class spell_dreamwalker_twisted_nightmares : public SpellScript { -public: - spell_dreamwalker_twisted_nightmares() : SpellScriptLoader("spell_dreamwalker_twisted_nightmares") { } + PrepareSpellScript(spell_dreamwalker_twisted_nightmares); - class spell_dreamwalker_twisted_nightmares_SpellScript : public SpellScript + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_dreamwalker_twisted_nightmares_SpellScript); + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()) + return; - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()) - return; + if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) + GetHitUnit()->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); + } - if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) - GetHitUnit()->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_twisted_nightmares_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_dreamwalker_twisted_nightmares_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_twisted_nightmares::HandleScript, EFFECT_2, SPELL_EFFECT_FORCE_CAST); } }; -class spell_dreamwalker_nightmare_cloud : public SpellScriptLoader +class spell_dreamwalker_nightmare_cloud_aura : public AuraScript { -public: - spell_dreamwalker_nightmare_cloud() : SpellScriptLoader("spell_dreamwalker_nightmare_cloud") { } + PrepareAuraScript(spell_dreamwalker_nightmare_cloud_aura); - class spell_dreamwalker_nightmare_cloud_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_dreamwalker_nightmare_cloud_AuraScript); - - bool Load() override - { - _instance = GetOwner()->GetInstanceScript(); - return _instance != nullptr; - } - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS) - PreventDefaultAction(); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_nightmare_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - - InstanceScript* _instance; - }; - - AuraScript* GetAuraScript() const override - { - return new spell_dreamwalker_nightmare_cloud_AuraScript(); + _instance = GetOwner()->GetInstanceScript(); + return _instance != nullptr; } -}; -class spell_dreamwalker_mana_void : public SpellScriptLoader -{ -public: - spell_dreamwalker_mana_void() : SpellScriptLoader("spell_dreamwalker_mana_void") { } - - class spell_dreamwalker_mana_void_AuraScript : public AuraScript + void PeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_dreamwalker_mana_void_AuraScript); - - void PeriodicTick(AuraEffect const* aurEff) - { - // first 3 ticks have amplitude 1 second - // remaining tick every 500ms - if (aurEff->GetTickNumber() <= 5) - if (!(aurEff->GetTickNumber() & 1)) - PreventDefaultAction(); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_mana_void_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_dreamwalker_mana_void_AuraScript(); - } -}; - -class spell_dreamwalker_decay_periodic_timer : public SpellScriptLoader -{ -public: - spell_dreamwalker_decay_periodic_timer() : SpellScriptLoader("spell_dreamwalker_decay_periodic_timer") { } - - class spell_dreamwalker_decay_periodic_timer_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dreamwalker_decay_periodic_timer_AuraScript); - - bool Load() override - { - _decayRate = GetId() != SPELL_TIMER_BLAZING_SKELETON ? 1000 : 5000; - return true; - } - - void DecayPeriodicTimer(AuraEffect* aurEff) - { - int32 timer = aurEff->GetPeriodicTimer(); - if (timer <= 5000) - return; - - aurEff->SetPeriodicTimer(timer - _decayRate); - } - - void Register() override - { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dreamwalker_decay_periodic_timer_AuraScript::DecayPeriodicTimer, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - - int32 _decayRate; - }; - - AuraScript* GetAuraScript() const override - { - return new spell_dreamwalker_decay_periodic_timer_AuraScript(); - } -}; - -class spell_dreamwalker_summoner : public SpellScriptLoader -{ -public: - spell_dreamwalker_summoner() : SpellScriptLoader("spell_dreamwalker_summoner") { } - - class spell_dreamwalker_summoner_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dreamwalker_summoner_SpellScript); - - bool Load() override - { - if (!GetCaster()->GetInstanceScript()) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 250.0f, true)); - std::list list_copy = targets; - targets.remove_if(Acore::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); - if (targets.empty()) - { - if (list_copy.empty()) - return; - targets = list_copy; - } - - WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - - void HandleForceCast(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()) - return; - - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dreamwalker_summoner_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summoner_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dreamwalker_summoner_SpellScript(); - } -}; - -class spell_dreamwalker_summon_suppresser : public SpellScriptLoader -{ -public: - spell_dreamwalker_summon_suppresser() : SpellScriptLoader("spell_dreamwalker_summon_suppresser") { } - - class spell_dreamwalker_summon_suppresser_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dreamwalker_summon_suppresser_AuraScript); - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { + if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS) PreventDefaultAction(); - Unit* caster = GetCaster(); - if (!caster) - return; + } - std::list summoners; - caster->GetCreaturesWithEntryInRange(summoners, 200.0f, NPC_WORLD_TRIGGER); - std::list list_copy = summoners; - summoners.remove_if(Acore::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); - if (summoners.empty()) + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_nightmare_cloud_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + +private: + InstanceScript* _instance; +}; + +class spell_dreamwalker_mana_void_aura : public AuraScript +{ + PrepareAuraScript(spell_dreamwalker_mana_void_aura); + + void PeriodicTick(AuraEffect const* aurEff) + { + // first 3 ticks have amplitude 1 second + // remaining tick every 500ms + if (aurEff->GetTickNumber() <= 5) + if (!(aurEff->GetTickNumber() & 1)) + PreventDefaultAction(); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_mana_void_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_dreamwalker_decay_periodic_timer_aura : public AuraScript +{ + PrepareAuraScript(spell_dreamwalker_decay_periodic_timer_aura); + + bool Load() override + { + _decayRate = GetId() != SPELL_TIMER_BLAZING_SKELETON ? 1000 : 5000; + return true; + } + + void DecayPeriodicTimer(AuraEffect* aurEff) + { + int32 timer = aurEff->GetPeriodicTimer(); + if (timer <= 5000) + return; + + aurEff->SetPeriodicTimer(timer - _decayRate); + } + + void Register() override + { + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dreamwalker_decay_periodic_timer_aura::DecayPeriodicTimer, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + +private: + int32 _decayRate; +}; + +class spell_dreamwalker_summoner : public SpellScript +{ + PrepareSpellScript(spell_dreamwalker_summoner); + + bool Load() override + { + if (!GetCaster()->GetInstanceScript()) + return false; + return true; + } + + void FilterTargets(std::list& targets) + { + targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 250.0f, true)); + std::list list_copy = targets; + targets.remove_if(Acore::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); + if (targets.empty()) + { + if (list_copy.empty()) + return; + targets = list_copy; + } + + WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleForceCast(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()) + return; + + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dreamwalker_summoner::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summoner::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + } +}; + +class spell_dreamwalker_summon_suppresser_aura : public AuraScript +{ + PrepareAuraScript(spell_dreamwalker_summon_suppresser_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SUMMON_SUPPRESSER }); + } + + void PeriodicTick(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + Unit* caster = GetCaster(); + if (!caster) + return; + + std::list summoners; + caster->GetCreaturesWithEntryInRange(summoners, 200.0f, NPC_WORLD_TRIGGER); + std::list list_copy = summoners; + summoners.remove_if(Acore::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); + if (summoners.empty()) + { + if (list_copy.empty()) + return; + summoners = list_copy; + } + Acore::Containers::RandomResize(summoners, 2); + + for (uint32 i = 0; i < 3; ++i) + caster->CastSpell(summoners.front(), SPELL_SUMMON_SUPPRESSER, true); + for (uint32 i = 0; i < 3; ++i) + caster->CastSpell(summoners.back(), SPELL_SUMMON_SUPPRESSER, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_summon_suppresser_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_dreamwalker_summon_suppresser_effect : public SpellScript +{ + PrepareSpellScript(spell_dreamwalker_summon_suppresser_effect); + + bool Load() override + { + if (!GetCaster()->GetInstanceScript()) + return false; + return true; + } + + void HandleForceCast(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()) + return; + + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summon_suppresser_effect::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + } +}; + +class spell_valithria_suppression_aura : public AuraScript +{ + PrepareAuraScript(spell_valithria_suppression_aura); + + void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + const_cast(aurEff)->SetAmount(0); + + Unit* target = GetTarget(); + Unit::AuraApplicationMap& aam = target->GetAppliedAuras(); + Unit::AuraApplicationMapBounds range = aam.equal_range(GetSpellInfo()->Id); + uint32 count = target->GetAuraCount(GetSpellInfo()->Id); + + if (range.first == range.second) + return; + + for (Unit::AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr) + if (count == 1 || itr->second->GetBase()->GetEffect(EFFECT_0)->GetAmount()) { - if (list_copy.empty()) - return; - summoners = list_copy; + itr->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(count * GetSpellInfo()->Effects[0].CalcValue()); + break; } - Acore::Containers::RandomResize(summoners, 2); - - for (uint32 i = 0; i < 3; ++i) - caster->CastSpell(summoners.front(), SPELL_SUMMON_SUPPRESSER, true); - for (uint32 i = 0; i < 3; ++i) - caster->CastSpell(summoners.back(), SPELL_SUMMON_SUPPRESSER, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_summon_suppresser_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_dreamwalker_summon_suppresser_AuraScript(); } -}; -class spell_dreamwalker_summon_suppresser_effect : public SpellScriptLoader -{ -public: - spell_dreamwalker_summon_suppresser_effect() : SpellScriptLoader("spell_dreamwalker_summon_suppresser_effect") { } - - class spell_dreamwalker_summon_suppresser_effect_SpellScript : public SpellScript + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareSpellScript(spell_dreamwalker_summon_suppresser_effect_SpellScript); + Unit* target = GetTarget(); + Unit::AuraApplicationMap& aam = target->GetAppliedAuras(); + Unit::AuraApplicationMapBounds range = aam.equal_range(GetSpellInfo()->Id); + uint32 count = target->GetAuraCount(GetSpellInfo()->Id); - bool Load() override - { - if (!GetCaster()->GetInstanceScript()) - return false; - return true; - } + if (range.first == range.second) + return; - void HandleForceCast(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()) - return; + for (Unit::AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr) + if (itr->second->GetBase()->GetEffect(EFFECT_0)->GetAmount()) + itr->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(0); - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summon_suppresser_effect_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dreamwalker_summon_suppresser_effect_SpellScript(); + range.first->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(count * GetSpellInfo()->Effects[0].CalcValue()); } -}; -class spell_valithria_suppression : public SpellScriptLoader -{ -public: - spell_valithria_suppression() : SpellScriptLoader("spell_valithria_suppression") { } - - class spell_valithria_suppression_AuraScript : public AuraScript + void Register() override { - PrepareAuraScript(spell_valithria_suppression_AuraScript); - - void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - const_cast(aurEff)->SetAmount(0); - - Unit* target = GetTarget(); - Unit::AuraApplicationMap& aam = target->GetAppliedAuras(); - Unit::AuraApplicationMapBounds range = aam.equal_range(GetSpellInfo()->Id); - uint32 count = target->GetAuraCount(GetSpellInfo()->Id); - - if (range.first == range.second) - return; - - for (Unit::AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr) - if (count == 1 || itr->second->GetBase()->GetEffect(EFFECT_0)->GetAmount()) - { - itr->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(count * GetSpellInfo()->Effects[0].CalcValue()); - break; - } - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - Unit::AuraApplicationMap& aam = target->GetAppliedAuras(); - Unit::AuraApplicationMapBounds range = aam.equal_range(GetSpellInfo()->Id); - uint32 count = target->GetAuraCount(GetSpellInfo()->Id); - - if (range.first == range.second) - return; - - for (Unit::AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr) - if (itr->second->GetBase()->GetEffect(EFFECT_0)->GetAmount()) - itr->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(0); - - range.first->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(count * GetSpellInfo()->Effects[0].CalcValue()); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_valithria_suppression_AuraScript::OnApply, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_valithria_suppression_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_valithria_suppression_AuraScript(); + AfterEffectApply += AuraEffectApplyFn(spell_valithria_suppression_aura::OnApply, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_valithria_suppression_aura::OnRemove, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); } }; @@ -1531,15 +1439,15 @@ void AddSC_boss_valithria_dreamwalker() new npc_blistering_zombie(); new npc_gluttonous_abomination(); - new spell_dreamwalker_summon_portal(); - new spell_dreamwalker_twisted_nightmares(); - new spell_dreamwalker_nightmare_cloud(); - new spell_dreamwalker_mana_void(); - new spell_dreamwalker_decay_periodic_timer(); - new spell_dreamwalker_summoner(); - new spell_dreamwalker_summon_suppresser(); - new spell_dreamwalker_summon_suppresser_effect(); - new spell_valithria_suppression(); + RegisterSpellScript(spell_dreamwalker_summon_portal); + RegisterSpellScript(spell_dreamwalker_twisted_nightmares); + RegisterSpellScript(spell_dreamwalker_nightmare_cloud_aura); + RegisterSpellScript(spell_dreamwalker_mana_void_aura); + RegisterSpellScript(spell_dreamwalker_decay_periodic_timer_aura); + RegisterSpellScript(spell_dreamwalker_summoner); + RegisterSpellScript(spell_dreamwalker_summon_suppresser_aura); + RegisterSpellScript(spell_dreamwalker_summon_suppresser_effect); + RegisterSpellScript(spell_valithria_suppression_aura); new achievement_portal_jockey(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index b6be91e6a..b94169666 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -1890,252 +1890,207 @@ public: } }; -class spell_icc_stoneform : public SpellScriptLoader +class spell_icc_stoneform_aura : public AuraScript { -public: - spell_icc_stoneform() : SpellScriptLoader("spell_icc_stoneform") { } + PrepareAuraScript(spell_icc_stoneform_aura); - class spell_icc_stoneform_AuraScript : public AuraScript + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_icc_stoneform_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + if (Creature* target = GetTarget()->ToCreature()) { - if (Creature* target = GetTarget()->ToCreature()) - { - target->SetReactState(REACT_PASSIVE); - target->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - target->SetImmuneToPC(true); - target->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_CUSTOM_SPELL_02); - } + target->SetReactState(REACT_PASSIVE); + target->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + target->SetImmuneToPC(true); + target->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_CUSTOM_SPELL_02); } + } - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* target = GetTarget()->ToCreature()) - { - target->SetReactState(REACT_AGGRESSIVE); - target->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - target->SetImmuneToPC(false); - target->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - } - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_icc_stoneform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_icc_stoneform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_icc_stoneform_AuraScript(); + if (Creature* target = GetTarget()->ToCreature()) + { + target->SetReactState(REACT_AGGRESSIVE); + target->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + target->SetImmuneToPC(false); + target->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + } + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_icc_stoneform_aura::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_icc_stoneform_aura::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; -class spell_icc_sprit_alarm : public SpellScriptLoader +class spell_icc_sprit_alarm : public SpellScript { -public: - spell_icc_sprit_alarm() : SpellScriptLoader("spell_icc_sprit_alarm") { } + PrepareSpellScript(spell_icc_sprit_alarm); - class spell_icc_sprit_alarm_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_icc_sprit_alarm_SpellScript); + return ValidateSpellInfo({ SPELL_STONEFORM }); + } - void HandleEvent(SpellEffIndex effIndex) + void HandleEvent(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + uint32 trapId = 0; + switch (GetSpellInfo()->Effects[effIndex].MiscValue) { - PreventHitDefaultEffect(effIndex); - uint32 trapId = 0; - switch (GetSpellInfo()->Effects[effIndex].MiscValue) - { - case EVENT_AWAKEN_WARD_1: - trapId = GO_SPIRIT_ALARM_1; - break; - case EVENT_AWAKEN_WARD_2: - trapId = GO_SPIRIT_ALARM_2; - break; - case EVENT_AWAKEN_WARD_3: - trapId = GO_SPIRIT_ALARM_3; - break; - case EVENT_AWAKEN_WARD_4: - trapId = GO_SPIRIT_ALARM_4; - break; - default: - return; - } + case EVENT_AWAKEN_WARD_1: + trapId = GO_SPIRIT_ALARM_1; + break; + case EVENT_AWAKEN_WARD_2: + trapId = GO_SPIRIT_ALARM_2; + break; + case EVENT_AWAKEN_WARD_3: + trapId = GO_SPIRIT_ALARM_3; + break; + case EVENT_AWAKEN_WARD_4: + trapId = GO_SPIRIT_ALARM_4; + break; + default: + return; + } - if (GameObject* trap = GetCaster()->FindNearestGameObject(trapId, 5.0f)) - { - trap->SetRespawnTime(trap->GetGOInfo()->GetAutoCloseTime() / IN_MILLISECONDS); - } + if (GameObject* trap = GetCaster()->FindNearestGameObject(trapId, 5.0f)) + { + trap->SetRespawnTime(trap->GetGOInfo()->GetAutoCloseTime() / IN_MILLISECONDS); + } - std::list wards; - GetCaster()->GetCreatureListWithEntryInGrid(wards, NPC_DEATHBOUND_WARD, 150.0f); - wards.sort(Acore::ObjectDistanceOrderPred(GetCaster())); - for (std::list::iterator itr = wards.begin(); itr != wards.end(); ++itr) + std::list wards; + GetCaster()->GetCreatureListWithEntryInGrid(wards, NPC_DEATHBOUND_WARD, 150.0f); + wards.sort(Acore::ObjectDistanceOrderPred(GetCaster())); + for (std::list::iterator itr = wards.begin(); itr != wards.end(); ++itr) + { + if ((*itr)->IsAlive() && (*itr)->HasAura(SPELL_STONEFORM)) { - if ((*itr)->IsAlive() && (*itr)->HasAura(SPELL_STONEFORM)) + (*itr)->AI()->Talk(SAY_TRAP_ACTIVATE); + (*itr)->RemoveAurasDueToSpell(SPELL_STONEFORM); + (*itr)->AI()->SetData(1, 1); + break; + } + } + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_icc_sprit_alarm::HandleEvent, EFFECT_2, SPELL_EFFECT_SEND_EVENT); + } +}; + +class spell_icc_geist_alarm : public SpellScript +{ + PrepareSpellScript(spell_icc_geist_alarm); + + void HandleEvent(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + { + Position p = {4356.77f, 2971.90f, 360.52f, M_PI / 2}; + if (Creature* l = instance->instance->SummonCreature(NPC_VENGEFUL_FLESHREAPER, p)) + { + bool hasTarget = false; + Unit* target = nullptr; + if ((target = l->SelectNearestTarget(20.0f))) + hasTarget = true; + else { - (*itr)->AI()->Talk(SAY_TRAP_ACTIVATE); - (*itr)->RemoveAurasDueToSpell(SPELL_STONEFORM); - (*itr)->AI()->SetData(1, 1); - break; + target = l->SelectNearestTarget(120.0f); + l->GetMotionMaster()->MoveJump(l->GetPositionX(), l->GetPositionY() + 55.0f, l->GetPositionZ(), 20.0f, 6.0f); } - } - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_icc_sprit_alarm_SpellScript::HandleEvent, EFFECT_2, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_icc_sprit_alarm_SpellScript(); - } -}; - -class spell_icc_geist_alarm : public SpellScriptLoader -{ -public: - spell_icc_geist_alarm() : SpellScriptLoader("spell_icc_geist_alarm") { } - - class spell_icc_geist_alarm_SpellScript : public SpellScript - { - PrepareSpellScript(spell_icc_geist_alarm_SpellScript); - - void HandleEvent(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - { - Position p = {4356.77f, 2971.90f, 360.52f, M_PI / 2}; - if (Creature* l = instance->instance->SummonCreature(NPC_VENGEFUL_FLESHREAPER, p)) + l->AI()->Talk(0); + l->AI()->AttackStart(target); + l->AddThreat(target, 1.0f); + for (uint8 i = 0; i < 5; ++i) { - bool hasTarget = false; - Unit* target = nullptr; - if ((target = l->SelectNearestTarget(20.0f))) - hasTarget = true; - else + float dist = 2.0f + rand_norm() * 4.0f; + float angle = rand_norm() * 2 * M_PI; + Position pos(p); + l->MovePosition(pos, dist, angle); + if (Creature* c = l->SummonCreature(NPC_VENGEFUL_FLESHREAPER, pos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30 * MINUTE * IN_MILLISECONDS)) { - target = l->SelectNearestTarget(120.0f); - l->GetMotionMaster()->MoveJump(l->GetPositionX(), l->GetPositionY() + 55.0f, l->GetPositionZ(), 20.0f, 6.0f); - } - l->AI()->Talk(0); - l->AI()->AttackStart(target); - l->AddThreat(target, 1.0f); - for (uint8 i = 0; i < 5; ++i) - { - float dist = 2.0f + rand_norm() * 4.0f; - float angle = rand_norm() * 2 * M_PI; - Position pos(p); - l->MovePosition(pos, dist, angle); - if (Creature* c = l->SummonCreature(NPC_VENGEFUL_FLESHREAPER, pos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30 * MINUTE * IN_MILLISECONDS)) - { - c->AI()->AttackStart(l->GetVictim()); - c->AddThreat(l->GetVictim(), 1.0f); - if (!hasTarget) - c->GetMotionMaster()->MoveJump(c->GetPositionX(), c->GetPositionY() + 55.0f, c->GetPositionZ(), 20.0f, 6.0f); - } + c->AI()->AttackStart(l->GetVictim()); + c->AddThreat(l->GetVictim(), 1.0f); + if (!hasTarget) + c->GetMotionMaster()->MoveJump(c->GetPositionX(), c->GetPositionY() + 55.0f, c->GetPositionZ(), 20.0f, 6.0f); } } } } + } - void Register() override - { - OnEffectHit += SpellEffectFn(spell_icc_geist_alarm_SpellScript::HandleEvent, EFFECT_2, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_icc_geist_alarm_SpellScript(); + OnEffectHit += SpellEffectFn(spell_icc_geist_alarm::HandleEvent, EFFECT_2, SPELL_EFFECT_SEND_EVENT); } }; -class spell_frost_giant_death_plague : public SpellScriptLoader +class spell_frost_giant_death_plague : public SpellScript { -public: - spell_frost_giant_death_plague() : SpellScriptLoader("spell_frost_giant_death_plague") { } + PrepareSpellScript(spell_frost_giant_death_plague); - class spell_frost_giant_death_plague_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_frost_giant_death_plague_SpellScript); + return ValidateSpellInfo({ SPELL_DEATH_PLAGUE_AURA, SPELL_DEATH_PLAGUE_KILL, SPELL_RECENTLY_INFECTED }); + } - // First effect - void CountTargets(std::list& targets) - { - targets.remove_if(Acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); - targets.remove_if(Acore::ObjectGUIDCheck(GetCaster()->GetGUID(), true)); + // First effect + void CountTargets(std::list& targets) + { + targets.remove_if(Acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); + targets.remove_if(Acore::ObjectGUIDCheck(GetCaster()->GetGUID(), true)); - bool kill = true; - for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - if (!(*itr)->ToUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA)) - { - kill = false; - break; - } - if (kill) - GetCaster()->CastSpell(GetCaster(), SPELL_DEATH_PLAGUE_KILL, true); - else + bool kill = true; + for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if (!(*itr)->ToUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA)) { - GetCaster()->CastSpell(GetCaster(), SPELL_RECENTLY_INFECTED, true); - targets.push_back(GetCaster()); + kill = false; + break; } - } - - void HandleScript(SpellEffIndex /*effIndex*/) + if (kill) + GetCaster()->CastSpell(GetCaster(), SPELL_DEATH_PLAGUE_KILL, true); + else { - if (!GetHitUnit()->HasAura(SPELL_RECENTLY_INFECTED) && !GetHitUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA)) - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_DEATH_PLAGUE_AURA, true); + GetCaster()->CastSpell(GetCaster(), SPELL_RECENTLY_INFECTED, true); + targets.push_back(GetCaster()); } + } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - OnEffectHitTarget += SpellEffectFn(spell_frost_giant_death_plague_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex /*effIndex*/) { - return new spell_frost_giant_death_plague_SpellScript(); + if (!GetHitUnit()->HasAura(SPELL_RECENTLY_INFECTED) && !GetHitUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA)) + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_DEATH_PLAGUE_AURA, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + OnEffectHitTarget += SpellEffectFn(spell_frost_giant_death_plague::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); } }; -class spell_icc_harvest_blight_specimen : public SpellScriptLoader +class spell_icc_harvest_blight_specimen : public SpellScript { -public: - spell_icc_harvest_blight_specimen() : SpellScriptLoader("spell_icc_harvest_blight_specimen") { } + PrepareSpellScript(spell_icc_harvest_blight_specimen); - class spell_icc_harvest_blight_specimen_SpellScript : public SpellScript + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_icc_harvest_blight_specimen_SpellScript); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); + } - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); - } - - void HandleQuestComplete(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen_SpellScript::HandleQuestComplete, EFFECT_1, SPELL_EFFECT_QUEST_COMPLETE); - } - }; - - SpellScript* GetSpellScript() const override + void HandleQuestComplete(SpellEffIndex /*effIndex*/) { - return new spell_icc_harvest_blight_specimen_SpellScript(); + GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen::HandleQuestComplete, EFFECT_1, SPELL_EFFECT_QUEST_COMPLETE); } }; @@ -2150,103 +2105,75 @@ public: } }; -class spell_svalna_revive_champion : public SpellScriptLoader +class spell_svalna_revive_champion : public SpellScript { -public: - spell_svalna_revive_champion() : SpellScriptLoader("spell_svalna_revive_champion") { } + PrepareSpellScript(spell_svalna_revive_champion); - class spell_svalna_revive_champion_SpellScript : public SpellScript + void RemoveAliveTarget(std::list& targets) { - PrepareSpellScript(spell_svalna_revive_champion_SpellScript); + targets.remove_if(AliveCheck()); + Acore::Containers::RandomResize(targets, 2); + } - void RemoveAliveTarget(std::list& targets) - { - targets.remove_if(AliveCheck()); - Acore::Containers::RandomResize(targets, 2); - } - - void Land(SpellEffIndex /*effIndex*/) - { - Creature* caster = GetCaster()->ToCreature(); - if (!caster) - return; - - Position pos = caster->GetNearPosition(5.0f, 0.0f); - pos.m_positionZ = caster->GetMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f); - pos.m_positionZ += 0.1f; - caster->SendMeleeAttackStop(caster->GetVictim()); - caster->GetMotionMaster()->MoveLand(POINT_LAND, pos, 7.0f); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_svalna_revive_champion_SpellScript::RemoveAliveTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); - OnEffectHit += SpellEffectFn(spell_svalna_revive_champion_SpellScript::Land, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Land(SpellEffIndex /*effIndex*/) { - return new spell_svalna_revive_champion_SpellScript(); + Creature* caster = GetCaster()->ToCreature(); + if (!caster) + return; + + Position pos = caster->GetNearPosition(5.0f, 0.0f); + pos.m_positionZ = caster->GetMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f); + pos.m_positionZ += 0.1f; + caster->SendMeleeAttackStop(caster->GetVictim()); + caster->GetMotionMaster()->MoveLand(POINT_LAND, pos, 7.0f); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_svalna_revive_champion::RemoveAliveTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHit += SpellEffectFn(spell_svalna_revive_champion::Land, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_svalna_remove_spear : public SpellScriptLoader +class spell_svalna_remove_spear : public SpellScript { -public: - spell_svalna_remove_spear() : SpellScriptLoader("spell_svalna_remove_spear") { } + PrepareSpellScript(spell_svalna_remove_spear); - class spell_svalna_remove_spear_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_svalna_remove_spear_SpellScript); + return ValidateSpellInfo({ SPELL_IMPALING_SPEAR }); + } - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Creature* target = GetHitCreature()) - { - if (Unit* vehicle = target->GetVehicleBase()) - vehicle->RemoveAurasDueToSpell(SPELL_IMPALING_SPEAR); - target->DespawnOrUnsummon(1); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_svalna_remove_spear_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex effIndex) { - return new spell_svalna_remove_spear_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Creature* target = GetHitCreature()) + { + if (Unit* vehicle = target->GetVehicleBase()) + vehicle->RemoveAurasDueToSpell(SPELL_IMPALING_SPEAR); + target->DespawnOrUnsummon(1); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_svalna_remove_spear::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_icc_soul_missile : public SpellScriptLoader +class spell_icc_soul_missile : public SpellScript { -public: - spell_icc_soul_missile() : SpellScriptLoader("spell_icc_soul_missile") { } + PrepareSpellScript(spell_icc_soul_missile); - class spell_icc_soul_missile_SpellScript : public SpellScript + void RelocateDest() { - PrepareSpellScript(spell_icc_soul_missile_SpellScript); + static Position const offset = {0.0f, 0.0f, 200.0f, 0.0f}; + const_cast(GetExplTargetDest())->RelocateOffset(offset); + } - void RelocateDest() - { - static Position const offset = {0.0f, 0.0f, 200.0f, 0.0f}; - const_cast(GetExplTargetDest())->RelocateOffset(offset); - } - - void Register() override - { - OnCast += SpellCastFn(spell_icc_soul_missile_SpellScript::RelocateDest); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_icc_soul_missile_SpellScript(); + OnCast += SpellCastFn(spell_icc_soul_missile::RelocateDest); } }; @@ -2346,207 +2273,160 @@ public: // pussywizard below: -class spell_icc_web_wrap : public SpellScriptLoader +class spell_icc_web_wrap_aura : public AuraScript { -public: - spell_icc_web_wrap() : SpellScriptLoader("spell_icc_web_wrap") { } + PrepareAuraScript(spell_icc_web_wrap_aura); - class spell_icc_web_wrap_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_icc_web_wrap_AuraScript); + return ValidateSpellInfo({ 71010 }); + } - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (!target->HasAura(71010)) - target->CastSpell(target, 71010, true); - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_icc_web_wrap_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_icc_web_wrap_AuraScript(); + Unit* target = GetTarget(); + if (!target->HasAura(71010)) + target->CastSpell(target, 71010, true); + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_icc_web_wrap_aura::OnRemove, EFFECT_0, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); } }; -class spell_icc_dark_reckoning : public SpellScriptLoader +class spell_icc_dark_reckoning_aura : public AuraScript { -public: - spell_icc_dark_reckoning() : SpellScriptLoader("spell_icc_dark_reckoning") { } + PrepareAuraScript(spell_icc_dark_reckoning_aura); - class spell_icc_dark_reckoning_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_icc_dark_reckoning_AuraScript); + return ValidateSpellInfo({ 69482 }); + } - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), 69482, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_icc_dark_reckoning_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void OnPeriodic(AuraEffect const* /*aurEff*/) { - return new spell_icc_dark_reckoning_AuraScript(); + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), 69482, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_icc_dark_reckoning_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; -class spell_stinky_precious_decimate : public SpellScriptLoader +class spell_stinky_precious_decimate : public SpellScript { -public: - spell_stinky_precious_decimate() : SpellScriptLoader("spell_stinky_precious_decimate") { } + PrepareSpellScript(spell_stinky_precious_decimate); - class spell_stinky_precious_decimate_SpellScript : public SpellScript + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_stinky_precious_decimate_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + if (GetHitUnit()->GetHealthPct() > float(GetEffectValue())) { - if (GetHitUnit()->GetHealthPct() > float(GetEffectValue())) + uint32 newHealth = GetHitUnit()->GetMaxHealth() * uint32(GetEffectValue()) / 100; + GetHitUnit()->SetHealth(newHealth); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_stinky_precious_decimate::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_icc_yf_frozen_orb_aura : public AuraScript +{ + PrepareAuraScript(spell_icc_yf_frozen_orb_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ 71285 }); + } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + if (Unit* c = GetCaster()) + if (Unit* t = GetTarget()) + c->CastSpell(t->GetPositionX(), t->GetPositionY(), t->GetPositionZ(), 71285, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_icc_yf_frozen_orb_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_icc_yh_volley_aura : public AuraScript +{ + PrepareAuraScript(spell_icc_yh_volley_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ 41089 }); + } + + void HandleEffectPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (Unit* c = GetCaster()) + if (Unit* t = GetTarget()) { - uint32 newHealth = GetHitUnit()->GetMaxHealth() * uint32(GetEffectValue()) / 100; - GetHitUnit()->SetHealth(newHealth); + if ((aurEff->GetTickNumber() % 5) == 0) + c->SetFacingToObject(t); + int32 basepoints1 = aurEff->GetAmount(); + c->CastCustomSpell(t, 41089, 0, &basepoints1, 0, true); } - } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_stinky_precious_decimate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_stinky_precious_decimate_SpellScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_icc_yh_volley_aura::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE); } }; -class spell_icc_yf_frozen_orb : public SpellScriptLoader +class spell_icc_yd_summon_undead : public SpellScript { -public: - spell_icc_yf_frozen_orb() : SpellScriptLoader("spell_icc_yf_frozen_orb") { } + PrepareSpellScript(spell_icc_yd_summon_undead); - class spell_icc_yf_frozen_orb_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_icc_yf_frozen_orb_AuraScript) + return ValidateSpellInfo({ 71302 }); + } - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* c = GetCaster()) - if (Unit* t = GetTarget()) - c->CastSpell(t->GetPositionX(), t->GetPositionY(), t->GetPositionZ(), 71285, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_icc_yf_frozen_orb_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleDummyLaunch(SpellEffIndex /*effIndex*/) { - return new spell_icc_yf_frozen_orb_AuraScript(); + if (Unit* c = GetCaster()) + if (c->GetMapId() == 631) + for (uint8 i = 0; i < 5; ++i) + c->CastSpell(c, 71302, true); + } + + void Register() override + { + OnEffectLaunch += SpellEffectFn(spell_icc_yd_summon_undead::HandleDummyLaunch, EFFECT_0, SPELL_EFFECT_DUMMY); } }; -class spell_icc_yh_volley : public SpellScriptLoader +class spell_icc_shattered_bones : public SpellScript { -public: - spell_icc_yh_volley() : SpellScriptLoader("spell_icc_yh_volley") { } + PrepareSpellScript(spell_icc_shattered_bones); - class spell_icc_yh_volley_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_icc_yh_volley_AuraScript) - - void HandleEffectPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* c = GetCaster()) - if (Unit* t = GetTarget()) - { - if ((aurEff->GetTickNumber() % 5) == 0) - c->SetFacingToObject(t); - int32 basepoints1 = aurEff->GetAmount(); - c->CastCustomSpell(t, 41089, 0, &basepoints1, 0, true); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_icc_yh_volley_AuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_icc_yh_volley_AuraScript(); + return ValidateSpellInfo({ 70963 }); } -}; -class spell_icc_yd_summon_undead : public SpellScriptLoader -{ -public: - spell_icc_yd_summon_undead() : SpellScriptLoader("spell_icc_yd_summon_undead") { } - - class spell_icc_yd_summon_undead_SpellScript : public SpellScript + void HandleDummy() { - PrepareSpellScript(spell_icc_yd_summon_undead_SpellScript); - - void HandleDummyLaunch(SpellEffIndex /*effIndex*/) - { - if (Unit* c = GetCaster()) - if (c->GetMapId() == 631) - for (uint8 i = 0; i < 5; ++i) - c->CastSpell(c, 71302, true); - } - - void Register() override - { - OnEffectLaunch += SpellEffectFn(spell_icc_yd_summon_undead_SpellScript::HandleDummyLaunch, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_icc_yd_summon_undead_SpellScript(); + for (uint8 i = 0; i < 10; ++i) + GetCaster()->CastSpell((Unit*)nullptr, 70963, true); } -}; -class spell_icc_shattered_bones : public SpellScriptLoader -{ -public: - spell_icc_shattered_bones() : SpellScriptLoader("spell_icc_shattered_bones") { } - - class spell_icc_shattered_bones_SpellScript : public SpellScript + void Register() override { - PrepareSpellScript(spell_icc_shattered_bones_SpellScript); - - void HandleDummy() - { - for (uint8 i = 0; i < 10; ++i) - GetCaster()->CastSpell((Unit*)nullptr, 70963, true); - } - - void Register() override - { - AfterCast += SpellCastFn(spell_icc_shattered_bones_SpellScript::HandleDummy); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_icc_shattered_bones_SpellScript(); + AfterCast += SpellCastFn(spell_icc_shattered_bones::HandleDummy); } }; @@ -3780,28 +3660,29 @@ void AddSC_icecrown_citadel() new npc_frostwing_vrykul(); new npc_impaling_spear(); new npc_arthas_teleport_visual(); - new spell_icc_stoneform(); - new spell_icc_sprit_alarm(); - new spell_icc_geist_alarm(); - new spell_frost_giant_death_plague(); - new spell_icc_harvest_blight_specimen(); - new spell_trigger_spell_from_caster("spell_svalna_caress_of_death", SPELL_IMPALING_SPEAR_KILL); - new spell_svalna_revive_champion(); - new spell_svalna_remove_spear(); - new spell_icc_soul_missile(); + RegisterSpellScript(spell_icc_stoneform_aura); + RegisterSpellScript(spell_icc_sprit_alarm); + RegisterSpellScript(spell_icc_geist_alarm); + RegisterSpellScript(spell_frost_giant_death_plague); + RegisterSpellScript(spell_icc_harvest_blight_specimen); + RegisterSpellScriptWithArgs(spell_trigger_spell_from_caster, "spell_svalna_caress_of_death", SPELL_IMPALING_SPEAR_KILL); + + RegisterSpellScript(spell_svalna_revive_champion); + RegisterSpellScript(spell_svalna_remove_spear); + RegisterSpellScript(spell_icc_soul_missile); new at_icc_saurfang_portal(); new at_icc_shutdown_traps(); new at_icc_start_blood_quickening(); new at_icc_start_frostwing_gauntlet(); // pussywizard below: - new spell_icc_web_wrap(); - new spell_icc_dark_reckoning(); - new spell_stinky_precious_decimate(); - new spell_icc_yf_frozen_orb(); - new spell_icc_yh_volley(); - new spell_icc_yd_summon_undead(); - new spell_icc_shattered_bones(); + RegisterSpellScript(spell_icc_web_wrap_aura); + RegisterSpellScript(spell_icc_dark_reckoning_aura); + RegisterSpellScript(spell_stinky_precious_decimate); + RegisterSpellScript(spell_icc_yf_frozen_orb_aura); + RegisterSpellScript(spell_icc_yh_volley_aura); + RegisterSpellScript(spell_icc_yd_summon_undead); + RegisterSpellScript(spell_icc_shattered_bones); new npc_icc_skybreaker_hierophant(); new npc_icc_skybreaker_marksman(); new npc_icc_skybreaker_vicar(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index fa4516546..5c94d4880 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -591,39 +591,26 @@ enum ItemIds ITEM_GOBLIN_ROCKET_PACK = 49278 }; -class spell_trigger_spell_from_caster : public SpellScriptLoader +class spell_trigger_spell_from_caster : public SpellScript { + PrepareSpellScript(spell_trigger_spell_from_caster); + public: - spell_trigger_spell_from_caster(char const* scriptName, uint32 triggerId) : SpellScriptLoader(scriptName), _triggerId(triggerId) { } + spell_trigger_spell_from_caster(uint32 triggerId) : SpellScript(), _triggerId(triggerId) { } - class spell_trigger_spell_from_caster_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_trigger_spell_from_caster_SpellScript); + return ValidateSpellInfo({ _triggerId }); + } - public: - spell_trigger_spell_from_caster_SpellScript(uint32 triggerId) : SpellScript(), _triggerId(triggerId) { } - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ _triggerId }); - } - - void HandleTrigger() - { - GetCaster()->CastSpell(GetHitUnit(), _triggerId, true); - } - - void Register() override - { - AfterHit += SpellHitFn(spell_trigger_spell_from_caster_SpellScript::HandleTrigger); - } - - uint32 _triggerId; - }; - - SpellScript* GetSpellScript() const override + void HandleTrigger() { - return new spell_trigger_spell_from_caster_SpellScript(_triggerId); + GetCaster()->CastSpell(GetHitUnit(), _triggerId, true); + } + + void Register() override + { + AfterHit += SpellHitFn(spell_trigger_spell_from_caster::HandleTrigger); } private: From d5c472b25d3197d8b474768144139c09406f057d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jul 2024 12:58:21 +0000 Subject: [PATCH 04/24] chore(DB): import pending files Referenced commit(s): a3be4c25db9ca3921b288c8ec737de985c0d3e18 --- .../rev_1719841493844689528.sql => db_world/2024_07_29_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1719841493844689528.sql => db_world/2024_07_29_00.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1719841493844689528.sql b/data/sql/updates/db_world/2024_07_29_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1719841493844689528.sql rename to data/sql/updates/db_world/2024_07_29_00.sql index e61ec6ca1..4303ab00d 100644 --- a/data/sql/updates/pending_db_world/rev_1719841493844689528.sql +++ b/data/sql/updates/db_world/2024_07_29_00.sql @@ -1,3 +1,4 @@ +-- DB update 2024_07_28_00 -> 2024_07_29_00 -- UPDATE `spell_script_names` SET `ScriptName`='spell_blood_queen_pact_of_the_darkfallen_dmg_aura' WHERE `spell_id`=71340 AND `ScriptName`='spell_blood_queen_pact_of_the_darkfallen_dmg'; UPDATE `spell_script_names` SET `ScriptName`='spell_blood_queen_frenzied_bloodthirst_aura' WHERE `spell_id` IN (70877,71474) AND `ScriptName`='spell_blood_queen_frenzied_bloodthirst'; From 87f4adf63403bb1c58da5ecb5143df4179fea846 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Mon, 29 Jul 2024 19:44:13 +0200 Subject: [PATCH 05/24] =?UTF-8?q?refactor(Core/Chat):=20Move=20SendWorldTe?= =?UTF-8?q?xt(optional)=20to=20ChatHandler=20and=20=E2=80=A6=20(#19501)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(Core/Chat): Move SendWorldText(optional) to ChatHandler and allow `fmt` * Update src/server/game/Battlegrounds/BattlegroundQueue.cpp * Update src/server/game/Battlegrounds/BattlegroundQueue.cpp * Update src/server/game/Misc/BanMgr.cpp * Update src/server/game/Misc/BanMgr.cpp * Update src/server/game/Misc/BanMgr.cpp * Update src/server/game/Misc/BanMgr.cpp * Update src/server/game/Misc/BanMgr.cpp * Update src/server/game/Misc/BanMgr.cpp * Update src/server/game/Misc/BanMgr.cpp * Update src/server/game/Misc/BanMgr.cpp --- .../game/Autobroadcast/AutobroadcastMgr.cpp | 2 +- .../game/Battlefield/Zones/BattlefieldWG.cpp | 3 +- .../game/Battlegrounds/ArenaTeamMgr.cpp | 13 ++--- .../game/Battlegrounds/Battleground.cpp | 2 +- .../game/Battlegrounds/BattlegroundMgr.cpp | 8 +-- .../game/Battlegrounds/BattlegroundQueue.cpp | 22 ++++---- src/server/game/Chat/Chat.cpp | 50 +++++++++++++++++++ src/server/game/Chat/Chat.h | 24 +++++++++ src/server/game/DungeonFinding/LFGMgr.cpp | 3 +- src/server/game/Events/GameEventMgr.cpp | 3 +- src/server/game/Misc/BanMgr.cpp | 17 ++++--- src/server/game/World/IWorld.h | 2 - src/server/game/World/World.cpp | 47 ----------------- src/server/game/World/World.h | 3 -- src/server/scripts/Commands/cs_message.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 6 +-- src/server/scripts/Commands/cs_reset.cpp | 4 +- src/test/mocks/WorldMock.h | 2 - 18 files changed, 119 insertions(+), 94 deletions(-) diff --git a/src/server/game/Autobroadcast/AutobroadcastMgr.cpp b/src/server/game/Autobroadcast/AutobroadcastMgr.cpp index a0d00dd81..8b31bf893 100644 --- a/src/server/game/Autobroadcast/AutobroadcastMgr.cpp +++ b/src/server/game/Autobroadcast/AutobroadcastMgr.cpp @@ -131,7 +131,7 @@ void AutobroadcastMgr::SendAutobroadcasts() void AutobroadcastMgr::SendWorldAnnouncement(std::string msg) { - sWorld->SendWorldTextOptional(LANG_AUTO_BROADCAST, ANNOUNCER_FLAG_DISABLE_AUTOBROADCAST, msg.data()); + ChatHandler(nullptr).SendWorldTextOptional(LANG_AUTO_BROADCAST, ANNOUNCER_FLAG_DISABLE_AUTOBROADCAST, msg.data()); } void AutobroadcastMgr::SendNotificationAnnouncement(std::string msg) diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp index 6697ffe36..ce81b448b 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp @@ -20,6 +20,7 @@ /// @todo: Add proper implement of achievement #include "BattlefieldWG.h" +#include "Chat.h" #include "GameTime.h" #include "MapMgr.h" #include "Opcodes.h" @@ -290,7 +291,7 @@ void BattlefieldWG::OnBattleStart() m_tenacityUpdateTimer = 20000; if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE)) - sWorld->SendWorldText(BATTLEFIELD_WG_WORLD_START_MESSAGE); + ChatHandler(nullptr).SendWorldText(BATTLEFIELD_WG_WORLD_START_MESSAGE); } void BattlefieldWG::UpdateCounterVehicle(bool init) diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp index 629296d2e..e36b874ac 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp @@ -16,6 +16,7 @@ */ #include "ArenaTeamMgr.h" +#include "Chat.h" #include "DatabaseEnv.h" #include "Define.h" #include "Language.h" @@ -194,9 +195,9 @@ void ArenaTeamMgr::LoadArenaTeams() void ArenaTeamMgr::DistributeArenaPoints() { // Used to distribute arena points based on last week's stats - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_START); + ChatHandler(nullptr).SendWorldText(LANG_DIST_ARENA_POINTS_START); - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_START); + ChatHandler(nullptr).SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_START); // Temporary structure for storing maximum points to add values for all players std::map PlayerPoints; @@ -232,9 +233,9 @@ void ArenaTeamMgr::DistributeArenaPoints() PlayerPoints.clear(); - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_END); + ChatHandler(nullptr).SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_END); - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_START); + ChatHandler(nullptr).SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_START); for (ArenaTeamContainer::iterator titr = GetArenaTeamMapBegin(); titr != GetArenaTeamMapEnd(); ++titr) { if (ArenaTeam* at = titr->second) @@ -246,7 +247,7 @@ void ArenaTeamMgr::DistributeArenaPoints() } } - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_END); + ChatHandler(nullptr).SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_END); - sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_END); + ChatHandler(nullptr).SendWorldText(LANG_DIST_ARENA_POINTS_END); } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index a315ba935..d3189c258 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -618,7 +618,7 @@ inline void Battleground::_ProcessJoin(uint32 diff) // Announce BG starting if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE)) - sWorld->SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, GetName().c_str(), std::min(GetMinLevel(), (uint32)80), std::min(GetMaxLevel(), (uint32)80)); + ChatHandler(nullptr).SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, GetName(), std::min(GetMinLevel(), (uint32)80), std::min(GetMaxLevel(), (uint32)80)); sScriptMgr->OnBattlegroundStart(this); } diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 8336352ea..db6b96b5b 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -722,12 +722,12 @@ void BattlegroundMgr::ToggleTesting() if (sWorld->getBoolConfig(CONFIG_DEBUG_BATTLEGROUND)) { m_Testing = true; - sWorld->SendWorldText(LANG_DEBUG_BG_CONF); + ChatHandler(nullptr).SendWorldText(LANG_DEBUG_BG_CONF); } else { m_Testing = !m_Testing; - sWorld->SendWorldText(m_Testing ? LANG_DEBUG_BG_ON : LANG_DEBUG_BG_OFF); + ChatHandler(nullptr).SendWorldText(m_Testing ? LANG_DEBUG_BG_ON : LANG_DEBUG_BG_OFF); } } @@ -736,12 +736,12 @@ void BattlegroundMgr::ToggleArenaTesting() if (sWorld->getBoolConfig(CONFIG_DEBUG_ARENA)) { m_ArenaTesting = true; - sWorld->SendWorldText(LANG_DEBUG_ARENA_CONF); + ChatHandler(nullptr).SendWorldText(LANG_DEBUG_ARENA_CONF); } else { m_ArenaTesting = !m_ArenaTesting; - sWorld->SendWorldText(m_ArenaTesting ? LANG_DEBUG_ARENA_ON : LANG_DEBUG_ARENA_OFF); + ChatHandler(nullptr).SendWorldText(m_ArenaTesting ? LANG_DEBUG_ARENA_ON : LANG_DEBUG_ARENA_OFF); } } diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index e0b77a01a..cef257d0f 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -996,7 +996,7 @@ void BattlegroundQueue::BattlegroundQueueAnnouncerUpdate(uint32 diff, Battlegrou uint32 q_min_level = std::min(bracketEntry->minLevel, (uint32) 80); uint32 q_max_level = std::min(bracketEntry->maxLevel, (uint32) 80); - sWorld->SendWorldTextOptional(LANG_BG_QUEUE_ANNOUNCE_WORLD, ANNOUNCER_FLAG_DISABLE_BG_QUEUE, bgName.c_str(), q_min_level, q_max_level, qPlayers, MaxPlayers); + ChatHandler(nullptr).SendWorldTextOptional(LANG_BG_QUEUE_ANNOUNCE_WORLD, ANNOUNCER_FLAG_DISABLE_BG_QUEUE, bgName.c_str(), q_min_level, q_max_level, qPlayers, MaxPlayers); } else { @@ -1077,7 +1077,7 @@ void BattlegroundQueue::SendMessageBGQueue(Player* leader, Battleground* bg, PvP return; } - sWorld->SendWorldTextOptional(LANG_BG_QUEUE_ANNOUNCE_WORLD, ANNOUNCER_FLAG_DISABLE_BG_QUEUE, bgName.c_str(), q_min_level, q_max_level, qAlliance + qHorde, MaxPlayers); + ChatHandler(nullptr).SendWorldTextOptional(LANG_BG_QUEUE_ANNOUNCE_WORLD, ANNOUNCER_FLAG_DISABLE_BG_QUEUE, bgName.c_str(), q_min_level, q_max_level, qAlliance + qHorde, MaxPlayers); } } } @@ -1128,7 +1128,7 @@ void BattlegroundQueue::SendJoinMessageArenaQueue(Player* leader, GroupQueueInfo return; } - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, bgName.c_str(), arenatype.c_str(), q_min_level, q_max_level, qPlayers, playersNeed); + ChatHandler(nullptr).SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, bgName.c_str(), arenatype.c_str(), q_min_level, q_max_level, qPlayers, playersNeed); } } else @@ -1147,16 +1147,16 @@ void BattlegroundQueue::SendJoinMessageArenaQueue(Player* leader, GroupQueueInfo switch (announcementDetail) { case 3: - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_NAME_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType, ArenaTeamRating); + ChatHandler(nullptr).SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_NAME_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType, ArenaTeamRating); break; case 2: - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_NAME, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType); + ChatHandler(nullptr).SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_NAME, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName, ArenaType, ArenaType); break; case 1: - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType, ArenaTeamRating); + ChatHandler(nullptr).SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType, ArenaTeamRating); break; default: - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType); + ChatHandler(nullptr).SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType); break; } } @@ -1187,16 +1187,16 @@ void BattlegroundQueue::SendExitMessageArenaQueue(GroupQueueInfo* ginfo) switch (announcementDetail) { case 3: - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_NAME_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType, ArenaTeamRating); + ChatHandler(nullptr).SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_NAME_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType, ArenaTeamRating); break; case 2: - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_NAME, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType); + ChatHandler(nullptr).SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_NAME, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName, ArenaType, ArenaType); break; case 1: - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType, ArenaTeamRating); + ChatHandler(nullptr).SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType, ArenaTeamRating); break; default: - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType); + ChatHandler(nullptr).SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType); break; } } diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index fcd405fa9..1cc245c3e 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -99,6 +99,56 @@ bool ChatHandler::HasLowerSecurityAccount(WorldSession* target, uint32 target_ac return false; } +void ChatHandler::SendWorldText(std::string_view str) +{ + std::vector lines = Acore::Tokenize(str, '\n', true); + for (SessionMap::const_iterator itr = sWorld->GetAllSessions().begin(); itr != sWorld->GetAllSessions().end(); ++itr) + { + WorldSession* session = itr->second; + if (!session) + continue; + + // Player should be in world + Player* player = session->GetPlayer(); + if (!player || !player->IsInWorld()) + continue; + + for (std::string_view line : lines) + { + WorldPacket data; + ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); + player->SendDirectMessage(&data); + } + } +} + +void ChatHandler::SendWorldTextOptional(std::string_view str, uint32 flag) +{ + std::vector lines = Acore::Tokenize(str, '\n', true); + for (SessionMap::const_iterator itr = sWorld->GetAllSessions().begin(); itr != sWorld->GetAllSessions().end(); ++itr) + { + WorldSession* session = itr->second; + if (!session) + continue; + + // Player should be in world + Player* player = session->GetPlayer(); + if (!player || !player->IsInWorld()) + continue; + + if (sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED)) + if (player->GetPlayerSetting(AzerothcorePSSource, SETTING_ANNOUNCER_FLAGS).HasFlag(flag)) + continue; + + for (std::string_view line : lines) + { + WorldPacket data; + ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); + player->SendDirectMessage(&data); + } + } +} + void ChatHandler::SendSysMessage(std::string_view str, bool escapeCharacters) { std::string msg{ str }; diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index acb6760db..eb0d7256e 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -50,6 +50,30 @@ public: static char* LineFromMessage(char*& pos) { char* start = strtok(pos, "\n"); pos = nullptr; return start; } + void SendWorldText(std::string_view str); + template + void SendWorldText(uint32 strId, Args&&... args) + { + SendWorldText(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...)); + } + template + void SendWorldText(char const* fmt, Args&&... args) + { + SendWorldText(Acore::StringFormatFmt(fmt, std::forward(args)...)); + } + + void SendWorldTextOptional(std::string_view str, uint32 flag); + template + void SendWorldTextOptional(uint32 strId, uint32 flag, Args&&... args) + { + SendWorldTextOptional(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...), flag); + } + template + void SendWorldTextOptional(char const* fmt, uint32 flag, Args&&... args) + { + SendWorldTextOptional(Acore::StringFormatFmt(fmt, std::forward(args)...), flag); + } + // function with different implementation for chat/console virtual char const* GetAcoreString(uint32 entry) const; virtual void SendSysMessage(std::string_view str, bool escapeCharacters = false); diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index d5a275812..9136d3b1a 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -17,6 +17,7 @@ #include "LFGMgr.h" #include "BattlegroundMgr.h" +#include "Chat.h" #include "CharacterCache.h" #include "Common.h" #include "DBCStores.h" @@ -805,7 +806,7 @@ namespace lfg void LFGMgr::ToggleTesting() { m_Testing = !m_Testing; - sWorld->SendWorldText(m_Testing ? LANG_DEBUG_LFG_ON : LANG_DEBUG_LFG_OFF); + ChatHandler(nullptr).SendWorldText(m_Testing ? LANG_DEBUG_LFG_ON : LANG_DEBUG_LFG_OFF); } /** diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index 073352c4c..f835af43e 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -17,6 +17,7 @@ #include "GameEventMgr.h" #include "BattlegroundMgr.h" +#include "Chat.h" #include "DisableMgr.h" #include "GameObjectAI.h" #include "GameTime.h" @@ -1230,7 +1231,7 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id) { uint8 announce = mGameEvent[event_id].announce; if (announce == 1 || (announce == 2 && sWorld->getIntConfig(CONFIG_EVENT_ANNOUNCE))) - sWorld->SendWorldText(LANG_EVENTMESSAGE, mGameEvent[event_id].description.c_str()); + ChatHandler(nullptr).SendWorldText(LANG_EVENTMESSAGE, mGameEvent[event_id].description); LOG_DEBUG("gameevent", "GameEvent {} \"{}\" started.", event_id, mGameEvent[event_id].description); diff --git a/src/server/game/Misc/BanMgr.cpp b/src/server/game/Misc/BanMgr.cpp index e55d4e276..e3102c67e 100644 --- a/src/server/game/Misc/BanMgr.cpp +++ b/src/server/game/Misc/BanMgr.cpp @@ -17,6 +17,7 @@ #include "BanMgr.h" #include "AccountMgr.h" +#include "Chat.h" #include "DatabaseEnv.h" #include "GameTime.h" #include "Language.h" @@ -86,9 +87,9 @@ BanReturn BanMgr::BanAccount(std::string const& AccountName, std::string const& IsPermanetly = false; if (!IsPermanetly) - sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, Author.c_str(), AccountName.c_str(), secsToTimeString(TimeStringToSecs(Duration), true).c_str(), Reason.c_str()); + ChatHandler(nullptr).SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, Author, AccountName, secsToTimeString(TimeStringToSecs(Duration), true), Reason); else - sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, Author.c_str(), AccountName.c_str(), Reason.c_str()); + ChatHandler(nullptr).SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, Author, AccountName, Reason); } return BAN_SUCCESS; @@ -152,9 +153,9 @@ BanReturn BanMgr::BanAccountByPlayerName(std::string const& CharacterName, std:: AccountMgr::GetName(AccountID, AccountName); if (!IsPermanetly) - sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, Author.c_str(), AccountName.c_str(), secsToTimeString(TimeStringToSecs(Duration), true).c_str(), Reason.c_str()); + ChatHandler(nullptr).SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, Author, AccountName, secsToTimeString(TimeStringToSecs(Duration), true), Reason); else - sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, Author.c_str(), AccountName.c_str(), Reason.c_str()); + ChatHandler(nullptr).SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, Author, AccountName, Reason); } return BAN_SUCCESS; @@ -188,9 +189,9 @@ BanReturn BanMgr::BanIP(std::string const& IP, std::string const& Duration, std: IsPermanetly = false; if (IsPermanetly) - sWorld->SendWorldText(LANG_BAN_IP_YOUPERMBANNEDMESSAGE_WORLD, Author.c_str(), IP.c_str(), Reason.c_str()); + ChatHandler(nullptr).SendWorldText(LANG_BAN_IP_YOUPERMBANNEDMESSAGE_WORLD, Author, IP, Reason); else - sWorld->SendWorldText(LANG_BAN_IP_YOUBANNEDMESSAGE_WORLD, Author.c_str(), IP.c_str(), secsToTimeString(TimeStringToSecs(Duration), true).c_str(), Reason.c_str()); + ChatHandler(nullptr).SendWorldText(LANG_BAN_IP_YOUBANNEDMESSAGE_WORLD, Author, IP, secsToTimeString(TimeStringToSecs(Duration), true), Reason); } if (!resultAccounts) @@ -258,9 +259,9 @@ BanReturn BanMgr::BanCharacter(std::string const& CharacterName, std::string con IsPermanetly = false; if (!IsPermanetly) - sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, Author.c_str(), CharacterName.c_str(), secsToTimeString(TimeStringToSecs(Duration), true).c_str(), Reason.c_str()); + ChatHandler(nullptr).SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, Author, CharacterName, secsToTimeString(TimeStringToSecs(Duration), true), Reason); else - sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUPERMBANNEDMESSAGE_WORLD, Author.c_str(), CharacterName.c_str(), Reason.c_str()); + ChatHandler(nullptr).SendWorldText(LANG_BAN_CHARACTER_YOUPERMBANNEDMESSAGE_WORLD, Author, CharacterName, Reason); } return BAN_SUCCESS; diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index cec7b4548..1771d7f41 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -566,8 +566,6 @@ public: [[nodiscard]] virtual uint16 GetConfigMaxSkillValue() const = 0; virtual void SetInitialWorldSettings() = 0; virtual void LoadConfigSettings(bool reload = false) = 0; - virtual void SendWorldText(uint32 string_id, ...) = 0; - virtual void SendWorldTextOptional(uint32 string_id, uint32 flag, ...) = 0; virtual void SendGMText(uint32 string_id, ...) = 0; virtual void SendGlobalMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0; virtual void SendGlobalGMMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index b42d97fe3..1d46005e0 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2578,53 +2578,6 @@ namespace Acore }; } // namespace Acore -/// Send a System Message to all players (except self if mentioned) -void World::SendWorldText(uint32 string_id, ...) -{ - va_list ap; - va_start(ap, string_id); - - Acore::WorldWorldTextBuilder wt_builder(string_id, &ap); - Acore::LocalizedPacketListDo wt_do(wt_builder); - for (SessionMap::const_iterator itr = _sessions.begin(); itr != _sessions.end(); ++itr) - { - if (!itr->second || !itr->second->GetPlayer() || !itr->second->GetPlayer()->IsInWorld()) - continue; - - wt_do(itr->second->GetPlayer()); - } - - va_end(ap); -} - -void World::SendWorldTextOptional(uint32 string_id, uint32 flag, ...) -{ - va_list ap; - va_start(ap, flag); - - Acore::WorldWorldTextBuilder wt_builder(string_id, &ap); - Acore::LocalizedPacketListDo wt_do(wt_builder); - for (auto const& itr : _sessions) - { - if (!itr.second || !itr.second->GetPlayer() || !itr.second->GetPlayer()->IsInWorld()) - { - continue; - } - - if (sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED)) - { - if (itr.second->GetPlayer()->GetPlayerSetting(AzerothcorePSSource, SETTING_ANNOUNCER_FLAGS).HasFlag(flag)) - { - continue; - } - } - - wt_do(itr.second->GetPlayer()); - } - - va_end(ap); -} - /// Send a System Message to all GMs (except self if mentioned) void World::SendGMText(uint32 string_id, ...) { diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 3968dbd8f..9126df816 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -238,7 +238,6 @@ public: void SetInitialWorldSettings() override; void LoadConfigSettings(bool reload = false) override; - void SendWorldText(uint32 string_id, ...) override; void SendGMText(uint32 string_id, ...) override; void SendGlobalMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) override; void SendGlobalGMMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) override; @@ -246,8 +245,6 @@ public: void SendZoneText(uint32 zone, const char* text, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) override; void SendServerMessage(ServerMessageType messageID, std::string stringParam = "", Player* player = nullptr) override; - void SendWorldTextOptional(uint32 string_id, uint32 flag, ...) override; - /// Are we in the middle of a shutdown? [[nodiscard]] bool IsShuttingDown() const override { return _shutdownTimer > 0; } [[nodiscard]] uint32 GetShutDownTimeLeft() const override { return _shutdownTimer; } diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp index 104c16277..f2ef60752 100644 --- a/src/server/scripts/Commands/cs_message.cpp +++ b/src/server/scripts/Commands/cs_message.cpp @@ -64,7 +64,7 @@ public: if (WorldSession* session = handler->GetSession()) name = session->GetPlayer()->GetName(); - sWorld->SendWorldText(LANG_ANNOUNCE_COLOR, name.c_str(), message.data()); + handler->SendWorldText(LANG_ANNOUNCE_COLOR, name, message.data()); return true; } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 572bc3376..fe32b740c 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1404,7 +1404,7 @@ public: if (sWorld->getBoolConfig(CONFIG_SHOW_KICK_IN_WORLD)) { - sWorld->SendWorldText(LANG_COMMAND_KICKMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), target->GetName().c_str(), kickReasonStr.c_str()); + handler->SendWorldText(LANG_COMMAND_KICKMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName() : "Server"), target->GetName(), kickReasonStr); } else { @@ -2506,7 +2506,7 @@ public: if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD)) { - sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), secsToTimeString(muteDuration, true).c_str(), muteReasonStr.c_str()); + handler->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy, nameLink, secsToTimeString(muteDuration, true), muteReasonStr); } ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, secsToTimeString(muteDuration, true), muteBy, muteReasonStr); @@ -2533,7 +2533,7 @@ public: if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD) && !target) { - sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), secsToTimeString(muteDuration, true).c_str(), muteReasonStr.c_str()); + handler->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy, nameLink, secsToTimeString(muteDuration, true), muteReasonStr); } else { diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index 26bf8109d..646f8a793 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -281,14 +281,14 @@ public: if (caseName == "spells") { atLogin = AT_LOGIN_RESET_SPELLS; - sWorld->SendWorldText(LANG_RESETALL_SPELLS); + handler->SendWorldText(LANG_RESETALL_SPELLS); if (!handler->GetSession()) handler->SendSysMessage(LANG_RESETALL_SPELLS); } else if (caseName == "talents") { atLogin = AtLoginFlags(AT_LOGIN_RESET_TALENTS | AT_LOGIN_RESET_PET_TALENTS); - sWorld->SendWorldText(LANG_RESETALL_TALENTS); + handler->SendWorldText(LANG_RESETALL_TALENTS); if (!handler->GetSession()) handler->SendSysMessage(LANG_RESETALL_TALENTS); } diff --git a/src/test/mocks/WorldMock.h b/src/test/mocks/WorldMock.h index 3ac4d571d..5c00ae829 100644 --- a/src/test/mocks/WorldMock.h +++ b/src/test/mocks/WorldMock.h @@ -72,8 +72,6 @@ public: MOCK_METHOD(uint16, GetConfigMaxSkillValue, (), (const)); MOCK_METHOD(void, SetInitialWorldSettings, ()); MOCK_METHOD(void, LoadConfigSettings, (bool reload), ()); - void SendWorldText(uint32 string_id, ...) override {} - void SendWorldTextOptional(uint32 string_id, uint32 flag, ...) override {} void SendGMText(uint32 string_id, ...) override {} MOCK_METHOD(void, SendGlobalMessage, (WorldPacket const* packet, WorldSession* self, TeamId teamId), ()); MOCK_METHOD(void, SendGlobalGMMessage, (WorldPacket const* packet, WorldSession* self, TeamId teamId), ()); From 2dd53e3521a941fba9b388b34ab511e24a830729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Mon, 29 Jul 2024 19:44:52 +0200 Subject: [PATCH 06/24] refactor(Scripts): remove unused imports (#19503) --- .../EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h | 1 - .../scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp | 1 - .../scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp | 1 - 3 files changed, 3 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h index aad474bef..851ea697e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h @@ -19,7 +19,6 @@ #define DEF_MOLTEN_CORE_H #include "CreatureAIImpl.h" -#include "Object.h" #define DataHeader "MC" diff --git a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp index 0dae90d25..d51538887 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp @@ -15,7 +15,6 @@ * with this program. If not, see . */ -#include "CreatureScript.h" #include "InstanceMapScript.h" #include "InstanceScript.h" #include "Player.h" diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp index e12dfb5be..caa4e8f8e 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp @@ -15,7 +15,6 @@ * with this program. If not, see . */ -#include "CreatureScript.h" #include "InstanceMapScript.h" #include "InstanceScript.h" #include "ObjectMgr.h" From 506f95e6e5fafcb6b53dabd2c61b6e446ea57e8f Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Mon, 29 Jul 2024 19:04:59 -0300 Subject: [PATCH 07/24] fix(Scripts/BlackTemple): Mother Shahraz Taunt Immunity and Enrage cancelling (#19521) * init * Update rev_1722290115671857500.sql --- data/sql/updates/pending_db_world/rev_1722290115671857500.sql | 2 ++ src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/rev_1722290115671857500.sql diff --git a/data/sql/updates/pending_db_world/rev_1722290115671857500.sql b/data/sql/updates/pending_db_world/rev_1722290115671857500.sql new file mode 100644 index 000000000..9c0849317 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1722290115671857500.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|256 WHERE (`entry` = 22947); diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index 3706fd211..42133b668 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -110,7 +110,7 @@ struct boss_mother_shahraz : public BossAI me->m_Events.AddEventAtOffset([&] { DoCastSelf(SPELL_ENRAGE, true); Talk(SAY_ENRAGE); - }, 10min); + }, 10min, GROUP_ENRAGE); } void KilledUnit(Unit* /*victim*/) override From 15849601e754eba9ff11dbd3f1e3c2a782d48e42 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jul 2024 22:05:51 +0000 Subject: [PATCH 08/24] chore(DB): import pending files Referenced commit(s): 506f95e6e5fafcb6b53dabd2c61b6e446ea57e8f --- .../rev_1722290115671857500.sql => db_world/2024_07_29_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1722290115671857500.sql => db_world/2024_07_29_01.sql} (67%) diff --git a/data/sql/updates/pending_db_world/rev_1722290115671857500.sql b/data/sql/updates/db_world/2024_07_29_01.sql similarity index 67% rename from data/sql/updates/pending_db_world/rev_1722290115671857500.sql rename to data/sql/updates/db_world/2024_07_29_01.sql index 9c0849317..4b689d03a 100644 --- a/data/sql/updates/pending_db_world/rev_1722290115671857500.sql +++ b/data/sql/updates/db_world/2024_07_29_01.sql @@ -1,2 +1,3 @@ +-- DB update 2024_07_29_00 -> 2024_07_29_01 -- UPDATE `creature_template` SET `flags_extra` = `flags_extra`|256 WHERE (`entry` = 22947); From a5672597705ca1b745c0284fce98fb90dac0eb36 Mon Sep 17 00:00:00 2001 From: avarishd <46330494+avarishd@users.noreply.github.com> Date: Tue, 30 Jul 2024 03:39:36 +0300 Subject: [PATCH 09/24] fix(Core/Spells): [TK] Wing Buffet should be a cone. (#19382) * fix(Core/Spells): [TK] Wing Buffet should be a cone. * radius to 20, from 15 * Update SpellInfoCorrections.cpp --- .../updates/pending_db_world/rev_1720635777463456900.sql | 3 +++ src/server/game/Spells/SpellInfoCorrections.cpp | 8 ++++++++ 2 files changed, 11 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1720635777463456900.sql diff --git a/data/sql/updates/pending_db_world/rev_1720635777463456900.sql b/data/sql/updates/pending_db_world/rev_1720635777463456900.sql new file mode 100644 index 000000000..c5e6ec901 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1720635777463456900.sql @@ -0,0 +1,3 @@ +-- Wing Buffet +DELETE FROM `spell_custom_attr` WHERE `spell_id`=37319; +INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES (37319, 4); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index df0f6d901..83ed323fb 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4784,6 +4784,14 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_CASTER); }); + // Wing Buffet + ApplySpellFix({ 37319 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_24); + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(0); + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; From c5fb1c6e56ca360ab9d42605b632c8616c1212ab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jul 2024 00:40:29 +0000 Subject: [PATCH 10/24] chore(DB): import pending files Referenced commit(s): a5672597705ca1b745c0284fce98fb90dac0eb36 --- .../rev_1720635777463456900.sql => db_world/2024_07_30_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1720635777463456900.sql => db_world/2024_07_30_00.sql} (77%) diff --git a/data/sql/updates/pending_db_world/rev_1720635777463456900.sql b/data/sql/updates/db_world/2024_07_30_00.sql similarity index 77% rename from data/sql/updates/pending_db_world/rev_1720635777463456900.sql rename to data/sql/updates/db_world/2024_07_30_00.sql index c5e6ec901..c6e11c207 100644 --- a/data/sql/updates/pending_db_world/rev_1720635777463456900.sql +++ b/data/sql/updates/db_world/2024_07_30_00.sql @@ -1,3 +1,4 @@ +-- DB update 2024_07_29_01 -> 2024_07_30_00 -- Wing Buffet DELETE FROM `spell_custom_attr` WHERE `spell_id`=37319; INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES (37319, 4); From 74764e09b112d717addc3d6ce411a46e54d5bb92 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Mon, 29 Jul 2024 23:25:15 -0300 Subject: [PATCH 11/24] fix(DB/Spells): Acidic Wounds (#19524) Create rev_1722303292918945800.sql --- data/sql/updates/pending_db_world/rev_1722303292918945800.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1722303292918945800.sql diff --git a/data/sql/updates/pending_db_world/rev_1722303292918945800.sql b/data/sql/updates/pending_db_world/rev_1722303292918945800.sql new file mode 100644 index 000000000..2294eb440 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1722303292918945800.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_proc_event` WHERE `entry` = 40484; +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `procPhase`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES +(40484, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0); From 277b618d60241328b0a169d3b2daad0fd1a09d58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jul 2024 02:26:08 +0000 Subject: [PATCH 12/24] chore(DB): import pending files Referenced commit(s): 74764e09b112d717addc3d6ce411a46e54d5bb92 --- .../rev_1722303292918945800.sql => db_world/2024_07_30_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1722303292918945800.sql => db_world/2024_07_30_01.sql} (87%) diff --git a/data/sql/updates/pending_db_world/rev_1722303292918945800.sql b/data/sql/updates/db_world/2024_07_30_01.sql similarity index 87% rename from data/sql/updates/pending_db_world/rev_1722303292918945800.sql rename to data/sql/updates/db_world/2024_07_30_01.sql index 2294eb440..edb3e3103 100644 --- a/data/sql/updates/pending_db_world/rev_1722303292918945800.sql +++ b/data/sql/updates/db_world/2024_07_30_01.sql @@ -1,3 +1,4 @@ +-- DB update 2024_07_30_00 -> 2024_07_30_01 -- DELETE FROM `spell_proc_event` WHERE `entry` = 40484; INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `procPhase`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES From fccfe51594b48520d465b886d6d2b407548b514c Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Mon, 29 Jul 2024 23:49:58 -0300 Subject: [PATCH 13/24] fix(Scripts/BlackTemple): Mother Shahraz Periodic Beams (#19525) * init * Update boss_mother_shahraz.cpp --- src/server/game/Spells/SpellInfoCorrections.cpp | 6 ++++++ .../scripts/Outland/BlackTemple/boss_mother_shahraz.cpp | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 83ed323fb..1da205ab9 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4792,6 +4792,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); }); + // Random Periodic + ApplySpellFix({ 40867 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].Amplitude = 9000; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index 42133b668..47bbde7b3 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -145,10 +145,10 @@ class spell_mother_shahraz_random_periodic_aura : public AuraScript return ValidateSpellInfo({ SPELL_SINFUL_PERIODIC, SPELL_SINISTER_PERIODIC, SPELL_VILE_PERIODIC, SPELL_WICKED_PERIODIC }); } - void Update(AuraEffect const* effect) + void Update(AuraEffect const* /*effect*/) { PreventDefaultAction(); - if (effect->GetTickNumber() % 5 == 1) + if (GetUnitOwner()) GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SINFUL_PERIODIC, SPELL_SINISTER_PERIODIC, SPELL_VILE_PERIODIC, SPELL_WICKED_PERIODIC), true); } From af6b8ce09941650025c73770123efb49d0af9ef8 Mon Sep 17 00:00:00 2001 From: Justin Hanley Date: Tue, 30 Jul 2024 07:33:13 -0600 Subject: [PATCH 14/24] feat(Scripts/Commands): account set email (#19481) * added worldserver command to set email address * reverted sql, added Tail args * removed pointer * Added helper text via updatescript * fix build * fix build * fixed db update * Update data/sql/updates/db_world/2024_07_26_01.sql Co-authored-by: Kitzunu <24550914+Kitzunu@users.noreply.github.com> * Update data/sql/updates/db_world/2024_07_26_01.sql Co-authored-by: Kitzunu <24550914+Kitzunu@users.noreply.github.com> * fixed hander * refactor with named params * refactor with named params --------- Co-authored-by: Kitzunu <24550914+Kitzunu@users.noreply.github.com> --- data/sql/updates/db_world/2024_07_26_01.sql | 9 ++++ .../Database/Implementation/LoginDatabase.cpp | 1 + .../Database/Implementation/LoginDatabase.h | 1 + src/server/game/Accounts/AccountMgr.cpp | 27 ++++++++++ src/server/game/Accounts/AccountMgr.h | 3 ++ src/server/scripts/Commands/cs_account.cpp | 50 ++++++++++++++++++- 6 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/db_world/2024_07_26_01.sql diff --git a/data/sql/updates/db_world/2024_07_26_01.sql b/data/sql/updates/db_world/2024_07_26_01.sql new file mode 100644 index 000000000..55cc22a45 --- /dev/null +++ b/data/sql/updates/db_world/2024_07_26_01.sql @@ -0,0 +1,9 @@ +-- DB update 22024_07_26_00 -> 2024_07_26_01 +DELETE FROM `command` WHERE `name`='account set email'; + +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('account set email', 4, 'Syntax: .account set email $account $email $email_confirmation\nAdd or change an email to the account.'); + +DELETE FROM `acore_string` WHERE `entry` IN (875); +INSERT INTO `acore_string` (`entry`, `content_default`,`locale_zhCN`) VALUES +(875, 'Your email can\'t be longer than 255 characters, email not changed!', '您的电子邮件无法超过255个字符,电子邮件没有改变!'); diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp index 3dbb2ced2..5b20d8693 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.cpp +++ b/src/server/database/Database/Implementation/LoginDatabase.cpp @@ -83,6 +83,7 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_UPD_EXPANSION, "UPDATE account SET expansion = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_ACCOUNT_LOCK, "UPDATE account SET locked = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_ACCOUNT_LOCK_COUNTRY, "UPDATE account SET lock_country = ? WHERE id = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_UPD_EMAIL, "UPDATE account SET email = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_USERNAME, "UPDATE account SET username = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_MUTE_TIME, "UPDATE account SET mutetime = ? , mutereason = ? , muteby = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_MUTE_TIME_LOGIN, "UPDATE account SET mutetime = ? WHERE id = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h index c7fb2be48..365099913 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.h +++ b/src/server/database/Database/Implementation/LoginDatabase.h @@ -67,6 +67,7 @@ enum LoginDatabaseStatements : uint32 LOGIN_UPD_EXPANSION, LOGIN_UPD_ACCOUNT_LOCK, LOGIN_UPD_ACCOUNT_LOCK_COUNTRY, + LOGIN_UPD_EMAIL, LOGIN_UPD_USERNAME, LOGIN_UPD_MUTE_TIME, LOGIN_UPD_MUTE_TIME_LOGIN, diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index 439b6b5ba..2eefbc3ee 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -58,6 +58,33 @@ namespace AccountMgr return AOR_OK; // everything's fine } + AccountOpResult ChangeEmail(uint32 accountId, std::string newEmail) + { + std::string username; + + if (!GetName(accountId, username)) + { + sScriptMgr->OnFailedEmailChange(accountId); + return AOR_NAME_NOT_EXIST; // account doesn't exist + } + + if (utf8length(newEmail) > MAX_EMAIL_STR) + { + sScriptMgr->OnFailedEmailChange(accountId); + return AOR_EMAIL_TOO_LONG; // email's too long + } + + Utf8ToUpperOnlyLatin(newEmail); + + LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_EMAIL); + stmt->SetData(0, newEmail); + stmt->SetData(1, accountId); + LoginDatabase.Execute(stmt); + + sScriptMgr->OnEmailChange(accountId); + return AOR_OK; + } + AccountOpResult DeleteAccount(uint32 accountId) { // Check if accounts exists diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h index 2f203093f..49361db16 100644 --- a/src/server/game/Accounts/AccountMgr.h +++ b/src/server/game/Accounts/AccountMgr.h @@ -26,6 +26,7 @@ enum AccountOpResult AOR_OK, AOR_NAME_TOO_LONG, AOR_PASS_TOO_LONG, + AOR_EMAIL_TOO_LONG, AOR_NAME_ALREADY_EXIST, AOR_NAME_NOT_EXIST, AOR_DB_INTERNAL_ERROR @@ -33,6 +34,7 @@ enum AccountOpResult #define MAX_ACCOUNT_STR 20 #define MAX_PASS_STR 16 +#define MAX_EMAIL_STR 255 namespace AccountMgr { @@ -40,6 +42,7 @@ namespace AccountMgr AccountOpResult DeleteAccount(uint32 accountId); AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword); AccountOpResult ChangePassword(uint32 accountId, std::string newPassword); + AccountOpResult ChangeEmail(uint32 accountId, std::string email); bool CheckPassword(uint32 accountId, std::string password); uint32 GetId(std::string const& username); diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index 94d3893d6..93092d9b2 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -55,7 +55,8 @@ public: { "addon", HandleAccountSetAddonCommand, SEC_GAMEMASTER, Console::Yes }, { "gmlevel", HandleAccountSetGmLevelCommand, SEC_ADMINISTRATOR, Console::Yes }, { "password", HandleAccountSetPasswordCommand, SEC_ADMINISTRATOR, Console::Yes }, - { "2fa", HandleAccountSet2FACommand, SEC_PLAYER, Console::Yes } + { "2fa", HandleAccountSet2FACommand, SEC_PLAYER, Console::Yes }, + { "email", HandleAccountSetEmailCommand, SEC_ADMINISTRATOR, Console::Yes } }; static ChatCommandTable accountLockCommandTable @@ -900,6 +901,53 @@ public: } return true; } + + /// Set email for account + static bool HandleAccountSetEmailCommand(ChatHandler* handler, AccountIdentifier account, std::string email, std::string emailConfirmation) + + { + if (!account || !email.data() || !emailConfirmation.data()) + return false; + + std::string accountName = account.GetName(); + if (!Utf8ToUpperOnlyLatin(accountName)) + { + handler->SendErrorMessage(LANG_ACCOUNT_NOT_EXIST, accountName); + return false; + } + + uint32 targetAccountId = account.GetID(); + if (!targetAccountId) + { + handler->SendErrorMessage(LANG_ACCOUNT_NOT_EXIST, accountName); + return false; + } + + if (email != emailConfirmation) + { + handler->SendErrorMessage(LANG_NEW_EMAILS_NOT_MATCH); + return false; + } + + AccountOpResult result = AccountMgr::ChangeEmail(targetAccountId, email.data()); + + switch (result) + { + case AOR_OK: + handler->SendSysMessage(LANG_COMMAND_EMAIL); + break; + case AOR_NAME_NOT_EXIST: + handler->SendErrorMessage(LANG_ACCOUNT_NOT_EXIST, accountName); + return false; + case AOR_EMAIL_TOO_LONG: + handler->SendErrorMessage(LANG_EMAIL_TOO_LONG); + return false; + default: + handler->SendErrorMessage(LANG_COMMAND_NOTCHANGEEMAIL); + return false; + } + return true; + } }; void AddSC_account_commandscript() From 6bab2ec214d448578604111597782fe86715ecf4 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:26:03 -0300 Subject: [PATCH 15/24] fix(DB/Creature): Remove Essence of Desire interrupt immunity (#19526) --- data/sql/updates/pending_db_world/rev_1722307588789038000.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1722307588789038000.sql diff --git a/data/sql/updates/pending_db_world/rev_1722307588789038000.sql b/data/sql/updates/pending_db_world/rev_1722307588789038000.sql new file mode 100644 index 000000000..3a740b92f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1722307588789038000.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask`&~33554432 WHERE `entry` = 23419; From 4ca1fc1ba93f78cde82d4809474a58fd83bdd971 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jul 2024 14:26:55 +0000 Subject: [PATCH 16/24] chore(DB): import pending files Referenced commit(s): 6bab2ec214d448578604111597782fe86715ecf4 --- .../rev_1722307588789038000.sql => db_world/2024_07_30_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1722307588789038000.sql => db_world/2024_07_30_02.sql} (72%) diff --git a/data/sql/updates/pending_db_world/rev_1722307588789038000.sql b/data/sql/updates/db_world/2024_07_30_02.sql similarity index 72% rename from data/sql/updates/pending_db_world/rev_1722307588789038000.sql rename to data/sql/updates/db_world/2024_07_30_02.sql index 3a740b92f..fa885f271 100644 --- a/data/sql/updates/pending_db_world/rev_1722307588789038000.sql +++ b/data/sql/updates/db_world/2024_07_30_02.sql @@ -1,2 +1,3 @@ +-- DB update 2024_07_30_01 -> 2024_07_30_02 -- UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask`&~33554432 WHERE `entry` = 23419; From 97ee20a7aa0243fef809f1c4a88cdca239897f53 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 30 Jul 2024 17:33:10 -0300 Subject: [PATCH 17/24] fix(Scripts/BlackTemple): Reliquary of Souls move to TaskScheduler and Spirit Shock timer (#19523) --- .../BlackTemple/boss_reliquary_of_souls.cpp | 297 ++++++++---------- 1 file changed, 139 insertions(+), 158 deletions(-) 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 741082b65..36cd73151 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -91,24 +91,7 @@ enum Misc EVENT_ESSENCE_OF_SUFFERING = 1, EVENT_ESSENCE_OF_DESIRE = 2, EVENT_ESSENCE_OF_ANGER = 3, - EVENT_ENGAGE_ESSENCE = 4, - EVENT_SPAWN_ENSLAVED_SOULS = 5, - EVENT_SPAWN_SOUL = 6, - EVENT_SUCK_ESSENCE = 7, - EVENT_SUFF_FRENZY = 10, - EVENT_SUFF_FRENZY_EMOTE = 11, - EVENT_SUFF_SOUL_DRAIN = 12, - - EVENT_DESI_DEADEN = 20, - EVENT_DESI_SPIRIT_SHOCK = 21, - EVENT_DESI_RUNE_SHIELD = 22, - - EVENT_ANGER_SPITE = 30, - EVENT_ANGER_SOUL_SCREAM = 31, - EVENT_ANGER_SEETHE = 32, - - EVENT_KILL_TALK = 100, POINT_GO_BACK = 1 }; @@ -162,31 +145,61 @@ public: return; me->SetInCombatWithZone(); - events.ScheduleEvent(EVENT_ESSENCE_OF_SUFFERING, 5000); // 15000); me->SetStandState(UNIT_STAND_STATE_STAND); + + ScheduleUniqueTimedEvent(5s, [&] { // 15s + me->SetStandState(UNIT_STAND_STATE_SUBMERGED); + DoCastSelf(SPELL_SUMMON_ESSENCE_OF_SUFFERING); + }, EVENT_ESSENCE_OF_SUFFERING); } void DoAction(int32 param) override { if (param == ACTION_ESSENCE_OF_SUFFERING) { - me->SetStandState(UNIT_STAND_STATE_STAND); - events.ScheduleEvent(EVENT_SUCK_ESSENCE, 1000); - events.ScheduleEvent(EVENT_SPAWN_ENSLAVED_SOULS, 8000); - events.ScheduleEvent(EVENT_ESSENCE_OF_DESIRE, 38000); + PhaseTransitionSpawns(); + + ScheduleUniqueTimedEvent(38s, [&] { + summons.DespawnAll(); + me->SetStandState(UNIT_STAND_STATE_SUBMERGED); + DoCastSelf(SPELL_SUMMON_ESSENCE_OF_DESIRE); + }, EVENT_ESSENCE_OF_DESIRE); } else if (param == ACTION_ESSENCE_OF_DESIRE) { - me->SetStandState(UNIT_STAND_STATE_STAND); - events.ScheduleEvent(EVENT_SUCK_ESSENCE, 1000); - events.ScheduleEvent(EVENT_SPAWN_ENSLAVED_SOULS, 8000); - events.ScheduleEvent(EVENT_ESSENCE_OF_ANGER, 38000); + PhaseTransitionSpawns(); + + ScheduleUniqueTimedEvent(38s, [&] { + summons.DespawnAll(); + me->SetStandState(UNIT_STAND_STATE_SUBMERGED); + DoCastSelf(SPELL_SUMMON_ESSENCE_OF_ANGER); + }, EVENT_ESSENCE_OF_ANGER); } else if (param == ACTION_ESSENCE_OF_ANGER) { } } + void PhaseTransitionSpawns() + { + me->SetStandState(UNIT_STAND_STATE_STAND); + me->m_Events.AddEventAtOffset([&] { + me->SetStandState(UNIT_STAND_STATE_STAND); + }, 1s); + + me->m_Events.AddEventAtOffset([&] { + me->CastCustomSpell(SPELL_SUMMON_ENSLAVED_SOUL, SPELLVALUE_MAX_TARGETS, 1, me, false); + me->CastCustomSpell(SPELL_SUMMON_ENSLAVED_SOUL, SPELLVALUE_MAX_TARGETS, 1, me, false); + + for (uint8 i = 0; i < 16; ++i) + { + me->m_Events.AddEventAtOffset([&] { + me->CastCustomSpell(SPELL_SUMMON_ENSLAVED_SOUL, SPELLVALUE_MAX_TARGETS, 1, me, false); + }, i * 1200ms); + } + }, 8s); + } + void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); @@ -200,7 +213,9 @@ public: summon->SetReactState(REACT_PASSIVE); summon->CastSpell(summon, SPELL_EMERGE_VISUAL, true); - events.ScheduleEvent(EVENT_ENGAGE_ESSENCE, 4000); + me->m_Events.AddEventAtOffset([&] { + summons.DoAction(ACTION_ENGAGE_ESSENCE); + }, 4s); } void SummonedCreatureDies(Creature* summon, Unit*) override @@ -221,39 +236,7 @@ public: if (me->getStandState() == UNIT_STAND_STATE_SLEEP) return; - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_SUCK_ESSENCE: - me->SetStandState(UNIT_STAND_STATE_STAND); - break; - case EVENT_ENGAGE_ESSENCE: - summons.DoAction(ACTION_ENGAGE_ESSENCE); - break; - case EVENT_ESSENCE_OF_SUFFERING: - me->SetStandState(UNIT_STAND_STATE_SUBMERGED); - me->CastSpell(me, SPELL_SUMMON_ESSENCE_OF_SUFFERING, false); - break; - case EVENT_ESSENCE_OF_DESIRE: - summons.DespawnAll(); - me->SetStandState(UNIT_STAND_STATE_SUBMERGED); - me->CastSpell(me, SPELL_SUMMON_ESSENCE_OF_DESIRE, false); - break; - case EVENT_ESSENCE_OF_ANGER: - summons.DespawnAll(); - me->SetStandState(UNIT_STAND_STATE_SUBMERGED); - me->CastSpell(me, SPELL_SUMMON_ESSENCE_OF_ANGER, false); - break; - case EVENT_SPAWN_ENSLAVED_SOULS: - events.ScheduleEvent(EVENT_SPAWN_SOUL, 0); - events.ScheduleEvent(EVENT_SPAWN_SOUL, 0); - for (uint8 i = 0; i < 16; ++i) - events.ScheduleEvent(EVENT_SPAWN_SOUL, i * 1200); - break; - case EVENT_SPAWN_SOUL: - me->CastCustomSpell(SPELL_SUMMON_ENSLAVED_SOUL, SPELLVALUE_MAX_TARGETS, 1, me, false); - break; - } + scheduler.Update(diff); if (!UpdateVictim()) return; @@ -278,13 +261,12 @@ public: struct boss_essence_of_sufferingAI : public ScriptedAI { - boss_essence_of_sufferingAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; + boss_essence_of_sufferingAI(Creature* creature) : ScriptedAI(creature), _recentlySpoken(false) { } void Reset() override { - events.Reset(); + _recentlySpoken = false; + scheduler.CancelAll(); } void DoAction(int32 param) override @@ -311,7 +293,7 @@ public: { if (damage >= me->GetHealth()) { - damage = 0; + damage = me->GetHealth() - 1; if (!me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE)) { me->RemoveAurasDueToSpell(SPELL_ESSENCE_OF_SUFFERING_PASSIVE); // prevent fixate from triggering @@ -320,29 +302,42 @@ public: me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), false); - events.Reset(); + scheduler.CancelAll(); } } } void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!_recentlySpoken) { Talk(SUFF_SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); + me->m_Events.AddEventAtOffset([&] { + _recentlySpoken = false; + }, 6s); } } void JustEngagedWith(Unit* /*who*/) override { Talk(SUFF_SAY_FREED); - me->CastSpell(me, SPELL_AURA_OF_SUFFERING, true); - me->CastSpell(me, SPELL_ESSENCE_OF_SUFFERING_PASSIVE, true); - me->CastSpell(me, SPELL_ESSENCE_OF_SUFFERING_PASSIVE2, true); + DoCastSelf(SPELL_AURA_OF_SUFFERING, true); + DoCastSelf(SPELL_ESSENCE_OF_SUFFERING_PASSIVE, true); + DoCastSelf(SPELL_ESSENCE_OF_SUFFERING_PASSIVE2, true); - events.ScheduleEvent(EVENT_SUFF_FRENZY, 45000); - events.ScheduleEvent(EVENT_SUFF_SOUL_DRAIN, 25000); + ScheduleTimedEvent(45s, [&] { + Talk(SUFF_SAY_ENRAGE); + Talk(SUFF_EMOTE_ENRAGE); + DoCastSelf(SPELL_FRENZY); + + me->m_Events.AddEventAtOffset([&] { + Talk(SUFF_EMOTE_ENRAGE); + }, 3s); + }, 45s); + + ScheduleTimedEvent(25s, [&] { + me->CastCustomSpell(SPELL_SOUL_DRAIN, SPELLVALUE_MAX_TARGETS, 3, me, false); + }, 30s); } void UpdateAI(uint32 diff) override @@ -350,30 +345,15 @@ public: if (!UpdateVictim()) return; - events.Update(diff); + scheduler.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) - { - case EVENT_SUFF_SOUL_DRAIN: - me->CastCustomSpell(SPELL_SOUL_DRAIN, SPELLVALUE_MAX_TARGETS, 3, me, false); - events.ScheduleEvent(EVENT_SUFF_SOUL_DRAIN, 30000); - break; - case EVENT_SUFF_FRENZY: - Talk(SUFF_SAY_ENRAGE); - Talk(SUFF_EMOTE_ENRAGE); - me->CastSpell(me, SPELL_FRENZY, false); - events.ScheduleEvent(EVENT_SUFF_FRENZY, 45000); - events.ScheduleEvent(EVENT_SUFF_FRENZY_EMOTE, 3000); - break; - case EVENT_SUFF_FRENZY_EMOTE: - Talk(SUFF_EMOTE_ENRAGE); - break; - } - DoMeleeAttackIfReady(); } + + private: + bool _recentlySpoken; }; }; @@ -389,13 +369,12 @@ public: struct boss_essence_of_desireAI : public ScriptedAI { - boss_essence_of_desireAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; + boss_essence_of_desireAI(Creature* creature) : ScriptedAI(creature), _recentlySpoken(false) { } void Reset() override { - events.Reset(); + _recentlySpoken = false; + scheduler.CancelAll(); } void DoAction(int32 param) override @@ -422,7 +401,7 @@ public: { if (damage >= me->GetHealth()) { - damage = 0; + damage = me->GetHealth() - 1; if (!me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE)) { me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); @@ -430,28 +409,48 @@ public: me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), false); - events.Reset(); + scheduler.CancelAll(); } } } void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!_recentlySpoken) { Talk(DESI_SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); + me->m_Events.AddEventAtOffset([&] { + _recentlySpoken = false; + }, 6s); } } void JustEngagedWith(Unit* /*who*/) override { Talk(DESI_SAY_FREED); - me->CastSpell(me, SPELL_AURA_OF_DESIRE, true); + DoCastSelf(SPELL_AURA_OF_DESIRE, true); - events.ScheduleEvent(EVENT_DESI_DEADEN, 28000); - events.ScheduleEvent(EVENT_DESI_SPIRIT_SHOCK, 20000); - events.ScheduleEvent(EVENT_DESI_RUNE_SHIELD, 13000); + ScheduleTimedEvent(28s, [&] { + if (roll_chance_i(50)) + Talk(DESI_SAY_SPEC); + DoCastVictim(SPELL_DEADEN); + }, 31s); + + scheduler.Schedule(8s, 12s, [this](TaskContext context) { + if (!me->HasUnitState(UNIT_STATE_CASTING)) + { + if (DoCastVictim(SPELL_SPIRIT_SHOCK) == SPELL_CAST_OK) + context.Repeat(1200ms); + else + context.Repeat(3s, 8s); + } + else + context.Repeat(1200ms); + }); + + ScheduleTimedEvent(13s, [&] { + DoCastSelf(SPELL_RUNE_SHIELD); + }, 15s); } void UpdateAI(uint32 diff) override @@ -459,30 +458,15 @@ public: if (!UpdateVictim()) return; - events.Update(diff); + scheduler.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) - { - case EVENT_DESI_DEADEN: - if (roll_chance_i(50)) - Talk(DESI_SAY_SPEC); - me->CastSpell(me->GetVictim(), SPELL_DEADEN, false); - events.ScheduleEvent(EVENT_DESI_DEADEN, 31000); - break; - case EVENT_DESI_SPIRIT_SHOCK: - me->CastSpell(me->GetVictim(), SPELL_SPIRIT_SHOCK, false); - events.ScheduleEvent(EVENT_DESI_SPIRIT_SHOCK, 12000); - break; - case EVENT_DESI_RUNE_SHIELD: - me->CastSpell(me, SPELL_RUNE_SHIELD, false); - events.ScheduleEvent(EVENT_DESI_RUNE_SHIELD, 15000); - break; - } - DoMeleeAttackIfReady(); } + + private: + bool _recentlySpoken; }; }; @@ -498,15 +482,15 @@ public: struct boss_essence_of_angerAI : public ScriptedAI { - boss_essence_of_angerAI(Creature* creature) : ScriptedAI(creature) { } + boss_essence_of_angerAI(Creature* creature) : ScriptedAI(creature), _recentlySpoken(false) { } - EventMap events; ObjectGuid targetGUID; void Reset() override { + _recentlySpoken = false; targetGUID.Clear(); - events.Reset(); + scheduler.CancelAll(); } void DoAction(int32 param) override @@ -521,10 +505,12 @@ public: void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!_recentlySpoken) { Talk(ANGER_SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); + me->m_Events.AddEventAtOffset([&] { + _recentlySpoken = false; + }, 6s); } } @@ -539,11 +525,28 @@ public: void JustEngagedWith(Unit* /*who*/) override { Talk(ANGER_SAY_FREED); - me->CastSpell(me, SPELL_AURA_OF_ANGER, true); + DoCastSelf(SPELL_AURA_OF_ANGER, true); - events.ScheduleEvent(EVENT_ANGER_SPITE, 15000); - events.ScheduleEvent(EVENT_ANGER_SOUL_SCREAM, 10000); - events.ScheduleEvent(EVENT_ANGER_SEETHE, 1000); + ScheduleTimedEvent(15s, [&] { + if (roll_chance_i(30)) + Talk(ANGER_SAY_SPEC); + me->CastCustomSpell(SPELL_SPITE, SPELLVALUE_MAX_TARGETS, 3, me, false); + }, 25s); + + ScheduleTimedEvent(10s, [&] { + DoCastVictim(SPELL_SOUL_SCREAM); + }, 10s); + + ScheduleTimedEvent(1s, [&] { + if (Unit* victim = me->GetVictim()) + { + ObjectGuid victimGUID = victim->GetGUID(); + if (targetGUID && targetGUID != victimGUID) + DoCastSelf(SPELL_SEETHE); + // victim can be lost + targetGUID = victimGUID; + } + }, 1s); } void UpdateAI(uint32 diff) override @@ -551,37 +554,15 @@ public: if (!UpdateVictim()) return; - events.Update(diff); + scheduler.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) - { - case EVENT_ANGER_SPITE: - if (roll_chance_i(30)) - Talk(ANGER_SAY_SPEC); - me->CastCustomSpell(SPELL_SPITE, SPELLVALUE_MAX_TARGETS, 3, me, false); - events.ScheduleEvent(EVENT_ANGER_SPITE, 25000); - break; - case EVENT_ANGER_SOUL_SCREAM: - me->CastSpell(me->GetVictim(), SPELL_SOUL_SCREAM, false); - events.ScheduleEvent(EVENT_ANGER_SOUL_SCREAM, 10000); - break; - case EVENT_ANGER_SEETHE: - if (Unit* victim = me->GetVictim()) - { - ObjectGuid victimGUID = victim->GetGUID(); - if (targetGUID && targetGUID != victimGUID) - me->CastSpell(me, SPELL_SEETHE, false); - // victim can be lost - targetGUID = victimGUID; - } - events.ScheduleEvent(EVENT_ANGER_SEETHE, 1000); - break; - } - DoMeleeAttackIfReady(); } + + private: + bool _recentlySpoken; }; }; From a1e9dfce41dbe75586ed9bf4a233e9122085893d Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 30 Jul 2024 22:53:11 +0200 Subject: [PATCH 18/24] fix(Core/World): Crash on SendWorldText(Optional) (#19531) * fix(Core/World): Crash on SendWorldText(Optional) * WorldText should be sent to all sessions * now it works --- src/server/game/Chat/Chat.cpp | 58 +++++++++++++---------------------- src/server/game/Chat/Chat.h | 49 ++++++++++++++++++++++++++--- 2 files changed, 67 insertions(+), 40 deletions(-) diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 1cc245c3e..9cd64c8a1 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -102,50 +102,36 @@ bool ChatHandler::HasLowerSecurityAccount(WorldSession* target, uint32 target_ac void ChatHandler::SendWorldText(std::string_view str) { std::vector lines = Acore::Tokenize(str, '\n', true); - for (SessionMap::const_iterator itr = sWorld->GetAllSessions().begin(); itr != sWorld->GetAllSessions().end(); ++itr) + + Player* player = m_session->GetPlayer(); + if (!player || !player->IsInWorld()) + return; + + for (std::string_view line : lines) { - WorldSession* session = itr->second; - if (!session) - continue; - - // Player should be in world - Player* player = session->GetPlayer(); - if (!player || !player->IsInWorld()) - continue; - - for (std::string_view line : lines) - { - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); - player->SendDirectMessage(&data); - } + WorldPacket data; + ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); + player->SendDirectMessage(&data); } } void ChatHandler::SendWorldTextOptional(std::string_view str, uint32 flag) { std::vector lines = Acore::Tokenize(str, '\n', true); - for (SessionMap::const_iterator itr = sWorld->GetAllSessions().begin(); itr != sWorld->GetAllSessions().end(); ++itr) + + Player* player = m_session->GetPlayer(); + if (!player || !player->IsInWorld()) + return; + + if (sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED)) + if (player->GetPlayerSetting(AzerothcorePSSource, SETTING_ANNOUNCER_FLAGS).HasFlag(flag)) + return; + + for (std::string_view line : lines) { - WorldSession* session = itr->second; - if (!session) - continue; - - // Player should be in world - Player* player = session->GetPlayer(); - if (!player || !player->IsInWorld()) - continue; - - if (sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED)) - if (player->GetPlayerSetting(AzerothcorePSSource, SETTING_ANNOUNCER_FLAGS).HasFlag(flag)) - continue; - - for (std::string_view line : lines) - { - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); - player->SendDirectMessage(&data); - } + WorldPacket data; + ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); + player->SendDirectMessage(&data); } } diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index eb0d7256e..17642a46d 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -20,6 +20,7 @@ #include "ChatCommand.h" #include "Errors.h" +#include "Player.h" #include "SharedDefines.h" #include "WorldSession.h" #include @@ -54,24 +55,64 @@ public: template void SendWorldText(uint32 strId, Args&&... args) { - SendWorldText(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...)); + // WorldText should be sent to all sessions + SessionMap::const_iterator itr; + for (itr = sWorld->GetAllSessions().begin(); itr != sWorld->GetAllSessions().end(); ++itr) + { + Player* player = itr->second->GetPlayer(); + if (player && player->IsInWorld()) + { + m_session = player->GetSession(); + SendWorldText(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...)); + } + } } template void SendWorldText(char const* fmt, Args&&... args) { - SendWorldText(Acore::StringFormatFmt(fmt, std::forward(args)...)); + // WorldTextOptional should be sent to all sessions + SessionMap::const_iterator itr; + for (itr = sWorld->GetAllSessions().begin(); itr != sWorld->GetAllSessions().end(); ++itr) + { + Player* player = itr->second->GetPlayer(); + if (player && player->IsInWorld()) + { + m_session = player->GetSession(); + SendWorldText(Acore::StringFormatFmt(fmt, std::forward(args)...)); + } + } } void SendWorldTextOptional(std::string_view str, uint32 flag); template void SendWorldTextOptional(uint32 strId, uint32 flag, Args&&... args) { - SendWorldTextOptional(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...), flag); + // WorldTextOptional should be sent to all sessions + SessionMap::const_iterator itr; + for (itr = sWorld->GetAllSessions().begin(); itr != sWorld->GetAllSessions().end(); ++itr) + { + Player* player = itr->second->GetPlayer(); + if (player && player->IsInWorld()) + { + m_session = player->GetSession(); + SendWorldTextOptional(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...), flag); + } + } } template void SendWorldTextOptional(char const* fmt, uint32 flag, Args&&... args) { - SendWorldTextOptional(Acore::StringFormatFmt(fmt, std::forward(args)...), flag); + // WorldTextOptional should be sent to all sessions + SessionMap::const_iterator itr; + for (itr = sWorld->GetAllSessions().begin(); itr != sWorld->GetAllSessions().end(); ++itr) + { + Player* player = itr->second->GetPlayer(); + if (player && player->IsInWorld()) + { + m_session = player->GetSession(); + SendWorldTextOptional(Acore::StringFormatFmt(fmt, std::forward(args)...), flag); + } + } } // function with different implementation for chat/console From 203087f5e70c229322868565a6e8e72b4033c683 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 30 Jul 2024 18:28:25 -0300 Subject: [PATCH 19/24] chore(Scripts/BlackTemple): Move Gurtogg Bloodboil to TaskScheduler (#19532) * Update boss_bloodboil.cpp * Update boss_bloodboil.cpp --- .../Outland/BlackTemple/boss_bloodboil.cpp | 135 ++++++++---------- 1 file changed, 62 insertions(+), 73 deletions(-) diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp index 4fb630a65..1726beedd 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp @@ -60,15 +60,7 @@ enum Spells enum Misc { - EVENT_SPELL_BLOOD_BOIL = 1, - EVENT_SPELL_BEWILDERING_STRIKE = 2, - EVENT_SPELL_FEL_ACID_BREATH = 3, - EVENT_SPELL_EJECT = 4, - EVENT_SPELL_ARCING_SMASH = 5, - EVENT_SPELL_CHARGE = 6, - EVENT_SPELL_BERSERK = 7, - EVENT_SPELL_FEL_GEYSER = 8, - EVENT_KILL_TALK = 9, + EVENT_SPELL_BERSERK = 1, GROUP_DELAY = 1 }; @@ -85,13 +77,12 @@ public: struct boss_gurtogg_bloodboilAI : public BossAI { - boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL) - { - } + boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL), _recentlySpoken(false) { } void Reset() override { BossAI::Reset(); + _recentlySpoken = false; } void JustEngagedWith(Unit* who) override @@ -99,22 +90,67 @@ public: BossAI::JustEngagedWith(who); Talk(SAY_AGGRO); - me->CastSpell(me, SPELL_ACIDIC_WOUND, true); - events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000); - events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 28000, GROUP_DELAY); - events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 38000); - events.ScheduleEvent(EVENT_SPELL_EJECT, 14000); - events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 5000); - events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 60000); - events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); + DoCastSelf(SPELL_ACIDIC_WOUND, true); + + ScheduleTimedEvent(10s, [&] { + me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false); + }, 10s); + + ScheduleTimedEvent(38s, [&] { + DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1); + }, 30s); + + ScheduleTimedEvent(14s, [&] { + DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1); + }, 20s); + + ScheduleTimedEvent(5s, [&] { + DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1); + }, 15s); + + ScheduleTimedEvent(1min, [&] { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true)) + { + me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT); + DoCastSelf(SPELL_FEL_RAGE_SELF, true); + DoCast(target, SPELL_FEL_RAGE_TARGET, true); + DoCast(target, SPELL_FEL_RAGE_2, true); + DoCast(target, SPELL_FEL_RAGE_3, true); + DoCast(target, SPELL_FEL_RAGE_SIZE, true); + target->CastSpell(me, SPELL_TAUNT_GURTOGG, true); + + DoCast(target, SPELL_FEL_GEYSER_SUMMON, true); + DoCastSelf(SPELL_FEL_GEYSER_STUN, true); + DoCastSelf(SPELL_INSIGNIFICANCE, true); + + me->m_Events.AddEventAtOffset([&] { + DoCastVictim(SPELL_CHARGE); + }, 2s); + + scheduler.DelayGroup(GROUP_DELAY, 30s); + } + }, 90s); + + ScheduleUniqueTimedEvent(10min, [&] { + Talk(SAY_ENRAGE); + DoCastSelf(SPELL_BERSERK, true); + }, EVENT_SPELL_BERSERK); + + scheduler.Schedule(28s, [this](TaskContext context) { + context.SetGroup(GROUP_DELAY); + DoCastVictim(SPELL_BEWILDERING_STRIKE); + context.Repeat(30s); + }); } void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!_recentlySpoken) { Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); + me->m_Events.AddEventAtOffset([&] { + _recentlySpoken = false; + }, 6s); } } @@ -135,60 +171,10 @@ public: if (!UpdateVictim()) return; - events.Update(diff); + scheduler.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_BERSERK: - Talk(SAY_ENRAGE); - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_SPELL_BLOOD_BOIL: - me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false); - events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000); - break; - case EVENT_SPELL_BEWILDERING_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_BEWILDERING_STRIKE, false); - events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 30000, GROUP_DELAY); - break; - case EVENT_SPELL_FEL_ACID_BREATH: - me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1, false); - events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 30000); - break; - case EVENT_SPELL_EJECT: - me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1, false); - events.ScheduleEvent(EVENT_SPELL_EJECT, 20000); - break; - case EVENT_SPELL_ARCING_SMASH: - me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1, false); - events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 15000); - break; - case EVENT_SPELL_FEL_GEYSER: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true)) - { - me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT); - me->CastSpell(me, SPELL_FEL_RAGE_SELF, true); - me->CastSpell(target, SPELL_FEL_RAGE_TARGET, true); - me->CastSpell(target, SPELL_FEL_RAGE_2, true); - me->CastSpell(target, SPELL_FEL_RAGE_3, true); - me->CastSpell(target, SPELL_FEL_RAGE_SIZE, true); - target->CastSpell(me, SPELL_TAUNT_GURTOGG, true); - - me->CastSpell(target, SPELL_FEL_GEYSER_SUMMON, true); - me->CastSpell(me, SPELL_FEL_GEYSER_STUN, true); - me->CastSpell(me, SPELL_INSIGNIFICANCE, true); - events.ScheduleEvent(EVENT_SPELL_CHARGE, 2000); - events.DelayEvents(30000, GROUP_DELAY); - } - events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 90000); - break; - case EVENT_SPELL_CHARGE: - me->CastSpell(me->GetVictim(), SPELL_CHARGE, true); - break; - } - DoMeleeAttackIfReady(); } @@ -196,6 +182,9 @@ public: { return me->GetHomePosition().GetExactDist2d(me) > 105.0f; } + + private: + bool _recentlySpoken; }; }; From 06a608d244cf24d5077cbcdf547993d2a0e30659 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Tue, 30 Jul 2024 19:06:07 -0400 Subject: [PATCH 20/24] fix(Core/GroupHandler): Remove bad party invite check. (#19530) Init. --- src/server/game/Handlers/GroupHandler.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 7bea72443..43b8d5c6f 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -111,12 +111,6 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData) SendPartyResult(PARTY_OP_INVITE, membername, ERR_TARGET_NOT_IN_INSTANCE_S); return; } - // just ignore us - if (invitedPlayer->GetInstanceId() != 0 && invitedPlayer->GetDungeonDifficulty() != invitingPlayer->GetDungeonDifficulty()) - { - SendPartyResult(PARTY_OP_INVITE, membername, ERR_IGNORING_YOU_S); - return; - } if (invitedPlayer->GetSocial()->HasIgnore(invitingPlayer->GetGUID())) { From 02a05fbd4c640b33b1e03075681f169db2fb6ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Wed, 31 Jul 2024 01:06:46 +0200 Subject: [PATCH 21/24] refactor(src/common): remove unused imports (#19506) * refactor(src/common): remove unused imports * fix: build * chore: fix build * chore: size_t -> std::size_t * chore: fix fuckup from previous commit * chore: fix build * chore: fix build * chore: fix build * chore: fix build with std::size_t * chore: fix build * chore: fix build * chore: fix build * chore: fix build * chore: fix build * chore: fix build * chore: fix build * chore: fix build * chore: fix build * chore: fix build * chore: fix build * chore: fix build --- src/common/Asio/AsioHacksFwd.h | 2 - src/common/Asio/Resolver.h | 1 - src/common/Collision/DynamicTree.cpp | 2 +- src/common/Collision/Management/IMMAPMgr.h | 3 - .../Collision/Management/MMapFactory.cpp | 2 - src/common/Collision/Management/MMapFactory.h | 4 - src/common/Collision/Management/MMapMgr.cpp | 2 +- src/common/Collision/Management/MMapMgr.h | 3 +- src/common/Collision/Management/VMapFactory.h | 2 - src/common/Collision/Management/VMapMgr2.h | 1 - src/common/Collision/Models/WorldModel.h | 1 - src/common/Collision/RegularGrid.h | 1 - src/common/Collision/VMapDefinitions.h | 1 - src/common/Collision/VMapTools.h | 1 - src/common/Common.h | 3 - src/common/Configuration/Config.cpp | 14 +-- src/common/Configuration/Config.h | 1 - src/common/Cryptography/AES.cpp | 2 +- src/common/Cryptography/AES.h | 8 +- src/common/Cryptography/ARC4.cpp | 4 +- src/common/Cryptography/ARC4.h | 4 +- .../Cryptography/Authentication/AuthCrypt.cpp | 4 +- .../Cryptography/Authentication/AuthCrypt.h | 4 +- .../Cryptography/Authentication/AuthDefines.h | 2 +- .../Cryptography/Authentication/SRP6.cpp | 6 +- src/common/Cryptography/Authentication/SRP6.h | 6 +- src/common/Cryptography/BigNumber.cpp | 2 +- src/common/Cryptography/BigNumber.h | 4 +- src/common/Cryptography/CryptoConstants.h | 8 +- src/common/Cryptography/CryptoGenerics.h | 2 +- src/common/Cryptography/CryptoHash.h | 8 +- src/common/Cryptography/CryptoRandom.cpp | 2 +- src/common/Cryptography/CryptoRandom.h | 4 +- src/common/Cryptography/HMAC.h | 12 +-- src/common/Cryptography/OpenSSLCrypto.cpp | 1 - src/common/Cryptography/SessionKeyGenerator.h | 7 +- src/common/Cryptography/TOTP.h | 2 +- src/common/DataStores/DBCFileLoader.cpp | 2 +- src/common/DataStores/DBCFileLoader.h | 14 +-- .../Debugging/WheatyExceptionReport.cpp | 10 +-- src/common/Debugging/WheatyExceptionReport.h | 2 +- src/common/Define.h | 1 - src/common/Dynamic/FactoryHolder.h | 1 - src/common/Dynamic/ObjectRegistry.h | 3 - src/common/Dynamic/TypeContainer.h | 4 +- src/common/Dynamic/TypeContainerFunctions.h | 13 ++- .../Dynamic/TypeContainerFunctionsPtr.h | 10 +-- src/common/Dynamic/TypeContainerVisitor.h | 1 - src/common/Logging/Appender.h | 1 - src/common/Logging/AppenderConsole.h | 1 + src/common/Logging/AppenderFile.cpp | 2 +- src/common/Logging/AppenderFile.h | 1 + src/common/Logging/Log.cpp | 4 +- src/common/Logging/Log.h | 1 - src/common/Logging/LogOperation.h | 1 - .../Logging/enuminfo_AppenderConsole.cpp | 6 +- src/common/Logging/enuminfo_LogCommon.cpp | 18 ++-- src/common/Metric/Metric.h | 2 - src/common/Threading/MPSCQueue.h | 2 - src/common/Threading/PCQueue.h | 5 +- src/common/Threading/ThreadingModel.h | 2 - src/common/Utilities/AsyncCallbackProcessor.h | 1 - src/common/Utilities/ByteConverter.h | 2 +- src/common/Utilities/CircularBuffer.h | 14 +-- src/common/Utilities/Containers.h | 6 +- src/common/Utilities/EventProcessor.h | 1 - src/common/Utilities/Geometry.h | 2 - src/common/Utilities/IteratorPair.h | 1 - src/common/Utilities/MathUtil.h | 2 +- src/common/Utilities/Physics.h | 3 - src/common/Utilities/Random.cpp | 2 +- src/common/Utilities/Random.h | 2 +- src/common/Utilities/SFMTRand.cpp | 10 +-- src/common/Utilities/SFMTRand.h | 8 +- src/common/Utilities/SmartEnum.h | 12 +-- src/common/Utilities/StartProcess.h | 1 - src/common/Utilities/StringConvert.h | 2 +- src/common/Utilities/TaskScheduler.cpp | 2 +- src/common/Utilities/TaskScheduler.h | 5 +- src/common/Utilities/Tokenize.cpp | 4 +- src/common/Utilities/Tokenize.h | 1 - src/common/Utilities/Tuples.h | 2 +- src/common/Utilities/Util.cpp | 24 ++--- src/common/Utilities/Util.h | 20 ++--- .../apps/authserver/Server/AuthSession.cpp | 2 +- .../apps/authserver/Server/AuthSession.h | 2 +- .../worldserver/CommandLine/CliRunnable.cpp | 2 +- .../worldserver/RemoteAccess/RASession.cpp | 4 +- .../apps/worldserver/RemoteAccess/RASession.h | 2 +- .../database/Database/DatabaseWorkerPool.cpp | 6 +- .../database/Database/DatabaseWorkerPool.h | 2 +- src/server/database/Database/Field.cpp | 2 +- src/server/database/Database/Field.h | 4 +- .../database/Database/MySQLConnection.cpp | 2 +- .../database/Database/MySQLConnection.h | 2 +- .../Database/MySQLPreparedStatement.cpp | 2 +- src/server/database/Database/QueryHolder.cpp | 10 +-- src/server/database/Database/QueryHolder.h | 10 +-- src/server/database/Logging/AppenderDB.cpp | 1 + src/server/database/Logging/AppenderDB.h | 1 + src/server/database/Updater/UpdateFetcher.cpp | 8 +- src/server/database/Updater/UpdateFetcher.h | 8 +- .../game/AI/SmartScripts/SmartScriptMgr.cpp | 30 +++---- src/server/game/AI/enuminfo_CreatureAI.cpp | 6 +- .../game/ArenaSpectator/ArenaSpectator.cpp | 2 +- src/server/game/Battlegrounds/ArenaTeam.h | 2 +- .../game/Battlegrounds/BattlegroundMgr.cpp | 2 +- .../game/Battlegrounds/enuminfo_ArenaTeam.cpp | 6 +- src/server/game/Calendar/CalendarMgr.cpp | 2 +- src/server/game/Chat/Channels/Channel.cpp | 2 +- .../game/Chat/Channels/enuminfo_Channel.cpp | 6 +- src/server/game/Chat/Chat.cpp | 10 +-- src/server/game/Chat/Chat.h | 4 +- .../game/Chat/ChatCommands/ChatCommand.cpp | 2 +- .../game/Chat/ChatCommands/ChatCommand.h | 8 +- .../game/Chat/ChatCommands/ChatCommandArgs.h | 6 +- .../Chat/ChatCommands/ChatCommandHelpers.h | 4 +- .../Chat/ChatCommands/ChatCommandTags.cpp | 2 +- .../game/Chat/ChatCommands/ChatCommandTags.h | 10 +-- src/server/game/Chat/HyperlinkTags.cpp | 2 +- src/server/game/Chat/Hyperlinks.cpp | 6 +- .../game/Entities/Creature/GossipDef.cpp | 2 +- .../Creature/enuminfo_CreatureData.cpp | 6 +- src/server/game/Entities/Item/Item.cpp | 6 +- .../game/Entities/Item/enuminfo_Item.cpp | 18 ++-- src/server/game/Entities/Object/Object.h | 1 + src/server/game/Entities/Object/ObjectGuid.h | 2 +- src/server/game/Entities/Player/Player.cpp | 20 ++--- src/server/game/Entities/Player/Player.h | 2 +- .../game/Entities/Player/PlayerStorage.cpp | 4 +- .../game/Entities/Player/PlayerTaxi.cpp | 4 +- .../game/Entities/Player/PlayerUpdates.cpp | 6 +- src/server/game/Entities/Player/SocialMgr.cpp | 2 +- src/server/game/Entities/Unit/Unit.cpp | 2 +- .../game/Entities/Unit/enuminfo_Unit.cpp | 12 +-- src/server/game/Globals/ObjectMgr.cpp | 10 +-- src/server/game/Globals/ObjectMgr.h | 8 +- .../game/Grids/Notifiers/GridNotifiers.h | 6 +- .../game/Grids/Notifiers/GridNotifiersImpl.h | 2 +- src/server/game/Handlers/GroupHandler.cpp | 2 +- src/server/game/Handlers/ItemHandler.cpp | 2 +- src/server/game/Handlers/MailHandler.cpp | 2 +- src/server/game/Handlers/NPCHandler.cpp | 4 +- src/server/game/Handlers/QueryHandler.cpp | 8 +- src/server/game/Handlers/QuestHandler.cpp | 2 +- src/server/game/Loot/LootMgr.cpp | 4 +- src/server/game/Maps/Map.h | 2 +- src/server/game/Maps/MapUpdater.cpp | 4 +- src/server/game/Maps/MapUpdater.h | 4 +- src/server/game/Maps/TransportMgr.cpp | 22 ++--- src/server/game/Movement/MotionMaster.cpp | 2 +- .../MovementGenerators/PathGenerator.cpp | 2 +- .../WaypointMovementGenerator.cpp | 2 +- .../game/Movement/Spline/MoveSplineInitArgs.h | 2 +- src/server/game/Pools/PoolMgr.cpp | 4 +- src/server/game/Quests/enuminfo_QuestDef.cpp | 12 +-- src/server/game/Reputation/ReputationMgr.cpp | 2 +- src/server/game/Scripting/ScriptMgr.h | 4 +- src/server/game/Server/Packet.cpp | 2 +- src/server/game/Server/Packet.h | 4 +- src/server/game/Server/WorldPacket.h | 4 +- src/server/game/Server/WorldSession.cpp | 3 +- src/server/game/Server/WorldSession.h | 2 +- src/server/game/Spells/Spell.cpp | 4 +- src/server/game/Texts/ChatTextBuilder.cpp | 4 +- src/server/game/Texts/ChatTextBuilder.h | 2 +- src/server/game/Texts/CreatureTextMgr.cpp | 4 +- src/server/game/Texts/CreatureTextMgr.h | 8 +- src/server/game/Tickets/TicketMgr.cpp | 4 +- src/server/game/Tools/PlayerDump.cpp | 8 +- src/server/game/Warden/Warden.cpp | 2 +- src/server/game/Warden/WardenMac.cpp | 1 + src/server/game/Warden/WardenPayloadMgr.cpp | 2 +- .../game/Warden/enuminfo_WardenCheckMgr.cpp | 6 +- src/server/scripts/Commands/cs_account.cpp | 2 +- .../boss_professor_putricide.cpp | 2 +- src/server/shared/DataStores/DBCStore.h | 2 +- src/server/shared/DataStores/DBCStructure.h | 2 +- src/server/shared/Network/NetworkThread.h | 2 +- src/server/shared/Network/Socket.h | 4 +- src/server/shared/Packets/ByteBuffer.cpp | 10 +-- src/server/shared/Packets/ByteBuffer.h | 46 +++++----- src/server/shared/Realms/Realm.h | 1 + src/server/shared/SharedDefines.h | 2 +- src/server/shared/enuminfo_SharedDefines.cpp | 90 +++++++++---------- src/test/common/Configuration/Config.cpp | 1 + src/tools/map_extractor/System.cpp | 14 +-- src/tools/map_extractor/dbcfile.cpp | 10 +-- src/tools/map_extractor/dbcfile.h | 26 +++--- src/tools/map_extractor/mpq_libmpq.cpp | 6 +- src/tools/map_extractor/mpq_libmpq04.h | 6 +- src/tools/vmap4_extractor/adtfile.cpp | 12 +-- src/tools/vmap4_extractor/adtfile.h | 6 +- src/tools/vmap4_extractor/dbcfile.cpp | 2 +- src/tools/vmap4_extractor/dbcfile.h | 26 +++--- src/tools/vmap4_extractor/mpq_libmpq.cpp | 6 +- src/tools/vmap4_extractor/mpq_libmpq04.h | 6 +- src/tools/vmap4_extractor/vmapexport.cpp | 2 +- src/tools/vmap4_extractor/wdtfile.cpp | 2 +- src/tools/vmap4_extractor/wmo.cpp | 4 +- 200 files changed, 522 insertions(+), 581 deletions(-) diff --git a/src/common/Asio/AsioHacksFwd.h b/src/common/Asio/AsioHacksFwd.h index fa49b351d..8746a92fd 100644 --- a/src/common/Asio/AsioHacksFwd.h +++ b/src/common/Asio/AsioHacksFwd.h @@ -18,8 +18,6 @@ #ifndef AsioHacksFwd_h__ #define AsioHacksFwd_h__ -#include - /** Collection of forward declarations to improve compile time */ diff --git a/src/common/Asio/Resolver.h b/src/common/Asio/Resolver.h index 45b3c5b79..a49b8fcda 100644 --- a/src/common/Asio/Resolver.h +++ b/src/common/Asio/Resolver.h @@ -18,7 +18,6 @@ #ifndef Resolver_h__ #define Resolver_h__ -#include "IoContext.h" #include "Optional.h" #include #include diff --git a/src/common/Collision/DynamicTree.cpp b/src/common/Collision/DynamicTree.cpp index e7538a32a..aef80fa91 100644 --- a/src/common/Collision/DynamicTree.cpp +++ b/src/common/Collision/DynamicTree.cpp @@ -40,7 +40,7 @@ namespace template<> struct HashTrait< GameObjectModel> { - static size_t hashCode(const GameObjectModel& g) { return (size_t)(void*)&g; } + static std::size_t hashCode(const GameObjectModel& g) { return (size_t)(void*)&g; } }; template<> struct PositionTrait< GameObjectModel> diff --git a/src/common/Collision/Management/IMMAPMgr.h b/src/common/Collision/Management/IMMAPMgr.h index 7ffb7d10e..e68f0ff48 100644 --- a/src/common/Collision/Management/IMMAPMgr.h +++ b/src/common/Collision/Management/IMMAPMgr.h @@ -18,9 +18,6 @@ #ifndef _IMMAPMANAGER_H #define _IMMAPMANAGER_H -#include "Define.h" -#include - // Interface for IMMapManger namespace MMAP { diff --git a/src/common/Collision/Management/MMapFactory.cpp b/src/common/Collision/Management/MMapFactory.cpp index af0a46cab..70a57726d 100644 --- a/src/common/Collision/Management/MMapFactory.cpp +++ b/src/common/Collision/Management/MMapFactory.cpp @@ -17,8 +17,6 @@ #include "MMapFactory.h" #include -#include - namespace MMAP { // ######################## MMapFactory ######################## diff --git a/src/common/Collision/Management/MMapFactory.h b/src/common/Collision/Management/MMapFactory.h index 61c601080..08136b6fc 100644 --- a/src/common/Collision/Management/MMapFactory.h +++ b/src/common/Collision/Management/MMapFactory.h @@ -18,11 +18,7 @@ #ifndef _MMAP_FACTORY_H #define _MMAP_FACTORY_H -#include "DetourAlloc.h" -#include "DetourExtended.h" -#include "DetourNavMesh.h" #include "MMapMgr.h" -#include namespace MMAP { diff --git a/src/common/Collision/Management/MMapMgr.cpp b/src/common/Collision/Management/MMapMgr.cpp index 622220c5a..bb6791057 100644 --- a/src/common/Collision/Management/MMapMgr.cpp +++ b/src/common/Collision/Management/MMapMgr.cpp @@ -174,7 +174,7 @@ namespace MMAP unsigned char* data = (unsigned char*)dtAlloc(fileHeader.size, DT_ALLOC_PERM); ASSERT(data); - size_t result = fread(data, fileHeader.size, 1, file); + std::size_t result = fread(data, fileHeader.size, 1, file); if (!result) { LOG_ERROR("maps", "MMAP:loadMap: Bad header or data in mmap {:03}{:02}{:02}.mmtile", mapId, x, y); diff --git a/src/common/Collision/Management/MMapMgr.h b/src/common/Collision/Management/MMapMgr.h index d6ca2c44c..013f34292 100644 --- a/src/common/Collision/Management/MMapMgr.h +++ b/src/common/Collision/Management/MMapMgr.h @@ -22,12 +22,11 @@ #include "DetourAlloc.h" #include "DetourExtended.h" #include "DetourNavMesh.h" -#include #include #include // memory management -inline void* dtCustomAlloc(size_t size, dtAllocHint /*hint*/) +inline void* dtCustomAlloc(std::size_t size, dtAllocHint /*hint*/) { return (void*)new unsigned char[size]; } diff --git a/src/common/Collision/Management/VMapFactory.h b/src/common/Collision/Management/VMapFactory.h index 512ccb252..aa6ebd4ee 100644 --- a/src/common/Collision/Management/VMapFactory.h +++ b/src/common/Collision/Management/VMapFactory.h @@ -18,8 +18,6 @@ #ifndef _VMAPFACTORY_H #define _VMAPFACTORY_H -#include "IVMapMgr.h" - // This is the access point to the VMapMgr. namespace VMAP { diff --git a/src/common/Collision/Management/VMapMgr2.h b/src/common/Collision/Management/VMapMgr2.h index 4c37a95b4..f025c8086 100644 --- a/src/common/Collision/Management/VMapMgr2.h +++ b/src/common/Collision/Management/VMapMgr2.h @@ -18,7 +18,6 @@ #ifndef _VMAPMANAGER2_H #define _VMAPMANAGER2_H -#include "Common.h" #include "IVMapMgr.h" #include #include diff --git a/src/common/Collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h index b1a268318..df1bd4751 100644 --- a/src/common/Collision/Models/WorldModel.h +++ b/src/common/Collision/Models/WorldModel.h @@ -21,7 +21,6 @@ #include "BoundingIntervalHierarchy.h" #include "Define.h" #include -#include #include #include diff --git a/src/common/Collision/RegularGrid.h b/src/common/Collision/RegularGrid.h index 7de66a39a..1a24c4258 100644 --- a/src/common/Collision/RegularGrid.h +++ b/src/common/Collision/RegularGrid.h @@ -1,7 +1,6 @@ #ifndef _REGULAR_GRID_H #define _REGULAR_GRID_H -#include #include #include #include diff --git a/src/common/Collision/VMapDefinitions.h b/src/common/Collision/VMapDefinitions.h index c2094a722..eee744fe4 100644 --- a/src/common/Collision/VMapDefinitions.h +++ b/src/common/Collision/VMapDefinitions.h @@ -17,7 +17,6 @@ #ifndef _VMAPDEFINITIONS_H #define _VMAPDEFINITIONS_H -#include #define LIQUID_TILE_SIZE (533.333f / 128.f) diff --git a/src/common/Collision/VMapTools.h b/src/common/Collision/VMapTools.h index 42350df67..f200e3647 100644 --- a/src/common/Collision/VMapTools.h +++ b/src/common/Collision/VMapTools.h @@ -18,7 +18,6 @@ #ifndef _VMAPTOOLS_H #define _VMAPTOOLS_H -#include "Define.h" #include #include diff --git a/src/common/Common.h b/src/common/Common.h index 5f1267199..cd50104c8 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -19,10 +19,7 @@ #define AZEROTHCORE_COMMON_H #include "Define.h" -#include -#include #include -#include #if AC_PLATFORM == AC_PLATFORM_WINDOWS #include diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp index 0cd69584d..2261c14b1 100644 --- a/src/common/Configuration/Config.cpp +++ b/src/common/Configuration/Config.cpp @@ -46,9 +46,9 @@ namespace // Check system configs like *server.conf* bool IsAppConfig(std::string_view fileName) { - size_t foundAuth = fileName.find("authserver.conf"); - size_t foundWorld = fileName.find("worldserver.conf"); - size_t foundImport = fileName.find("dbimport.conf"); + std::size_t foundAuth = fileName.find("authserver.conf"); + std::size_t foundWorld = fileName.find("worldserver.conf"); + std::size_t foundImport = fileName.find("dbimport.conf"); return foundAuth != std::string_view::npos || foundWorld != std::string_view::npos || foundImport != std::string_view::npos; } @@ -56,8 +56,8 @@ namespace // Check logging system configs like Appender.* and Logger.* bool IsLoggingSystemOptions(std::string_view optionName) { - size_t foundAppender = optionName.find("Appender."); - size_t foundLogger = optionName.find("Logger."); + std::size_t foundAppender = optionName.find("Appender."); + std::size_t foundLogger = optionName.find("Logger."); return foundAppender != std::string_view::npos || foundLogger != std::string_view::npos; } @@ -223,7 +223,7 @@ namespace std::string result; const char* str = key.c_str(); - size_t n = key.length(); + std::size_t n = key.length(); char curr; bool isEnd; @@ -231,7 +231,7 @@ namespace bool currIsNumeric; bool nextIsNumeric; - for (size_t i = 0; i < n; ++i) + for (std::size_t i = 0; i < n; ++i) { curr = str[i]; if (curr == ' ' || curr == '.' || curr == '-') diff --git a/src/common/Configuration/Config.h b/src/common/Configuration/Config.h index c7708290e..ccb35132d 100644 --- a/src/common/Configuration/Config.h +++ b/src/common/Configuration/Config.h @@ -18,7 +18,6 @@ #ifndef CONFIG_H #define CONFIG_H -#include "Define.h" #include #include #include diff --git a/src/common/Cryptography/AES.cpp b/src/common/Cryptography/AES.cpp index 31e084700..f4061cdcb 100644 --- a/src/common/Cryptography/AES.cpp +++ b/src/common/Cryptography/AES.cpp @@ -37,7 +37,7 @@ void Acore::Crypto::AES::Init(Key const& key) ASSERT(status); } -bool Acore::Crypto::AES::Process(IV const& iv, uint8* data, size_t length, Tag& tag) +bool Acore::Crypto::AES::Process(IV const& iv, uint8* data, std::size_t length, Tag& tag) { ASSERT(length <= static_cast(std::numeric_limits::max())); int len = static_cast(length); diff --git a/src/common/Cryptography/AES.h b/src/common/Cryptography/AES.h index c73aeebea..c49f18183 100644 --- a/src/common/Cryptography/AES.h +++ b/src/common/Cryptography/AES.h @@ -27,9 +27,9 @@ namespace Acore::Crypto class AC_COMMON_API AES { public: - static constexpr size_t IV_SIZE_BYTES = 12; - static constexpr size_t KEY_SIZE_BYTES = 16; - static constexpr size_t TAG_SIZE_BYTES = 12; + static constexpr std::size_t IV_SIZE_BYTES = 12; + static constexpr std::size_t KEY_SIZE_BYTES = 16; + static constexpr std::size_t TAG_SIZE_BYTES = 12; using IV = std::array; using Key = std::array; @@ -40,7 +40,7 @@ namespace Acore::Crypto void Init(Key const& key); - bool Process(IV const& iv, uint8* data, size_t length, Tag& tag); + bool Process(IV const& iv, uint8* data, std::size_t length, Tag& tag); private: EVP_CIPHER_CTX* _ctx; diff --git a/src/common/Cryptography/ARC4.cpp b/src/common/Cryptography/ARC4.cpp index 90535f747..10a7ad490 100644 --- a/src/common/Cryptography/ARC4.cpp +++ b/src/common/Cryptography/ARC4.cpp @@ -40,7 +40,7 @@ Acore::Crypto::ARC4::~ARC4() #endif } -void Acore::Crypto::ARC4::Init(uint8 const* seed, size_t len) +void Acore::Crypto::ARC4::Init(uint8 const* seed, std::size_t len) { int result1 = EVP_CIPHER_CTX_set_key_length(_ctx, len); ASSERT(result1 == 1); @@ -48,7 +48,7 @@ void Acore::Crypto::ARC4::Init(uint8 const* seed, size_t len) ASSERT(result2 == 1); } -void Acore::Crypto::ARC4::UpdateData(uint8* data, size_t len) +void Acore::Crypto::ARC4::UpdateData(uint8* data, std::size_t len) { int outlen = 0; int result1 = EVP_EncryptUpdate(_ctx, data, &outlen, data, len); diff --git a/src/common/Cryptography/ARC4.h b/src/common/Cryptography/ARC4.h index f598589a2..7f4f0dc53 100644 --- a/src/common/Cryptography/ARC4.h +++ b/src/common/Cryptography/ARC4.h @@ -30,12 +30,12 @@ namespace Acore::Crypto ARC4(); ~ARC4(); - void Init(uint8 const* seed, size_t len); + void Init(uint8 const* seed, std::size_t len); template void Init(Container const& c) { Init(std::data(c), std::size(c)); } - void UpdateData(uint8* data, size_t len); + void UpdateData(uint8* data, std::size_t len); template void UpdateData(Container& c) { UpdateData(std::data(c), std::size(c)); } diff --git a/src/common/Cryptography/Authentication/AuthCrypt.cpp b/src/common/Cryptography/Authentication/AuthCrypt.cpp index 21115ed15..26084f76a 100644 --- a/src/common/Cryptography/Authentication/AuthCrypt.cpp +++ b/src/common/Cryptography/Authentication/AuthCrypt.cpp @@ -35,13 +35,13 @@ void AuthCrypt::Init(SessionKey const& K) _initialized = true; } -void AuthCrypt::DecryptRecv(uint8* data, size_t len) +void AuthCrypt::DecryptRecv(uint8* data, std::size_t len) { ASSERT(_initialized); _clientDecrypt.UpdateData(data, len); } -void AuthCrypt::EncryptSend(uint8* data, size_t len) +void AuthCrypt::EncryptSend(uint8* data, std::size_t len) { ASSERT(_initialized); _serverEncrypt.UpdateData(data, len); diff --git a/src/common/Cryptography/Authentication/AuthCrypt.h b/src/common/Cryptography/Authentication/AuthCrypt.h index 88239a9e3..3a7ff89df 100644 --- a/src/common/Cryptography/Authentication/AuthCrypt.h +++ b/src/common/Cryptography/Authentication/AuthCrypt.h @@ -27,8 +27,8 @@ public: AuthCrypt() = default; void Init(SessionKey const& K); - void DecryptRecv(uint8* data, size_t len); - void EncryptSend(uint8* data, size_t len); + void DecryptRecv(uint8* data, std::size_t len); + void EncryptSend(uint8* data, std::size_t len); bool IsInitialized() const { return _initialized; } diff --git a/src/common/Cryptography/Authentication/AuthDefines.h b/src/common/Cryptography/Authentication/AuthDefines.h index 85d0dbf49..3de2a02fb 100644 --- a/src/common/Cryptography/Authentication/AuthDefines.h +++ b/src/common/Cryptography/Authentication/AuthDefines.h @@ -21,7 +21,7 @@ #include "Define.h" #include -constexpr size_t SESSION_KEY_LENGTH = 40; +constexpr std::size_t SESSION_KEY_LENGTH = 40; using SessionKey = std::array; #endif diff --git a/src/common/Cryptography/Authentication/SRP6.cpp b/src/common/Cryptography/Authentication/SRP6.cpp index 20e05f5b2..e89ac99a7 100644 --- a/src/common/Cryptography/Authentication/SRP6.cpp +++ b/src/common/Cryptography/Authentication/SRP6.cpp @@ -51,14 +51,14 @@ using SRP6 = Acore::Crypto::SRP6; { // split S into two buffers std::array buf0{}, buf1{}; - for (size_t i = 0; i < EPHEMERAL_KEY_LENGTH / 2; ++i) + for (std::size_t i = 0; i < EPHEMERAL_KEY_LENGTH / 2; ++i) { buf0[i] = S[2 * i + 0]; buf1[i] = S[2 * i + 1]; } // find position of first nonzero byte - size_t p = 0; + std::size_t p = 0; while (p < EPHEMERAL_KEY_LENGTH && !S[p]) ++p; @@ -73,7 +73,7 @@ using SRP6 = Acore::Crypto::SRP6; // stick the two hashes back together SessionKey K; - for (size_t i = 0; i < SHA1::DIGEST_LENGTH; ++i) + for (std::size_t i = 0; i < SHA1::DIGEST_LENGTH; ++i) { K[2 * i + 0] = hash0[i]; K[2 * i + 1] = hash1[i]; diff --git a/src/common/Cryptography/Authentication/SRP6.h b/src/common/Cryptography/Authentication/SRP6.h index 734ef1298..d7f288dc3 100644 --- a/src/common/Cryptography/Authentication/SRP6.h +++ b/src/common/Cryptography/Authentication/SRP6.h @@ -28,13 +28,13 @@ namespace Acore::Crypto class AC_COMMON_API SRP6 { public: - static constexpr size_t SALT_LENGTH = 32; + static constexpr std::size_t SALT_LENGTH = 32; using Salt = std::array; - static constexpr size_t VERIFIER_LENGTH = 32; + static constexpr std::size_t VERIFIER_LENGTH = 32; using Verifier = std::array; - static constexpr size_t EPHEMERAL_KEY_LENGTH = 32; + static constexpr std::size_t EPHEMERAL_KEY_LENGTH = 32; using EphemeralKey = std::array; static std::array const g; diff --git a/src/common/Cryptography/BigNumber.cpp b/src/common/Cryptography/BigNumber.cpp index 1cd8d6a19..decfeecbe 100644 --- a/src/common/Cryptography/BigNumber.cpp +++ b/src/common/Cryptography/BigNumber.cpp @@ -195,7 +195,7 @@ bool BigNumber::IsNegative() const return BN_is_negative(_bn); } -void BigNumber::GetBytes(uint8* buf, size_t bufsize, bool littleEndian) const +void BigNumber::GetBytes(uint8* buf, std::size_t bufsize, bool littleEndian) const { #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x10100000L int nBytes = GetNumBytes(); diff --git a/src/common/Cryptography/BigNumber.h b/src/common/Cryptography/BigNumber.h index 259fa92ed..591da4e67 100644 --- a/src/common/Cryptography/BigNumber.h +++ b/src/common/Cryptography/BigNumber.h @@ -34,7 +34,7 @@ public: BigNumber(int32 v) : BigNumber() { SetDword(v); } BigNumber(std::string const& v) : BigNumber() { SetHexStr(v); } - template + template BigNumber(std::array const& v, bool littleEndian = true) : BigNumber() { SetBinary(v.data(), Size, littleEndian); } ~BigNumber(); @@ -116,7 +116,7 @@ public: [[nodiscard]] uint32 AsDword() const; - void GetBytes(uint8* buf, size_t bufsize, bool littleEndian = true) const; + void GetBytes(uint8* buf, std::size_t bufsize, bool littleEndian = true) const; [[nodiscard]] std::vector ToByteVector(int32 minSize = 0, bool littleEndian = true) const; template diff --git a/src/common/Cryptography/CryptoConstants.h b/src/common/Cryptography/CryptoConstants.h index 3ba8b55d6..7fadc4f36 100644 --- a/src/common/Cryptography/CryptoConstants.h +++ b/src/common/Cryptography/CryptoConstants.h @@ -18,15 +18,13 @@ #ifndef AZEROTHCORE_CRYPTO_CONSTANTS_H #define AZEROTHCORE_CRYPTO_CONSTANTS_H -#include "Define.h" - namespace Acore::Crypto { struct Constants { - static constexpr size_t MD5_DIGEST_LENGTH_BYTES = 16; - static constexpr size_t SHA1_DIGEST_LENGTH_BYTES = 20; - static constexpr size_t SHA256_DIGEST_LENGTH_BYTES = 32; + static constexpr std::size_t MD5_DIGEST_LENGTH_BYTES = 16; + static constexpr std::size_t SHA1_DIGEST_LENGTH_BYTES = 20; + static constexpr std::size_t SHA256_DIGEST_LENGTH_BYTES = 32; }; } diff --git a/src/common/Cryptography/CryptoGenerics.h b/src/common/Cryptography/CryptoGenerics.h index d4b799747..3e84c6b3e 100644 --- a/src/common/Cryptography/CryptoGenerics.h +++ b/src/common/Cryptography/CryptoGenerics.h @@ -47,7 +47,7 @@ namespace Acore::Impl static void SplitFromBack(std::vector& data, Container& tail) { ASSERT(data.size() >= std::size(tail)); - for (size_t i = 1, N = std::size(tail); i <= N; ++i) + for (std::size_t i = 1, N = std::size(tail); i <= N; ++i) { tail[N - i] = data.back(); data.pop_back(); diff --git a/src/common/Cryptography/CryptoHash.h b/src/common/Cryptography/CryptoHash.h index 1763351bc..6b98c5cd5 100644 --- a/src/common/Cryptography/CryptoHash.h +++ b/src/common/Cryptography/CryptoHash.h @@ -43,14 +43,14 @@ namespace Acore::Impl #endif }; - template + template class GenericHash { public: - static constexpr size_t DIGEST_LENGTH = DigestLength; + static constexpr std::size_t DIGEST_LENGTH = DigestLength; using Digest = std::array; - static Digest GetDigestOf(uint8 const* data, size_t len) + static Digest GetDigestOf(uint8 const* data, std::size_t len) { GenericHash hash; hash.UpdateData(data, len); @@ -112,7 +112,7 @@ namespace Acore::Impl return *this; } - void UpdateData(uint8 const* data, size_t len) + void UpdateData(uint8 const* data, std::size_t len) { int result = EVP_DigestUpdate(_ctx, data, len); ASSERT(result == 1); diff --git a/src/common/Cryptography/CryptoRandom.cpp b/src/common/Cryptography/CryptoRandom.cpp index 35d78f744..c44f73eab 100644 --- a/src/common/Cryptography/CryptoRandom.cpp +++ b/src/common/Cryptography/CryptoRandom.cpp @@ -19,7 +19,7 @@ #include "Errors.h" #include -void Acore::Crypto::GetRandomBytes(uint8* buf, size_t len) +void Acore::Crypto::GetRandomBytes(uint8* buf, std::size_t len) { int result = RAND_bytes(buf, len); ASSERT(result == 1, "Not enough randomness in OpenSSL's entropy pool. What in the world are you running on?"); diff --git a/src/common/Cryptography/CryptoRandom.h b/src/common/Cryptography/CryptoRandom.h index 07f87df00..7554735ad 100644 --- a/src/common/Cryptography/CryptoRandom.h +++ b/src/common/Cryptography/CryptoRandom.h @@ -23,7 +23,7 @@ namespace Acore::Crypto { - AC_COMMON_API void GetRandomBytes(uint8* buf, size_t len); + AC_COMMON_API void GetRandomBytes(uint8* buf, std::size_t len); template void GetRandomBytes(Container& c) @@ -31,7 +31,7 @@ namespace Acore::Crypto GetRandomBytes(std::data(c), std::size(c)); } - template + template std::array GetRandomBytes() { std::array arr; diff --git a/src/common/Cryptography/HMAC.h b/src/common/Cryptography/HMAC.h index ebfc1e14b..6830c6131 100644 --- a/src/common/Cryptography/HMAC.h +++ b/src/common/Cryptography/HMAC.h @@ -29,15 +29,15 @@ class BigNumber; namespace Acore::Impl { - template + template class GenericHMAC { public: - static constexpr size_t DIGEST_LENGTH = DigestLength; + static constexpr std::size_t DIGEST_LENGTH = DigestLength; using Digest = std::array; template - static Digest GetDigestOf(Container const& seed, uint8 const* data, size_t len) + static Digest GetDigestOf(Container const& seed, uint8 const* data, std::size_t len) { GenericHMAC hash(seed); hash.UpdateData(data, len); @@ -54,7 +54,7 @@ namespace Acore::Impl return hash.GetDigest(); } - GenericHMAC(uint8 const* seed, size_t len) : _ctx(GenericHashImpl::MakeCTX()), _key(EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, nullptr, seed, len)) + GenericHMAC(uint8 const* seed, std::size_t len) : _ctx(GenericHashImpl::MakeCTX()), _key(EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, nullptr, seed, len)) { int result = EVP_DigestSignInit(_ctx, nullptr, HashCreator(), nullptr, _key); ASSERT(result == 1); @@ -105,7 +105,7 @@ namespace Acore::Impl return *this; } - void UpdateData(uint8 const* data, size_t len) + void UpdateData(uint8 const* data, std::size_t len) { int result = EVP_DigestSignUpdate(_ctx, data, len); ASSERT(result == 1); @@ -120,7 +120,7 @@ namespace Acore::Impl void Finalize() { - size_t length = DIGEST_LENGTH; + std::size_t length = DIGEST_LENGTH; int result = EVP_DigestSignFinal(_ctx, _digest.data(), &length); ASSERT(result == 1); ASSERT(length == DIGEST_LENGTH); diff --git a/src/common/Cryptography/OpenSSLCrypto.cpp b/src/common/Cryptography/OpenSSLCrypto.cpp index 036a94c0e..1a69a0c0f 100644 --- a/src/common/Cryptography/OpenSSLCrypto.cpp +++ b/src/common/Cryptography/OpenSSLCrypto.cpp @@ -16,7 +16,6 @@ */ #include "OpenSSLCrypto.h" -#include "Errors.h" #include // NOTE: this import is NEEDED (even though some IDEs report it as unused) #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1010000fL diff --git a/src/common/Cryptography/SessionKeyGenerator.h b/src/common/Cryptography/SessionKeyGenerator.h index 43dca3f23..bafd9ce01 100644 --- a/src/common/Cryptography/SessionKeyGenerator.h +++ b/src/common/Cryptography/SessionKeyGenerator.h @@ -18,9 +18,6 @@ #ifndef AZEROTHCORE_SESSIONKEYGENERATOR_HPP #define AZEROTHCORE_SESSIONKEYGENERATOR_HPP -#include "CryptoHash.h" -#include - template class SessionKeyGenerator { @@ -30,8 +27,8 @@ public: o0it(o0.begin()) { uint8 const* data = std::data(buf); - size_t const len = std::size(buf); - size_t const halflen = (len / 2); + std::size_t const len = std::size(buf); + std::size_t const halflen = (len / 2); o1 = Hash::GetDigestOf(data, halflen); o2 = Hash::GetDigestOf(data + halflen, len - halflen); diff --git a/src/common/Cryptography/TOTP.h b/src/common/Cryptography/TOTP.h index ddcaf7573..56ddccb6b 100644 --- a/src/common/Cryptography/TOTP.h +++ b/src/common/Cryptography/TOTP.h @@ -26,7 +26,7 @@ namespace Acore::Crypto { struct AC_COMMON_API TOTP { - static constexpr size_t RECOMMENDED_SECRET_LENGTH = 20; + static constexpr std::size_t RECOMMENDED_SECRET_LENGTH = 20; using Secret = std::vector; static uint32 GenerateToken(Secret const& key, time_t timestamp); diff --git a/src/common/DataStores/DBCFileLoader.cpp b/src/common/DataStores/DBCFileLoader.cpp index 80bb213b5..dfabe1630 100644 --- a/src/common/DataStores/DBCFileLoader.cpp +++ b/src/common/DataStores/DBCFileLoader.cpp @@ -120,7 +120,7 @@ DBCFileLoader::~DBCFileLoader() delete[] fieldsOffset; } -DBCFileLoader::Record DBCFileLoader::getRecord(size_t id) +DBCFileLoader::Record DBCFileLoader::getRecord(std::size_t id) { ASSERT(data); return Record(*this, data + id * recordSize); diff --git a/src/common/DataStores/DBCFileLoader.h b/src/common/DataStores/DBCFileLoader.h index c6781d40f..ffe52e9a0 100644 --- a/src/common/DataStores/DBCFileLoader.h +++ b/src/common/DataStores/DBCFileLoader.h @@ -46,7 +46,7 @@ public: class Record { public: - [[nodiscard]] float getFloat(size_t field) const + [[nodiscard]] float getFloat(std::size_t field) const { ASSERT(field < file.fieldCount); float val = *reinterpret_cast(offset + file.GetOffset(field)); @@ -54,7 +54,7 @@ public: return val; } - [[nodiscard]] uint32 getUInt(size_t field) const + [[nodiscard]] uint32 getUInt(std::size_t field) const { ASSERT(field < file.fieldCount); uint32 val = *reinterpret_cast(offset + file.GetOffset(field)); @@ -62,16 +62,16 @@ public: return val; } - [[nodiscard]] uint8 getUInt8(size_t field) const + [[nodiscard]] uint8 getUInt8(std::size_t field) const { ASSERT(field < file.fieldCount); return *reinterpret_cast(offset + file.GetOffset(field)); } - [[nodiscard]] const char* getString(size_t field) const + [[nodiscard]] const char* getString(std::size_t field) const { ASSERT(field < file.fieldCount); - size_t stringOffset = getUInt(field); + std::size_t stringOffset = getUInt(field); ASSERT(stringOffset < file.stringSize); return reinterpret_cast(file.stringTable + stringOffset); } @@ -85,12 +85,12 @@ public: }; // Get record by id - Record getRecord(size_t id); + Record getRecord(std::size_t id); [[nodiscard]] uint32 GetNumRows() const { return recordCount; } [[nodiscard]] uint32 GetRowSize() const { return recordSize; } [[nodiscard]] uint32 GetCols() const { return fieldCount; } - [[nodiscard]] uint32 GetOffset(size_t id) const { return (fieldsOffset != nullptr && id < fieldCount) ? fieldsOffset[id] : 0; } + [[nodiscard]] uint32 GetOffset(std::size_t id) const { return (fieldsOffset != nullptr && id < fieldCount) ? fieldsOffset[id] : 0; } [[nodiscard]] bool IsLoaded() const { return data != nullptr; } char* AutoProduceData(char const* fmt, uint32& count, char**& indexTable); char* AutoProduceStrings(char const* fmt, char* dataTable); diff --git a/src/common/Debugging/WheatyExceptionReport.cpp b/src/common/Debugging/WheatyExceptionReport.cpp index be5663002..57ba80cae 100644 --- a/src/common/Debugging/WheatyExceptionReport.cpp +++ b/src/common/Debugging/WheatyExceptionReport.cpp @@ -260,13 +260,13 @@ BOOL WheatyExceptionReport::_GetProcessorName(TCHAR* sProcessorName, DWORD maxco return TRUE; } -template +template void ToTchar(wchar_t const* src, TCHAR (&dst)[size], std::true_type) { wcstombs_s(nullptr, dst, src, size); } -template +template void ToTchar(wchar_t const* src, TCHAR (&dst)[size], std::false_type) { wcscpy_s(dst, src); @@ -1455,8 +1455,8 @@ void WheatyExceptionReport::FormatOutputValue(char* pszCurrBuffer, BasicType basicType, DWORD64 length, PVOID pAddress, - size_t bufferSize, - size_t countOverride) + std::size_t bufferSize, + std::size_t countOverride) { __try { @@ -1677,7 +1677,7 @@ void WheatyExceptionReport::PrintSymbolDetail() } // Add appropriate indentation level (since this routine is recursive) - for (size_t i = 0; i < symbolDetails.size(); i++) + for (std::size_t i = 0; i < symbolDetails.size(); i++) { Log(_T("\t")); } diff --git a/src/common/Debugging/WheatyExceptionReport.h b/src/common/Debugging/WheatyExceptionReport.h index 3d6fb2757..94e91e869 100644 --- a/src/common/Debugging/WheatyExceptionReport.h +++ b/src/common/Debugging/WheatyExceptionReport.h @@ -164,7 +164,7 @@ private: static void DumpTypeIndex(DWORD64, DWORD, DWORD_PTR, bool&, char const*, char*, bool, bool); - static void FormatOutputValue(char* pszCurrBuffer, BasicType basicType, DWORD64 length, PVOID pAddress, size_t bufferSize, size_t countOverride = 0); + static void FormatOutputValue(char* pszCurrBuffer, BasicType basicType, DWORD64 length, PVOID pAddress, std::size_t bufferSize, std::size_t countOverride = 0); static BasicType GetBasicType(DWORD typeIndex, DWORD64 modBase); static DWORD_PTR DereferenceUnsafePointer(DWORD_PTR address); diff --git a/src/common/Define.h b/src/common/Define.h index 1da537e41..09cd43544 100644 --- a/src/common/Define.h +++ b/src/common/Define.h @@ -21,7 +21,6 @@ #include "CompilerDefs.h" #include #include -#include #define ACORE_LITTLEENDIAN 0 #define ACORE_BIGENDIAN 1 diff --git a/src/common/Dynamic/FactoryHolder.h b/src/common/Dynamic/FactoryHolder.h index 093f6e4f3..245bd0282 100644 --- a/src/common/Dynamic/FactoryHolder.h +++ b/src/common/Dynamic/FactoryHolder.h @@ -20,7 +20,6 @@ #include "Define.h" #include "ObjectRegistry.h" -#include "TypeList.h" /** FactoryHolder holds a factory object of a specific type */ diff --git a/src/common/Dynamic/ObjectRegistry.h b/src/common/Dynamic/ObjectRegistry.h index fe8c64dd7..31adcd8f1 100644 --- a/src/common/Dynamic/ObjectRegistry.h +++ b/src/common/Dynamic/ObjectRegistry.h @@ -18,12 +18,9 @@ #ifndef ACORE_OBJECTREGISTRY_H #define ACORE_OBJECTREGISTRY_H -#include "Define.h" #include #include #include -#include -#include /** ObjectRegistry holds all registry item of the same type */ diff --git a/src/common/Dynamic/TypeContainer.h b/src/common/Dynamic/TypeContainer.h index 2a69bd61e..7e8ef91bc 100644 --- a/src/common/Dynamic/TypeContainer.h +++ b/src/common/Dynamic/TypeContainer.h @@ -23,12 +23,10 @@ * types of object at the same time. */ -#include "Define.h" #include "Dynamic/TypeList.h" #include "GridRefMgr.h" #include #include -#include /* * @class ContainerMapList is a mulit-type container for map elements @@ -102,7 +100,7 @@ template class TypeMapContainer { public: - template [[nodiscard]] size_t Count() const { return Acore::Count(i_elements, (SPECIFIC_TYPE*)nullptr); } + template [[nodiscard]] std::size_t Count() const { return Acore::Count(i_elements, (SPECIFIC_TYPE*)nullptr); } /// inserts a specific object into the container template diff --git a/src/common/Dynamic/TypeContainerFunctions.h b/src/common/Dynamic/TypeContainerFunctions.h index e34d914be..12094a490 100644 --- a/src/common/Dynamic/TypeContainerFunctions.h +++ b/src/common/Dynamic/TypeContainerFunctions.h @@ -24,10 +24,7 @@ * to access or mutate the container. */ -#include "Define.h" #include "Dynamic/TypeList.h" -#include -#include namespace Acore { @@ -159,31 +156,31 @@ namespace Acore /* ContainerMapList Helpers */ // count functions template - size_t Count(const ContainerMapList& elements, SPECIFIC_TYPE* /*fake*/) + std::size_t Count(const ContainerMapList& elements, SPECIFIC_TYPE* /*fake*/) { return elements._element.getSize(); } template - size_t Count(const ContainerMapList& /*elements*/, SPECIFIC_TYPE* /*fake*/) + std::size_t Count(const ContainerMapList& /*elements*/, SPECIFIC_TYPE* /*fake*/) { return 0; } template - size_t Count(const ContainerMapList& /*elements*/, SPECIFIC_TYPE* /*fake*/) + std::size_t Count(const ContainerMapList& /*elements*/, SPECIFIC_TYPE* /*fake*/) { return 0; } template - size_t Count(const ContainerMapList>& elements, SPECIFIC_TYPE* fake) + std::size_t Count(const ContainerMapList>& elements, SPECIFIC_TYPE* fake) { return Count(elements._elements, fake); } template - size_t Count(const ContainerMapList>& elements, SPECIFIC_TYPE* fake) + std::size_t Count(const ContainerMapList>& elements, SPECIFIC_TYPE* fake) { return Count(elements._TailElements, fake); } diff --git a/src/common/Dynamic/TypeContainerFunctionsPtr.h b/src/common/Dynamic/TypeContainerFunctionsPtr.h index 836aef769..37be105ce 100644 --- a/src/common/Dynamic/TypeContainerFunctionsPtr.h +++ b/src/common/Dynamic/TypeContainerFunctionsPtr.h @@ -32,27 +32,27 @@ namespace Acore { /* ContainerMapList Helpers */ // count functions - // template size_t Count(const ContainerMapList &elements, CountedPtr* /*fake*/) + // template std::size_t Count(const ContainerMapList &elements, CountedPtr* /*fake*/) // { // return elements._element.size(); // }; // - // template size_t Count(const ContainerMapList &elements, CountedPtr* /*fake*/) + // template std::size_t Count(const ContainerMapList &elements, CountedPtr* /*fake*/) // { // return 0; // } // - // template size_t Count(const ContainerMapList &elements, CountedPtr* /*fake*/) + // template std::size_t Count(const ContainerMapList &elements, CountedPtr* /*fake*/) // { // return 0; // } // - // template size_t Count(const ContainerMapList >&elements, SPECIFIC_TYPE* fake) + // template std::size_t Count(const ContainerMapList >&elements, SPECIFIC_TYPE* fake) // { // return Count(elements._elements, fake); // } // - // template size_t Count(const ContainerMapList >&elements, SPECIFIC_TYPE* fake) + // template std::size_t Count(const ContainerMapList >&elements, SPECIFIC_TYPE* fake) // { // return Count(elements._TailElements, fake); // } diff --git a/src/common/Dynamic/TypeContainerVisitor.h b/src/common/Dynamic/TypeContainerVisitor.h index cab848b4b..1553d918a 100644 --- a/src/common/Dynamic/TypeContainerVisitor.h +++ b/src/common/Dynamic/TypeContainerVisitor.h @@ -24,7 +24,6 @@ * to overload its types as a visit method is called. */ -#include "Define.h" #include "Dynamic/TypeContainer.h" // forward declaration diff --git a/src/common/Logging/Appender.h b/src/common/Logging/Appender.h index 23f2d47f6..0d5e02801 100644 --- a/src/common/Logging/Appender.h +++ b/src/common/Logging/Appender.h @@ -22,7 +22,6 @@ #include "LogCommon.h" #include #include -#include struct LogMessage; diff --git a/src/common/Logging/AppenderConsole.h b/src/common/Logging/AppenderConsole.h index 9da2a6ec5..d60553523 100644 --- a/src/common/Logging/AppenderConsole.h +++ b/src/common/Logging/AppenderConsole.h @@ -19,6 +19,7 @@ #define APPENDERCONSOLE_H #include "Appender.h" +#include // EnumUtils: DESCRIBE THIS enum ColorTypes diff --git a/src/common/Logging/AppenderFile.cpp b/src/common/Logging/AppenderFile.cpp index 3357b2cf3..81b84cb98 100644 --- a/src/common/Logging/AppenderFile.cpp +++ b/src/common/Logging/AppenderFile.cpp @@ -44,7 +44,7 @@ AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, Ap if (flags & APPENDER_FLAGS_USE_TIMESTAMP) { - size_t dot_pos = _fileName.find_last_of('.'); + std::size_t dot_pos = _fileName.find_last_of('.'); if (dot_pos != std::string::npos) { _fileName.insert(dot_pos, sLog->GetLogsTimestamp()); diff --git a/src/common/Logging/AppenderFile.h b/src/common/Logging/AppenderFile.h index cb1d0424f..38b21065a 100644 --- a/src/common/Logging/AppenderFile.h +++ b/src/common/Logging/AppenderFile.h @@ -20,6 +20,7 @@ #include "Appender.h" #include +#include class AppenderFile : public Appender { diff --git a/src/common/Logging/Log.cpp b/src/common/Logging/Log.cpp index 6fd65216c..37809458b 100644 --- a/src/common/Logging/Log.cpp +++ b/src/common/Logging/Log.cpp @@ -73,7 +73,7 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName) std::vector tokens = Acore::Tokenize(options, ',', true); - size_t const size = tokens.size(); + std::size_t const size = tokens.size(); std::string name = appenderName.substr(9); if (size < 2) @@ -265,7 +265,7 @@ Logger const* Log::GetLoggerByType(std::string const& type) const } std::string parentLogger = LOGGER_ROOT; - size_t found = type.find_last_of('.'); + std::size_t found = type.find_last_of('.'); if (found != std::string::npos) { parentLogger = type.substr(0, found); diff --git a/src/common/Logging/Log.h b/src/common/Logging/Log.h index f80869399..f60bb0367 100644 --- a/src/common/Logging/Log.h +++ b/src/common/Logging/Log.h @@ -21,7 +21,6 @@ #include "Define.h" #include "LogCommon.h" #include "StringFormat.h" -#include #include #include diff --git a/src/common/Logging/LogOperation.h b/src/common/Logging/LogOperation.h index 77d403d5c..9c24ca5b7 100644 --- a/src/common/Logging/LogOperation.h +++ b/src/common/Logging/LogOperation.h @@ -18,7 +18,6 @@ #ifndef LOGOPERATION_H #define LOGOPERATION_H -#include "Define.h" #include class Logger; diff --git a/src/common/Logging/enuminfo_AppenderConsole.cpp b/src/common/Logging/enuminfo_AppenderConsole.cpp index c747a1bef..28031a58b 100644 --- a/src/common/Logging/enuminfo_AppenderConsole.cpp +++ b/src/common/Logging/enuminfo_AppenderConsole.cpp @@ -51,10 +51,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(ColorTypes value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 15; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 15; } template <> -AC_API_EXPORT ColorTypes EnumUtils::FromIndex(size_t index) +AC_API_EXPORT ColorTypes EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -78,7 +78,7 @@ AC_API_EXPORT ColorTypes EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(ColorTypes value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(ColorTypes value) { switch (value) { diff --git a/src/common/Logging/enuminfo_LogCommon.cpp b/src/common/Logging/enuminfo_LogCommon.cpp index 2e4265563..e06d5fc26 100644 --- a/src/common/Logging/enuminfo_LogCommon.cpp +++ b/src/common/Logging/enuminfo_LogCommon.cpp @@ -43,10 +43,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(LogLevel value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 7; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 7; } template <> -AC_API_EXPORT LogLevel EnumUtils::FromIndex(size_t index) +AC_API_EXPORT LogLevel EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -62,7 +62,7 @@ AC_API_EXPORT LogLevel EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(LogLevel value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(LogLevel value) { switch (value) { @@ -94,10 +94,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(AppenderType value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 4; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 4; } template <> -AC_API_EXPORT AppenderType EnumUtils::FromIndex(size_t index) +AC_API_EXPORT AppenderType EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -110,7 +110,7 @@ AC_API_EXPORT AppenderType EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(AppenderType value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(AppenderType value) { switch (value) { @@ -141,10 +141,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(AppenderFlags value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 6; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 6; } template <> -AC_API_EXPORT AppenderFlags EnumUtils::FromIndex(size_t index) +AC_API_EXPORT AppenderFlags EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -159,7 +159,7 @@ AC_API_EXPORT AppenderFlags EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(AppenderFlags value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(AppenderFlags value) { switch (value) { diff --git a/src/common/Metric/Metric.h b/src/common/Metric/Metric.h index ed841a1e9..fda4048d6 100644 --- a/src/common/Metric/Metric.h +++ b/src/common/Metric/Metric.h @@ -22,11 +22,9 @@ #include "Duration.h" #include "MPSCQueue.h" #include -#include #include #include #include -#include #include namespace Acore::Asio diff --git a/src/common/Threading/MPSCQueue.h b/src/common/Threading/MPSCQueue.h index ce26db40b..15176178b 100644 --- a/src/common/Threading/MPSCQueue.h +++ b/src/common/Threading/MPSCQueue.h @@ -19,8 +19,6 @@ #define MPSCQueue_h__ #include -#include -#include namespace Acore::Impl { diff --git a/src/common/Threading/PCQueue.h b/src/common/Threading/PCQueue.h index 648405365..57f3b08ef 100644 --- a/src/common/Threading/PCQueue.h +++ b/src/common/Threading/PCQueue.h @@ -18,11 +18,8 @@ #ifndef _PCQ_H #define _PCQ_H -#include #include -#include #include -#include template class ProducerConsumerQueue @@ -51,7 +48,7 @@ public: return _queue.empty(); } - [[nodiscard]] size_t Size() const + [[nodiscard]] std::size_t Size() const { return _queue.size(); } diff --git a/src/common/Threading/ThreadingModel.h b/src/common/Threading/ThreadingModel.h index 69d4f5b8e..a23884df3 100644 --- a/src/common/Threading/ThreadingModel.h +++ b/src/common/Threading/ThreadingModel.h @@ -23,8 +23,6 @@ * */ -#include "Define.h" - namespace Acore { template diff --git a/src/common/Utilities/AsyncCallbackProcessor.h b/src/common/Utilities/AsyncCallbackProcessor.h index 54b981cbc..68566809a 100644 --- a/src/common/Utilities/AsyncCallbackProcessor.h +++ b/src/common/Utilities/AsyncCallbackProcessor.h @@ -18,7 +18,6 @@ #ifndef AsyncCallbackProcessor_h__ #define AsyncCallbackProcessor_h__ -#include "Define.h" #include #include diff --git a/src/common/Utilities/ByteConverter.h b/src/common/Utilities/ByteConverter.h index 4a96d773c..ff0818bd6 100644 --- a/src/common/Utilities/ByteConverter.h +++ b/src/common/Utilities/ByteConverter.h @@ -27,7 +27,7 @@ namespace ByteConverter { - template + template inline void convert(char* val) { std::swap(*val, *(val + T - 1)); diff --git a/src/common/Utilities/CircularBuffer.h b/src/common/Utilities/CircularBuffer.h index 898ab1a11..4c23099c9 100644 --- a/src/common/Utilities/CircularBuffer.h +++ b/src/common/Utilities/CircularBuffer.h @@ -17,7 +17,7 @@ template class CircularBuffer { public: - explicit CircularBuffer(size_t size) : + explicit CircularBuffer(std::size_t size) : buf_(std::unique_ptr(new T[size])), max_size_(size) { @@ -52,14 +52,14 @@ public: return full_; } - [[nodiscard]] size_t capacity() const + [[nodiscard]] std::size_t capacity() const { return max_size_; } - [[nodiscard]] size_t size() const + [[nodiscard]] std::size_t size() const { - size_t size = max_size_; + std::size_t size = max_size_; if (!full_) { @@ -95,9 +95,9 @@ public: private: std::mutex mutex_; std::unique_ptr buf_; - size_t head_ = 0; - size_t tail_ = 0; - const size_t max_size_; + std::size_t head_ = 0; + std::size_t tail_ = 0; + const std::size_t max_size_; bool full_ = false; }; #endif diff --git a/src/common/Utilities/Containers.h b/src/common/Utilities/Containers.h index c77a48be7..3a5c3b180 100644 --- a/src/common/Utilities/Containers.h +++ b/src/common/Utilities/Containers.h @@ -23,8 +23,6 @@ #include #include #include -#include -#include #include namespace Acore @@ -51,13 +49,13 @@ namespace Acore using reference = T&; using difference_type = std::ptrdiff_t; - CheckedBufferOutputIterator(T* buf, size_t n) : _buf(buf), _end(buf + n) {} + CheckedBufferOutputIterator(T* buf, std::size_t n) : _buf(buf), _end(buf + n) {} T& operator*() const { check(); return *_buf; } CheckedBufferOutputIterator& operator++() { check(); ++_buf; return *this; } CheckedBufferOutputIterator operator++(int) { CheckedBufferOutputIterator v = *this; operator++(); return v; } - [[nodiscard]] size_t remaining() const { return (_end - _buf); } + [[nodiscard]] std::size_t remaining() const { return (_end - _buf); } private: T* _buf; diff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h index 0ebd48077..3e7896bb3 100644 --- a/src/common/Utilities/EventProcessor.h +++ b/src/common/Utilities/EventProcessor.h @@ -22,7 +22,6 @@ #include "Duration.h" #include "Random.h" #include -#include class EventProcessor; diff --git a/src/common/Utilities/Geometry.h b/src/common/Utilities/Geometry.h index f5912c838..75affe53b 100644 --- a/src/common/Utilities/Geometry.h +++ b/src/common/Utilities/Geometry.h @@ -24,9 +24,7 @@ #ifndef _ACORE_GEOMETRY_H #define _ACORE_GEOMETRY_H -#include "Define.h" #include -#include #include [[nodiscard]] inline float getAngle(float startX, float startY, float destX, float destY) diff --git a/src/common/Utilities/IteratorPair.h b/src/common/Utilities/IteratorPair.h index c1e512c28..385c77a86 100644 --- a/src/common/Utilities/IteratorPair.h +++ b/src/common/Utilities/IteratorPair.h @@ -18,7 +18,6 @@ #ifndef IteratorPair_h__ #define IteratorPair_h__ -#include "Define.h" #include namespace Acore diff --git a/src/common/Utilities/MathUtil.h b/src/common/Utilities/MathUtil.h index fad8317c3..f1df43e7d 100644 --- a/src/common/Utilities/MathUtil.h +++ b/src/common/Utilities/MathUtil.h @@ -58,7 +58,7 @@ inline T mean(Container&& c) template inline T median(std::vector a) { - size_t n = a.size(); + std::size_t n = a.size(); // If size of the arr[] is even if (n % 2 == 0) { diff --git a/src/common/Utilities/Physics.h b/src/common/Utilities/Physics.h index 8aff22f68..3f4d93a67 100644 --- a/src/common/Utilities/Physics.h +++ b/src/common/Utilities/Physics.h @@ -25,9 +25,6 @@ #define _ACORE_PHYSICS_H #include "Geometry.h" -#include -#include -#include using namespace std; diff --git a/src/common/Utilities/Random.cpp b/src/common/Utilities/Random.cpp index f80e02307..40090caa1 100644 --- a/src/common/Utilities/Random.cpp +++ b/src/common/Utilities/Random.cpp @@ -86,7 +86,7 @@ double rand_chance() return urd(engine); } -uint32 urandweighted(size_t count, double const* chances) +uint32 urandweighted(std::size_t count, double const* chances) { std::discrete_distribution dd(chances, chances + count); return dd(engine); diff --git a/src/common/Utilities/Random.h b/src/common/Utilities/Random.h index 9b1867e28..07bc91d3a 100644 --- a/src/common/Utilities/Random.h +++ b/src/common/Utilities/Random.h @@ -47,7 +47,7 @@ AC_COMMON_API double rand_norm(); AC_COMMON_API double rand_chance(); /* Return a random number in the range 0..count (exclusive) with each value having a different chance of happening */ -AC_COMMON_API uint32 urandweighted(size_t count, double const* chances); +AC_COMMON_API uint32 urandweighted(std::size_t count, double const* chances); /* Return true if a random roll fits in the specified chance (range 0-100). */ inline bool roll_chance_f(float chance) diff --git a/src/common/Utilities/SFMTRand.cpp b/src/common/Utilities/SFMTRand.cpp index fccd41aab..c109924db 100644 --- a/src/common/Utilities/SFMTRand.cpp +++ b/src/common/Utilities/SFMTRand.cpp @@ -26,7 +26,7 @@ #include #elif defined(__GNUC__) static __inline__ void *__attribute__((__always_inline__, __nodebug__, __malloc__)) - _mm_malloc(size_t __size, size_t __align) + _mm_malloc(std::size_t __size, std::size_t __align) { if (__align == 1) { @@ -78,7 +78,7 @@ uint32 SFMTRand::RandomUInt32() // Output random bits return sfmt_genrand_uint32(&_state); } -void* SFMTRand::operator new(size_t size, std::nothrow_t const&) +void* SFMTRand::operator new(std::size_t size, std::nothrow_t const&) { return _mm_malloc(size, 16); } @@ -88,7 +88,7 @@ void SFMTRand::operator delete(void* ptr, std::nothrow_t const&) _mm_free(ptr); } -void* SFMTRand::operator new(size_t size) +void* SFMTRand::operator new(std::size_t size) { return _mm_malloc(size, 16); } @@ -98,7 +98,7 @@ void SFMTRand::operator delete(void* ptr) _mm_free(ptr); } -void* SFMTRand::operator new[](size_t size, std::nothrow_t const&) +void* SFMTRand::operator new[](std::size_t size, std::nothrow_t const&) { return _mm_malloc(size, 16); } @@ -108,7 +108,7 @@ void SFMTRand::operator delete[](void* ptr, std::nothrow_t const&) _mm_free(ptr); } -void* SFMTRand::operator new[](size_t size) +void* SFMTRand::operator new[](std::size_t size) { return _mm_malloc(size, 16); } diff --git a/src/common/Utilities/SFMTRand.h b/src/common/Utilities/SFMTRand.h index 30981b47d..e24cfe198 100644 --- a/src/common/Utilities/SFMTRand.h +++ b/src/common/Utilities/SFMTRand.h @@ -30,13 +30,13 @@ class SFMTRand public: SFMTRand(); uint32 RandomUInt32(); // Output random bits - void* operator new(size_t size, std::nothrow_t const&); + void* operator new(std::size_t size, std::nothrow_t const&); void operator delete(void* ptr, std::nothrow_t const&); - void* operator new(size_t size); + void* operator new(std::size_t size); void operator delete(void* ptr); - void* operator new[](size_t size, std::nothrow_t const&); + void* operator new[](std::size_t size, std::nothrow_t const&); void operator delete[](void* ptr, std::nothrow_t const&); - void* operator new[](size_t size); + void* operator new[](std::size_t size); void operator delete[](void* ptr); private: sfmt_t _state; diff --git a/src/common/Utilities/SmartEnum.h b/src/common/Utilities/SmartEnum.h index e6e0be257..fd00b8362 100644 --- a/src/common/Utilities/SmartEnum.h +++ b/src/common/Utilities/SmartEnum.h @@ -37,10 +37,10 @@ namespace Acore::Impl::EnumUtilsImpl template struct EnumUtils { - static size_t Count(); + static std::size_t Count(); static EnumText ToString(Enum value); - static Enum FromIndex(size_t index); - static size_t ToIndex(Enum index); + static Enum FromIndex(std::size_t index); + static std::size_t ToIndex(Enum index); }; } @@ -48,11 +48,11 @@ class EnumUtils { public: template - static size_t Count() { return Acore::Impl::EnumUtilsImpl::EnumUtils::Count(); } + static std::size_t Count() { return Acore::Impl::EnumUtilsImpl::EnumUtils::Count(); } template static EnumText ToString(Enum value) { return Acore::Impl::EnumUtilsImpl::EnumUtils::ToString(value); } template - static Enum FromIndex(size_t index) { return Acore::Impl::EnumUtilsImpl::EnumUtils::FromIndex(index); } + static Enum FromIndex(std::size_t index) { return Acore::Impl::EnumUtilsImpl::EnumUtils::FromIndex(index); } template static uint32 ToIndex(Enum value) { return Acore::Impl::EnumUtilsImpl::EnumUtils::ToIndex(value);} @@ -84,7 +84,7 @@ public: using difference_type = std::ptrdiff_t; Iterator() : _index(EnumUtils::Count()) {} - explicit Iterator(size_t index) : _index(index) { } + explicit Iterator(std::size_t index) : _index(index) { } bool operator==(const Iterator& other) const { return other._index == _index; } bool operator!=(const Iterator& other) const { return !operator==(other); } diff --git a/src/common/Utilities/StartProcess.h b/src/common/Utilities/StartProcess.h index 6b564cb9e..6de13d1be 100644 --- a/src/common/Utilities/StartProcess.h +++ b/src/common/Utilities/StartProcess.h @@ -20,7 +20,6 @@ #include "Define.h" #include -#include #include #include diff --git a/src/common/Utilities/StringConvert.h b/src/common/Utilities/StringConvert.h index bd02cf3ea..4f51b9746 100644 --- a/src/common/Utilities/StringConvert.h +++ b/src/common/Utilities/StringConvert.h @@ -219,7 +219,7 @@ namespace Acore::Impl::StringConvertImpl } tmp.append(str); - size_t n; + std::size_t n; T val = static_cast(std::stold(tmp, &n)); if (n != tmp.length()) { diff --git a/src/common/Utilities/TaskScheduler.cpp b/src/common/Utilities/TaskScheduler.cpp index 1d0bf89e6..1e4e0222d 100644 --- a/src/common/Utilities/TaskScheduler.cpp +++ b/src/common/Utilities/TaskScheduler.cpp @@ -31,7 +31,7 @@ TaskScheduler& TaskScheduler::Update(success_t const& callback) return *this; } -TaskScheduler& TaskScheduler::Update(size_t const milliseconds, success_t const& callback) +TaskScheduler& TaskScheduler::Update(std::size_t const milliseconds, success_t const& callback) { return Update(std::chrono::milliseconds(milliseconds), callback); } diff --git a/src/common/Utilities/TaskScheduler.h b/src/common/Utilities/TaskScheduler.h index a256be680..145489e08 100644 --- a/src/common/Utilities/TaskScheduler.h +++ b/src/common/Utilities/TaskScheduler.h @@ -19,14 +19,11 @@ #define _TASK_SCHEDULER_H_ #include "Util.h" -#include #include #include -#include #include #include #include -#include #include class TaskContext; @@ -209,7 +206,7 @@ public: /// Update the scheduler with a difftime in ms. /// Calls the optional callback on successfully finish. - TaskScheduler& Update(size_t const milliseconds, success_t const& callback = EmptyCallback); + TaskScheduler& Update(std::size_t const milliseconds, success_t const& callback = EmptyCallback); /// Update the scheduler with a difftime. /// Calls the optional callback on successfully finish. diff --git a/src/common/Utilities/Tokenize.cpp b/src/common/Utilities/Tokenize.cpp index 98ba213a6..3ceb57f08 100644 --- a/src/common/Utilities/Tokenize.cpp +++ b/src/common/Utilities/Tokenize.cpp @@ -21,8 +21,8 @@ std::vector Acore::Tokenize(std::string_view str, char sep, bo { std::vector tokens; - size_t start = 0; - for (size_t end = str.find(sep); end != std::string_view::npos; end = str.find(sep, start)) + std::size_t start = 0; + for (std::size_t end = str.find(sep); end != std::string_view::npos; end = str.find(sep, start)) { if (keepEmpty || (start < end)) { diff --git a/src/common/Utilities/Tokenize.h b/src/common/Utilities/Tokenize.h index a871c83be..6ee20ca53 100644 --- a/src/common/Utilities/Tokenize.h +++ b/src/common/Utilities/Tokenize.h @@ -18,7 +18,6 @@ #ifndef _ACORE_TOKENIZE_H_ #define _ACORE_TOKENIZE_H_ -#include "Common.h" #include #include diff --git a/src/common/Utilities/Tuples.h b/src/common/Utilities/Tuples.h index 886faac51..f648e20e6 100644 --- a/src/common/Utilities/Tuples.h +++ b/src/common/Utilities/Tuples.h @@ -48,7 +48,7 @@ namespace Acore namespace Impl { - template + template T* new_from_tuple(Tuple&& args, std::index_sequence) { return new T(std::get(std::forward(args))...); diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index ee397dd4d..0652e5667 100644 --- a/src/common/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp @@ -33,10 +33,10 @@ void stripLineInvisibleChars(std::string& str) { static std::string const invChars = " \t\7\n"; - size_t wpos = 0; + std::size_t wpos = 0; bool space = false; - for (size_t pos = 0; pos < str.size(); ++pos) + for (std::size_t pos = 0; pos < str.size(); ++pos) { if (invChars.find(str[pos]) != std::string::npos) { @@ -242,7 +242,7 @@ uint32 GetPID() return uint32(pid); } -size_t utf8length(std::string& utf8str) +std::size_t utf8length(std::string& utf8str) { try { @@ -255,11 +255,11 @@ size_t utf8length(std::string& utf8str) } } -void utf8truncate(std::string& utf8str, size_t len) +void utf8truncate(std::string& utf8str, std::size_t len) { try { - size_t wlen = utf8::distance(utf8str.c_str(), utf8str.c_str() + utf8str.size()); + std::size_t wlen = utf8::distance(utf8str.c_str(), utf8str.c_str() + utf8str.size()); if (wlen <= len) { return; @@ -278,7 +278,7 @@ void utf8truncate(std::string& utf8str, size_t len) } } -bool Utf8toWStr(char const* utf8str, size_t csize, wchar_t* wstr, size_t& wsize) +bool Utf8toWStr(char const* utf8str, std::size_t csize, wchar_t* wstr, std::size_t& wsize) { try { @@ -330,7 +330,7 @@ bool Utf8toWStr(std::string_view utf8str, std::wstring& wstr) return true; } -bool WStrToUtf8(wchar_t const* wstr, size_t size, std::string& utf8str) +bool WStrToUtf8(wchar_t const* wstr, std::size_t size, std::string& utf8str) { try { @@ -512,14 +512,14 @@ void vutf8printf(FILE* out, const char* str, va_list* ap) char temp_buf[32 * 1024]; wchar_t wtemp_buf[32 * 1024]; - size_t temp_len = vsnprintf(temp_buf, 32 * 1024, str, *ap); + std::size_t temp_len = vsnprintf(temp_buf, 32 * 1024, str, *ap); //vsnprintf returns -1 if the buffer is too small - if (temp_len == size_t(-1)) + if (temp_len == std::size_t(-1)) { temp_len = 32 * 1024 - 1; } - size_t wtemp_len = 32 * 1024 - 1; + std::size_t wtemp_len = 32 * 1024 - 1; Utf8toWStr(temp_buf, temp_len, wtemp_buf, wtemp_len); CharToOemBuffW(&wtemp_buf[0], &temp_buf[0], uint32(wtemp_len + 1)); @@ -542,7 +542,7 @@ bool Utf8ToUpperOnlyLatin(std::string& utf8String) return WStrToUtf8(wstr, utf8String); } -std::string Acore::Impl::ByteArrayToHexStr(uint8 const* bytes, size_t arrayLen, bool reverse /* = false */) +std::string Acore::Impl::ByteArrayToHexStr(uint8 const* bytes, std::size_t arrayLen, bool reverse /* = false */) { int32 init = 0; int32 end = arrayLen; @@ -566,7 +566,7 @@ std::string Acore::Impl::ByteArrayToHexStr(uint8 const* bytes, size_t arrayLen, return ss.str(); } -void Acore::Impl::HexStrToByteArray(std::string_view str, uint8* out, size_t outlen, bool reverse /*= false*/) +void Acore::Impl::HexStrToByteArray(std::string_view str, uint8* out, std::size_t outlen, bool reverse /*= false*/) { ASSERT(str.size() == (2 * outlen)); diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index ddc72c10d..e5ced0699 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -85,9 +85,9 @@ inline T RoundToInterval(T& num, T floor, T ceil) AC_COMMON_API bool Utf8toWStr(std::string_view utf8str, std::wstring& wstr); // in wsize==max size of buffer, out wsize==real string size -AC_COMMON_API bool Utf8toWStr(char const* utf8str, size_t csize, wchar_t* wstr, size_t& wsize); +AC_COMMON_API bool Utf8toWStr(char const* utf8str, std::size_t csize, wchar_t* wstr, std::size_t& wsize); -inline bool Utf8toWStr(std::string_view utf8str, wchar_t* wstr, size_t& wsize) +inline bool Utf8toWStr(std::string_view utf8str, wchar_t* wstr, std::size_t& wsize) { return Utf8toWStr(utf8str.data(), utf8str.size(), wstr, wsize); } @@ -95,11 +95,11 @@ inline bool Utf8toWStr(std::string_view utf8str, wchar_t* wstr, size_t& wsize) AC_COMMON_API bool WStrToUtf8(std::wstring_view wstr, std::string& utf8str); // size==real string size -AC_COMMON_API bool WStrToUtf8(wchar_t const* wstr, size_t size, std::string& utf8str); +AC_COMMON_API bool WStrToUtf8(wchar_t const* wstr, std::size_t size, std::string& utf8str); // set string to "" if invalid utf8 sequence -size_t utf8length(std::string& utf8str); -void utf8truncate(std::string& utf8str, size_t len); +std::size_t utf8length(std::string& utf8str); +void utf8truncate(std::string& utf8str, std::size_t len); inline bool isBasicLatinCharacter(wchar_t wchar) { @@ -373,8 +373,8 @@ uint32 GetPID(); namespace Acore::Impl { - AC_COMMON_API std::string ByteArrayToHexStr(uint8 const* bytes, size_t length, bool reverse = false); - AC_COMMON_API void HexStrToByteArray(std::string_view str, uint8* out, size_t outlen, bool reverse = false); + AC_COMMON_API std::string ByteArrayToHexStr(uint8 const* bytes, std::size_t length, bool reverse = false); + AC_COMMON_API void HexStrToByteArray(std::string_view str, uint8* out, std::size_t outlen, bool reverse = false); } template @@ -383,13 +383,13 @@ std::string ByteArrayToHexStr(Container const& c, bool reverse = false) return Acore::Impl::ByteArrayToHexStr(std::data(c), std::size(c), reverse); } -template +template void HexStrToByteArray(std::string_view str, std::array& buf, bool reverse = false) { Acore::Impl::HexStrToByteArray(str, buf.data(), Size, reverse); } -template +template std::array HexStrToByteArray(std::string_view str, bool reverse = false) { std::array arr; @@ -433,7 +433,7 @@ public: m_list.remove(t); return *this; } - size_t size() + std::size_t size() { return m_list.size(); } diff --git a/src/server/apps/authserver/Server/AuthSession.cpp b/src/server/apps/authserver/Server/AuthSession.cpp index 741e4724e..bd9e0c61f 100644 --- a/src/server/apps/authserver/Server/AuthSession.cpp +++ b/src/server/apps/authserver/Server/AuthSession.cpp @@ -751,7 +751,7 @@ void AuthSession::RealmListCallback(PreparedQueryResult result) // Circle through realms in the RealmList and construct the return packet (including # of user characters in each realm) ByteBuffer pkt; - size_t RealmListSize = 0; + std::size_t RealmListSize = 0; for (auto const& [realmHandle, realm] : sRealmList->GetRealms()) { // don't work with realms which not compatible with the client diff --git a/src/server/apps/authserver/Server/AuthSession.h b/src/server/apps/authserver/Server/AuthSession.h index fe19cf809..b85421327 100644 --- a/src/server/apps/authserver/Server/AuthSession.h +++ b/src/server/apps/authserver/Server/AuthSession.h @@ -113,7 +113,7 @@ private: struct AuthHandler { AuthStatus status; - size_t packetSize; + std::size_t packetSize; bool (AuthSession::* handler)(); }; diff --git a/src/server/apps/worldserver/CommandLine/CliRunnable.cpp b/src/server/apps/worldserver/CommandLine/CliRunnable.cpp index 83688f1cc..6db897bde 100644 --- a/src/server/apps/worldserver/CommandLine/CliRunnable.cpp +++ b/src/server/apps/worldserver/CommandLine/CliRunnable.cpp @@ -46,7 +46,7 @@ namespace Acore::Impl::Readline static std::vector vec; char* cli_unpack_vector(char const*, int state) { - static size_t i=0; + static std::size_t i=0; if (!state) i = 0; if (i < vec.size()) diff --git a/src/server/apps/worldserver/RemoteAccess/RASession.cpp b/src/server/apps/worldserver/RemoteAccess/RASession.cpp index d1cf74e93..06215d019 100644 --- a/src/server/apps/worldserver/RemoteAccess/RASession.cpp +++ b/src/server/apps/worldserver/RemoteAccess/RASession.cpp @@ -94,7 +94,7 @@ int RASession::Send(std::string_view data) { std::ostream os(&_writeBuffer); os << data; - size_t written = _socket.send(_writeBuffer.data()); + std::size_t written = _socket.send(_writeBuffer.data()); _writeBuffer.consume(written); return written; } @@ -102,7 +102,7 @@ int RASession::Send(std::string_view data) std::string RASession::ReadString() { boost::system::error_code error; - size_t read = boost::asio::read_until(_socket, _readBuffer, "\r\n", error); + std::size_t read = boost::asio::read_until(_socket, _readBuffer, "\r\n", error); if (!read) { _socket.close(); diff --git a/src/server/apps/worldserver/RemoteAccess/RASession.h b/src/server/apps/worldserver/RemoteAccess/RASession.h index c4dd6d861..b2c8ab948 100644 --- a/src/server/apps/worldserver/RemoteAccess/RASession.h +++ b/src/server/apps/worldserver/RemoteAccess/RASession.h @@ -26,7 +26,7 @@ using boost::asio::ip::tcp; -const size_t bufferSize = 4096; +const std::size_t bufferSize = 4096; class RASession : public std::enable_shared_from_this { diff --git a/src/server/database/Database/DatabaseWorkerPool.cpp b/src/server/database/Database/DatabaseWorkerPool.cpp index 94bc7d22d..3be45ed40 100644 --- a/src/server/database/Database/DatabaseWorkerPool.cpp +++ b/src/server/database/Database/DatabaseWorkerPool.cpp @@ -151,11 +151,11 @@ bool DatabaseWorkerPool::PrepareStatements() else connection->Unlock(); - size_t const preparedSize = connection->m_stmts.size(); + std::size_t const preparedSize = connection->m_stmts.size(); if (_preparedStatementSize.size() < preparedSize) _preparedStatementSize.resize(preparedSize); - for (size_t i = 0; i < preparedSize; ++i) + for (std::size_t i = 0; i < preparedSize; ++i) { // already set by another connection // (each connection only has prepared statements of it's own type sync/async) @@ -485,7 +485,7 @@ void DatabaseWorkerPool::Enqueue(SQLOperation* op) } template -size_t DatabaseWorkerPool::QueueSize() const +std::size_t DatabaseWorkerPool::QueueSize() const { return _queue->Size(); } diff --git a/src/server/database/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h index 4cf6a2e92..181dd7f58 100644 --- a/src/server/database/Database/DatabaseWorkerPool.h +++ b/src/server/database/Database/DatabaseWorkerPool.h @@ -227,7 +227,7 @@ public: #endif } - [[nodiscard]] size_t QueueSize() const; + [[nodiscard]] std::size_t QueueSize() const; private: uint32 OpenConnections(InternalIndex type, uint8 numConnections); diff --git a/src/server/database/Database/Field.cpp b/src/server/database/Database/Field.cpp index 35f84c2a0..ad552699d 100644 --- a/src/server/database/Database/Field.cpp +++ b/src/server/database/Database/Field.cpp @@ -144,7 +144,7 @@ namespace } } -void Field::GetBinarySizeChecked(uint8* buf, size_t length) const +void Field::GetBinarySizeChecked(uint8* buf, std::size_t length) const { ASSERT(data.value && (data.length == length), "Expected {}-byte binary blob, got {}data ({} bytes) instead", length, data.value ? "" : "no ", data.length); memcpy(buf, data.value, length); diff --git a/src/server/database/Database/Field.h b/src/server/database/Database/Field.h index 8496560c3..6af5cb807 100644 --- a/src/server/database/Database/Field.h +++ b/src/server/database/Database/Field.h @@ -133,7 +133,7 @@ public: return GetDataBinary(); } - template + template inline std::enable_if_t, std::array> Get() const { std::array buf = {}; @@ -173,7 +173,7 @@ private: QueryResultFieldMetadata const* meta; void LogWrongType(std::string_view getter, std::string_view typeName) const; void SetMetadata(QueryResultFieldMetadata const* fieldMeta); - void GetBinarySizeChecked(uint8* buf, size_t size) const; + void GetBinarySizeChecked(uint8* buf, std::size_t size) const; }; #endif diff --git a/src/server/database/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp index a77f78d07..54c393c75 100644 --- a/src/server/database/Database/MySQLConnection.cpp +++ b/src/server/database/Database/MySQLConnection.cpp @@ -464,7 +464,7 @@ int MySQLConnection::ExecuteTransaction(std::shared_ptr transac return 0; } -size_t MySQLConnection::EscapeString(char* to, const char* from, size_t length) +std::size_t MySQLConnection::EscapeString(char* to, const char* from, std::size_t length) { return mysql_real_escape_string(m_Mysql, to, from, length); } diff --git a/src/server/database/Database/MySQLConnection.h b/src/server/database/Database/MySQLConnection.h index 08e4f07ac..2249aafce 100644 --- a/src/server/database/Database/MySQLConnection.h +++ b/src/server/database/Database/MySQLConnection.h @@ -80,7 +80,7 @@ public: void RollbackTransaction(); void CommitTransaction(); int ExecuteTransaction(std::shared_ptr transaction); - size_t EscapeString(char* to, const char* from, size_t length); + std::size_t EscapeString(char* to, const char* from, std::size_t length); void Ping(); uint32 GetLastError(); diff --git a/src/server/database/Database/MySQLPreparedStatement.cpp b/src/server/database/Database/MySQLPreparedStatement.cpp index 0335cf5cb..a2e95864b 100644 --- a/src/server/database/Database/MySQLPreparedStatement.cpp +++ b/src/server/database/Database/MySQLPreparedStatement.cpp @@ -190,7 +190,7 @@ std::string MySQLPreparedStatement::getQueryString() const { std::string queryString(m_queryString); - size_t pos = 0; + std::size_t pos = 0; for (PreparedStatementData const& data : m_stmt->GetParameters()) { diff --git a/src/server/database/Database/QueryHolder.cpp b/src/server/database/Database/QueryHolder.cpp index c3c54aad8..c8f4375d7 100644 --- a/src/server/database/Database/QueryHolder.cpp +++ b/src/server/database/Database/QueryHolder.cpp @@ -22,7 +22,7 @@ #include "PreparedStatement.h" #include "QueryResult.h" -bool SQLQueryHolderBase::SetPreparedQueryImpl(size_t index, PreparedStatementBase* stmt) +bool SQLQueryHolderBase::SetPreparedQueryImpl(std::size_t index, PreparedStatementBase* stmt) { if (m_queries.size() <= index) { @@ -34,7 +34,7 @@ bool SQLQueryHolderBase::SetPreparedQueryImpl(size_t index, PreparedStatementBas return true; } -PreparedQueryResult SQLQueryHolderBase::GetPreparedResult(size_t index) const +PreparedQueryResult SQLQueryHolderBase::GetPreparedResult(std::size_t index) const { // Don't call to this function if the index is of a prepared statement ASSERT(index < m_queries.size(), "Query holder result index out of range, tried to access index {} but there are only {} results", @@ -43,7 +43,7 @@ PreparedQueryResult SQLQueryHolderBase::GetPreparedResult(size_t index) const return m_queries[index].second; } -void SQLQueryHolderBase::SetPreparedResult(size_t index, PreparedResultSet* result) +void SQLQueryHolderBase::SetPreparedResult(std::size_t index, PreparedResultSet* result) { if (result && !result->GetRowCount()) { @@ -66,7 +66,7 @@ SQLQueryHolderBase::~SQLQueryHolderBase() } } -void SQLQueryHolderBase::SetSize(size_t size) +void SQLQueryHolderBase::SetSize(std::size_t size) { /// to optimize push_back, reserve the number of queries about to be executed m_queries.resize(size); @@ -77,7 +77,7 @@ SQLQueryHolderTask::~SQLQueryHolderTask() = default; bool SQLQueryHolderTask::Execute() { /// execute all queries in the holder and pass the results - for (size_t i = 0; i < m_holder->m_queries.size(); ++i) + for (std::size_t i = 0; i < m_holder->m_queries.size(); ++i) if (PreparedStatementBase* stmt = m_holder->m_queries[i].first) m_holder->SetPreparedResult(i, m_conn->Query(stmt)); diff --git a/src/server/database/Database/QueryHolder.h b/src/server/database/Database/QueryHolder.h index 63994b487..2072d71ab 100644 --- a/src/server/database/Database/QueryHolder.h +++ b/src/server/database/Database/QueryHolder.h @@ -28,12 +28,12 @@ friend class SQLQueryHolderTask; public: SQLQueryHolderBase() = default; virtual ~SQLQueryHolderBase(); - void SetSize(size_t size); - PreparedQueryResult GetPreparedResult(size_t index) const; - void SetPreparedResult(size_t index, PreparedResultSet* result); + void SetSize(std::size_t size); + PreparedQueryResult GetPreparedResult(std::size_t index) const; + void SetPreparedResult(std::size_t index, PreparedResultSet* result); protected: - bool SetPreparedQueryImpl(size_t index, PreparedStatementBase* stmt); + bool SetPreparedQueryImpl(std::size_t index, PreparedStatementBase* stmt); private: std::vector> m_queries; @@ -43,7 +43,7 @@ template class SQLQueryHolder : public SQLQueryHolderBase { public: - bool SetPreparedQuery(size_t index, PreparedStatement* stmt) + bool SetPreparedQuery(std::size_t index, PreparedStatement* stmt) { return SetPreparedQueryImpl(index, stmt); } diff --git a/src/server/database/Logging/AppenderDB.cpp b/src/server/database/Logging/AppenderDB.cpp index 1878bb363..41758f815 100644 --- a/src/server/database/Logging/AppenderDB.cpp +++ b/src/server/database/Logging/AppenderDB.cpp @@ -19,6 +19,7 @@ #include "DatabaseEnv.h" #include "LogMessage.h" #include "PreparedStatement.h" +#include AppenderDB::AppenderDB(uint8 id, std::string const& name, LogLevel level, AppenderFlags /*flags*/, std::vector const& /*args*/) : Appender(id, name, level), realmId(0), enabled(false) { } diff --git a/src/server/database/Logging/AppenderDB.h b/src/server/database/Logging/AppenderDB.h index fbafc635c..7ec576955 100644 --- a/src/server/database/Logging/AppenderDB.h +++ b/src/server/database/Logging/AppenderDB.h @@ -19,6 +19,7 @@ #define APPENDERDB_H #include "Appender.h" +#include class AppenderDB : public Appender { diff --git a/src/server/database/Updater/UpdateFetcher.cpp b/src/server/database/Updater/UpdateFetcher.cpp index 3e128ebb5..720662ff6 100644 --- a/src/server/database/Updater/UpdateFetcher.cpp +++ b/src/server/database/Updater/UpdateFetcher.cpp @@ -240,8 +240,8 @@ UpdateResult UpdateFetcher::Update(bool const redundancyChecks, AppliedFileStorage applied = ReceiveAppliedFiles(); - size_t countRecentUpdates = 0; - size_t countArchivedUpdates = 0; + std::size_t countRecentUpdates = 0; + std::size_t countArchivedUpdates = 0; // Count updates for (auto const& entry : applied) @@ -255,7 +255,7 @@ UpdateResult UpdateFetcher::Update(bool const redundancyChecks, for (auto& entry : applied) hashToName.insert(std::make_pair(entry.second.hash, entry.first)); - size_t importedUpdates = 0; + std::size_t importedUpdates = 0; auto ApplyUpdateFile = [&](LocaleFileEntry const& sqlFile) { @@ -483,7 +483,7 @@ void UpdateFetcher::CleanUp(AppliedFileStorage const& storage) const return; std::stringstream update; - size_t remaining = storage.size(); + std::size_t remaining = storage.size(); update << "DELETE FROM `updates` WHERE `name` IN("; diff --git a/src/server/database/Updater/UpdateFetcher.h b/src/server/database/Updater/UpdateFetcher.h index ca9918f48..ca7d8c2d8 100644 --- a/src/server/database/Updater/UpdateFetcher.h +++ b/src/server/database/Updater/UpdateFetcher.h @@ -31,12 +31,12 @@ struct AC_DATABASE_API UpdateResult UpdateResult() : updated(0), recent(0), archived(0) { } - UpdateResult(size_t const updated_, size_t const recent_, size_t const archived_) + UpdateResult(std::size_t const updated_, std::size_t const recent_, std::size_t const archived_) : updated(updated_), recent(recent_), archived(archived_) { } - size_t updated; - size_t recent; - size_t archived; + std::size_t updated; + std::size_t recent; + std::size_t archived; }; class AC_DATABASE_API UpdateFetcher diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index a3d759a6d..2d8a1bd30 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -480,9 +480,9 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e) { - size_t paramsStructSize = [&]() -> size_t + std::size_t paramsStructSize = [&]() -> std::size_t { - constexpr size_t NO_PARAMS = size_t(0); + constexpr std::size_t NO_PARAMS = std::size_t(0); switch (e.event.type) { case SMART_EVENT_UPDATE_IC: return sizeof(SmartEvent::minMaxRepeat); @@ -584,11 +584,11 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e) } }(); - static size_t rawCount = sizeof(SmartEvent::raw) / sizeof(uint32); - size_t paramsCount = paramsStructSize / sizeof(uint32); + static std::size_t rawCount = sizeof(SmartEvent::raw) / sizeof(uint32); + std::size_t paramsCount = paramsStructSize / sizeof(uint32); bool valid = true; - for (size_t index = paramsCount; index < rawCount; index++) + for (std::size_t index = paramsCount; index < rawCount; index++) { uint32 value = ((uint32*)&e.event.raw)[index]; if (value != 0) @@ -604,9 +604,9 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e) bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) { - size_t paramsStructSize = [&]() -> size_t + std::size_t paramsStructSize = [&]() -> std::size_t { - constexpr size_t NO_PARAMS = size_t(0); + constexpr std::size_t NO_PARAMS = std::size_t(0); switch (e.action.type) { case SMART_ACTION_NONE: return NO_PARAMS; @@ -784,11 +784,11 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) } }(); - static size_t rawCount = sizeof(SmartAction::raw) / sizeof(uint32); - size_t paramsCount = paramsStructSize / sizeof(uint32); + static std::size_t rawCount = sizeof(SmartAction::raw) / sizeof(uint32); + std::size_t paramsCount = paramsStructSize / sizeof(uint32); bool valid = true; - for (size_t index = paramsCount; index < rawCount; index++) + for (std::size_t index = paramsCount; index < rawCount; index++) { uint32 value = ((uint32*)&e.action.raw)[index]; if (value != 0) @@ -804,9 +804,9 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) bool SmartAIMgr::CheckUnusedTargetParams(SmartScriptHolder const& e) { - size_t paramsStructSize = [&]() -> size_t + std::size_t paramsStructSize = [&]() -> std::size_t { - constexpr size_t NO_PARAMS = size_t(0); + constexpr std::size_t NO_PARAMS = std::size_t(0); switch (e.target.type) { case SMART_TARGET_NONE: return NO_PARAMS; @@ -848,11 +848,11 @@ bool SmartAIMgr::CheckUnusedTargetParams(SmartScriptHolder const& e) } }(); - static size_t rawCount = sizeof(SmartTarget::raw) / sizeof(uint32); - size_t paramsCount = paramsStructSize / sizeof(uint32); + static std::size_t rawCount = sizeof(SmartTarget::raw) / sizeof(uint32); + std::size_t paramsCount = paramsStructSize / sizeof(uint32); bool valid = true; - for (size_t index = paramsCount; index < rawCount; index++) + for (std::size_t index = paramsCount; index < rawCount; index++) { uint32 value = ((uint32*)&e.target.raw)[index]; if (value != 0) diff --git a/src/server/game/AI/enuminfo_CreatureAI.cpp b/src/server/game/AI/enuminfo_CreatureAI.cpp index 3cb4c7e15..12b2b20b8 100644 --- a/src/server/game/AI/enuminfo_CreatureAI.cpp +++ b/src/server/game/AI/enuminfo_CreatureAI.cpp @@ -40,10 +40,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(CreatureAI:: } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 4; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 4; } template <> -AC_API_EXPORT CreatureAI::EvadeReason EnumUtils::FromIndex(size_t index) +AC_API_EXPORT CreatureAI::EvadeReason EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -56,7 +56,7 @@ AC_API_EXPORT CreatureAI::EvadeReason EnumUtils::FromIn } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(CreatureAI::EvadeReason value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(CreatureAI::EvadeReason value) { switch (value) { diff --git a/src/server/game/ArenaSpectator/ArenaSpectator.cpp b/src/server/game/ArenaSpectator/ArenaSpectator.cpp index 049f2fcdc..fd4faf700 100644 --- a/src/server/game/ArenaSpectator/ArenaSpectator.cpp +++ b/src/server/game/ArenaSpectator/ArenaSpectator.cpp @@ -212,7 +212,7 @@ bool ArenaSpectator::HandleSpectatorWatchCommand(ChatHandler* handler, std::stri void ArenaSpectator::CreatePacket(WorldPacket& data, std::string const& message) { - size_t len = message.length(); + std::size_t len = message.length(); data.Initialize(SMSG_MESSAGECHAT, 1 + 4 + 8 + 4 + 8 + 4 + 1 + len + 1); data << uint8(CHAT_MSG_WHISPER); data << uint32(LANG_ADDON); diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h index e66a18411..2bac7b571 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.h +++ b/src/server/game/Battlegrounds/ArenaTeam.h @@ -167,7 +167,7 @@ public: // and this method removes given record from list. So invalid reference can happen. void DelMember(ObjectGuid guid, bool cleanDb); - [[nodiscard]] size_t GetMembersSize() const { return Members.size(); } + [[nodiscard]] std::size_t GetMembersSize() const { return Members.size(); } [[nodiscard]] bool Empty() const { return Members.empty(); } MemberList::iterator m_membersBegin() { return Members.begin(); } MemberList::iterator m_membersEnd() { return Members.end(); } diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index db6b96b5b..4874cf157 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -608,7 +608,7 @@ void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid *data << uint32(0); // unk (count?) else // battleground { - size_t count_pos = data->wpos(); + std::size_t count_pos = data->wpos(); *data << uint32(0); // number of bg instances auto const& it = bgDataStore.find(bgTypeId); diff --git a/src/server/game/Battlegrounds/enuminfo_ArenaTeam.cpp b/src/server/game/Battlegrounds/enuminfo_ArenaTeam.cpp index 078185dd0..952a2458e 100644 --- a/src/server/game/Battlegrounds/enuminfo_ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/enuminfo_ArenaTeam.cpp @@ -39,10 +39,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(ArenaTeamTypes value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 3; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 3; } template <> -AC_API_EXPORT ArenaTeamTypes EnumUtils::FromIndex(size_t index) +AC_API_EXPORT ArenaTeamTypes EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -54,7 +54,7 @@ AC_API_EXPORT ArenaTeamTypes EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(ArenaTeamTypes value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(ArenaTeamTypes value) { switch (value) { diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index 5982599fd..12cdf0ae4 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -182,7 +182,7 @@ void CalendarMgr::RemoveEvent(CalendarEvent* calendarEvent, ObjectGuid remover) MailDraft mail(calendarEvent->BuildCalendarMailSubject(remover), calendarEvent->BuildCalendarMailBody()); CalendarInviteStore& eventInvites = _invites[calendarEvent->GetEventId()]; - for (size_t i = 0; i < eventInvites.size(); ++i) + for (std::size_t i = 0; i < eventInvites.size(); ++i) { CalendarInvite* invite = eventInvites[i]; stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CALENDAR_INVITE); diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 73b0a5e14..8d459d4ec 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -706,7 +706,7 @@ void Channel::List(Player const* player) data << GetName(); // channel name data << uint8(GetFlags()); // channel flags? - size_t pos = data.wpos(); + std::size_t pos = data.wpos(); data << uint32(0); // size of list, placeholder uint32 count = 0; diff --git a/src/server/game/Chat/Channels/enuminfo_Channel.cpp b/src/server/game/Chat/Channels/enuminfo_Channel.cpp index 137aa2e9e..b6ad0335d 100644 --- a/src/server/game/Chat/Channels/enuminfo_Channel.cpp +++ b/src/server/game/Chat/Channels/enuminfo_Channel.cpp @@ -72,10 +72,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(ChatNotify value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 36; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 36; } template <> -AC_API_EXPORT ChatNotify EnumUtils::FromIndex(size_t index) +AC_API_EXPORT ChatNotify EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -120,7 +120,7 @@ AC_API_EXPORT ChatNotify EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(ChatNotify value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(ChatNotify value) { switch (value) { diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 9cd64c8a1..764ef3c70 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -145,7 +145,7 @@ void ChatHandler::SendSysMessage(std::string_view str, bool escapeCharacters) std::vector tokens = Acore::Tokenize(msg, '|', true); std::ostringstream stream; - for (size_t i = 0; i < tokens.size() - 1; ++i) + for (std::size_t i = 0; i < tokens.size() - 1; ++i) stream << tokens[i] << "||"; stream << tokens[tokens.size() - 1]; @@ -240,11 +240,11 @@ bool ChatHandler::ParseCommands(std::string_view text) return _ParseCommands(text.substr(1)); } -size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, +std::size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const& senderName /*= ""*/, std::string const& receiverName /*= ""*/, uint32 achievementId /*= 0*/, bool gmMessage /*= false*/, std::string const& channelName /*= ""*/) { - size_t receiverGUIDPos = 0; + std::size_t receiverGUIDPos = 0; data.Initialize(!gmMessage ? SMSG_MESSAGECHAT : SMSG_GM_MESSAGECHAT); data << uint8(chatType); data << int32(language); @@ -320,7 +320,7 @@ size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Languag return receiverGUIDPos; } -size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string_view message, +std::size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string_view message, uint32 achievementId /*= 0*/, std::string const& channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/) { ObjectGuid senderGUID; @@ -1022,7 +1022,7 @@ void AddonChannelCommandHandler::SendSysMessage(std::string_view str, bool escap std::string body(str); if (escapeCharacters) boost::replace_all(body, "|", "||"); - size_t pos, lastpos; + std::size_t pos, lastpos; for (lastpos = 0, pos = body.find('\n', lastpos); pos != std::string::npos; lastpos = pos + 1, pos = body.find('\n', lastpos)) { std::string line(msg); diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 17642a46d..61dc38cda 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -42,12 +42,12 @@ public: virtual ~ChatHandler() { } // Builds chat packet and returns receiver guid position in the packet to substitute in whisper builders - static size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, + static std::size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const& senderName = "", std::string const& receiverName = "", uint32 achievementId = 0, bool gmMessage = false, std::string const& channelName = ""); // Builds chat packet and returns receiver guid position in the packet to substitute in whisper builders - static size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string_view message, uint32 achievementId = 0, std::string const& channelName = "", LocaleConstant locale = DEFAULT_LOCALE); + static std::size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string_view message, uint32 achievementId = 0, std::string const& channelName = "", LocaleConstant locale = DEFAULT_LOCALE); static char* LineFromMessage(char*& pos) { char* start = strtok(pos, "\n"); pos = nullptr; return start; } diff --git a/src/server/game/Chat/ChatCommands/ChatCommand.cpp b/src/server/game/Chat/ChatCommands/ChatCommand.cpp index 4ff2c34fb..916b83919 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommand.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommand.cpp @@ -58,7 +58,7 @@ void Acore::Impl::ChatCommands::ChatCommandNode::LoadFromBuilder(ChatCommandBuil std::vector const tokens = Acore::Tokenize(builder._name, COMMAND_DELIMITER, false); ASSERT(!tokens.empty(), "Invalid command name '{}'.", builder._name); ChatSubCommandMap* subMap = ↦ - for (size_t i = 0, n = (tokens.size() - 1); i < n; ++i) + for (std::size_t i = 0, n = (tokens.size() - 1); i < n; ++i) subMap = &((*subMap)[tokens[i]]._subCommands); ((*subMap)[tokens.back()]).LoadFromBuilder(builder); } diff --git a/src/server/game/Chat/ChatCommands/ChatCommand.h b/src/server/game/Chat/ChatCommands/ChatCommand.h index 4f51206be..079f40a50 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommand.h +++ b/src/server/game/Chat/ChatCommands/ChatCommand.h @@ -55,10 +55,10 @@ namespace Acore::Impl::ChatCommands // ConsumeFromOffset contains the bounds check for offset, then hands off to MultiConsumer // the call stack is MultiConsumer -> ConsumeFromOffset -> MultiConsumer -> ConsumeFromOffset etc // MultiConsumer goes into ArgInfo for parsing on each iteration - template + template ChatCommandResult ConsumeFromOffset(Tuple&, ChatHandler const* handler, std::string_view args); - template + template struct MultiConsumer { static ChatCommandResult TryConsumeTo(Tuple& tuple, ChatHandler const* handler, std::string_view args) @@ -71,7 +71,7 @@ namespace Acore::Impl::ChatCommands } }; - template + template struct MultiConsumer, offset> { static ChatCommandResult TryConsumeTo(Tuple& tuple, ChatHandler const* handler, std::string_view args) @@ -102,7 +102,7 @@ namespace Acore::Impl::ChatCommands } }; - template + template ChatCommandResult ConsumeFromOffset([[maybe_unused]] Tuple& tuple, [[maybe_unused]] ChatHandler const* handler, std::string_view args) { if constexpr (offset < std::tuple_size_v) diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h index d151dcc27..524cc608e 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h @@ -237,7 +237,7 @@ namespace Acore::Impl::ChatCommands }; // fixed-size array - template + template struct ArgInfo, void> { static ChatCommandResult TryConsume(std::array& val, ChatHandler const* handler, std::string_view args) @@ -255,9 +255,9 @@ namespace Acore::Impl::ChatCommands struct ArgInfo> { using V = std::variant; - static constexpr size_t N = std::variant_size_v; + static constexpr std::size_t N = std::variant_size_v; - template + template static ChatCommandResult TryAtIndex([[maybe_unused]] Acore::ChatCommands::Variant& val, [[maybe_unused]] ChatHandler const* handler, [[maybe_unused]] std::string_view args) { if constexpr (I < N) diff --git a/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h b/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h index dac07038d..f5b4cf5af 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h @@ -55,10 +55,10 @@ namespace Acore::Impl::ChatCommands inline TokenizeResult tokenize(std::string_view args) { TokenizeResult result; - if (size_t delimPos = args.find(COMMAND_DELIMITER); delimPos != std::string_view::npos) + if (std::size_t delimPos = args.find(COMMAND_DELIMITER); delimPos != std::string_view::npos) { result.token = args.substr(0, delimPos); - if (size_t tailPos = args.find_first_not_of(COMMAND_DELIMITER, delimPos); tailPos != std::string_view::npos) + if (std::size_t tailPos = args.find_first_not_of(COMMAND_DELIMITER, delimPos); tailPos != std::string_view::npos) result.tail = args.substr(tailPos); } else diff --git a/src/server/game/Chat/ChatCommands/ChatCommandTags.cpp b/src/server/game/Chat/ChatCommands/ChatCommandTags.cpp index e9510e2f9..57e678d13 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandTags.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommandTags.cpp @@ -34,7 +34,7 @@ ChatCommandResult Acore::ChatCommands::QuotedString::TryConsume(ChatHandler cons return ArgInfo::TryConsume(*this, handler, args); char const QUOTE = args[0]; - for (size_t i = 1; i < args.length(); ++i) + for (std::size_t i = 1; i < args.length(); ++i) { if (args[i] == QUOTE) { diff --git a/src/server/game/Chat/ChatCommands/ChatCommandTags.h b/src/server/game/Chat/ChatCommands/ChatCommandTags.h index bfc61504f..f5c25a639 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandTags.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandTags.h @@ -51,8 +51,8 @@ namespace Acore::Impl::ChatCommands using type = typename T::value_type; }; - template - inline constexpr char GetChar(char const (&s)[N], size_t i) + template + inline constexpr char GetChar(char const (&s)[N], std::size_t i) { static_assert(N <= 25, "The EXACT_SEQUENCE macro can only be used with up to 25 character long literals. Specify them char-by-char (null terminated) as parameters to ExactSequence<> instead."); return i >= N ? '\0' : s[i]; @@ -273,7 +273,7 @@ namespace Acore::ChatCommands } template - operator std::enable_if_t && std::is_convertible_v, size_t>() const + operator std::enable_if_t && std::is_convertible_v, std::size_t>() const { return operator*(); } @@ -284,9 +284,9 @@ namespace Acore::ChatCommands template Variant& operator=(T&& arg) { base::operator=(std::forward(arg)); return *this; } - template + template constexpr decltype(auto) get() { return std::get(static_cast(*this)); } - template + template constexpr decltype(auto) get() const { return std::get(static_cast(*this)); } template constexpr decltype(auto) get() { return std::get(static_cast(*this)); } diff --git a/src/server/game/Chat/HyperlinkTags.cpp b/src/server/game/Chat/HyperlinkTags.cpp index 49efa0b2f..342ba3035 100644 --- a/src/server/game/Chat/HyperlinkTags.cpp +++ b/src/server/game/Chat/HyperlinkTags.cpp @@ -35,7 +35,7 @@ class HyperlinkDataTokenizer if (IsEmpty()) return false; - if (size_t off = _str.find(HYPERLINK_DATA_DELIMITER); off != std::string_view::npos) + if (std::size_t off = _str.find(HYPERLINK_DATA_DELIMITER); off != std::string_view::npos) { if (!Acore::Hyperlinks::LinkTags::base_tag::StoreTo(val, _str.substr(0, off))) return false; diff --git a/src/server/game/Chat/Hyperlinks.cpp b/src/server/game/Chat/Hyperlinks.cpp index b55f36191..6cc124e80 100644 --- a/src/server/game/Chat/Hyperlinks.cpp +++ b/src/server/game/Chat/Hyperlinks.cpp @@ -61,7 +61,7 @@ HyperlinkInfo Acore::Hyperlinks::ParseSingleHyperlink(std::string_view str) str.remove_prefix(2); // tag+data part follows - if (size_t delimPos = str.find('|'); delimPos != std::string_view::npos) + if (std::size_t delimPos = str.find('|'); delimPos != std::string_view::npos) { tag = str.substr(0, delimPos); str.remove_prefix(delimPos+1); @@ -70,7 +70,7 @@ HyperlinkInfo Acore::Hyperlinks::ParseSingleHyperlink(std::string_view str) return {}; // split tag if : is present (data separator) - if (size_t dataStart = tag.find(':'); dataStart != std::string_view::npos) + if (std::size_t dataStart = tag.find(':'); dataStart != std::string_view::npos) { data = tag.substr(dataStart+1); tag = tag.substr(0, dataStart); @@ -81,7 +81,7 @@ HyperlinkInfo Acore::Hyperlinks::ParseSingleHyperlink(std::string_view str) return {}; str.remove_prefix(1); // skip to final | - if (size_t end = str.find('|'); end != std::string_view::npos) + if (std::size_t end = str.find('|'); end != std::string_view::npos) { // check end tag if (str.substr(end, 4) != "|h|r") diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 077ef5d5e..f0b1f75f7 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -337,7 +337,7 @@ void PlayerMenu::SendQuestGiverQuestList(QEmote const& eEmote, std::string const data << uint32(eEmote._Emote); // NPC emote } - size_t count_pos = data.wpos(); + std::size_t count_pos = data.wpos(); data << uint8(0); uint32 count = 0; diff --git a/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp b/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp index 80a6de93a..b1af41ce3 100644 --- a/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp +++ b/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp @@ -68,10 +68,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(CreatureFlagsExtr } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT CreatureFlagsExtra EnumUtils::FromIndex(size_t index) +AC_API_EXPORT CreatureFlagsExtra EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -112,7 +112,7 @@ AC_API_EXPORT CreatureFlagsExtra EnumUtils::FromIndex(size_t } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(CreatureFlagsExtra value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(CreatureFlagsExtra value) { switch (value) { diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 9311e9202..7c62b7798 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -48,7 +48,7 @@ void AddItemsSetItem(Player* player, Item* item) ItemSetEffect* eff = nullptr; - for (size_t x = 0; x < player->ItemSetEff.size(); ++x) + for (std::size_t x = 0; x < player->ItemSetEff.size(); ++x) { if (player->ItemSetEff[x] && player->ItemSetEff[x]->setid == setid) { @@ -62,7 +62,7 @@ void AddItemsSetItem(Player* player, Item* item) eff = new ItemSetEffect(); eff->setid = setid; - size_t x = 0; + std::size_t x = 0; for (; x < player->ItemSetEff.size(); ++x) if (!player->ItemSetEff[x]) break; @@ -129,7 +129,7 @@ void RemoveItemsSetItem(Player* player, ItemTemplate const* proto) } ItemSetEffect* eff = nullptr; - size_t setindex = 0; + std::size_t setindex = 0; for (; setindex < player->ItemSetEff.size(); setindex++) { if (player->ItemSetEff[setindex] && player->ItemSetEff[setindex]->setid == setid) diff --git a/src/server/game/Entities/Item/enuminfo_Item.cpp b/src/server/game/Entities/Item/enuminfo_Item.cpp index a7b1ecc35..54edf959b 100644 --- a/src/server/game/Entities/Item/enuminfo_Item.cpp +++ b/src/server/game/Entities/Item/enuminfo_Item.cpp @@ -124,10 +124,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(InventoryResult valu } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 88; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 88; } template <> -AC_API_EXPORT InventoryResult EnumUtils::FromIndex(size_t index) +AC_API_EXPORT InventoryResult EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -224,7 +224,7 @@ AC_API_EXPORT InventoryResult EnumUtils::FromIndex(size_t index } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(InventoryResult value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(InventoryResult value) { switch (value) { @@ -342,10 +342,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(BuyResult value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 9; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 9; } template <> -AC_API_EXPORT BuyResult EnumUtils::FromIndex(size_t index) +AC_API_EXPORT BuyResult EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -363,7 +363,7 @@ AC_API_EXPORT BuyResult EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(BuyResult value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(BuyResult value) { switch (value) { @@ -402,10 +402,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SellResult value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 9; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 9; } template <> -AC_API_EXPORT SellResult EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SellResult EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -423,7 +423,7 @@ AC_API_EXPORT SellResult EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SellResult value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SellResult value) { switch (value) { diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index b419531a6..3147c41ab 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -31,6 +31,7 @@ #include "Position.h" #include "UpdateData.h" #include "UpdateMask.h" +#include #include #include #include diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index 94363d6f5..eb69c7d12 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -321,7 +321,7 @@ namespace std struct hash { public: - size_t operator()(ObjectGuid const& key) const + std::size_t operator()(ObjectGuid const& key) const { return std::hash()(key.GetRawValue()); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2beff7936..9bacc9133 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -434,7 +434,7 @@ Player::~Player() delete PlayerTalkClass; - for (size_t x = 0; x < ItemSetEff.size(); x++) + for (std::size_t x = 0; x < ItemSetEff.size(); x++) delete ItemSetEff[x]; delete m_declinedname; @@ -2749,7 +2749,7 @@ void Player::SendInitialSpells() WorldPacket data(SMSG_INITIAL_SPELLS, (1 + 2 + 4 * m_spells.size() + 2 + m_spellCooldowns.size() * (4 + 2 + 2 + 4 + 4))); data << uint8(0); - size_t countPos = data.wpos(); + std::size_t countPos = data.wpos(); data << uint16(spellCount); // spell count placeholder for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr) @@ -8153,7 +8153,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) data << uint32(mapid); // mapid data << uint32(zoneid); // zone id data << uint32(areaid); // area id, new 2.1.0 - size_t countPos = data.wpos(); + std::size_t countPos = data.wpos(); data << uint16(0); // count of uint64 blocks data << uint32(0x8d8) << uint32(0x0); // 1 data << uint32(0x8d7) << uint32(0x0); // 2 @@ -9442,7 +9442,7 @@ void Player::PetSpellInitialize() // action bar loop charmInfo->BuildActionBar(&data); - size_t spellsCountPos = data.wpos(); + std::size_t spellsCountPos = data.wpos(); // spells count uint8 addlist = 0; @@ -14270,7 +14270,7 @@ void Player::BuildPlayerTalentsInfoData(WorldPacket* data) for (uint32 specIdx = 0; specIdx < m_specsCount; ++specIdx) { uint8 talentIdCount = 0; - size_t pos = data->wpos(); + std::size_t pos = data->wpos(); *data << uint8(talentIdCount); // [PH], talentIdCount const PlayerTalentMap& talentMap = GetTalentMap(); @@ -14295,11 +14295,11 @@ void Player::BuildPlayerTalentsInfoData(WorldPacket* data) void Player::BuildPetTalentsInfoData(WorldPacket* data) { uint32 unspentTalentPoints = 0; - size_t pointsPos = data->wpos(); + std::size_t pointsPos = data->wpos(); *data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints uint8 talentIdCount = 0; - size_t countPos = data->wpos(); + std::size_t countPos = data->wpos(); *data << uint8(talentIdCount); // [PH], talentIdCount Pet* pet = GetPet(); @@ -14378,7 +14378,7 @@ void Player::SendTalentsInfoData(bool pet) void Player::BuildEnchantmentsInfoData(WorldPacket* data) { uint32 slotUsedMask = 0; - size_t slotUsedMaskPos = data->wpos(); + std::size_t slotUsedMaskPos = data->wpos(); *data << uint32(slotUsedMask); // slotUsedMask < 0x80000 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) @@ -14393,7 +14393,7 @@ void Player::BuildEnchantmentsInfoData(WorldPacket* data) *data << uint32(item->GetEntry()); // item entry uint16 enchantmentMask = 0; - size_t enchantmentMaskPos = data->wpos(); + std::size_t enchantmentMaskPos = data->wpos(); *data << uint16(enchantmentMask); // enchantmentMask < 0x1000 for (uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j) @@ -14422,7 +14422,7 @@ void Player::SendEquipmentSetList() { uint32 count = 0; WorldPacket data(SMSG_EQUIPMENT_SET_LIST, 4); - size_t count_pos = data.wpos(); + std::size_t count_pos = data.wpos(); data << uint32(count); // count placeholder for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index d9ab3e60b..c888310b0 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1609,7 +1609,7 @@ public: QuestStatusMap& getQuestStatusMap() { return m_QuestStatus; } QuestStatusSaveMap& GetQuestStatusSaveMap() { return m_QuestStatusSave; } - [[nodiscard]] size_t GetRewardedQuestCount() const { return m_RewardedQuests.size(); } + [[nodiscard]] std::size_t GetRewardedQuestCount() const { return m_RewardedQuests.size(); } [[nodiscard]] bool IsQuestRewarded(uint32 quest_id) const { return m_RewardedQuests.find(quest_id) != m_RewardedQuests.end(); diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index eec6bd9d3..4fcdc5602 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -6537,7 +6537,7 @@ void Player::SendRaidInfo() WorldPacket data(SMSG_RAID_INSTANCE_INFO, 4); - size_t p_counter = data.wpos(); + std::size_t p_counter = data.wpos(); data << uint32(counter); // placeholder time_t now = GameTime::GetGameTime().count(); @@ -7318,7 +7318,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans) return; ObjectGuid::LowType lowGuid = GetGUID().GetCounter(); - for (size_t i = 0; i < m_itemUpdateQueue.size(); ++i) + for (std::size_t i = 0; i < m_itemUpdateQueue.size(); ++i) { Item* item = m_itemUpdateQueue[i]; if (!item) diff --git a/src/server/game/Entities/Player/PlayerTaxi.cpp b/src/server/game/Entities/Player/PlayerTaxi.cpp index 36fda1f9c..9c56f5824 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.cpp +++ b/src/server/game/Entities/Player/PlayerTaxi.cpp @@ -170,7 +170,7 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, TeamI return false; } - for (size_t i = 1; i < m_TaxiDestinations.size(); ++i) + for (std::size_t i = 1; i < m_TaxiDestinations.size(); ++i) { uint32 cost; uint32 path; @@ -202,7 +202,7 @@ std::string PlayerTaxi::SaveTaxiDestinationsToString() std::ostringstream ss; ss << m_flightMasterFactionId << ' '; - for (size_t i = 0; i < m_TaxiDestinations.size(); ++i) + for (std::size_t i = 0; i < m_TaxiDestinations.size(); ++i) { ss << m_TaxiDestinations[i] << ' '; } diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index 263033a08..c8fc7a849 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -864,7 +864,7 @@ bool Player::UpdateFishingSkill() // bonus abilities in sSkillLineAbilityStore // Used only to avoid scan DBC at each skill grow static uint32 bonusSkillLevels[] = {75, 150, 225, 300, 375, 450}; -static const size_t bonusSkillLevelsSize = +static const std::size_t bonusSkillLevelsSize = sizeof(bonusSkillLevels) / sizeof(uint32); bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step) @@ -908,7 +908,7 @@ bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step) if (itr->second.uState != SKILL_NEW) itr->second.uState = SKILL_CHANGED; - for (size_t i = 0; i < bonusSkillLevelsSize; ++i) + for (std::size_t i = 0; i < bonusSkillLevelsSize; ++i) { uint32 bsl = bonusSkillLevels[i]; if (SkillValue < bsl && new_value >= bsl) @@ -1322,7 +1322,7 @@ void Player::UpdateEquipSpellsAtFormChange() } // item set bonuses not dependent from item broken state - for (size_t setindex = 0; setindex < ItemSetEff.size(); ++setindex) + for (std::size_t setindex = 0; setindex < ItemSetEff.size(); ++setindex) { ItemSetEffect* eff = ItemSetEff[setindex]; if (!eff) diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index 487e41117..e66f52629 100644 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -132,7 +132,7 @@ void PlayerSocial::SendSocialList(Player* player, uint32 flags) WorldPacket data(SMSG_CONTACT_LIST, (4 + 4 + m_playerSocialMap.size() * 25)); // just can guess size data << uint32(flags); // 0x1 = Friendlist update. 0x2 = Ignorelist update. 0x4 = Mutelist update. - size_t countPos = data.wpos(); + std::size_t countPos = data.wpos(); data << uint32(0); // contacts count placeholder for (auto& itr : m_playerSocialMap) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f56404dc6..5293d76bf 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6467,7 +6467,7 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) ++count; } - size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12; + std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12; WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size data << uint32(damageInfo->HitInfo); data << damageInfo->attacker->GetPackGUID(); diff --git a/src/server/game/Entities/Unit/enuminfo_Unit.cpp b/src/server/game/Entities/Unit/enuminfo_Unit.cpp index a3c4938c6..01747bdb6 100644 --- a/src/server/game/Entities/Unit/enuminfo_Unit.cpp +++ b/src/server/game/Entities/Unit/enuminfo_Unit.cpp @@ -69,10 +69,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(UnitFlags value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 33; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 33; } template <> -AC_API_EXPORT UnitFlags EnumUtils::FromIndex(size_t index) +AC_API_EXPORT UnitFlags EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -114,7 +114,7 @@ AC_API_EXPORT UnitFlags EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(UnitFlags value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(UnitFlags value) { switch (value) { @@ -196,10 +196,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(NPCFlags value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 28; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 28; } template <> -AC_API_EXPORT NPCFlags EnumUtils::FromIndex(size_t index) +AC_API_EXPORT NPCFlags EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -236,7 +236,7 @@ AC_API_EXPORT NPCFlags EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(NPCFlags value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(NPCFlags value) { switch (value) { diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 458dfcfc3..2b07f99ba 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -381,7 +381,7 @@ void ObjectMgr::AddLocaleString(std::string&& s, LocaleConstant locale, std::vec { if (!s.empty()) { - if (data.size() <= size_t(locale)) + if (data.size() <= std::size_t(locale)) data.resize(locale + 1); data[locale] = std::move(s); @@ -5514,9 +5514,9 @@ void ObjectMgr::LoadEventScripts() if (spell->Effects[j].MiscValue) evt_scripts.insert(spell->Effects[j].MiscValue); - for (size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx) + for (std::size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx) { - for (size_t node_idx = 0; node_idx < sTaxiPathNodesByPath[path_idx].size(); ++node_idx) + for (std::size_t node_idx = 0; node_idx < sTaxiPathNodesByPath[path_idx].size(); ++node_idx) { TaxiPathNodeEntry const* node = sTaxiPathNodesByPath[path_idx][node_idx]; @@ -8388,7 +8388,7 @@ uint8 ObjectMgr::CheckPlayerName(std::string_view name, bool create) // Check for three consecutive letters wstrToLower(wname); - for (size_t i = 2; i < wname.size(); ++i) + for (std::size_t i = 2; i < wname.size(); ++i) if (wname[i] == wname[i - 1] && wname[i] == wname[i - 2]) return CHAR_NAME_THREE_CONSECUTIVE; @@ -8581,7 +8581,7 @@ char const* ObjectMgr::GetAcoreString(uint32 entry, LocaleConstant locale) const { if (AcoreString const* ts = GetAcoreString(entry)) { - if (ts->Content.size() > size_t(locale) && !ts->Content[locale].empty()) + if (ts->Content.size() > std::size_t(locale) && !ts->Content[locale].empty()) return ts->Content[locale].c_str(); return ts->Content[DEFAULT_LOCALE].c_str(); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 17d6d480f..de9c44089 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -458,13 +458,13 @@ struct BroadcastText { if (gender == GENDER_FEMALE && (forceGender || !FemaleText[DEFAULT_LOCALE].empty())) { - if (FemaleText.size() > size_t(locale) && !FemaleText[locale].empty()) + if (FemaleText.size() > std::size_t(locale) && !FemaleText[locale].empty()) return FemaleText[locale]; return FemaleText[DEFAULT_LOCALE]; } // else if (gender == GENDER_MALE) { - if (MaleText.size() > size_t(locale) && !MaleText[locale].empty()) + if (MaleText.size() > std::size_t(locale) && !MaleText[locale].empty()) return MaleText[locale]; return MaleText[DEFAULT_LOCALE]; } @@ -1414,7 +1414,7 @@ public: } static void AddLocaleString(std::string&& s, LocaleConstant locale, std::vector& data); - static std::string_view GetLocaleString(std::vector const& data, size_t locale) + static std::string_view GetLocaleString(std::vector const& data, std::size_t locale) { if (locale < data.size()) return data[locale]; @@ -1423,7 +1423,7 @@ public: } static inline void GetLocaleString(const std::vector& data, int loc_idx, std::string& value) { - if (data.size() > size_t(loc_idx) && !data[loc_idx].empty()) + if (data.size() > std::size_t(loc_idx) && !data[loc_idx].empty()) value = data[loc_idx]; } diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index c6ec70d1b..3440bf8af 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1709,7 +1709,7 @@ namespace Acore ~LocalizedPacketDo() { - for (size_t i = 0; i < i_data_cache.size(); ++i) + for (std::size_t i = 0; i < i_data_cache.size(); ++i) delete i_data_cache[i]; } void operator()(Player* p); @@ -1729,8 +1729,8 @@ namespace Acore ~LocalizedPacketListDo() { - for (size_t i = 0; i < i_data_cache.size(); ++i) - for (size_t j = 0; j < i_data_cache[i].size(); ++j) + for (std::size_t i = 0; i < i_data_cache.size(); ++i) + for (std::size_t j = 0; j < i_data_cache[i].size(); ++j) delete i_data_cache[i][j]; } void operator()(Player* p); diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index 3cd1b77dc..bc5e8e2fa 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -580,7 +580,7 @@ void Acore::LocalizedPacketListDo::operator()(Player* p) else data_list = &i_data_cache[cache_idx]; - for (size_t i = 0; i < data_list->size(); ++i) + for (std::size_t i = 0; i < data_list->size(); ++i) p->SendDirectMessage((*data_list)[i]); } diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 43b8d5c6f..8cf5dda04 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -1024,7 +1024,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData) data << uint16(player->GetPositionY()); // GROUP_UPDATE_FLAG_POSITION uint64 auraMask = 0; - size_t maskPos = data.wpos(); + std::size_t maskPos = data.wpos(); data << uint64(auraMask); // placeholder for (uint8 i = 0; i < MAX_AURAS_GROUP_UPDATE; ++i) { diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 7307b6e8f..afe228b4e 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1074,7 +1074,7 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry) WorldPacket data(SMSG_LIST_INVENTORY, 8 + 1 + itemCount * 8 * 4); data << vendorGuid; - size_t countPos = data.wpos(); + std::size_t countPos = data.wpos(); data << uint8(count); float discountMod = _player->GetReputationPriceDiscount(vendor); diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 9c71d98bc..ab9179d61 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -660,7 +660,7 @@ void WorldSession::HandleGetMailList(WorldPacket& recvData) uint8 item_count = uint8(mail->items.size()); // max count is MAX_MAIL_ITEMS (12) - size_t next_mail_size = 2 + 4 + 1 + (mail->messageType == MAIL_NORMAL ? 8 : 4) + 4 * 8 + (mail->subject.size() + 1) + (mail->body.size() + 1) + 1 + item_count * (1 + 4 + 4 + MAX_INSPECTED_ENCHANTMENT_SLOT * 3 * 4 + 4 + 4 + 4 + 4 + 4 + 4 + 1); + std::size_t next_mail_size = 2 + 4 + 1 + (mail->messageType == MAIL_NORMAL ? 8 : 4) + 4 * 8 + (mail->subject.size() + 1) + (mail->body.size() + 1) + 1 + item_count * (1 + 4 + 4 + MAX_INSPECTED_ENCHANTMENT_SLOT * 3 * 4 + 4 + 4 + 4 + 4 + 4 + 4 + 1); if (data.wpos() + next_mail_size > MAX_NETCLIENT_PACKET_SIZE) { diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 237ccf166..b226b9ed0 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -124,7 +124,7 @@ void WorldSession::SendTrainerList(ObjectGuid guid, const std::string& strTitle) data << guid; data << uint32(trainer_spells->trainerType); - size_t count_pos = data.wpos(); + std::size_t count_pos = data.wpos(); data << uint32(trainer_spells->spellList.size()); // reputation discount @@ -483,7 +483,7 @@ void WorldSession::SendStablePet(ObjectGuid guid) WorldPacket data(MSG_LIST_STABLED_PETS, 200); // guess size data << guid; - size_t wpos = data.wpos(); + std::size_t wpos = data.wpos(); data << uint8(0); // place holder for slot show number PetStable* petStable = GetPlayer()->GetPetStable(); diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index f38df27fc..0e718484b 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -149,10 +149,10 @@ void WorldSession::HandleCreatureQueryOpcode(WorldPacket& recvData) CreatureQuestItemList const* items = sObjectMgr->GetCreatureQuestItemList(entry); if (items) - for (size_t i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) + for (std::size_t i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) data << (i < items->size() ? uint32((*items)[i]) : uint32(0)); else - for (size_t i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) + for (std::size_t i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) data << uint32(0); data << uint32(ci->movementId); // CreatureMovementInfo.dbc @@ -210,10 +210,10 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPacket& recvData) GameObjectQuestItemList const* items = sObjectMgr->GetGameObjectQuestItemList(entry); if (items) - for (size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) + for (std::size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) data << (i < items->size() ? uint32((*items)[i]) : uint32(0)); else - for (size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) + for (std::size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) data << uint32(0); SendPacket(&data); diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 18ce2e57d..c9555f414 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -641,7 +641,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket void WorldSession::HandleQueryQuestsCompleted(WorldPacket& /*recvData*/) { - size_t rew_count = _player->GetRewardedQuestCount(); + std::size_t rew_count = _player->GetRewardedQuestCount(); WorldPacket data(SMSG_QUERY_QUESTS_COMPLETED_RESPONSE, 4 + 4 * rew_count); data << uint32(rew_count); diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 5284e5554..d85a49194 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -1007,7 +1007,7 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv) b << uint32(l.gold); //gold - size_t count_pos = b.wpos(); // pos of item count byte + std::size_t count_pos = b.wpos(); // pos of item count byte b << uint8(0); // item count placeholder switch (lv.permission) @@ -1546,7 +1546,7 @@ LootTemplate::~LootTemplate() Entries.pop_back(); } - for (size_t i = 0; i < Groups.size(); ++i) + for (std::size_t i = 0; i < Groups.size(); ++i) delete Groups[i]; Groups.clear(); } diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 168d54111..c4410d384 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -651,7 +651,7 @@ public: _updateObjects.erase(obj); } - size_t GetActiveNonPlayersCount() const + std::size_t GetActiveNonPlayersCount() const { return m_activeNonPlayers.size(); } diff --git a/src/server/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp index 952ee8751..552b48d7e 100644 --- a/src/server/game/Maps/MapUpdater.cpp +++ b/src/server/game/Maps/MapUpdater.cpp @@ -71,10 +71,10 @@ MapUpdater::MapUpdater(): pending_requests(0) { } -void MapUpdater::activate(size_t num_threads) +void MapUpdater::activate(std::size_t num_threads) { _workerThreads.reserve(num_threads); - for (size_t i = 0; i < num_threads; ++i) + for (std::size_t i = 0; i < num_threads; ++i) { _workerThreads.push_back(std::thread(&MapUpdater::WorkerThread, this)); } diff --git a/src/server/game/Maps/MapUpdater.h b/src/server/game/Maps/MapUpdater.h index 59b4f0e1a..617e1c536 100644 --- a/src/server/game/Maps/MapUpdater.h +++ b/src/server/game/Maps/MapUpdater.h @@ -36,7 +36,7 @@ public: void schedule_update(Map& map, uint32 diff, uint32 s_diff); void schedule_lfg_update(uint32 diff); void wait(); - void activate(size_t num_threads); + void activate(std::size_t num_threads); void deactivate(); bool activated(); void update_finished(); @@ -51,7 +51,7 @@ private: std::mutex _lock; std::condition_variable _condition; - size_t pending_requests; + std::size_t pending_requests; }; #endif //_MAP_UPDATER_H_INCLUDED diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp index e6ad171d3..faeef233e 100644 --- a/src/server/game/Maps/TransportMgr.cpp +++ b/src/server/game/Maps/TransportMgr.cpp @@ -25,7 +25,7 @@ TransportTemplate::~TransportTemplate() { // Collect shared pointers into a set to avoid deleting the same memory more than once std::set splines; - for (size_t i = 0; i < keyFrames.size(); ++i) + for (std::size_t i = 0; i < keyFrames.size(); ++i) splines.insert(keyFrames[i].Spline); for (std::set::iterator itr = splines.begin(); itr != splines.end(); ++itr) @@ -118,7 +118,7 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl std::vector& keyFrames = transport->keyFrames; Movement::PointsArray splinePath, allPoints; bool mapChange = false; - for (size_t i = 0; i < path.size(); ++i) + for (std::size_t i = 0; i < path.size(); ++i) allPoints.push_back(G3D::Vector3(path[i]->x, path[i]->y, path[i]->z)); // Add extra points to allow derivative calculations for all path nodes @@ -131,7 +131,7 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl orientationSpline.init_spline_custom(initer); orientationSpline.initLengths(); - for (size_t i = 0; i < path.size(); ++i) + for (std::size_t i = 0; i < path.size(); ++i) { if (!mapChange) { @@ -208,16 +208,16 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl // find the rest of the distances between key points // Every path segment has its own spline - size_t start = 0; - for (size_t i = 1; i < keyFrames.size(); ++i) + std::size_t start = 0; + for (std::size_t i = 1; i < keyFrames.size(); ++i) { if (keyFrames[i - 1].Teleport || i + 1 == keyFrames.size()) { - size_t extra = !keyFrames[i - 1].Teleport ? 1 : 0; + std::size_t extra = !keyFrames[i - 1].Teleport ? 1 : 0; TransportSpline* spline = new TransportSpline(); spline->init_spline(&splinePath[start], i - start + extra, Movement::SplineBase::ModeCatmullrom); spline->initLengths(); - for (size_t j = start; j < i + extra; ++j) + for (std::size_t j = start; j < i + extra; ++j) { keyFrames[j].Index = j - start + 1; keyFrames[j].DistFromPrev = spline->length(j - start, j + 1 - start); @@ -255,7 +255,7 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl // and distUntilStop is to the next stopping keyframe. // this is required to properly handle cases of two stopping frames in a row (yes they do exist) float tmpDist = 0.0f; - for (size_t i = 0; i < keyFrames.size(); ++i) + for (std::size_t i = 0; i < keyFrames.size(); ++i) { int32 j = (i + lastStop) % keyFrames.size(); if (keyFrames[j].IsStopFrame() || j == lastStop) @@ -275,7 +275,7 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl tmpDist = 0.0f; } - for (size_t i = 0; i < keyFrames.size(); ++i) + for (std::size_t i = 0; i < keyFrames.size(); ++i) { float total_dist = keyFrames[i].DistSinceStop + keyFrames[i].DistUntilStop; if (total_dist < 2 * accel_dist) // won't reach full speed @@ -305,7 +305,7 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl // calculate tFrom times from tTo times float segmentTime = 0.0f; - for (size_t i = 0; i < keyFrames.size(); ++i) + for (std::size_t i = 0; i < keyFrames.size(); ++i) { int32 j = (i + lastStop) % keyFrames.size(); if (keyFrames[j].IsStopFrame() || j == lastStop) @@ -322,7 +322,7 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl keyFrames[0].DepartureTime = uint32(curPathTime * IN_MILLISECONDS); } - for (size_t i = 1; i < keyFrames.size(); ++i) + for (std::size_t i = 1; i < keyFrames.size(); ++i) { curPathTime += keyFrames[i - 1].TimeTo; if (keyFrames[i].IsStopFrame()) diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 785b48baf..d17cef553 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -121,7 +121,7 @@ void MotionMaster::UpdateMotion(uint32 diff) if (_expList) { - for (size_t i = 0; i < _expList->size(); ++i) + for (std::size_t i = 0; i < _expList->size(); ++i) { MovementGenerator* mg = (*_expList)[i]; DirectDelete(mg); diff --git a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp index 0a8bbb566..ebe4934f8 100644 --- a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp @@ -1038,7 +1038,7 @@ void PathGenerator::ShortenPathUntilDist(G3D::Vector3 const& target, float dist) if ((*_pathPoints.rbegin() - target).squaredLength() >= distSq) return; - size_t i = _pathPoints.size() - 1; + std::size_t i = _pathPoints.size() - 1; float x, y, z, collisionHeight = _source->GetCollisionHeight(); // find the first i s.t.: // - _pathPoints[i] is still too close diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 449dafaf0..d06f9bb3e 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -500,7 +500,7 @@ void FlightPathMovementGenerator::SetCurrentNodeAfterTeleport() } uint32 map0 = i_path[i_currentNode]->mapid; - for (size_t i = i_currentNode + 1; i < i_path.size(); ++i) + for (std::size_t i = i_currentNode + 1; i < i_path.size(); ++i) { if (i_path[i]->mapid != map0) { diff --git a/src/server/game/Movement/Spline/MoveSplineInitArgs.h b/src/server/game/Movement/Spline/MoveSplineInitArgs.h index a0d26fd54..68ad95b14 100644 --- a/src/server/game/Movement/Spline/MoveSplineInitArgs.h +++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h @@ -43,7 +43,7 @@ namespace Movement struct MoveSplineInitArgs { - MoveSplineInitArgs(size_t path_capacity = 16) + MoveSplineInitArgs(std::size_t path_capacity = 16) { path.reserve(path_capacity); } diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp index 703a79dde..247cbf343 100644 --- a/src/server/game/Pools/PoolMgr.cpp +++ b/src/server/game/Pools/PoolMgr.cpp @@ -158,7 +158,7 @@ bool PoolGroup::CheckPool() const template void PoolGroup::DespawnObject(ActivePoolData& spawns, ObjectGuid::LowType guid) { - for (size_t i = 0; i < EqualChanced.size(); ++i) + for (std::size_t i = 0; i < EqualChanced.size(); ++i) { // if spawned if (spawns.IsActiveObject(EqualChanced[i].guid)) @@ -171,7 +171,7 @@ void PoolGroup::DespawnObject(ActivePoolData& spawns, ObjectGuid::LowType gui } } - for (size_t i = 0; i < ExplicitlyChanced.size(); ++i) + for (std::size_t i = 0; i < ExplicitlyChanced.size(); ++i) { // spawned if (spawns.IsActiveObject(ExplicitlyChanced[i].guid)) diff --git a/src/server/game/Quests/enuminfo_QuestDef.cpp b/src/server/game/Quests/enuminfo_QuestDef.cpp index aec7b5de3..6fbf2beb9 100644 --- a/src/server/game/Quests/enuminfo_QuestDef.cpp +++ b/src/server/game/Quests/enuminfo_QuestDef.cpp @@ -49,10 +49,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(QuestFailedReason } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 13; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 13; } template <> -AC_API_EXPORT QuestFailedReason EnumUtils::FromIndex(size_t index) +AC_API_EXPORT QuestFailedReason EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -74,7 +74,7 @@ AC_API_EXPORT QuestFailedReason EnumUtils::FromIndex(size_t i } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(QuestFailedReason value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(QuestFailedReason value) { switch (value) { @@ -119,10 +119,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(QuestShareMessage } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 11; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 11; } template <> -AC_API_EXPORT QuestShareMessages EnumUtils::FromIndex(size_t index) +AC_API_EXPORT QuestShareMessages EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -142,7 +142,7 @@ AC_API_EXPORT QuestShareMessages EnumUtils::FromIndex(size_t } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(QuestShareMessages value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(QuestShareMessages value) { switch (value) { diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index b749e267f..497d5078e 100644 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -184,7 +184,7 @@ void ReputationMgr::SendState(FactionState const* faction) data << uint8(_sendFactionIncreased); _sendFactionIncreased = false; // Reset - size_t p_count = data.wpos(); + std::size_t p_count = data.wpos(); data << uint32(count); data << uint32(faction->ReputationListID); diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 15fb7d4fa..eed0d2f20 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -530,7 +530,7 @@ public: /* GlobalScript */ public: /* Scheduled scripts */ uint32 IncreaseScheduledScriptsCount() { return ++_scheduledScripts; } uint32 DecreaseScheduledScriptCount() { return --_scheduledScripts; } - uint32 DecreaseScheduledScriptCount(size_t count) { return _scheduledScripts -= count; } + uint32 DecreaseScheduledScriptCount(std::size_t count) { return _scheduledScripts -= count; } bool IsScriptScheduled() const { return _scheduledScripts > 0; } public: /* UnitScript */ @@ -796,7 +796,7 @@ public: if (oldScript) { for (auto& vIt : EnabledHooks) - for (size_t i = 0; i < vIt.size(); ++i) + for (std::size_t i = 0; i < vIt.size(); ++i) if (vIt[i] == oldScript) { vIt.erase(vIt.begin() + i); diff --git a/src/server/game/Server/Packet.cpp b/src/server/game/Server/Packet.cpp index e0fea0b79..47d4e4fbe 100644 --- a/src/server/game/Server/Packet.cpp +++ b/src/server/game/Server/Packet.cpp @@ -22,7 +22,7 @@ WorldPackets::Packet::Packet(WorldPacket&& worldPacket) : _worldPacket(std::move { } -WorldPackets::ServerPacket::ServerPacket(OpcodeServer opcode, size_t initialSize /*= 200*/) : Packet(WorldPacket(opcode, initialSize)) +WorldPackets::ServerPacket::ServerPacket(OpcodeServer opcode, std::size_t initialSize /*= 200*/) : Packet(WorldPacket(opcode, initialSize)) { } diff --git a/src/server/game/Server/Packet.h b/src/server/game/Server/Packet.h index f4c3c8ce9..0bb5664ae 100644 --- a/src/server/game/Server/Packet.h +++ b/src/server/game/Server/Packet.h @@ -36,7 +36,7 @@ namespace WorldPackets virtual void Read() = 0; [[nodiscard]] WorldPacket const* GetRawPacket() const { return &_worldPacket; } - [[nodiscard]] size_t GetSize() const { return _worldPacket.size(); } + [[nodiscard]] std::size_t GetSize() const { return _worldPacket.size(); } protected: WorldPacket _worldPacket; @@ -45,7 +45,7 @@ namespace WorldPackets class AC_GAME_API ServerPacket : public Packet { public: - ServerPacket(OpcodeServer opcode, size_t initialSize = 200); + ServerPacket(OpcodeServer opcode, std::size_t initialSize = 200); void Read() final; diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h index f2a6933d5..370446b2d 100644 --- a/src/server/game/Server/WorldPacket.h +++ b/src/server/game/Server/WorldPacket.h @@ -29,7 +29,7 @@ public: // just container for later use WorldPacket() : ByteBuffer(0) { } - explicit WorldPacket(uint16 opcode, size_t res = 200) : + explicit WorldPacket(uint16 opcode, std::size_t res = 200) : ByteBuffer(res), m_opcode(opcode) { } WorldPacket(WorldPacket&& packet) noexcept : @@ -66,7 +66,7 @@ public: WorldPacket(uint16 opcode, MessageBuffer&& buffer) : ByteBuffer(std::move(buffer)), m_opcode(opcode) { } - void Initialize(uint16 opcode, size_t newres = 200) + void Initialize(uint16 opcode, std::size_t newres = 200) { clear(); _storage.reserve(newres); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 7476ce1df..cc3a0c911 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -46,13 +46,14 @@ #include "Tokenize.h" #include "Transport.h" #include "Vehicle.h" -#include "WardenMac.h" #include "WardenWin.h" #include "World.h" #include "WorldPacket.h" #include "WorldSocket.h" #include +#include "BanMgr.h" + namespace { std::string const DefaultPlayerName = ""; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 596214e29..52f3e9425 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -25,7 +25,6 @@ #include "AccountMgr.h" #include "AddonMgr.h" #include "AuthDefines.h" -#include "BanMgr.h" #include "CircularBuffer.h" #include "Common.h" #include "DatabaseEnv.h" @@ -34,6 +33,7 @@ #include "SharedDefines.h" #include "World.h" #include +#include #include class Creature; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index bd9506c05..4a6e43f56 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5002,7 +5002,7 @@ void Spell::WriteSpellGoTargets(WorldPacket* data) // correct count for both hit and miss). uint32 hit = 0; - size_t hitPos = data->wpos(); + std::size_t hitPos = data->wpos(); *data << (uint8)0; // placeholder for (std::list::const_iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end() && hit < 255; ++ihit) { @@ -5022,7 +5022,7 @@ void Spell::WriteSpellGoTargets(WorldPacket* data) } uint32 miss = 0; - size_t missPos = data->wpos(); + std::size_t missPos = data->wpos(); *data << (uint8)0; // placeholder for (std::list::const_iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end() && miss < 255; ++ihit) { diff --git a/src/server/game/Texts/ChatTextBuilder.cpp b/src/server/game/Texts/ChatTextBuilder.cpp index 79f27913c..dff037a0b 100644 --- a/src/server/game/Texts/ChatTextBuilder.cpp +++ b/src/server/game/Texts/ChatTextBuilder.cpp @@ -26,7 +26,7 @@ void Acore::BroadcastTextBuilder::operator()(WorldPacket& data, LocaleConstant l ChatHandler::BuildChatPacket(data, _msgType, bct ? Language(bct->LanguageID) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _gender) : "", _achievementId, "", locale); } -size_t Acore::BroadcastTextBuilder::operator()(WorldPacket* data, LocaleConstant locale) const +std::size_t Acore::BroadcastTextBuilder::operator()(WorldPacket* data, LocaleConstant locale) const { BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId); return ChatHandler::BuildChatPacket(*data, _msgType, bct ? Language(bct->LanguageID) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _gender) : "", _achievementId, "", locale); @@ -47,7 +47,7 @@ void Acore::AcoreStringChatBuilder::operator()(WorldPacket& data, LocaleConstant va_list ap; va_copy(ap, *_args); - static size_t const BufferSize = 2048; + static std::size_t const BufferSize = 2048; char strBuffer[BufferSize]; vsnprintf(strBuffer, BufferSize, text, ap); va_end(ap); diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h index ec1fce7d7..724f9f7b2 100644 --- a/src/server/game/Texts/ChatTextBuilder.h +++ b/src/server/game/Texts/ChatTextBuilder.h @@ -34,7 +34,7 @@ namespace Acore : _source(obj), _msgType(msgType), _textId(textId), _gender(gender), _target(target), _achievementId(achievementId) { } void operator()(WorldPacket& data, LocaleConstant locale) const; - size_t operator()(WorldPacket* data, LocaleConstant locale) const; + std::size_t operator()(WorldPacket* data, LocaleConstant locale) const; private: WorldObject const* _source; diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index f370e72ab..78fd3ce63 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -31,7 +31,7 @@ public: CreatureTextBuilder(WorldObject* obj, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target) : _source(obj), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { } - size_t operator()(WorldPacket* data, LocaleConstant locale) const + std::size_t operator()(WorldPacket* data, LocaleConstant locale) const { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); @@ -54,7 +54,7 @@ public: PlayerTextBuilder(WorldObject* obj, WorldObject* speaker, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target) : _source(obj), _talker(speaker), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { } - size_t operator()(WorldPacket* data, LocaleConstant locale) const + std::size_t operator()(WorldPacket* data, LocaleConstant locale) const { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index e6342eb0d..c90a6300e 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -129,7 +129,7 @@ public: ~CreatureTextLocalizer() { - for (size_t i = 0; i < _packetCache.size(); ++i) + for (std::size_t i = 0; i < _packetCache.size(); ++i) { if (_packetCache[i]) delete _packetCache[i]->first; @@ -141,14 +141,14 @@ public: { LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); WorldPacket* messageTemplate; - size_t whisperGUIDpos; + std::size_t whisperGUIDpos; // create if not cached yet if (!_packetCache[loc_idx]) { messageTemplate = new WorldPacket(); whisperGUIDpos = _builder(messageTemplate, loc_idx); - _packetCache[loc_idx] = new std::pair(messageTemplate, whisperGUIDpos); + _packetCache[loc_idx] = new std::pair(messageTemplate, whisperGUIDpos); } else { @@ -171,7 +171,7 @@ public: } private: - std::vector* > _packetCache; + std::vector* > _packetCache; Builder const& _builder; ChatMsg _msgType; }; diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index 9b19143ac..e4d2d94df 100644 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -138,14 +138,14 @@ void GmTicket::SendResponse(WorldSession* session) const data << uint32(_id); // ticketID data << _message.c_str(); - size_t len = _response.size(); + std::size_t len = _response.size(); char const* s = _response.c_str(); for (int i = 0; i < 4; i++) { if (len) { - size_t writeLen = std::min(len, 3999); + std::size_t writeLen = std::min(len, 3999); data.append(s, writeLen); len -= writeLen; diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index f1e4cb388..96f066a9e 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -426,7 +426,7 @@ inline std::string GetTableName(std::string const& str) return str.substr(s, e - s); } -inline bool ValidateFields(TableStruct const& ts, std::string const& str, size_t lineNumber) +inline bool ValidateFields(TableStruct const& ts, std::string const& str, std::size_t lineNumber) { std::string::size_type s = str.find("` VALUES ("); if (s != std::string::npos) // old dump format (no column names) @@ -753,7 +753,7 @@ DumpReturn PlayerDumpWriter::WriteDumpToString(std::string& dump, ObjectGuid::Lo inline void FixNULLfields(std::string& line) { static std::string const NullString("'NULL'"); - size_t pos = line.find(NullString); + std::size_t pos = line.find(NullString); while (pos != std::string::npos) { line.replace(pos, NullString.length(), "NULL"); @@ -823,7 +823,7 @@ DumpReturn PlayerDumpReader::LoadDump(std::istream& input, uint32 account, std:: uint8 level = 1; // for logs - size_t lineNumber = 0; + std::size_t lineNumber = 0; CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); while (std::getline(input, line)) @@ -831,7 +831,7 @@ DumpReturn PlayerDumpReader::LoadDump(std::istream& input, uint32 account, std:: ++lineNumber; // skip empty strings - size_t nw_pos = line.find_first_not_of(" \t\n\r\7"); + std::size_t nw_pos = line.find_first_not_of(" \t\n\r\7"); if (nw_pos == std::string::npos) continue; diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index af37fab2b..298264e46 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -168,7 +168,7 @@ union keyData uint32 Warden::BuildChecksum(const uint8* data, uint32 length) { keyData hash{}; - hash.bytes = Acore::Crypto::SHA1::GetDigestOf(data, size_t(length)); + hash.bytes = Acore::Crypto::SHA1::GetDigestOf(data, std::size_t(length)); uint32 checkSum = 0; for (uint8 i = 0; i < 5; ++i) diff --git a/src/server/game/Warden/WardenMac.cpp b/src/server/game/Warden/WardenMac.cpp index c10ce9a3b..53883f18c 100644 --- a/src/server/game/Warden/WardenMac.cpp +++ b/src/server/game/Warden/WardenMac.cpp @@ -17,6 +17,7 @@ #include "WardenMac.h" #include "ByteBuffer.h" +#include "CryptoHash.h" #include "Log.h" #include "Opcodes.h" #include "Player.h" diff --git a/src/server/game/Warden/WardenPayloadMgr.cpp b/src/server/game/Warden/WardenPayloadMgr.cpp index 9245bd9e5..4f88f1891 100644 --- a/src/server/game/Warden/WardenPayloadMgr.cpp +++ b/src/server/game/Warden/WardenPayloadMgr.cpp @@ -128,7 +128,7 @@ void WardenPayloadMgr::QueuePayload(uint16 payloadId, bool pushToFront) bool WardenPayloadMgr::DequeuePayload(uint16 payloadId) { - size_t const queueSize = QueuedPayloads.size(); + std::size_t const queueSize = QueuedPayloads.size(); QueuedPayloads.remove(payloadId); return queueSize != QueuedPayloads.size(); diff --git a/src/server/game/Warden/enuminfo_WardenCheckMgr.cpp b/src/server/game/Warden/enuminfo_WardenCheckMgr.cpp index f76872a82..61bd60f37 100644 --- a/src/server/game/Warden/enuminfo_WardenCheckMgr.cpp +++ b/src/server/game/Warden/enuminfo_WardenCheckMgr.cpp @@ -39,10 +39,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(WardenActions value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 3; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 3; } template <> -AC_API_EXPORT WardenActions EnumUtils::FromIndex(size_t index) +AC_API_EXPORT WardenActions EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -54,7 +54,7 @@ AC_API_EXPORT WardenActions EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(WardenActions value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(WardenActions value) { switch (value) { diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index 93092d9b2..9e908b632 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -138,7 +138,7 @@ public: // store random suggested secrets static std::unordered_map suggestions; - auto pair = suggestions.emplace(std::piecewise_construct, std::make_tuple(accountId), std::make_tuple(Acore::Crypto::TOTP::RECOMMENDED_SECRET_LENGTH)); // std::vector 1-argument size_t constructor invokes resize + auto pair = suggestions.emplace(std::piecewise_construct, std::make_tuple(accountId), std::make_tuple(Acore::Crypto::TOTP::RECOMMENDED_SECRET_LENGTH)); // std::vector 1-argument std::size_t constructor invokes resize if (pair.second) // no suggestion yet, generate random secret Acore::Crypto::GetRandomBytes(pair.first->second); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 242866a20..1c9afabda 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -694,7 +694,7 @@ public: if (!p->IsGameMaster()) targetList.push_back(p); - size_t half = targetList.size() / 2; + std::size_t half = targetList.size() / 2; // half gets ooze variable while (half < targetList.size()) { diff --git a/src/server/shared/DataStores/DBCStore.h b/src/server/shared/DataStores/DBCStore.h index 8b09daee0..b0ab57846 100644 --- a/src/server/shared/DataStores/DBCStore.h +++ b/src/server/shared/DataStores/DBCStore.h @@ -75,7 +75,7 @@ public: { // Resize typedef char* ptr; - size_t newSize = id + 1; + std::size_t newSize = id + 1; ptr* newArr = new ptr[newSize]; memset(newArr, 0, newSize * sizeof(ptr)); memcpy(newArr, _indexTable.AsChar, _indexTableSize * sizeof(ptr)); diff --git a/src/server/shared/DataStores/DBCStructure.h b/src/server/shared/DataStores/DBCStructure.h index b3d08a949..6dfcadb48 100644 --- a/src/server/shared/DataStores/DBCStructure.h +++ b/src/server/shared/DataStores/DBCStructure.h @@ -2245,7 +2245,7 @@ typedef std::map TaxiPathSetBySource; typedef std::vector TaxiPathNodeList; typedef std::vector TaxiPathNodesByPath; -static constexpr size_t TaxiMaskSize = 14; +static constexpr std::size_t TaxiMaskSize = 14; typedef std::array TaxiMask; #endif diff --git a/src/server/shared/Network/NetworkThread.h b/src/server/shared/Network/NetworkThread.h index d71cee51f..12c4ec4e8 100644 --- a/src/server/shared/Network/NetworkThread.h +++ b/src/server/shared/Network/NetworkThread.h @@ -134,7 +134,7 @@ protected: void HandleNewSocketsProxyReadingOnConnect() { - size_t index = 0; + std::size_t index = 0; std::vector newSocketsToRemoveIndexes; for (auto sock_iter = _newSockets.begin(); sock_iter != _newSockets.end(); ++sock_iter, ++index) { diff --git a/src/server/shared/Network/Socket.h b/src/server/shared/Network/Socket.h index e92f2c42e..0a431eb4d 100644 --- a/src/server/shared/Network/Socket.h +++ b/src/server/shared/Network/Socket.h @@ -205,7 +205,7 @@ protected: } private: - void ReadHandlerInternal(boost::system::error_code error, size_t transferredBytes) + void ReadHandlerInternal(boost::system::error_code error, std::size_t transferredBytes) { if (error) { @@ -219,7 +219,7 @@ private: // ProxyReadHeaderHandler reads Proxy Protocol v2 header (v1 is not supported). // See https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt (2.2. Binary header format (version 2)) for more details. - void ProxyReadHeaderHandler(boost::system::error_code error, size_t transferredBytes) + void ProxyReadHeaderHandler(boost::system::error_code error, std::size_t transferredBytes) { if (error) { diff --git a/src/server/shared/Packets/ByteBuffer.cpp b/src/server/shared/Packets/ByteBuffer.cpp index ce0f85b3a..dab792c77 100644 --- a/src/server/shared/Packets/ByteBuffer.cpp +++ b/src/server/shared/Packets/ByteBuffer.cpp @@ -27,7 +27,7 @@ ByteBuffer::ByteBuffer(MessageBuffer&& buffer) : _rpos(0), _wpos(0), _storage(buffer.Move()) { } -ByteBufferPositionException::ByteBufferPositionException(bool add, size_t pos, size_t size, size_t valueSize) +ByteBufferPositionException::ByteBufferPositionException(bool add, std::size_t pos, std::size_t size, std::size_t valueSize) { std::ostringstream ss; @@ -38,7 +38,7 @@ ByteBufferPositionException::ByteBufferPositionException(bool add, size_t pos, s message().assign(ss.str()); } -ByteBufferSourceException::ByteBufferSourceException(size_t pos, size_t size, size_t valueSize) +ByteBufferSourceException::ByteBufferSourceException(std::size_t pos, std::size_t size, std::size_t valueSize) { std::ostringstream ss; @@ -107,13 +107,13 @@ uint32 ByteBuffer::ReadPackedTime() return uint32(mktime(<)); } -void ByteBuffer::append(uint8 const* src, size_t cnt) +void ByteBuffer::append(uint8 const* src, std::size_t cnt) { ASSERT(src, "Attempted to put a NULL-pointer in ByteBuffer (pos: {} size: {})", _wpos, size()); ASSERT(cnt, "Attempted to put a zero-sized value in ByteBuffer (pos: {} size: {})", _wpos, size()); ASSERT(size() < 10000000); - size_t const newSize = _wpos + cnt; + std::size_t const newSize = _wpos + cnt; if (_storage.capacity() < newSize) // custom memory allocation rules { @@ -140,7 +140,7 @@ void ByteBuffer::AppendPackedTime(time_t time) append((lt.tm_year - 100) << 24 | lt.tm_mon << 20 | (lt.tm_mday - 1) << 14 | lt.tm_wday << 11 | lt.tm_hour << 6 | lt.tm_min); } -void ByteBuffer::put(size_t pos, uint8 const* src, size_t cnt) +void ByteBuffer::put(std::size_t pos, uint8 const* src, std::size_t cnt) { ASSERT(pos + cnt <= size(), "Attempted to put value with size: {} in ByteBuffer (pos: {} size: {})", cnt, pos, size()); ASSERT(src, "Attempted to put a NULL-pointer in ByteBuffer (pos: {} size: {})", pos, size()); diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 82e8d6521..308b6d728 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -45,7 +45,7 @@ private: class AC_SHARED_API ByteBufferPositionException : public ByteBufferException { public: - ByteBufferPositionException(bool add, size_t pos, size_t size, size_t valueSize); + ByteBufferPositionException(bool add, std::size_t pos, std::size_t size, std::size_t valueSize); ~ByteBufferPositionException() noexcept override = default; }; @@ -53,7 +53,7 @@ public: class AC_SHARED_API ByteBufferSourceException : public ByteBufferException { public: - ByteBufferSourceException(size_t pos, size_t size, size_t valueSize); + ByteBufferSourceException(std::size_t pos, std::size_t size, std::size_t valueSize); ~ByteBufferSourceException() noexcept override = default; }; @@ -211,7 +211,7 @@ public: ByteBuffer& operator<<(std::string_view value) { - if (size_t len = value.length()) + if (std::size_t len = value.length()) { append(reinterpret_cast(value.data()), len); } @@ -294,7 +294,7 @@ public: return *this; } - uint8& operator[](size_t const pos) + uint8& operator[](std::size_t const pos) { if (pos >= size()) { @@ -304,7 +304,7 @@ public: return _storage[pos]; } - uint8 const& operator[](size_t const pos) const + uint8 const& operator[](std::size_t const pos) const { if (pos >= size()) { @@ -314,9 +314,9 @@ public: return _storage[pos]; } - [[nodiscard]] size_t rpos() const { return _rpos; } + [[nodiscard]] std::size_t rpos() const { return _rpos; } - size_t rpos(size_t rpos_) + std::size_t rpos(std::size_t rpos_) { _rpos = rpos_; return _rpos; @@ -327,9 +327,9 @@ public: _rpos = wpos(); } - [[nodiscard]] size_t wpos() const { return _wpos; } + [[nodiscard]] std::size_t wpos() const { return _wpos; } - size_t wpos(size_t wpos_) + std::size_t wpos(std::size_t wpos_) { _wpos = wpos_; return _wpos; @@ -338,7 +338,7 @@ public: template void read_skip() { read_skip(sizeof(T)); } - void read_skip(size_t skip) + void read_skip(std::size_t skip) { if (_rpos + skip > size()) { @@ -355,7 +355,7 @@ public: return r; } - template [[nodiscard]] T read(size_t pos) const + template [[nodiscard]] T read(std::size_t pos) const { if (pos + sizeof(T) > size()) { @@ -367,7 +367,7 @@ public: return val; } - void read(uint8* dest, size_t len) + void read(uint8* dest, std::size_t len) { if (_rpos + len > size()) { @@ -378,7 +378,7 @@ public: _rpos += len; } - template + template void read(std::array& arr) { read(arr.data(), Size); @@ -441,17 +441,17 @@ public: return _storage.data(); } - [[nodiscard]] size_t size() const { return _storage.size(); } + [[nodiscard]] std::size_t size() const { return _storage.size(); } [[nodiscard]] bool empty() const { return _storage.empty(); } - void resize(size_t newsize) + void resize(std::size_t newsize) { _storage.resize(newsize, 0); _rpos = 0; _wpos = size(); } - void reserve(size_t ressize) + void reserve(std::size_t ressize) { if (ressize > size()) { @@ -464,17 +464,17 @@ public: _storage.shrink_to_fit(); } - void append(const char *src, size_t cnt) + void append(const char *src, std::size_t cnt) { return append((const uint8 *)src, cnt); } - template void append(const T* src, size_t cnt) + template void append(const T* src, std::size_t cnt) { return append((const uint8*)src, cnt * sizeof(T)); } - void append(uint8 const* src, size_t cnt); + void append(uint8 const* src, std::size_t cnt); void append(ByteBuffer const& buffer) { @@ -484,7 +484,7 @@ public: } } - template + template void append(std::array const& arr) { append(arr.data(), Size); @@ -504,7 +504,7 @@ public: { uint8 packGUID[8 + 1]; packGUID[0] = 0; - size_t size = 1; + std::size_t size = 1; for (uint8 i = 0; guid != 0;++i) { @@ -522,13 +522,13 @@ public: } void AppendPackedTime(time_t time); - void put(size_t pos, const uint8 *src, size_t cnt); + void put(std::size_t pos, const uint8 *src, std::size_t cnt); void print_storage() const; void textlike() const; void hexlike() const; protected: - size_t _rpos{0}, _wpos{0}; + std::size_t _rpos{0}, _wpos{0}; std::vector _storage; }; diff --git a/src/server/shared/Realms/Realm.h b/src/server/shared/Realms/Realm.h index 10e8f88ec..f3b0d7899 100644 --- a/src/server/shared/Realms/Realm.h +++ b/src/server/shared/Realms/Realm.h @@ -20,6 +20,7 @@ #include "AsioHacksFwd.h" #include "Common.h" +#include enum RealmFlags { diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 1b0568fe6..241f4ac5d 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -362,7 +362,7 @@ const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = 0xffe6cc80 //LIGHT YELLOW }; -size_t constexpr MAX_QUEST_DIFFICULTY = 5; +std::size_t constexpr MAX_QUEST_DIFFICULTY = 5; uint32 constexpr QuestDifficultyColors[MAX_QUEST_DIFFICULTY] = { 0xff40c040, diff --git a/src/server/shared/enuminfo_SharedDefines.cpp b/src/server/shared/enuminfo_SharedDefines.cpp index d75cdf89f..e5ae568dd 100644 --- a/src/server/shared/enuminfo_SharedDefines.cpp +++ b/src/server/shared/enuminfo_SharedDefines.cpp @@ -46,10 +46,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(Races value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 10; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 10; } template <> -AC_API_EXPORT Races EnumUtils::FromIndex(size_t index) +AC_API_EXPORT Races EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -68,7 +68,7 @@ AC_API_EXPORT Races EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(Races value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(Races value) { switch (value) { @@ -109,10 +109,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(Classes value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 10; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 10; } template <> -AC_API_EXPORT Classes EnumUtils::FromIndex(size_t index) +AC_API_EXPORT Classes EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -131,7 +131,7 @@ AC_API_EXPORT Classes EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(Classes value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(Classes value) { switch (value) { @@ -194,10 +194,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr0 value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT SpellAttr0 EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SpellAttr0 EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -238,7 +238,7 @@ AC_API_EXPORT SpellAttr0 EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr0 value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr0 value) { switch (value) { @@ -323,10 +323,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr1 value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT SpellAttr1 EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SpellAttr1 EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -367,7 +367,7 @@ AC_API_EXPORT SpellAttr1 EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr1 value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr1 value) { switch (value) { @@ -452,10 +452,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr2 value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT SpellAttr2 EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SpellAttr2 EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -496,7 +496,7 @@ AC_API_EXPORT SpellAttr2 EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr2 value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr2 value) { switch (value) { @@ -581,10 +581,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr3 value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT SpellAttr3 EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SpellAttr3 EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -625,7 +625,7 @@ AC_API_EXPORT SpellAttr3 EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr3 value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr3 value) { switch (value) { @@ -710,10 +710,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr4 value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT SpellAttr4 EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SpellAttr4 EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -754,7 +754,7 @@ AC_API_EXPORT SpellAttr4 EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr4 value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr4 value) { switch (value) { @@ -839,10 +839,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr5 value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT SpellAttr5 EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SpellAttr5 EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -883,7 +883,7 @@ AC_API_EXPORT SpellAttr5 EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr5 value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr5 value) { switch (value) { @@ -968,10 +968,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr6 value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT SpellAttr6 EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SpellAttr6 EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -1012,7 +1012,7 @@ AC_API_EXPORT SpellAttr6 EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr6 value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr6 value) { switch (value) { @@ -1097,10 +1097,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr7 value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT SpellAttr7 EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SpellAttr7 EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -1141,7 +1141,7 @@ AC_API_EXPORT SpellAttr7 EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr7 value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr7 value) { switch (value) { @@ -1383,10 +1383,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellCastResult valu } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 189; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 189; } template <> -AC_API_EXPORT SpellCastResult EnumUtils::FromIndex(size_t index) +AC_API_EXPORT SpellCastResult EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -1584,7 +1584,7 @@ AC_API_EXPORT SpellCastResult EnumUtils::FromIndex(size_t index } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(SpellCastResult value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellCastResult value) { switch (value) { @@ -1812,10 +1812,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(AuraStateType value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 18; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 18; } template <> -AC_API_EXPORT AuraStateType EnumUtils::FromIndex(size_t index) +AC_API_EXPORT AuraStateType EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -1842,7 +1842,7 @@ AC_API_EXPORT AuraStateType EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(AuraStateType value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(AuraStateType value) { switch (value) { @@ -1913,10 +1913,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(Mechanics value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 32; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 32; } template <> -AC_API_EXPORT Mechanics EnumUtils::FromIndex(size_t index) +AC_API_EXPORT Mechanics EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -1957,7 +1957,7 @@ AC_API_EXPORT Mechanics EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(Mechanics value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(Mechanics value) { switch (value) { @@ -2184,10 +2184,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(Emote value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 174; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 174; } template <> -AC_API_EXPORT Emote EnumUtils::FromIndex(size_t index) +AC_API_EXPORT Emote EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -2370,7 +2370,7 @@ AC_API_EXPORT Emote EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(Emote value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(Emote value) { switch (value) { @@ -2618,10 +2618,10 @@ AC_API_EXPORT EnumText EnumUtils::ToString(ChatMsg value) } template <> -AC_API_EXPORT size_t EnumUtils::Count() { return 53; } +AC_API_EXPORT std::size_t EnumUtils::Count() { return 53; } template <> -AC_API_EXPORT ChatMsg EnumUtils::FromIndex(size_t index) +AC_API_EXPORT ChatMsg EnumUtils::FromIndex(std::size_t index) { switch (index) { @@ -2683,7 +2683,7 @@ AC_API_EXPORT ChatMsg EnumUtils::FromIndex(size_t index) } template <> -AC_API_EXPORT size_t EnumUtils::ToIndex(ChatMsg value) +AC_API_EXPORT std::size_t EnumUtils::ToIndex(ChatMsg value) { switch (value) { diff --git a/src/test/common/Configuration/Config.cpp b/src/test/common/Configuration/Config.cpp index c3c1e67d3..df1889a88 100644 --- a/src/test/common/Configuration/Config.cpp +++ b/src/test/common/Configuration/Config.cpp @@ -16,6 +16,7 @@ */ #include "Config.h" +#include "Define.h" #include "gtest/gtest.h" #include diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp index 34f4a2f57..1d2d47a37 100644 --- a/src/tools/map_extractor/System.cpp +++ b/src/tools/map_extractor/System.cpp @@ -245,9 +245,9 @@ uint32 ReadBuild(int locale) std::string text = std::string(m.getPointer(), m.getSize()); m.close(); - size_t pos = text.find("version=\""); - size_t pos1 = pos + strlen("version=\""); - size_t pos2 = text.find("\"", pos1); + std::size_t pos = text.find("version=\""); + std::size_t pos1 = pos + strlen("version=\""); + std::size_t pos2 = text.find("\"", pos1); if (pos == text.npos || pos2 == text.npos || pos1 >= pos2) { printf("Fatal error: Invalid %s file format!\n", filename.c_str()); @@ -277,7 +277,7 @@ uint32 ReadMapDBC() exit(1); } - size_t map_count = dbc.getRecordCount(); + std::size_t map_count = dbc.getRecordCount(); map_ids.resize(map_count); for (uint32 x = 0; x < map_count; ++x) { @@ -1094,12 +1094,12 @@ void ExtractCameraFiles(int locale, bool basicLocale) // get camera file list from DBC std::vector camerafiles; - size_t cam_count = camdbc.getRecordCount(); + std::size_t cam_count = camdbc.getRecordCount(); - for (size_t i = 0; i < cam_count; ++i) + for (std::size_t i = 0; i < cam_count; ++i) { std::string camFile(camdbc.getRecord(i).getString(1)); - size_t loc = camFile.find(".mdx"); + std::size_t loc = camFile.find(".mdx"); if (loc != std::string::npos) { camFile.replace(loc, 4, ".m2"); diff --git a/src/tools/map_extractor/dbcfile.cpp b/src/tools/map_extractor/dbcfile.cpp index b4324014a..b349dfc75 100644 --- a/src/tools/map_extractor/dbcfile.cpp +++ b/src/tools/map_extractor/dbcfile.cpp @@ -58,7 +58,7 @@ bool DBCFile::open() data = new unsigned char[recordSize * recordCount + stringSize]; stringTable = data + recordSize * recordCount; - size_t data_size = recordSize * recordCount + stringSize; + std::size_t data_size = recordSize * recordCount + stringSize; if (f.read(data, data_size) != data_size) return false; f.close(); @@ -69,18 +69,18 @@ DBCFile::~DBCFile() delete [] data; } -DBCFile::Record DBCFile::getRecord(size_t id) +DBCFile::Record DBCFile::getRecord(std::size_t id) { assert(data); return Record(*this, data + id * recordSize); } -size_t DBCFile::getMaxId() +std::size_t DBCFile::getMaxId() { assert(data); - size_t maxId = 0; - for (size_t i = 0; i < getRecordCount(); ++i) + std::size_t maxId = 0; + for (std::size_t i = 0; i < getRecordCount(); ++i) { if (maxId < getRecord(i).getUInt(0)) maxId = getRecord(i).getUInt(0); diff --git a/src/tools/map_extractor/dbcfile.h b/src/tools/map_extractor/dbcfile.h index 6b8ed5086..b8158811b 100644 --- a/src/tools/map_extractor/dbcfile.h +++ b/src/tools/map_extractor/dbcfile.h @@ -53,25 +53,25 @@ public: class Record // cppcheck-suppress ctuOneDefinitionRuleViolation { public: - [[nodiscard]] float getFloat(size_t field) const + [[nodiscard]] float getFloat(std::size_t field) const { assert(field < file.fieldCount); return *reinterpret_cast(offset + field * 4); } - [[nodiscard]] unsigned int getUInt(size_t field) const + [[nodiscard]] unsigned int getUInt(std::size_t field) const { assert(field < file.fieldCount); return *reinterpret_cast(offset + field * 4); } - [[nodiscard]] int getInt(size_t field) const + [[nodiscard]] int getInt(std::size_t field) const { assert(field < file.fieldCount); return *reinterpret_cast(offset + field * 4); } - [[nodiscard]] const char* getString(size_t field) const + [[nodiscard]] const char* getString(std::size_t field) const { assert(field < file.fieldCount); - size_t stringOffset = getUInt(field); + std::size_t stringOffset = getUInt(field); assert(stringOffset < file.stringSize); return reinterpret_cast(file.stringTable + stringOffset); } @@ -116,21 +116,21 @@ public: }; // Get record by id - Record getRecord(size_t id); + Record getRecord(std::size_t id); /// Get begin iterator over records Iterator begin(); /// Get begin iterator over records Iterator end(); /// Trivial - [[nodiscard]] size_t getRecordCount() const { return recordCount;} - [[nodiscard]] size_t getFieldCount() const { return fieldCount; } - size_t getMaxId(); + [[nodiscard]] std::size_t getRecordCount() const { return recordCount;} + [[nodiscard]] std::size_t getFieldCount() const { return fieldCount; } + std::size_t getMaxId(); private: std::string filename; - size_t recordSize; - size_t recordCount; - size_t fieldCount; - size_t stringSize; + std::size_t recordSize; + std::size_t recordCount; + std::size_t fieldCount; + std::size_t stringSize; unsigned char* data; unsigned char* stringTable; }; diff --git a/src/tools/map_extractor/mpq_libmpq.cpp b/src/tools/map_extractor/mpq_libmpq.cpp index cac360087..5b70a933a 100644 --- a/src/tools/map_extractor/mpq_libmpq.cpp +++ b/src/tools/map_extractor/mpq_libmpq.cpp @@ -93,12 +93,12 @@ MPQFile::MPQFile(const char* filename): buffer = nullptr; } -size_t MPQFile::read(void* dest, size_t bytes) +std::size_t MPQFile::read(void* dest, std::size_t bytes) { if (eof) return 0; - size_t rpos = pointer + bytes; - if (rpos > size_t(size)) + std::size_t rpos = pointer + bytes; + if (rpos > std::size_t(size)) { bytes = size - pointer; eof = true; diff --git a/src/tools/map_extractor/mpq_libmpq04.h b/src/tools/map_extractor/mpq_libmpq04.h index 049cd7987..c7483e25b 100644 --- a/src/tools/map_extractor/mpq_libmpq04.h +++ b/src/tools/map_extractor/mpq_libmpq04.h @@ -85,9 +85,9 @@ class MPQFile public: MPQFile(const char* filename); // filenames are not case sensitive ~MPQFile() { close(); } - size_t read(void* dest, size_t bytes); - size_t getSize() { return size; } - size_t getPos() { return pointer; } + std::size_t read(void* dest, std::size_t bytes); + std::size_t getSize() { return size; } + std::size_t getPos() { return pointer; } char* getBuffer() { return buffer; } char* getPointer() { return buffer + pointer; } bool isEof() { return eof; } diff --git a/src/tools/vmap4_extractor/adtfile.cpp b/src/tools/vmap4_extractor/adtfile.cpp index 8367ba3d0..5af0937ed 100644 --- a/src/tools/vmap4_extractor/adtfile.cpp +++ b/src/tools/vmap4_extractor/adtfile.cpp @@ -42,12 +42,12 @@ char* GetPlainName(char* FileName) return FileName; } -void fixnamen(char* name, size_t len) +void fixnamen(char* name, std::size_t len) { if (len < 3) return; - for (size_t i = 0; i < len - 3; i++) + for (std::size_t i = 0; i < len - 3; i++) { if (i > 0 && name[i] >= 'A' && name[i] <= 'Z' && isalpha(name[i - 1])) name[i] |= 0x20; @@ -56,16 +56,16 @@ void fixnamen(char* name, size_t len) } //extension in lowercase - for (size_t i = len - 3; i < len; i++) + for (std::size_t i = len - 3; i < len; i++) name[i] |= 0x20; } -void fixname2(char* name, size_t len) +void fixname2(char* name, std::size_t len) { if (len < 3) return; - for (size_t i = 0; i < len - 3; i++) + for (std::size_t i = 0; i < len - 3; i++) if (name[i] == ' ') name[i] = '_'; } @@ -105,7 +105,7 @@ bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY) flipcc(fourcc); fourcc[4] = 0; - size_t nextpos = _file.getPos() + size; + std::size_t nextpos = _file.getPos() + size; if (!strcmp(fourcc, "MCIN")) { diff --git a/src/tools/vmap4_extractor/adtfile.h b/src/tools/vmap4_extractor/adtfile.h index f91a215dd..201806f3a 100644 --- a/src/tools/vmap4_extractor/adtfile.h +++ b/src/tools/vmap4_extractor/adtfile.h @@ -75,8 +75,8 @@ public: const char* GetPlainName(const char* FileName); char* GetPlainName(char* FileName); char* GetExtension(char* FileName); -void fixnamen(char* name, size_t len); -void fixname2(char* name, size_t len); -//void fixMapNamen(char *name, size_t len); +void fixnamen(char* name, std::size_t len); +void fixname2(char* name, std::size_t len); +//void fixMapNamen(char *name, std::size_t len); #endif diff --git a/src/tools/vmap4_extractor/dbcfile.cpp b/src/tools/vmap4_extractor/dbcfile.cpp index 6b003bb60..21cda295a 100644 --- a/src/tools/vmap4_extractor/dbcfile.cpp +++ b/src/tools/vmap4_extractor/dbcfile.cpp @@ -76,7 +76,7 @@ DBCFile::~DBCFile() delete [] data; } -DBCFile::Record DBCFile::getRecord(size_t id) +DBCFile::Record DBCFile::getRecord(std::std::size_t id) { assert(data); return Record(*this, data + id * recordSize); diff --git a/src/tools/vmap4_extractor/dbcfile.h b/src/tools/vmap4_extractor/dbcfile.h index 593a85b96..adde0b2ae 100644 --- a/src/tools/vmap4_extractor/dbcfile.h +++ b/src/tools/vmap4_extractor/dbcfile.h @@ -64,30 +64,30 @@ public: offset = r.offset; return *this; } - [[nodiscard]] float getFloat(size_t field) const + [[nodiscard]] float getFloat(std::size_t field) const { assert(field < file.fieldCount); return *reinterpret_cast(offset + field * 4); } - [[nodiscard]] unsigned int getUInt(size_t field) const + [[nodiscard]] unsigned int getUInt(std::size_t field) const { assert(field < file.fieldCount); return *reinterpret_cast(offset + (field * 4)); } - [[nodiscard]] int getInt(size_t field) const + [[nodiscard]] int getInt(std::size_t field) const { assert(field < file.fieldCount); return *reinterpret_cast(offset + field * 4); } - [[nodiscard]] unsigned char getByte(size_t ofs) const + [[nodiscard]] unsigned char getByte(std::size_t ofs) const { assert(ofs < file.recordSize); return *reinterpret_cast(offset + ofs); } - [[nodiscard]] const char* getString(size_t field) const + [[nodiscard]] const char* getString(std::size_t field) const { assert(field < file.fieldCount); - size_t stringOffset = getUInt(field); + std::size_t stringOffset = getUInt(field); assert(stringOffset < file.stringSize); //char * tmp = (char*)file.stringTable + stringOffset; //unsigned char * tmp2 = file.stringTable + stringOffset; @@ -134,21 +134,21 @@ public: }; // Get record by id - Record getRecord(size_t id); + Record getRecord(std::size_t id); /// Get begin iterator over records Iterator begin(); /// Get begin iterator over records Iterator end(); /// Trivial - [[nodiscard]] size_t getRecordCount() const { return recordCount;} - [[nodiscard]] size_t getFieldCount() const { return fieldCount; } + [[nodiscard]] std::size_t getRecordCount() const { return recordCount;} + [[nodiscard]] std::size_t getFieldCount() const { return fieldCount; } private: std::string filename; - size_t recordSize; - size_t recordCount; - size_t fieldCount; - size_t stringSize; + std::size_t recordSize; + std::size_t recordCount; + std::size_t fieldCount; + std::size_t stringSize; unsigned char* data; unsigned char* stringTable; }; diff --git a/src/tools/vmap4_extractor/mpq_libmpq.cpp b/src/tools/vmap4_extractor/mpq_libmpq.cpp index d8232388f..2e5e4eb2b 100644 --- a/src/tools/vmap4_extractor/mpq_libmpq.cpp +++ b/src/tools/vmap4_extractor/mpq_libmpq.cpp @@ -99,12 +99,12 @@ MPQFile::MPQFile(const char* filename): buffer = nullptr; } -size_t MPQFile::read(void* dest, size_t bytes) +std::size_t MPQFile::read(void* dest, std::size_t bytes) { if (eof) return 0; - size_t rpos = pointer + bytes; - if (rpos > size_t(size)) + std::size_t rpos = pointer + bytes; + if (rpos > std::size_t(size)) { bytes = size - pointer; eof = true; diff --git a/src/tools/vmap4_extractor/mpq_libmpq04.h b/src/tools/vmap4_extractor/mpq_libmpq04.h index 0530a31f3..1cceb1faf 100644 --- a/src/tools/vmap4_extractor/mpq_libmpq04.h +++ b/src/tools/vmap4_extractor/mpq_libmpq04.h @@ -86,9 +86,9 @@ class MPQFile public: MPQFile(const char* filename); // filenames are not case sensitive ~MPQFile() { close(); } - size_t read(void* dest, size_t bytes); - size_t getSize() { return size; } - size_t getPos() { return pointer; } + std::size_t read(void* dest, std::size_t bytes); + std::size_t getSize() { return size; } + std::size_t getPos() { return pointer; } char* getBuffer() { return buffer; } char* getPointer() { return buffer + pointer; } bool isEof() { return eof; } diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index 2d3e22751..3acd69872 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -485,7 +485,7 @@ int main(int argc, char** argv) map_ids[x].id = dbc->getRecord(x).getUInt(0); char const* map_name = dbc->getRecord(x).getString(1); - size_t max_map_name_length = sizeof(map_ids[x].name); + std::size_t max_map_name_length = sizeof(map_ids[x].name); if (strlen(map_name) >= max_map_name_length) { delete dbc; diff --git a/src/tools/vmap4_extractor/wdtfile.cpp b/src/tools/vmap4_extractor/wdtfile.cpp index 0a0ff125b..1a5234240 100644 --- a/src/tools/vmap4_extractor/wdtfile.cpp +++ b/src/tools/vmap4_extractor/wdtfile.cpp @@ -63,7 +63,7 @@ bool WDTFile::init(uint32 mapId) flipcc(fourcc); fourcc[4] = 0; - size_t nextpos = _file.getPos() + size; + std::size_t nextpos = _file.getPos() + size; if (!strcmp(fourcc, "MAIN")) { diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 0f303d0a4..963038099 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -56,7 +56,7 @@ bool WMORoot::open() flipcc(fourcc); fourcc[4] = 0; - size_t nextpos = f.getPos() + size; + std::size_t nextpos = f.getPos() + size; if (!strcmp(fourcc, "MOHD")) // header { @@ -185,7 +185,7 @@ bool WMOGroup::open(WMORoot* rootWMO) size = 68; } fourcc[4] = 0; - size_t nextpos = f.getPos() + size; + std::size_t nextpos = f.getPos() + size; LiquEx_size = 0; liquflags = 0; From 8cfb3383287ba42d69c4a7139026090bc5184bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Wed, 31 Jul 2024 09:10:12 +0200 Subject: [PATCH 22/24] fix(Core/Common): add missing import (#19535) * fix(Core/Common): add missing import * chore: fix mistake --- src/common/Threading/MPSCQueue.h | 1 + src/tools/vmap4_extractor/dbcfile.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/Threading/MPSCQueue.h b/src/common/Threading/MPSCQueue.h index 15176178b..41d49ba14 100644 --- a/src/common/Threading/MPSCQueue.h +++ b/src/common/Threading/MPSCQueue.h @@ -19,6 +19,7 @@ #define MPSCQueue_h__ #include +#include namespace Acore::Impl { diff --git a/src/tools/vmap4_extractor/dbcfile.cpp b/src/tools/vmap4_extractor/dbcfile.cpp index 21cda295a..61e0993ac 100644 --- a/src/tools/vmap4_extractor/dbcfile.cpp +++ b/src/tools/vmap4_extractor/dbcfile.cpp @@ -76,7 +76,7 @@ DBCFile::~DBCFile() delete [] data; } -DBCFile::Record DBCFile::getRecord(std::std::size_t id) +DBCFile::Record DBCFile::getRecord(std::size_t id) { assert(data); return Record(*this, data + id * recordSize); From 3eb2a0b2ad8a660ccdadec17a75cc9cf287f0620 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Wed, 31 Jul 2024 09:44:08 -0400 Subject: [PATCH 23/24] fix(DB/Event): Adjustments to BlizzCon L70ETC concert event. (#19539) * Init. * Update occurence interval. --- data/sql/updates/pending_db_world/l70etc-dmf.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 data/sql/updates/pending_db_world/l70etc-dmf.sql diff --git a/data/sql/updates/pending_db_world/l70etc-dmf.sql b/data/sql/updates/pending_db_world/l70etc-dmf.sql new file mode 100644 index 000000000..99d3ea1b4 --- /dev/null +++ b/data/sql/updates/pending_db_world/l70etc-dmf.sql @@ -0,0 +1 @@ +UPDATE `game_event` SET `start_time`='2008-07-31 12:00:00', `end_time`='2008-08-05 12:00:00', `occurence` = 60, `description` = 'L70ETC BlizzCon Concert' WHERE `eventEntry` = 32; From f2680d994bc0b0861109ada7fd621a926b9b6bfe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 31 Jul 2024 13:45:00 +0000 Subject: [PATCH 24/24] chore(DB): import pending files Referenced commit(s): 3eb2a0b2ad8a660ccdadec17a75cc9cf287f0620 --- .../l70etc-dmf.sql => db_world/2024_07_31_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/l70etc-dmf.sql => db_world/2024_07_31_00.sql} (80%) diff --git a/data/sql/updates/pending_db_world/l70etc-dmf.sql b/data/sql/updates/db_world/2024_07_31_00.sql similarity index 80% rename from data/sql/updates/pending_db_world/l70etc-dmf.sql rename to data/sql/updates/db_world/2024_07_31_00.sql index 99d3ea1b4..deb674b5a 100644 --- a/data/sql/updates/pending_db_world/l70etc-dmf.sql +++ b/data/sql/updates/db_world/2024_07_31_00.sql @@ -1 +1,2 @@ +-- DB update 2024_07_30_02 -> 2024_07_31_00 UPDATE `game_event` SET `start_time`='2008-07-31 12:00:00', `end_time`='2008-08-05 12:00:00', `occurence` = 60, `description` = 'L70ETC BlizzCon Concert' WHERE `eventEntry` = 32;