aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2025-08-31 16:48:41 +0200
committerGitHub <noreply@github.com>2025-08-31 16:48:41 +0200
commit2a872d2cc23a91178167c92c54fb84adfa1a379c (patch)
tree27e2e506d8b6bf953617c6265633fbd487b7684c /src/server
parent920d5d89d92e005de3802938bbaca7e673dd3425 (diff)
Scripts/TheJadeForest: Implement quest "Touching Ground" (31766) (#31122)
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Spells/SpellMgr.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp6
-rw-r--r--src/server/scripts/Kalimdor/zone_durotar.cpp2
-rw-r--r--src/server/scripts/Kalimdor/zone_orgrimmar.cpp2
-rw-r--r--src/server/scripts/Pandaria/zone_the_jade_forest.cpp149
5 files changed, 155 insertions, 10 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 584daa8e372..6eebe71de45 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -5066,6 +5066,12 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->AttributesEx4 &= ~SPELL_ATTR4_USE_FACING_FROM_SPELL;
});
+ // Rappelling Rope
+ ApplySpellFix({ 130960 }, [](SpellInfo* spellInfo)
+ {
+ spellInfo->AuraInterruptFlags |= SpellAuraInterruptFlags::LeaveWorld;
+ });
+
// ENDOF JADE FOREST SPELLS
//
diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
index 3f42b134149..1f7c3341da0 100644
--- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
@@ -549,7 +549,7 @@ class spell_the_kings_command_movie_aura : public SpellScript
{
GetHitUnit()->CastSpell(nullptr, Spells::FadeToBlack, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
- .OriginalCastId = GetSpell()->m_castId
+ .TriggeringSpell = GetSpell()
});
}
@@ -596,7 +596,7 @@ class spell_admiral_rogers_script_effect : public SpellScript
{
GetHitUnit()->CastSpell(nullptr, Spells::TeleportPrep, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
- .OriginalCastId = GetSpell()->m_castId
+ .TriggeringSpell = GetSpell()
});
}
@@ -623,7 +623,7 @@ class spell_teleport_prep_alliance : public SpellScript
hitUnit->CancelMountAura();
hitUnit->CastSpell(nullptr, Spells::TeleportTimer, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
- .OriginalCastId = GetSpell()->m_castId
+ .TriggeringSpell = GetSpell()
});
}
diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp
index 9e979057641..4ffbdc2e515 100644
--- a/src/server/scripts/Kalimdor/zone_durotar.cpp
+++ b/src/server/scripts/Kalimdor/zone_durotar.cpp
@@ -1263,7 +1263,7 @@ class spell_teleport_prep_horde : public SpellScript
hitUnit->CancelMountAura();
hitUnit->CastSpell(nullptr, Spells::TeleportTimer, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
- .OriginalCastId = GetSpell()->m_castId
+ .TriggeringSpell = GetSpell()
});
}
diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
index 34667e18522..19a90dc03b4 100644
--- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
+++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
@@ -45,7 +45,7 @@ class spell_art_of_war_movie_aura : public SpellScript
{
GetHitUnit()->CastSpell(nullptr, Spells::FadeToBlack, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
- .OriginalCastId = GetSpell()->m_castId
+ .TriggeringSpell = GetSpell()
});
}
diff --git a/src/server/scripts/Pandaria/zone_the_jade_forest.cpp b/src/server/scripts/Pandaria/zone_the_jade_forest.cpp
index 4c3ff748c8c..886aba759a8 100644
--- a/src/server/scripts/Pandaria/zone_the_jade_forest.cpp
+++ b/src/server/scripts/Pandaria/zone_the_jade_forest.cpp
@@ -15,16 +15,44 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ScriptMgr.h"
+#include "DB2Stores.h"
+#include "Map.h"
+#include "MotionMaster.h"
#include "PhasingHandler.h"
#include "Player.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
#include "Spell.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
+#include "TemporarySummon.h"
#include "Unit.h"
+#include "Vehicle.h"
namespace Scripts::Pandaria::TheJadeForest
{
+namespace Points
+{
+ static constexpr uint32 RappellingRopeDestination = 1;
+}
+
+namespace Positions
+{
+ static constexpr std::array<Position, 3> RappellingRopeSpawns =
+ {{
+ { 3133.9192f, -750.8542f, 298.9847f },
+ { 3156.4932f, -742.7101f, 297.54916f },
+ { 3169.0479f, -737.92017f, 298.42493f }
+ }};
+
+ static constexpr std::array<Position, 3> RappellingRopeDestinations =
+ {{
+ { 3133.9475f, -749.46844f, 240.00467f },
+ { 3156.2786f, -742.8666f, 239.32095f },
+ { 3168.5525f, -738.01764f, 240.19081f }
+ }};
+}
+
namespace Quests
{
static constexpr uint32 PaintItRed = 31765;
@@ -50,6 +78,10 @@ namespace Spells
static constexpr uint32 AbandonVehicle = 92678;
static constexpr uint32 CannonExplosionTrigger = 130234;
static constexpr uint32 BarrelExplosionTrigger = 130247;
+
+ // Touching Ground
+ static constexpr uint32 ReverseCastRideSeat1 = 85299;
+ static constexpr uint32 RappellingRope = 130960;
}
// 121545 - Into the Mists Scene - JF
@@ -69,7 +101,7 @@ class spell_into_the_mists_scene_jf : public SpellScript
hitUnit->CancelMountAura();
hitUnit->CastSpell(nullptr, Spells::CancelBlackout, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
- .OriginalCastId = GetSpell()->m_castId
+ .TriggeringSpell = GetSpell()
});
}
@@ -97,7 +129,7 @@ class spell_into_the_mists_scene_end : public SpellScript
CastSpellExtraArgs const& castSpellExtraArgs = CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
- .OriginalCastId = GetSpell()->m_castId
+ .TriggeringSpell = GetSpell()
};
hitUnit->CastSpell(nullptr, Spells::TeleportPlayerToCrashSite, castSpellExtraArgs);
hitUnit->CastSpell(nullptr, Spells::CutToBlack, castSpellExtraArgs);
@@ -127,7 +159,7 @@ class spell_the_mission_scene_jf : public SpellScript
hitUnit->CancelMountAura();
hitUnit->CastSpell(nullptr, Spells::CancelBlackout, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
- .OriginalCastId = GetSpell()->m_castId
+ .TriggeringSpell = GetSpell()
});
}
@@ -158,7 +190,7 @@ class spell_the_mission_scene_end : public SpellScript
CastSpellExtraArgs const& castSpellExtraArgs = CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
- .OriginalCastId = GetSpell()->m_castId
+ .TriggeringSpell = GetSpell()
};
hitUnit->CastSpell(nullptr, Spells::TheMissionTeleportPlayer, castSpellExtraArgs);
hitUnit->CastSpell(nullptr, Spells::CutToBlack, castSpellExtraArgs);
@@ -271,12 +303,117 @@ class spell_barrel_explosion_reversecast : public SpellScript
OnEffectHitTarget += SpellEffectFn(spell_barrel_explosion_reversecast::HandleHitTarget, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
+
+// 66640 - Rappelling Rope
+struct npc_rappelling_rope : public ScriptedAI
+{
+ npc_rappelling_rope(Creature* creature) : ScriptedAI(creature) {}
+
+ void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
+ {
+ if (apply)
+ {
+ passenger->SetDisableGravity(true);
+ _scheduler.Schedule(1500ms, [this](TaskContext /*context*/)
+ {
+ auto closestPosition = std::ranges::min_element(Positions::RappellingRopeDestinations, std::ranges::less(),
+ [this](Position const& pos) { return me->GetDistance(pos); });
+
+ me->GetMotionMaster()->MovePoint(Points::RappellingRopeDestination, *closestPosition);
+ });
+ }
+ else
+ passenger->SetDisableGravity(false);
+ }
+
+ void MovementInform(uint32 type, uint32 id) override
+ {
+ if (type == POINT_MOTION_TYPE && id == Points::RappellingRopeDestination)
+ {
+ if (Vehicle* vehicle = me->GetVehicleKit())
+ vehicle->RemoveAllPassengers();
+
+ me->DespawnOrUnsummon(1s);
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
+// 130960 - Rappelling Rope
+class spell_rappelling_rope : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({
+ Spells::ReverseCastRideSeat1
+ });
+ }
+
+ void HandleHitTarget(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ Unit* caster = GetCaster();
+ uint32 creatureId = uint32(GetEffectInfo().MiscValue);
+ SummonPropertiesEntry const* summonProperties = sSummonPropertiesStore.LookupEntry(uint32(GetEffectInfo().MiscValueB));
+ Milliseconds duration = Milliseconds(GetSpellInfo()->CalcDuration(caster));
+ auto closestPosition = std::ranges::min_element(Positions::RappellingRopeSpawns, std::ranges::less(),
+ [caster](Position const& pos) { return caster->GetDistance(pos); });
+
+ if (Creature* rappellingRope = caster->GetMap()->SummonCreature(creatureId, *closestPosition, summonProperties, duration, caster, GetSpellInfo()->Id))
+ {
+ if (TempSummon* summon = rappellingRope->ToTempSummon())
+ summon->SetCanFollowOwner(false);
+
+ rappellingRope->CastSpell(caster, Spells::ReverseCastRideSeat1, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_rappelling_rope::HandleHitTarget, EFFECT_0, SPELL_EFFECT_SUMMON);
+ }
+};
+
+// 130970 - Rappelling Rope Aura
+class spell_rappelling_rope_aura : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({
+ Spells::RappellingRope
+ });
+ }
+
+ void HandleAfterEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
+ {
+ GetTarget()->RemoveAurasDueToSpell(Spells::RappellingRope);
+ }
+
+ void Register() override
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_rappelling_rope_aura::HandleAfterEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+};
}
void AddSC_zone_the_jade_forest()
{
using namespace Scripts::Pandaria::TheJadeForest;
+ // Creatures
+ RegisterCreatureAI(npc_rappelling_rope);
+
// Spells
RegisterSpellScript(spell_into_the_mists_scene_jf);
RegisterSpellScript(spell_into_the_mists_scene_end);
@@ -286,4 +423,6 @@ void AddSC_zone_the_jade_forest()
RegisterSpellScript(spell_summon_gunship_turret);
RegisterSpellScript(spell_cannon_explosion_reversecast);
RegisterSpellScript(spell_barrel_explosion_reversecast);
+ RegisterSpellScript(spell_rappelling_rope);
+ RegisterSpellScript(spell_rappelling_rope_aura);
}