mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 00:18:43 +01:00
Scripts/Botanica: Rework Laj (#27282)
This commit is contained in:
19
sql/updates/world/3.3.5/2021_12_01_02_world.sql
Normal file
19
sql/updates/world/3.3.5/2021_12_01_02_world.sql
Normal file
@@ -0,0 +1,19 @@
|
||||
--
|
||||
UPDATE `spell_target_position` SET `PositionX` = -204, `PositionY` = 391, `PositionZ` = -11, `VerifiedBuild` = 14007 WHERE `ID` = 34673;
|
||||
|
||||
UPDATE `spell_target_position` SET `PositionX` = -185, `PositionY` = 376, `PositionZ` = -15.6, `VerifiedBuild` = 26365 WHERE `ID` = 34681;
|
||||
UPDATE `spell_target_position` SET `PositionX` = -185, `PositionY` = 376, `PositionZ` = -15.6, `VerifiedBuild` = 26365 WHERE `ID` = 34682;
|
||||
UPDATE `spell_target_position` SET `PositionX` = -185, `PositionY` = 407, `PositionZ` = -15.6, `VerifiedBuild` = 26365 WHERE `ID` = 34684;
|
||||
UPDATE `spell_target_position` SET `PositionX` = -185, `PositionY` = 407, `PositionZ` = -15.6, `VerifiedBuild` = 26365 WHERE `ID` = 34685;
|
||||
|
||||
UPDATE `creature_model_info` SET `BoundingRadius` = 2, `CombatReach` = 3 WHERE `DisplayID` IN (14112,14213,14214);
|
||||
|
||||
-- Their AI requires research
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` IN (19919,19920);
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (19919,19920) AND `source_type` = 0;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
|
||||
(19919,0,0,0,37,0,100,0,0,0,0,0,0,116,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Thorn Lasher - On AI Initialize - Set Corpse Delay"),
|
||||
(19919,0,1,0,0,0,100,0,3000,5000,10000,10000,0,11,35071,0,0,0,0,0,2,0,0,0,0,0,0,0,0,"Thorn Lasher - In Combat - Cast 'Thorn Missiles'"),
|
||||
|
||||
(19920,0,0,0,37,0,100,0,0,0,0,0,0,116,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Thorn Flayer - On AI Initialize - Set Corpse Delay"),
|
||||
(19920,0,1,0,0,0,100,0,3000,5000,10000,10000,0,11,35507,0,0,0,0,0,2,0,0,0,0,0,0,0,0,"Thorn Flayer - In Combat - Cast 'Mind Flay'");
|
||||
@@ -15,218 +15,139 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Laj
|
||||
SD%Complete: 90
|
||||
SDComment: Immunities are wrong, must be adjusted to use resistance from creature_templates. Most spells require database support.
|
||||
SDCategory: Tempest Keep, The Botanica
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "the_botanica.h"
|
||||
|
||||
enum Texts
|
||||
{
|
||||
EMOTE_SUMMON = 0
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_ALLERGIC_REACTION = 34697,
|
||||
SPELL_TELEPORT_SELF = 34673,
|
||||
SPELL_THRASH = 3391, // No aura here
|
||||
|
||||
SPELL_SUMMON_LASHER_1 = 34681,
|
||||
SPELL_SUMMON_FLAYER_1 = 34682,
|
||||
SPELL_SUMMON_LASHER_2 = 34684,
|
||||
SPELL_SUMMON_FLAYER_2 = 34685,
|
||||
SPELL_SUMMON_LASHER_3 = 34686,
|
||||
SPELL_SUMMON_FLAYER_4 = 34687,
|
||||
SPELL_SUMMON_LASHER_4 = 34688,
|
||||
SPELL_SUMMON_FLAYER_3 = 34690
|
||||
};
|
||||
enum Misc
|
||||
{
|
||||
EMOTE_SUMMON = 0,
|
||||
MODEL_DEFAULT = 13109,
|
||||
MODEL_ARCANE = 14213,
|
||||
MODEL_FIRE = 13110,
|
||||
MODEL_FROST = 14112,
|
||||
MODEL_NATURE = 14214
|
||||
|
||||
SPELL_TRANSFORM_ARCANE = 34703,
|
||||
SPELL_TRANSFORM_FIRE = 34704,
|
||||
SPELL_TRANSFORM_FROST = 34705,
|
||||
SPELL_TRANSFORM_NATURE = 34707,
|
||||
SPELL_TRANSFORM_SHADOW = 34710
|
||||
};
|
||||
|
||||
class boss_laj : public CreatureScript
|
||||
enum Events
|
||||
{
|
||||
public:
|
||||
EVENT_TELEPORT = 1,
|
||||
EVENT_EMOTE,
|
||||
EVENT_SUMMON,
|
||||
EVENT_ALLERGIC_REACTION,
|
||||
EVENT_TRANSFORM,
|
||||
EVENT_THRASH
|
||||
};
|
||||
|
||||
boss_laj()
|
||||
: CreatureScript("boss_laj")
|
||||
struct boss_laj : public BossAI
|
||||
{
|
||||
boss_laj(Creature* creature) : BossAI(creature, DATA_LAJ), _activeTransformAura(0) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
_activeTransformAura = 0;
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 15s, 25s);
|
||||
events.ScheduleEvent(EVENT_ALLERGIC_REACTION, 10s, 20s);
|
||||
events.ScheduleEvent(EVENT_TRANSFORM, 20s, 30s);
|
||||
events.ScheduleEvent(EVENT_THRASH, 0s, 10s);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
// Not entirely correct, they aggro on their own in a weird way and in general behave weirdly
|
||||
summon->AI()->AttackStart(SelectTarget(SelectTargetMethod::Random, 0));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
// Teleport sequence
|
||||
case EVENT_TELEPORT:
|
||||
DoCastSelf(SPELL_TELEPORT_SELF);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
events.Repeat(25s, 40s);
|
||||
events.ScheduleEvent(EVENT_EMOTE, 2s);
|
||||
break;
|
||||
case EVENT_EMOTE:
|
||||
Talk(EMOTE_SUMMON);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 1s);
|
||||
break;
|
||||
case EVENT_SUMMON:
|
||||
// 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)
|
||||
// Even if he uses other 4 spells, that does not make sense because the only difference between them is spells entries
|
||||
// Best guess other spells were added on early development stage for second pair of platforms and were never used on live
|
||||
DoCastSelf(RAND(SPELL_SUMMON_LASHER_1, SPELL_SUMMON_FLAYER_1), true);
|
||||
DoCastSelf(RAND(SPELL_SUMMON_LASHER_2, SPELL_SUMMON_FLAYER_2), true);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
break;
|
||||
// Abilities
|
||||
case EVENT_ALLERGIC_REACTION:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 8.f))
|
||||
DoCast(target, SPELL_ALLERGIC_REACTION);
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_TRANSFORM:
|
||||
{
|
||||
/// @todo: Don't apply same aura twice in a row and don't transform to shadow if the event is executed first time
|
||||
if (_activeTransformAura)
|
||||
me->RemoveAurasDueToSpell(_activeTransformAura);
|
||||
|
||||
uint32 spell = RAND(SPELL_TRANSFORM_ARCANE, SPELL_TRANSFORM_FIRE, SPELL_TRANSFORM_FROST, SPELL_TRANSFORM_NATURE, SPELL_TRANSFORM_SHADOW);
|
||||
DoCastSelf(spell);
|
||||
_activeTransformAura = spell;
|
||||
events.Repeat(25s, 45s);
|
||||
break;
|
||||
}
|
||||
case EVENT_THRASH:
|
||||
DoCastSelf(SPELL_THRASH);
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
}
|
||||
|
||||
struct boss_lajAI : public BossAI
|
||||
{
|
||||
boss_lajAI(Creature* creature) : BossAI(creature, DATA_LAJ)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
CanSummon = false;
|
||||
Teleport_Timer = 20000;
|
||||
Summon_Timer = 2500;
|
||||
Transform_Timer = 30000;
|
||||
Allergic_Timer = 5000;
|
||||
}
|
||||
|
||||
bool CanSummon;
|
||||
uint32 Teleport_Timer;
|
||||
uint32 Summon_Timer;
|
||||
uint32 Transform_Timer;
|
||||
uint32 Allergic_Timer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
me->SetDisplayId(MODEL_DEFAULT);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void DoTransform()
|
||||
{
|
||||
switch (rand32() % 5)
|
||||
{
|
||||
case 0:
|
||||
me->SetDisplayId(MODEL_DEFAULT);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 1:
|
||||
me->SetDisplayId(MODEL_ARCANE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 2:
|
||||
me->SetDisplayId(MODEL_FIRE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 3:
|
||||
me->SetDisplayId(MODEL_FROST);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 4:
|
||||
me->SetDisplayId(MODEL_NATURE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DoSummons()
|
||||
{
|
||||
switch (rand32() % 4)
|
||||
{
|
||||
case 0:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_1, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_1, true);
|
||||
break;
|
||||
case 1:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_2, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_2, true);
|
||||
break;
|
||||
case 2:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_3, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_3, true);
|
||||
break;
|
||||
case 3:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_4, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_4, true);
|
||||
break;
|
||||
}
|
||||
CanSummon = false;
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
if (summon && me->GetVictim())
|
||||
summon->AI()->AttackStart(SelectTarget(SelectTargetMethod::Random, 0));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (CanSummon)
|
||||
{
|
||||
if (Summon_Timer <= diff)
|
||||
{
|
||||
Talk(EMOTE_SUMMON);
|
||||
DoSummons();
|
||||
Summon_Timer = 2500;
|
||||
}
|
||||
else
|
||||
Summon_Timer -= diff;
|
||||
}
|
||||
|
||||
if (Allergic_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_ALLERGIC_REACTION);
|
||||
Allergic_Timer = 25000 + rand32() % 15000;
|
||||
}
|
||||
else
|
||||
Allergic_Timer -= diff;
|
||||
|
||||
if (Teleport_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_TELEPORT_SELF);
|
||||
Teleport_Timer = 30000 + rand32() % 10000;
|
||||
CanSummon = true;
|
||||
}
|
||||
else
|
||||
Teleport_Timer -= diff;
|
||||
|
||||
if (Transform_Timer <= diff)
|
||||
{
|
||||
DoTransform();
|
||||
Transform_Timer = 25000 + rand32() % 15000;
|
||||
}
|
||||
else
|
||||
Transform_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetBotanicaAI<boss_lajAI>(creature);
|
||||
}
|
||||
private:
|
||||
uint32 _activeTransformAura;
|
||||
};
|
||||
|
||||
void AddSC_boss_laj()
|
||||
{
|
||||
new boss_laj();
|
||||
RegisterBotanicaCreatureAI(boss_laj);
|
||||
}
|
||||
|
||||
@@ -49,4 +49,6 @@ inline AI* GetBotanicaAI(T* obj)
|
||||
return GetInstanceAI<AI>(obj, BotanicaScriptName);
|
||||
}
|
||||
|
||||
#define RegisterBotanicaCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBotanicaAI)
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user