Skip to content

Commit b237266

Browse files
committed
Scripts/Botanica: Update scripts
1 parent 9746b68 commit b237266

8 files changed

Lines changed: 119 additions & 60 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
--
2+
UPDATE `spell_target_position` SET `Orientation` = 0.017453 WHERE `ID` = 34673;
3+
UPDATE `spell_target_position` SET `Orientation` = 0.070336774 WHERE `ID` = 34681;
4+
UPDATE `spell_target_position` SET `Orientation` = 0.506146 WHERE `ID` = 34682;
5+
UPDATE `spell_target_position` SET `Orientation` = 5.9257417 WHERE `ID` = 34684;
6+
UPDATE `spell_target_position` SET `Orientation` = 6.126106 WHERE `ID` = 34685;

src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
* with this program. If not, see <http://www.gnu.org/licenses/>.
1616
*/
1717

18+
/*
19+
* Timers requires to be revisited
20+
*/
21+
1822
#include "ScriptMgr.h"
1923
#include "ScriptedCreature.h"
2024
#include "SpellInfo.h"
@@ -50,7 +54,7 @@ enum SarannisEvents
5054
EVENT_SUMMON_REINFORCEMENTS
5155
};
5256

53-
uint32 const SummonReinforcementsSpells[] =
57+
static constexpr std::array<uint32, 4> SummonReinforcementsSpells =
5458
{
5559
SPELL_SUMMON_MENDER_1, SPELL_SUMMON_RESERVIST_1, SPELL_SUMMON_RESERVIST_2, SPELL_SUMMON_RESERVIST_3
5660
};
@@ -69,10 +73,11 @@ struct boss_commander_sarannis : public BossAI
6973
void JustEngagedWith(Unit* who) override
7074
{
7175
BossAI::JustEngagedWith(who);
76+
7277
Talk(SAY_AGGRO);
7378

7479
// This is definitely just timed, not scheduled instantly when victim has specific amount of stacks of Arcane Resonance
75-
events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, RAND(10s, 15s, 20s, 25s, 30s, 35s));
80+
events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 10s, 20s);
7681
// Timed in heroic (repeatable), on HP PTC in normal (not repeatable)
7782
if (IsHeroic())
7883
events.ScheduleEvent(EVENT_SUMMON_REINFORCEMENTS, 1min);
@@ -87,20 +92,26 @@ struct boss_commander_sarannis : public BossAI
8792
}
8893
}
8994

90-
void OnSpellStart(SpellInfo const* spell) override
95+
void OnSpellStart(SpellInfo const* spellInfo) override
9196
{
92-
if (spell->Id == SPELL_SUMMON_REINFORCEMENTS)
97+
if (spellInfo->Id == SPELL_SUMMON_REINFORCEMENTS)
9398
Talk(EMOTE_SUMMON);
9499
}
95100

96-
void OnSpellCast(SpellInfo const* spell) override
101+
void OnSpellCast(SpellInfo const* spellInfo) override
97102
{
98-
// Not always?
99-
if (spell->Id == SPELL_ARCANE_DEVASTATION)
100-
Talk(SAY_ARCANE_DEVASTATION);
101-
102-
if (spell->Id == SPELL_SUMMON_REINFORCEMENTS)
103-
Talk(SAY_SUMMON);
103+
switch (spellInfo->Id)
104+
{
105+
case SPELL_ARCANE_DEVASTATION:
106+
// Not always?
107+
Talk(SAY_ARCANE_DEVASTATION);
108+
break;
109+
case SPELL_SUMMON_REINFORCEMENTS:
110+
Talk(SAY_SUMMON);
111+
break;
112+
default:
113+
break;
114+
}
104115
}
105116

