Skip to content

Commit

Permalink
Botanica: Add spell lists to laj and rework his elemental shift
Browse files Browse the repository at this point in the history
  • Loading branch information
killerwife committed Sep 9, 2023
1 parent 6fd0c98 commit 966698d
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 113 deletions.
8 changes: 8 additions & 0 deletions sql/base/dbc/cmangos_fixes/Spell.sql
Original file line number Diff line number Diff line change
Expand Up @@ -3070,6 +3070,14 @@ INSERT INTO spell_template(Id, SchoolMask, Category, Dispel, Mechanic, Attribute
INSERT INTO spell_template(Id, SchoolMask, Category, Dispel, Mechanic, Attributes, AttributesEx, AttributesEx2, AttributesEx3, AttributesEx4, AttributesEx5, Stances, StancesNot, Targets, TargetCreatureType, RequiresSpellFocus, CasterAuraState, TargetAuraState, CasterAuraStateNot, TargetAuraStateNot, CastingTimeIndex, RecoveryTime, CategoryRecoveryTime, InterruptFlags, AuraInterruptFlags, ChannelInterruptFlags, procFlags, procChance, procCharges, maxLevel, baseLevel, spellLevel, DurationIndex, powerType, manaCost, manaCostPerLevel, manaPerSecond, manaPerSecondPerLevel, rangeIndex, speed, StackAmount, Totem1, Totem2, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8, EquippedItemClass, EquippedItemSubClassMask, EquippedItemInventoryTypeMask, Effect1, Effect2, Effect3, EffectDieSides1, EffectDieSides2, EffectDieSides3, EffectBaseDice1, EffectBaseDice2, EffectBaseDice3, EffectDicePerLevel1, EffectDicePerLevel2, EffectDicePerLevel3, EffectRealPointsPerLevel1, EffectRealPointsPerLevel2, EffectRealPointsPerLevel3, EffectBasePoints1, EffectBasePoints2, EffectBasePoints3, EffectMechanic1, EffectMechanic2, EffectMechanic3, EffectImplicitTargetA1, EffectImplicitTargetA2, EffectImplicitTargetA3, EffectImplicitTargetB1, EffectImplicitTargetB2, EffectImplicitTargetB3, EffectRadiusIndex1, EffectRadiusIndex2, EffectRadiusIndex3, EffectApplyAuraName1, EffectApplyAuraName2, EffectApplyAuraName3, EffectAmplitude1, EffectAmplitude2, EffectAmplitude3, EffectMultipleValue1, EffectMultipleValue2, EffectMultipleValue3, EffectChainTarget1, EffectChainTarget2, EffectChainTarget3, EffectItemType1, EffectItemType2, EffectItemType3, EffectMiscValue1, EffectMiscValue2, EffectMiscValue3, EffectMiscValueB1, EffectMiscValueB2, EffectMiscValueB3, EffectTriggerSpell1, EffectTriggerSpell2, EffectTriggerSpell3, EffectPointsPerComboPoint1, EffectPointsPerComboPoint2, EffectPointsPerComboPoint3, SpellVisual, SpellIconID, activeIconID, spellPriority, SpellName, SpellName2, SpellName3, SpellName4, SpellName5, SpellName6, SpellName7, SpellName8, ManaCostPercentage, StartRecoveryCategory, StartRecoveryTime, MaxTargetLevel, SpellFamilyName, SpellFamilyFlags, MaxAffectedTargets, DmgClass, PreventionType, DmgMultiplier1, DmgMultiplier2, DmgMultiplier3, TotemCategory1, TotemCategory2, AreaId) VALUES
('34781', '1', '0', '0', '0', '464', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '101', '0', '0', '29', '29', '21', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '-1', '0', '6', '0', '0', '1', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '23', '0', '0', '5000', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '34782', '0', '0', '0', '0', '0', '0', '27', '0', '0', 'Bind Feet', '', '', '', '', '', '', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0');

-- Laj transformation spells
INSERT INTO spell_template(Id, SchoolMask, Category, Dispel, Mechanic, Attributes, AttributesEx, AttributesEx2, AttributesEx3, AttributesEx4, AttributesEx5, Stances, StancesNot, Targets, TargetCreatureType, RequiresSpellFocus, CasterAuraState, TargetAuraState, CasterAuraStateNot, TargetAuraStateNot, CastingTimeIndex, RecoveryTime, CategoryRecoveryTime, InterruptFlags, AuraInterruptFlags, ChannelInterruptFlags, procFlags, procChance, procCharges, maxLevel, baseLevel, spellLevel, DurationIndex, powerType, manaCost, manaCostPerLevel, manaPerSecond, manaPerSecondPerLevel, rangeIndex, speed, StackAmount, Totem1, Totem2, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8, EquippedItemClass, EquippedItemSubClassMask, EquippedItemInventoryTypeMask, Effect1, Effect2, Effect3, EffectDieSides1, EffectDieSides2, EffectDieSides3, EffectBaseDice1, EffectBaseDice2, EffectBaseDice3, EffectDicePerLevel1, EffectDicePerLevel2, EffectDicePerLevel3, EffectRealPointsPerLevel1, EffectRealPointsPerLevel2, EffectRealPointsPerLevel3, EffectBasePoints1, EffectBasePoints2, EffectBasePoints3, EffectMechanic1, EffectMechanic2, EffectMechanic3, EffectImplicitTargetA1, EffectImplicitTargetA2, EffectImplicitTargetA3, EffectImplicitTargetB1, EffectImplicitTargetB2, EffectImplicitTargetB3, EffectRadiusIndex1, EffectRadiusIndex2, EffectRadiusIndex3, EffectApplyAuraName1, EffectApplyAuraName2, EffectApplyAuraName3, EffectAmplitude1, EffectAmplitude2, EffectAmplitude3, EffectMultipleValue1, EffectMultipleValue2, EffectMultipleValue3, EffectChainTarget1, EffectChainTarget2, EffectChainTarget3, EffectItemType1, EffectItemType2, EffectItemType3, EffectMiscValue1, EffectMiscValue2, EffectMiscValue3, EffectMiscValueB1, EffectMiscValueB2, EffectMiscValueB3, EffectTriggerSpell1, EffectTriggerSpell2, EffectTriggerSpell3, EffectPointsPerComboPoint1, EffectPointsPerComboPoint2, EffectPointsPerComboPoint3, SpellVisual, SpellIconID, activeIconID, spellPriority, SpellName, SpellName2, SpellName3, SpellName4, SpellName5, SpellName6, SpellName7, SpellName8, ManaCostPercentage, StartRecoveryCategory, StartRecoveryTime, MaxTargetLevel, SpellFamilyName, SpellFamilyFlags, MaxAffectedTargets, DmgClass, PreventionType, DmgMultiplier1, DmgMultiplier2, DmgMultiplier3, TotemCategory1, TotemCategory2, AreaId) VALUES
('34703', '1', '0', '0', '0', '400', '268435456', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '101', '0', '0', '0', '0', '21', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '0', '0', '6', '6', '6', '0', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0', '0', '0', '-501', '499', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '56', '22', '22', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '19928', '32', '64', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '53', '0', '0', 'Laj (Arcane)', '', '', '', '', '', '', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0'),
('34704', '1', '0', '0', '0', '400', '268435456', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '101', '0', '0', '0', '0', '21', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '0', '0', '6', '6', '6', '0', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0', '0', '0', '-501', '499', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '56', '22', '22', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '19929', '32', '4', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '53', '0', '0', 'Laj (Fire)', '', '', '', '', '', '', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0'),
('34705', '1', '0', '0', '0', '400', '268435456', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '101', '0', '0', '0', '0', '21', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '0', '0', '6', '6', '6', '0', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0', '0', '0', '-501', '499', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '56', '22', '22', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '19930', '32', '16', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '53', '0', '0', 'Laj (Frost)', '', '', '', '', '', '', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0'),
('34707', '1', '0', '0', '0', '400', '268435456', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '101', '0', '0', '0', '0', '21', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '0', '0', '6', '6', '6', '0', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0', '0', '0', '-501', '499', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '56', '22', '22', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '19931', '32', '8', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '53', '0', '0', 'Laj (Nature)', '', '', '', '', '', '', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0'),
('34710', '1', '0', '0', '0', '400', '268435456', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '101', '0', '0', '0', '0', '21', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '0', '0', '6', '6', '6', '0', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0', '0', '0', '-501', '499', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '56', '22', '22', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '17980', '32', '32', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '53', '0', '0', 'Laj (Shadow)', '', '', '', '', '', '', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0');

-- ============================================================
-- WOTLK section
-- ============================================================
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ enum

SPELL_ROOT_SELF = 23973,

SPELL_LAJ_ARCANE = 34703,
SPELL_LAJ_FIRE = 34704,
SPELL_LAJ_FROST = 34705,
SPELL_LAJ_NATURE = 34707,
SPELL_LAJ_SHADOW = 34710,

MODEL_ID_DEFAULT = 13109,
MODEL_ID_ARCANE = 14213,
MODEL_ID_FIRE = 13110,
Expand All @@ -54,81 +60,46 @@ enum
const std::vector<uint32> summonSpellsFirstLoc = { SPELL_SUMMON_LASHER_1, SPELL_SUMMON_FLAYER_1 };
const std::vector<uint32> summonSpellsSecondLoc = { SPELL_SUMMON_LASHER_2, SPELL_SUMMON_FLAYER_2 };

enum LajActions
{
LAJ_ACTION_MAX,
LAJ_TELEPORT_SUMMON
};

struct boss_lajAI : public CombatAI
{
boss_lajAI(Creature* creature) : CombatAI(creature, 0)
{
Reset();
AddCustomAction(LAJ_TELEPORT_SUMMON, true, [&]() { HandleTeleportSummon(); }, TIMER_COMBAT_COMBAT);
}

uint32 m_uiTeleportTimer;
uint32 m_uiSummonTimer;
uint32 m_uiTransformTimer;
uint32 m_uiAllergicTimer;
uint32 m_uiTrashTimer;

void Reset() override
void AddTransformCooldowns(uint32 spellId)
{
m_creature->SetDisplayId(MODEL_ID_DEFAULT);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);

m_uiTeleportTimer = urand(17000, 26000);
m_uiSummonTimer = 0;
m_uiTransformTimer = 30000;
m_uiAllergicTimer = urand(8500, 30000);
m_uiTrashTimer = urand(3600, 5000);
if (spellId != SPELL_LAJ_ARCANE)
m_creature->AddCooldown(*sSpellTemplate.LookupEntry<SpellEntry>(SPELL_LAJ_ARCANE), nullptr, false, 5000);
if (spellId != SPELL_LAJ_FIRE)
m_creature->AddCooldown(*sSpellTemplate.LookupEntry<SpellEntry>(SPELL_LAJ_FIRE), nullptr, false, 5000);
if (spellId != SPELL_LAJ_FROST)
m_creature->AddCooldown(*sSpellTemplate.LookupEntry<SpellEntry>(SPELL_LAJ_FROST), nullptr, false, 5000);
if (spellId != SPELL_LAJ_NATURE)
m_creature->AddCooldown(*sSpellTemplate.LookupEntry<SpellEntry>(SPELL_LAJ_NATURE), nullptr, false, 5000);
if (spellId != SPELL_LAJ_SHADOW)
m_creature->AddCooldown(*sSpellTemplate.LookupEntry<SpellEntry>(SPELL_LAJ_SHADOW), nullptr, false, 5000);
}

void DoTransform()
{
uint32 spellId = 0;
// Random transform into a different form
switch (urand(0, 4))
{
case 0:
m_creature->SetDisplayId(MODEL_ID_DEFAULT);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
break;
case 1:
m_creature->SetDisplayId(MODEL_ID_ARCANE);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, true);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
break;
case 2:
m_creature->SetDisplayId(MODEL_ID_FIRE);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
break;
case 3:
m_creature->SetDisplayId(MODEL_ID_FROST);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
break;
case 4:
m_creature->SetDisplayId(MODEL_ID_NATURE);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
m_creature->ApplySpellImmune(nullptr, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
break;
case 0: spellId = SPELL_LAJ_ARCANE; break;
case 1: spellId = SPELL_LAJ_FIRE; break;
case 2: spellId = SPELL_LAJ_FROST; break;
case 3: spellId = SPELL_LAJ_NATURE; break;
case 4: spellId = SPELL_LAJ_SHADOW; break;
}
DoCastSpellIfCan(nullptr, spellId);
}

void DoSummons()
Expand All @@ -144,64 +115,26 @@ struct boss_lajAI : public CombatAI
summoned->AI()->AttackStart(target);
}

void UpdateAI(const uint32 uiDiff) override
void OnSpellCast(SpellEntry const* spellInfo, Unit* target) override
{
if (!m_creature->SelectHostileTarget() || !m_creature->GetVictim())
return;

if (m_uiSummonTimer)
switch (spellInfo->Id)
{
if (m_uiSummonTimer <= uiDiff)
{
// Summon adds and restart chasing the victim
DoSummons();
DoBroadcastText(EMOTE_SUMMON, m_creature);

if (m_creature->GetVictim())
m_creature->GetMotionMaster()->MoveChase(m_creature->GetVictim());
m_uiSummonTimer = 0;
}
else
m_uiSummonTimer -= uiDiff;
case SPELL_LAJ_ARCANE:
case SPELL_LAJ_FIRE:
case SPELL_LAJ_FROST:
case SPELL_LAJ_NATURE:
case SPELL_LAJ_SHADOW: AddTransformCooldowns(spellInfo->Id); break;
case SPELL_TELEPORT_SELF: SetCombatMovement(false, true); ResetTimer(LAJ_TELEPORT_SUMMON, 4000); break;
}
}

if (m_uiAllergicTimer < uiDiff)
{
if (DoCastSpellIfCan(m_creature->GetVictim(), SPELL_ALLERGIC_REACTION) == CAST_OK)
m_uiAllergicTimer = urand(21000, 32000);
}
else
m_uiAllergicTimer -= uiDiff;

if (m_uiTeleportTimer < uiDiff)
{
if (DoCastSpellIfCan(m_creature, SPELL_TELEPORT_SELF) == CAST_OK)
{
m_creature->GetMotionMaster()->MoveIdle();
m_uiTeleportTimer = urand(25000, 33000);
m_uiSummonTimer = 4000;
}
}
else
m_uiTeleportTimer -= uiDiff;

if (m_uiTransformTimer < uiDiff)
{
DoTransform();
m_uiTransformTimer = urand(25000, 40000);
}
else
m_uiTransformTimer -= uiDiff;

if (m_uiTrashTimer < uiDiff)
{
if (DoCastSpellIfCan(m_creature->GetVictim(), SPELL_TRASH) == CAST_OK)
m_uiTrashTimer = urand(10000, 24000);
}
else
m_uiTrashTimer -= uiDiff;
void HandleTeleportSummon()
{
DoSummons();
DoBroadcastText(EMOTE_SUMMON, m_creature);

DoMeleeAttackIfReady();
if (m_creature->GetVictim())
m_creature->GetMotionMaster()->MoveChase(m_creature->GetVictim());
}
};

Expand Down

0 comments on commit 966698d

Please sign in to comment.