CORE/Scripting: Move Commander Sarannis & Thorngrin the Tender to cpp scripting. Add instance script.

Thanks to Vincent Micheal for the help :)
This commit is contained in:
Malcrom committed 2013-01-01 21:36:21 -03:30
1 parent 01b705c844
commit f7e7f5fe26
10 files changed
+540 -9

No files matched your search

@@ -0,0 +1,30 @@
-- NPC talk text convert from creature_ai_text. Moving boss to cpp.
UPDATE `creature_template` SET `AIName`= '', `ScriptName`= 'boss_commander_sarannis' WHERE entry`=17976;
DELETE FROM `creature_ai_scripts` WHERE `creature_id`=17976;
DELETE FROM `creature_ai_texts` WHERE `entry` BETWEEN -39 AND -34;
DELETE FROM `creature_text` WHERE `entry` IN (17976);
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
(17976,0,0, 'Step forward! I will see that you are properly welcomed.',14,0,100,0,0,11071, 'Commander Sarannis - On Aggro Say'),
(17976,1,0, 'Oh stop your whimpering.',14,0,100,0,0,11072, 'Commander Sarannis - On Player Death Say'),
(17976,1,1, 'Mission accomplished.',14,0,100,0,0,11073, 'Commander Sarannis - On Player Death Say'),
(17976,2,0, 'You are no longer dealing with some underling.',14,0,100,0,0,11076, 'Commander Sarannis - On Cast Arcane Resonance Say'),
(17976,3,0, 'Band''or shorel''aran!',14,0,100,0,0,11077, 'Commander Sarannis - On Cast Arcane Devastation Say'),
(17976,4,0, '%s calls for reinforcements.',16,0,100,0,0,0, 'Commander Sarannis - On HP@50% Summon emote'),
(17976,5,0, 'Guards! Come and kill these intruders!',14,0,100,0,0,11078, 'Commander Sarannis - On HP@50% Summon Say'),
(17976,6,0, 'I have not yet... begun to...',14,0,100,0,0,11079, 'Commander Sarannis - On Death Say');
-- NPC talk text convert from creature_ai_text. Moving boss to cpp.
UPDATE `creature_template` SET `AIName`= '', `ScriptName`= 'thorngrin_the_tender' WHERE entry`=17978;
DELETE FROM `creature_ai_scripts` WHERE `creature_id`=17978;
DELETE FROM `creature_ai_texts` WHERE entry BETWEEN -16 AND -9;
DELETE FROM `creature_text` WHERE `entry` IN (17978);
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
(17978,0,0, 'What aggravation is this? You will die!',14,0,100,0,0,11205, 'Thorngrin the Tender - Aggro Say'),
(17978,1,0, 'You seek a prize, eh? How about death?',14,0,100,0,0,11206, 'Thorngrin the Tender - 20% Health Say'),
(17978,2,0, 'I hate to say I told you so...',14,0,100,0,0,11207, 'Thorngrin the Tender - Player Death Say'),
(17978,3,0, 'Your life will be mine!',14,0,100,0,0,11208, 'Thorngrin the Tender - Cast Sacrifice Say'),
(17978,4,0, 'I revel in your pain!',14,0,100,0,0,11209, 'Thorngrin the Tender - 50% Health Say'),
(17978,5,0, 'I''ll incinerate you!',14,0,100,0,0,11210, 'Thorngrin the Tender - Cast Hellfire Say'),
(17978,5,1, 'Scream while you burn!',14,0,100,0,0,11211, 'Thorngrin the Tender - Cast Hellfire Say'),
(17978,6,0, 'You won''t... get far.',14,0,100,0,0,11212, 'Thorngrin the Tender - On Death Say'),
(17978,7,0, '%s becomes enraged!',16,0,100,0,0,0, 'Thorngrin the Tender - On Enrage Say');
@@ -579,6 +579,9 @@ void AddSC_instance_arcatraz();
void AddSC_boss_high_botanist_freywinn(); //TK Botanica
void AddSC_boss_laj();
void AddSC_boss_warp_splinter();
void AddSC_boss_thorngrin_the_tender();
void AddSC_boss_commander_sarannis();
void AddSC_instance_the_botanica();
void AddSC_boss_alar(); //TK The Eye
void AddSC_boss_kaelthas();
void AddSC_boss_void_reaver();
@@ -59,6 +59,10 @@ set(scripts_STAT_SRCS
Outland/TempestKeep/Eye/boss_alar.cpp
Outland/TempestKeep/Eye/boss_kaelthas.cpp
Outland/TempestKeep/Eye/the_eye.cpp
Outland/TempestKeep/botanica/the_botanica.h
Outland/TempestKeep/botanica/the_botanica.cpp
Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
Outland/TempestKeep/botanica/thorngrin_the_tender.cpp
Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
Outland/TempestKeep/botanica/boss_warp_splinter.cpp
Outland/TempestKeep/botanica/boss_laj.cpp
@@ -0,0 +1,138 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
enum Says
{
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_ARCANE_RESONANCE = 2,
SAY_ARCANE_DEVASTATION = 3,
EMOTE_SUMMON = 4,
SAY_SUMMON = 5,
SAY_DEATH = 6
};
enum Spells
{
SPELL_ARCANE_RESONANCE = 34794,
SPELL_ARCANE_DEVASTATION = 34799,
SPELL_SUMMON_REINFORCEMENTS = 34803
};
enum
{
EVENT_ARCANE_RESONANCE = 1,
EVENT_ARCANE_DEVASTATION = 2
};
class boss_commander_sarannis : public CreatureScript
{
public: boss_commander_sarannis() : CreatureScript("boss_commander_sarannis") { }
struct boss_commander_sarannisAI : public ScriptedAI
{
boss_commander_sarannisAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_SARANNIS) { }
void Reset()
{
_phase = true;
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
_events.Reset();
_events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 42700);
_events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 15200);
}
void KilledUnit(Unit* /*victim*/)
{
Talk(SAY_KILL);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
}
void DamageTaken(Unit* /*killer*/, uint32 &damage)
{
if (me->HealthBelowPctDamaged(50, damage) && _phase)
{
_phase = false;
Talk(EMOTE_SUMMON);
Talk(SAY_SUMMON);
DoCast(me, SPELL_SUMMON_REINFORCEMENTS);
}
}
void JustSummoned(Creature* summon)
{
ScriptedAI::JustSummoned(summon);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_ARCANE_RESONANCE:
Talk(SAY_ARCANE_RESONANCE);
DoCastVictim(SPELL_ARCANE_RESONANCE, true);
_events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 42700);
break;
case EVENT_ARCANE_DEVASTATION:
Talk(SAY_ARCANE_DEVASTATION);
DoCastVictim(SPELL_ARCANE_DEVASTATION, true);
_events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, urand(11000, 19200));
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
bool _phase;
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_commander_sarannisAI(creature);
}
};
void AddSC_boss_commander_sarannis()
{
new boss_commander_sarannis();
}
@@ -33,7 +33,7 @@ enum eSays
SAY_TREE = 2,
SAY_SUMMON = 3,
SAY_DEATH = 4,
SAY_OOC_RANDOM = 5,
SAY_OOC_RANDOM = 5
};
enum eSpells
@@ -44,7 +44,7 @@ enum eSpells
SPELL_PLANT_WHITE = 34759,
SPELL_PLANT_GREEN = 34761,
SPELL_PLANT_BLUE = 34762,
SPELL_PLANT_RED = 34763,
SPELL_PLANT_RED = 34763
};
#define ENTRY_FRAYER 19953
@@ -60,7 +60,7 @@ class boss_high_botanist_freywinn : public CreatureScript
struct boss_high_botanist_freywinnAI : public ScriptedAI
{
boss_high_botanist_freywinnAI(Creature* creature) : ScriptedAI(creature) {}
boss_high_botanist_freywinnAI(Creature* creature) : BossAI(creature, DATA_HIGH_BOTANIST_FREYWINN) { }
std::list<uint64> Adds_List;
@@ -38,7 +38,7 @@ enum eSpells
SPELL_SUMMON_LASHER_3 = 34686,
SPELL_SUMMON_FLAYER_4 = 34687,
SPELL_SUMMON_LASHER_4 = 34688,
SPELL_SUMMON_FLAYER_3 = 34690,
SPELL_SUMMON_FLAYER_3 = 34690
};
enum eOthers
{
@@ -47,7 +47,7 @@ enum eOthers
MODEL_ARCANE = 14213,
MODEL_FIRE = 13110,
MODEL_FROST = 14112,
MODEL_NATURE = 14214,
MODEL_NATURE = 14214
};
class boss_laj : public CreatureScript
@@ -61,7 +61,7 @@ class boss_laj : public CreatureScript
struct boss_lajAI : public ScriptedAI
{
boss_lajAI(Creature* creature) : ScriptedAI(creature) {}
boss_lajAI(Creature* creature) : BossAI(creature, DATA_LAJ) { }
bool CanSummon;
uint32 Teleport_Timer;
@@ -40,13 +40,13 @@ enum eSpells
SUMMON_TREANTS = 34727, // DBC: 34727, 34731, 34733, 34734, 34736, 34739, 34741 (with Ancestral Life spell 34742) // won't work (guardian summon)
ARCANE_VOLLEY = 36705,
ARCANE_VOLLEY_H = 39133,
SPELL_HEAL_FATHER = 6262,
SPELL_HEAL_FATHER = 6262
};
enum eOthers
{
CREATURE_TREANT = 19949,
TREANT_SPAWN_DIST = 50, //50 yards from Warp Splinter's spawn point
TREANT_SPAWN_DIST = 50 //50 yards from Warp Splinter's spawn point
};
float treant_pos[6][3] =
@@ -136,7 +136,7 @@ class boss_warp_splinter : public CreatureScript
}
struct boss_warp_splinterAI : public ScriptedAI
{
boss_warp_splinterAI(Creature* creature) : ScriptedAI(creature)
boss_warp_splinterAI(Creature* creature) : BossAI(creature, DATA_WARP_SPLINTER) { }
{
Treant_Spawn_Pos_X = creature->GetPositionX();
Treant_Spawn_Pos_Y = creature->GetPositionY();
@@ -0,0 +1,164 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "the_botanica.h"
class instance_the_botanica : public InstanceMapScript
{
public:
instance_the_botanica() : InstanceMapScript("instance_the_botanica", 553) { }
struct instance_the_botanica_InstanceMapScript : public InstanceScript
{
instance_the_botanica_InstanceMapScript(Map* map) : InstanceScript(map)
{
CommanderSarannisGUID = 0;
HighBotanistFreywinnGUID = 0;
ThorngrinTheTenderGUID = 0;
LajGUID = 0;
WarpSplinterGUID = 0;
}
void OnCreatureCreate(Creature* creature)
{
switch (creature->GetEntry())
{
case NPC_COMMANDER_SARANNIS:
CommanderSarannisGUID = creature->GetGUID();
break;
case NPC_HIGH_BOTANIST_FREYWINN:
HighBotanistFreywinnGUID = creature->GetGUID();
break;
case NPC_THORNGRIN_THE_TENDER:
ThorngrinTheTenderGUID = creature->GetGUID();
break;
case NPC_LAJ:
LajGUID = creature->GetGUID();
break;
case NPC_WARP_SPLINTER:
WarpSplinterGUID = creature->GetGUID();
break;
default:
break;
}
}
uint64 GetData64(uint32 type) const
{
switch (type)
{
case DATA_COMMANDER_SARANNIS:
return CommanderSarannisGUID;
case DATA_HIGH_BOTANIST_FREYWINN:
return HighBotanistFreywinnGUID;
case DATA_THORNGRIN_THE_TENDER:
return ThorngrinTheTenderGUID;
case DATA_LAJ:
return LajGUID;
case DATA_WARP_SPLINTER:
return WarpSplinterGUID;
default:
break;
}
return 0;
}
bool SetBossState(uint32 type, EncounterState state)
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
case DATA_COMMANDER_SARANNIS:
case DATA_HIGH_BOTANIST_FREYWINN:
case DATA_THORNGRIN_THE_TENDER:
case DATA_LAJ:
case DATA_WARP_SPLINTER:
break;
default:
break;
}
return true;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "B O " << GetBossSaveData();
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(char const* str)
{
if (!str)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(str);
char dataHead1, dataHead2;
std::istringstream loadStream(str);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'B' && dataHead2 == 'O')
{
for (uint8 i = 0; i < EncounterCount; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
SetBossState(i, EncounterState(tmpState));
}
}
else
OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
protected:
uint64 CommanderSarannisGUID;
uint64 HighBotanistFreywinnGUID;
uint64 ThorngrinTheTenderGUID;
uint64 LajGUID;
uint64 WarpSplinterGUID;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_the_botanica_InstanceMapScript(map);
}
};
void AddSC_instance_the_botanica()
{
new instance_the_botanica;
}
@@ -0,0 +1,42 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DEF_THE_BOTANICA_H
#define DEF_THE_BOTANICA_H
uint32 const EncounterCount = 5;
enum DataTypes
{
DATA_COMMANDER_SARANNIS = 1,
DATA_HIGH_BOTANIST_FREYWINN = 2,
DATA_THORNGRIN_THE_TENDER = 3,
DATA_LAJ = 4,
DATA_WARP_SPLINTER = 5
};
enum CreatureIds
{
NPC_COMMANDER_SARANNIS = 17976,
NPC_HIGH_BOTANIST_FREYWINN = 17975,
NPC_THORNGRIN_THE_TENDER = 17978,
NPC_LAJ = 17980,
NPC_WARP_SPLINTER = 17977
};
#endif
@@ -0,0 +1,150 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
enum Says
{
SAY_AGGRO = 0,
SAY_20_PERCENT_HP = 1,
SAY_KILL = 2,
SAY_CAST_SACRIFICE = 3,
SAY_50_PERCENT_HP = 4,
SAY_CAST_HELLFIRE = 5,
SAY_DEATH = 6,
EMOTE_ENRAGE = 7
};
enum Spells
{
SPELL_SACRIFICE = 34661,
SPELL_HELLFIRE_NORMAL = 34659,
SPELL_HELLFIRE_HEROIC = 39131,
SPELL_ENRAGE = 34670
};
enum Events
{
EVENT_SACRIFICE = 1,
EVENT_HELLFIRE = 2,
EVENT_ENRAGE = 3
};
class boss_thorngrin_the_tender : public CreatureScript
{
public: boss_thorngrin_the_tender() : CreatureScript("thorngrin_the_tender") { }
struct boss_thorngrin_the_tenderAI : public BossAI
{
boss_thorngrin_the_tenderAI(Creature* creature) : BossAI(creature, DATA_THORNGRIN_THE_TENDER) { }
void Reset()
{
_phase1 = true;
_phase2 = true;
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
_events.Reset();
_events.ScheduleEvent(EVENT_SACRIFICE, 5700);
_events.ScheduleEvent(EVENT_HELLFIRE, IsHeroic() ? urand(17400, 19300) : 18000);
_events.ScheduleEvent(EVENT_ENRAGE, 12000);
}
void KilledUnit(Unit* /*victim*/)
{
Talk(SAY_KILL);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
}
void DamageTaken(Unit* /*killer*/, uint32 &damage)
{
if (me->HealthBelowPctDamaged(50, damage) && _phase1)
{
_phase1 = false;
Talk(SAY_50_PERCENT_HP);
}
if (me->HealthBelowPctDamaged(20, damage) && _phase2)
{
_phase2 = false;
Talk(SAY_20_PERCENT_HP);
}
}
void UpdateAI(uint32 const diff)
{
if (!UpdateVictim())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SACRIFICE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
{
Talk(SAY_CAST_SACRIFICE);
DoCast(target, SPELL_SACRIFICE, true);
}
_events.ScheduleEvent(EVENT_SACRIFICE, 29400);
break;
case EVENT_HELLFIRE:
Talk(SAY_CAST_HELLFIRE);
DoCastVictim(DUNGEON_MODE(SPELL_HELLFIRE_NORMAL, SPELL_HELLFIRE_HEROIC), true);
_events.ScheduleEvent(EVENT_HELLFIRE, IsHeroic() ? urand(17400, 19300) : 18000);
break;
case EVENT_ENRAGE:
Talk(EMOTE_ENRAGE);
DoCast(me, SPELL_ENRAGE);
_events.ScheduleEvent(EVENT_ENRAGE, 33000);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
bool _phase1;
bool _phase2;
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_thorngrin_the_tenderAI(creature);
}
};
void AddSC_boss_thorngrin_the_tender()
{
new boss_thorngrin_the_tender();
}