106117
// Do not despawn them
@@ -138,7 +149,7 @@ struct boss_commander_sarannis : public BossAI
138149
case EVENT_ARCANE_DEVASTATION:
139150
// She can cast it if victim has only one stack of Arcane Resonance but can she cast it if victim has no stacks?
140151
DoCastVictim(SPELL_ARCANE_DEVASTATION);
141-
events.Repeat(RAND(10s, 15s, 20s, 25s, 30s, 35s));
152+
events.Repeat(10s, 20s);
142153
break;
143154
case EVENT_SUMMON_REINFORCEMENTS:
144155
DoCastSelf(SPELL_SUMMON_REINFORCEMENTS);
@@ -165,7 +176,7 @@ class spell_commander_sarannis_arcane_devastation : public AuraScript
165176
{
166177
PrepareAuraScript(spell_commander_sarannis_arcane_devastation);
167178

168-
bool Validate(SpellInfo const* /*spell*/) override
179+
bool Validate(SpellInfo const* /*spellInfo*/) override
169180
{
170181
return ValidateSpellInfo({ SPELL_ARCANE_RESONANCE });
171182
}
@@ -194,8 +205,8 @@ class spell_commander_sarannis_summon_reinforcements : public SpellScript
194205
void HandleDummy(SpellEffIndex /*effIndex*/)
195206
{
196207
Unit* caster = GetCaster();
197-
for (uint32 spells : SummonReinforcementsSpells)
198-
caster->CastSpell(caster, spells, true);
208+
for (uint32 spell : SummonReinforcementsSpells)
209+
caster->CastSpell(nullptr, spell, true);
199210
}
200211

201212
void Register() override

src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ enum FreywinnTexts
3131

3232
enum FreywinnSpells
3333
{
34-
SPELL_TRANQUILITY = 34550,
35-
SPELL_TREE_FORM = 34551,
36-
SPELL_SUMMON_FRAYER = 34557,
3734
SPELL_PLANT_WHITE = 34759,
3835
SPELL_PLANT_GREEN = 34761,
3936
SPELL_PLANT_BLUE = 34762,
4037
SPELL_PLANT_RED = 34763,
38+
SPELL_TREE_FORM = 34551,
39+
SPELL_SUMMON_FRAYER = 34557,
40+
SPELL_TRANQUILITY = 34550,
4141
SPELL_CANCEL_TRANQUILITY = 34777
4242
};
4343

@@ -62,7 +62,9 @@ struct boss_high_botanist_freywinn : public BossAI
6262
void JustEngagedWith(Unit* who) override
6363
{
6464
BossAI::JustEngagedWith(who);
65+
6566
Talk(SAY_AGGRO);
67+
6668
events.ScheduleEvent(EVENT_PLANT_SEEDLING, 6s);
6769
events.ScheduleEvent(EVENT_TREE_FORM, 30s);
6870
}
@@ -74,6 +76,17 @@ struct boss_high_botanist_freywinn : public BossAI
7476
DoZoneInCombat(summon);
7577
}
7678

79+
void OnSpellCast(SpellInfo const* spellInfo) override
80+
{
81+
if (spellInfo->Id == SPELL_TREE_FORM)
82+
{
83+
_frayersKilled = 0;
84+
Talk(SAY_TREE);
85+
DoCastSelf(SPELL_SUMMON_FRAYER);
86+
events.ScheduleEvent(EVENT_TRANQUILITY, 1s);
87+
}
88+
}
89+
7790
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
7891
{
7992
// Completely guessed, may be actually not used
@@ -120,14 +133,8 @@ struct boss_high_botanist_freywinn : public BossAI
120133
events.Repeat(6s);
121134
break;
122135
case EVENT_TREE_FORM:
123-
// Reset counter in case not all frayers were killed and tree phase was ended, otherwise next time it will be enough to
124-
// kill only 1 or 2 to stop phase. It's an edge case, quite possible it was not even supported
125-
_frayersKilled = 0;
126-
Talk(SAY_TREE);
127-
DoCastSelf(SPELL_SUMMON_FRAYER);
128136
DoCastSelf(SPELL_TREE_FORM);
129137
events.Repeat(60s);
130-
events.ScheduleEvent(EVENT_TRANQUILITY, 1s);
131138
break;
132139
case EVENT_TRANQUILITY:
133140
DoCastSelf(SPELL_TRANQUILITY);

src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@
1515
* with this program. If not, see <http://www.gnu.org/licenses/>.
1616
*/
1717

18+
/*
19+
* Timers requires to be revisited
20+
*/
21+
1822
#include "ScriptMgr.h"
23+
#include "Containers.h"
1924
#include "ScriptedCreature.h"
2025
#include "the_botanica.h"
2126

@@ -44,9 +49,9 @@ enum LajSpells
4449

4550
enum LajEvents
4651
{
47-
EVENT_TELEPORT = 1,
48-
EVENT_EMOTE,
49-
EVENT_SUMMON,
52+
EVENT_SEQUENCE_1 = 1,
53+
EVENT_SEQUENCE_2,
54+
EVENT_SEQUENCE_3,
5055
EVENT_ALLERGIC_REACTION,
5156
EVENT_TRANSFORM,
5257
EVENT_THRASH
@@ -55,18 +60,22 @@ enum LajEvents
5560
// 17980 - Laj
5661
struct boss_laj : public BossAI
5762
{
58-
boss_laj(Creature* creature) : BossAI(creature, DATA_LAJ), _activeTransformAura(0) { }
63+
boss_laj(Creature* creature) : BossAI(creature, DATA_LAJ), _lastTransformSpell(0), _isFirstTransform(true) { }
5964

6065
void Reset() override
6166
{
6267
_Reset();
63-
_activeTransformAura = 0;
68+
_lastTransformSpell = 0;
69+
_isFirstTransform = true;
70+
71+
me->SetReactState(REACT_AGGRESSIVE);
6472
}
6573

6674
void JustEngagedWith(Unit* who) override
6775
{
6876
BossAI::JustEngagedWith(who);
69-
events.ScheduleEvent(EVENT_TELEPORT, 15s, 25s);
77+
78+
events.ScheduleEvent(EVENT_SEQUENCE_1, 15s, 25s);
7079
events.ScheduleEvent(EVENT_ALLERGIC_REACTION, 10s, 20s);
7180
events.ScheduleEvent(EVENT_TRANSFORM, 20s, 30s);
7281
events.ScheduleEvent(EVENT_THRASH, 0s, 10s);
@@ -94,24 +103,22 @@ struct boss_laj : public BossAI
94103
switch (eventId)
95104
{
96105
// Teleport sequence
97-
case EVENT_TELEPORT:
106+
case EVENT_SEQUENCE_1:
98107
DoCastSelf(SPELL_TELEPORT_SELF);
99108
me->SetReactState(REACT_PASSIVE);
100109
events.Repeat(25s, 40s);
101-
events.ScheduleEvent(EVENT_EMOTE, 2s);
110+
events.ScheduleEvent(EVENT_SEQUENCE_2, 2s);
102111
break;
103-
case EVENT_EMOTE:
112+
case EVENT_SEQUENCE_2:
104113
Talk(EMOTE_SUMMON);
105-
events.ScheduleEvent(EVENT_SUMMON, 1s);
114+
events.ScheduleEvent(EVENT_SEQUENCE_3, 1s);
106115
break;
107-
case EVENT_SUMMON:
108-
// He can summon 2 creatures of one type or 2 different. He always spawns them at 2 platforms(despite there are 4 in the room)
109-
// Even if he uses other 4 spells, that does not make sense because the only difference between them is spells entries
110-
// Best guess other spells were added on early development stage for second pair of platforms and were never used on live
111-
DoCastSelf(RAND(SPELL_SUMMON_LASHER_1, SPELL_SUMMON_FLAYER_1), true);
112-
DoCastSelf(RAND(SPELL_SUMMON_LASHER_2, SPELL_SUMMON_FLAYER_2), true);
116+
case EVENT_SEQUENCE_3:
117+
DoCastSelf(RAND(SPELL_SUMMON_LASHER_1, SPELL_SUMMON_FLAYER_1));
118+
DoCastSelf(RAND(SPELL_SUMMON_LASHER_2, SPELL_SUMMON_FLAYER_2));
113119
me->SetReactState(REACT_AGGRESSIVE);
114120
break;
121+
115122
// Abilities
116123
case EVENT_ALLERGIC_REACTION:
117124
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 8.f))
@@ -120,13 +127,25 @@ struct boss_laj : public BossAI
120127
break;
121128
case EVENT_TRANSFORM:
122129
{
123-
/// @todo: Don't apply same aura twice in a row and don't transform to shadow if the event is executed first time
124-
if (_activeTransformAura)
125-
me->RemoveAurasDueToSpell(_activeTransformAura);
130+
std::vector<uint32> transformSpells = { SPELL_TRANSFORM_ARCANE, SPELL_TRANSFORM_FIRE, SPELL_TRANSFORM_FROST, SPELL_TRANSFORM_NATURE, SPELL_TRANSFORM_SHADOW };
131+
132+
if (_isFirstTransform)
133+
{
134+
std::erase(transformSpells, SPELL_TRANSFORM_SHADOW);
135+
_isFirstTransform = false;
136+
}
137+
138+
if (_lastTransformSpell)
139+
{
140+
std::erase(transformSpells, _lastTransformSpell);
141+
me->RemoveAurasDueToSpell(_lastTransformSpell);
142+
}
143+
144+
uint32 selectedSpell = Trinity::Containers::SelectRandomContainerElement(transformSpells);
145+
146+
_lastTransformSpell = selectedSpell;
126147

127-
uint32 spell = RAND(SPELL_TRANSFORM_ARCANE, SPELL_TRANSFORM_FIRE, SPELL_TRANSFORM_FROST, SPELL_TRANSFORM_NATURE, SPELL_TRANSFORM_SHADOW);
128-
DoCastSelf(spell);
129-
_activeTransformAura = spell;
148+
DoCastSelf(selectedSpell);
130149
events.Repeat(25s, 45s);
131150
break;
132151
}
@@ -146,7 +165,8 @@ struct boss_laj : public BossAI
146165
}
147166

148167
private:
149-
uint32 _activeTransformAura;
168+
uint32 _lastTransformSpell;
169+
bool _isFirstTransform;
150170
};
151171

152172
void AddSC_boss_laj()

src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
* with this program. If not, see <http://www.gnu.org/licenses/>.
1616
*/
1717

18+
/*
19+
* Timers requires to be revisited
20+
*/
21+
1822
#include "ScriptMgr.h"
1923
#include "ScriptedCreature.h"
2024
#include "SpellInfo.h"
@@ -81,24 +85,26 @@ struct boss_thorngrin_the_tender : public BossAI
8185
void JustEngagedWith(Unit* who) override
8286
{
8387
BossAI::JustEngagedWith(who);
88+
8489
Talk(SAY_AGGRO);
90+
8591
events.ScheduleEvent(EVENT_SACRIFICE, 30s, 40s);
8692
events.ScheduleEvent(EVENT_HELLFIRE, 5s, 15s);
8793
events.ScheduleEvent(EVENT_ENRAGE, 30s, 40s);
8894
}
8995

90-
void OnSpellStart(SpellInfo const* spell) override
96+
void OnSpellStart(SpellInfo const* spellInfo) override
9197
{
92-
if (spell->Id == SPELL_SACRIFICE)
98+
if (spellInfo->Id == SPELL_SACRIFICE)
9399
Talk(SAY_CAST_SACRIFICE);
94100
}
95101

96-
void OnSpellCast(SpellInfo const* spell) override
102+
void OnSpellCast(SpellInfo const* spellInfo) override
97103
{
98-
if (spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_HELLFIRE, me))
104+
if (spellInfo->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_HELLFIRE, me))
99105
Talk(SAY_CAST_HELLFIRE);
100106

101-
if (spell->Id == SPELL_ENRAGE)
107+
if (spellInfo->Id == SPELL_ENRAGE)
102108
Talk(EMOTE_ENRAGE);
103109
}
104110

@@ -109,6 +115,7 @@ struct boss_thorngrin_the_tender : public BossAI
109115
_phase++;
110116
Talk(SAY_50_PERCENT_HP);
111117
}
118+
112119
if (_phase < PHASE_HEALTH_20 && me->HealthBelowPctDamaged(20, damage))
113120
{
114121
_phase++;

0 commit comments

Comments
 (0)