mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Scripting: Add Kirtonos The Herald to c++ scripting. Combat still not finished.
This commit is contained in:
8
sql/updates/world/2013_01_03_16_world_various_fixes.sql
Normal file
8
sql/updates/world/2013_01_03_16_world_various_fixes.sql
Normal file
@@ -0,0 +1,8 @@
|
||||
-- NPC talk text convert from creature_ai_text. Moving boss to cpp.
|
||||
UPDATE `creature_template` SET `minlevel`=63,`maxlevel`=63,`InhabitType`=5,`AIName`= '', `ScriptName`= 'boss_kirtonos_the_herald' WHERE `entry`=10506;
|
||||
UPDATE `gameobject_template` SET `AIName`= '', `ScriptName`= 'go_brazier_of_the_herald' WHERE `entry`=175564;
|
||||
DELETE FROM `creature_ai_scripts` WHERE `creature_id`=10506;
|
||||
DELETE FROM `creature_ai_texts` WHERE `entry`=-448;
|
||||
DELETE FROM `creature_text` WHERE `entry` IN (10506);
|
||||
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
|
||||
(10506,0,0, '%s lets out a shrill cry.',16,0,100,0,0,0, 'Kirtonos The Herald - Emote');
|
||||
@@ -192,6 +192,7 @@ void AddSC_boss_lorekeeperpolkelt();
|
||||
void AddSC_boss_rasfrost();
|
||||
void AddSC_boss_theravenian();
|
||||
void AddSC_boss_vectus();
|
||||
void AddSC_boss_kirtonos_the_herald();
|
||||
void AddSC_instance_scholomance();
|
||||
void AddSC_shadowfang_keep(); //Shadowfang keep
|
||||
void AddSC_instance_shadowfang_keep();
|
||||
@@ -826,6 +827,7 @@ void AddEasternKingdomsScripts()
|
||||
AddSC_boss_rasfrost();
|
||||
AddSC_boss_theravenian();
|
||||
AddSC_boss_vectus();
|
||||
AddSC_boss_kirtonos_the_herald();
|
||||
AddSC_instance_scholomance();
|
||||
AddSC_shadowfang_keep(); //Shadowfang keep
|
||||
AddSC_instance_shadowfang_keep();
|
||||
|
||||
@@ -31,6 +31,7 @@ set(scripts_STAT_SRCS
|
||||
EasternKingdoms/Scholomance/instance_scholomance.cpp
|
||||
EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
|
||||
EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
|
||||
EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
|
||||
EasternKingdoms/zone_isle_of_queldanas.cpp
|
||||
EasternKingdoms/boss_kruul.cpp
|
||||
EasternKingdoms/ZulGurub/boss_hakkar.cpp
|
||||
|
||||
@@ -0,0 +1,293 @@
|
||||
/*
|
||||
* 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"
|
||||
#include "scholomance.h"
|
||||
|
||||
enum Says
|
||||
{
|
||||
EMOTE_SUMMONED = 0
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_SWOOP = 18144,
|
||||
SPELL_WING_FLAP = 12882,
|
||||
SPELL_PIERCE_ARMOR = 6016,
|
||||
SPELL_DISARM = 8379,
|
||||
|
||||
SPELL_KIRTONOS_TRANSFORM = 16467, // 9:56 10:14 10:33 10:49 // 10:57 attack stopped? Display id changed 12K hp 7534
|
||||
|
||||
SPELL_SHADOW_BOLT = 17228,
|
||||
SPELL_CURSE_OR_TONGUES = 12889,
|
||||
SPELL_DONINATE_MIND = 14515
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SWOOP = 1,
|
||||
EVENT_WING_FLAP = 2,
|
||||
EVENT_PIERCE_ARMOR = 3,
|
||||
EVENT_DISARM = 4,
|
||||
EVENT_SHADOW_BOLT = 5,
|
||||
EVENT_CURSE_OR_TONGUES = 6,
|
||||
EVENT_DONINATE_MIND = 7,
|
||||
EVENT_KIRTONOS_TRANSFORM = 8
|
||||
};
|
||||
|
||||
enum Points
|
||||
{
|
||||
MAX_KIRTONOS_WAYPOINTS_INTRO = 14,
|
||||
POINT_KIRTONOS_LAND = 14
|
||||
};
|
||||
|
||||
Position const kirtonosIntroWaypoint[MAX_KIRTONOS_WAYPOINTS_INTRO] =
|
||||
{
|
||||
{316.7087f, 71.26834f, 104.5843f, 0.0f},
|
||||
{321.1605f, 72.80973f, 104.6676f, 0.0f},
|
||||
{332.3713f, 77.98991f, 105.8621f, 0.0f},
|
||||
{333.3254f, 86.60159f, 106.6399f, 0.0f},
|
||||
{334.1263f, 101.6836f, 106.8343f, 0.0f},
|
||||
{331.0458f, 114.5935f, 106.3621f, 0.0f},
|
||||
{329.5439f, 126.7019f, 106.1399f, 0.0f},
|
||||
{335.2471f, 136.5460f, 105.7232f, 0.0f},
|
||||
{343.2100f, 139.9459f, 107.6399f, 0.0f},
|
||||
{364.3288f, 140.9012f, 109.9454f, 0.0f},
|
||||
{362.6760f, 115.6384f, 110.3065f, 0.0f},
|
||||
{341.7896f, 91.94390f, 107.1676f, 0.0f},
|
||||
{313.4945f, 93.45945f, 104.0565f, 0.0f},
|
||||
{306.3839f, 93.61675f, 104.0565f, 0.0f},
|
||||
};
|
||||
|
||||
class boss_kirtonos_the_herald : public CreatureScript
|
||||
{
|
||||
public: boss_kirtonos_the_herald() : CreatureScript("boss_kirtonos_the_herald") { }
|
||||
|
||||
struct boss_kirtonos_the_heraldAI : public BossAI
|
||||
{
|
||||
boss_kirtonos_the_heraldAI(Creature* creature) : BossAI(creature, TYPE_KIRTONOS) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_combatPhase = 0;
|
||||
_summonPhase = 0;
|
||||
_summonTimer = 0;
|
||||
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
|
||||
gate->SetGoState(GO_STATE_ACTIVE);
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SWOOP, urand(7000, 8000)); // Phase 1 10:04 10:19
|
||||
events.ScheduleEvent(EVENT_WING_FLAP, urand(14000, 15000)); // Phase 1 10:11 10:24
|
||||
events.ScheduleEvent(EVENT_PIERCE_ARMOR, urand(17000, 18000)); // Phase 1 10:14
|
||||
events.ScheduleEvent(EVENT_DISARM, urand(21000, 22000)); // Phase 1 10:18 10:29
|
||||
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(42200, 47700)); // Phase 2 10:38
|
||||
events.ScheduleEvent(EVENT_CURSE_OR_TONGUES, urand(53200, 56000)); // Phase 2
|
||||
events.ScheduleEvent(EVENT_DONINATE_MIND, urand(34000, 40000)); // Phase 2
|
||||
events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, urand(18000, 20000)); // Phase 2
|
||||
_EnterCombat();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
|
||||
gate->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* brazier = me->GetMap()->GetGameObject(instance->GetData64(GO_BRAZIER_OF_THE_HERALD)))
|
||||
{
|
||||
brazier->ResetDoorOrButton();
|
||||
brazier->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
|
||||
gate->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* brazier = me->GetMap()->GetGameObject(instance->GetData64(GO_BRAZIER_OF_THE_HERALD)))
|
||||
{
|
||||
brazier->ResetDoorOrButton();
|
||||
brazier->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
me->DespawnOrUnsummon(5000);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*killer*/, uint32 &damage)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* summoner)
|
||||
{
|
||||
me->SetDisableGravity(true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
_summonPhase = 1;
|
||||
_summonTimer = 1;
|
||||
_currentPoint = 0;
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
BossAI::JustSummoned(summon);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 movementType, uint32 pointId)
|
||||
{
|
||||
if (movementType != POINT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
_currentPoint = pointId + 1;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
if (_summonPhase)
|
||||
{
|
||||
if (_summonTimer <= diff)
|
||||
{
|
||||
switch (_summonPhase)
|
||||
{
|
||||
case 1:
|
||||
if (_currentPoint < POINT_KIRTONOS_LAND)
|
||||
me->GetMotionMaster()->MovePoint(_currentPoint, kirtonosIntroWaypoint[_currentPoint]);
|
||||
else
|
||||
{
|
||||
_summonTimer = 1000;
|
||||
_summonPhase = 2;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
me->GetMotionMaster()->MovePoint(0, 299.4884f, 92.76137f, 105.6335f);
|
||||
_summonTimer = 1000;
|
||||
_summonPhase = 3;
|
||||
break;
|
||||
case 3:
|
||||
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
|
||||
gate->SetGoState(GO_STATE_READY);
|
||||
me->SetFacingTo(0.01745329f);
|
||||
_summonTimer = 3000;
|
||||
_summonPhase = 4;
|
||||
break;
|
||||
case 4:
|
||||
if (GameObject* brazier = me->GetMap()->GetGameObject(instance->GetData64(GO_BRAZIER_OF_THE_HERALD)))
|
||||
brazier->SetGoState(GO_STATE_READY);
|
||||
me->SetDisableGravity(false);
|
||||
DoCast(me, SPELL_KIRTONOS_TRANSFORM);
|
||||
_summonTimer = 1000;
|
||||
_summonPhase = 5;
|
||||
break;
|
||||
case 5:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
|
||||
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(11365));
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
_summonTimer = 0;
|
||||
_summonPhase = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
_summonTimer -= diff;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SWOOP:
|
||||
DoCast(me, SPELL_SWOOP);
|
||||
events.ScheduleEvent(EVENT_SWOOP, urand(15000, 16000));
|
||||
break;
|
||||
case EVENT_WING_FLAP:
|
||||
DoCast(me, SPELL_WING_FLAP);
|
||||
events.ScheduleEvent(EVENT_WING_FLAP, urand(13000, 14000));
|
||||
break;
|
||||
case EVENT_PIERCE_ARMOR:
|
||||
DoCastVictim(SPELL_PIERCE_ARMOR, true);
|
||||
events.ScheduleEvent(EVENT_PIERCE_ARMOR, urand(16000, 17000));
|
||||
break;
|
||||
case EVENT_DISARM:
|
||||
DoCastVictim(SPELL_DISARM, true);
|
||||
events.ScheduleEvent(EVENT_DISARM, urand(11000, 12000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _combatPhase;
|
||||
uint8 _summonPhase;
|
||||
uint32 _summonTimer;
|
||||
uint32 _currentPoint;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_kirtonos_the_heraldAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
## go_brazier_of_the_herald
|
||||
######*/
|
||||
|
||||
enum Brazier_Of_The_Herald
|
||||
{
|
||||
NPC_KIRTONOS = 10506,
|
||||
};
|
||||
|
||||
class go_brazier_of_the_herald : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { }
|
||||
|
||||
bool OnGossipHello(Player* player, GameObject* go)
|
||||
{
|
||||
go->UseDoorOrButton();
|
||||
go->PlayDirectSound(557,0);
|
||||
player->SummonCreature(NPC_KIRTONOS, 315.028f, 70.53845f, 102.1496f, 0.3859715f, TEMPSUMMON_DEAD_DESPAWN, 900000);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_kirtonos_the_herald()
|
||||
{
|
||||
new boss_kirtonos_the_herald();
|
||||
new go_brazier_of_the_herald;
|
||||
}
|
||||
@@ -27,17 +27,6 @@ EndScriptData */
|
||||
#include "InstanceScript.h"
|
||||
#include "scholomance.h"
|
||||
|
||||
#define GO_GATE_KIRTONOS 175570
|
||||
#define GO_GATE_GANDLING 177374
|
||||
#define GO_GATE_MALICIA 177375
|
||||
#define GO_GATE_THEOLEN 177377
|
||||
#define GO_GATE_POLKELT 177376
|
||||
#define GO_GATE_RAVENIAN 177372
|
||||
#define GO_GATE_BAROV 177373
|
||||
#define GO_GATE_ILLUCIA 177371
|
||||
|
||||
#define MAX_ENCOUNTER 2
|
||||
|
||||
class instance_scholomance : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
@@ -64,6 +53,7 @@ public:
|
||||
uint64 GateRavenianGUID;
|
||||
uint64 GateBarovGUID;
|
||||
uint64 GateIlluciaGUID;
|
||||
uint64 BrazierOfTheHeraldGUID;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
@@ -77,6 +67,7 @@ public:
|
||||
GateRavenianGUID = 0;
|
||||
GateBarovGUID = 0;
|
||||
GateIlluciaGUID = 0;
|
||||
BrazierOfTheHeraldGUID = 0;
|
||||
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
IsBossDied[i] = false;
|
||||
@@ -86,14 +77,15 @@ public:
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_GATE_KIRTONOS: GateKirtonosGUID = go->GetGUID(); break;
|
||||
case GO_GATE_GANDLING: GateGandlingGUID = go->GetGUID(); break;
|
||||
case GO_GATE_MALICIA: GateMiliciaGUID = go->GetGUID(); break;
|
||||
case GO_GATE_THEOLEN: GateTheolenGUID = go->GetGUID(); break;
|
||||
case GO_GATE_POLKELT: GatePolkeltGUID = go->GetGUID(); break;
|
||||
case GO_GATE_RAVENIAN: GateRavenianGUID = go->GetGUID(); break;
|
||||
case GO_GATE_BAROV: GateBarovGUID = go->GetGUID(); break;
|
||||
case GO_GATE_ILLUCIA: GateIlluciaGUID = go->GetGUID(); break;
|
||||
case GO_GATE_KIRTONOS: GateKirtonosGUID = go->GetGUID(); break;
|
||||
case GO_GATE_GANDLING: GateGandlingGUID = go->GetGUID(); break;
|
||||
case GO_GATE_MALICIA: GateMiliciaGUID = go->GetGUID(); break;
|
||||
case GO_GATE_THEOLEN: GateTheolenGUID = go->GetGUID(); break;
|
||||
case GO_GATE_POLKELT: GatePolkeltGUID = go->GetGUID(); break;
|
||||
case GO_GATE_RAVENIAN: GateRavenianGUID = go->GetGUID(); break;
|
||||
case GO_GATE_BAROV: GateBarovGUID = go->GetGUID(); break;
|
||||
case GO_GATE_ILLUCIA: GateIlluciaGUID = go->GetGUID(); break;
|
||||
case GO_BRAZIER_OF_THE_HERALD: BrazierOfTheHeraldGUID = go->GetGUID(); break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,6 +127,19 @@ public:
|
||||
IsBossDied[3] && IsBossDied[4] && IsBossDied[5])
|
||||
? IN_PROGRESS : 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case GO_GATE_KIRTONOS:
|
||||
return GateKirtonosGUID;
|
||||
case GO_BRAZIER_OF_THE_HERALD:
|
||||
return BrazierOfTheHeraldGUID;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -19,13 +19,31 @@
|
||||
#ifndef DEF_SCHOLOMANCE_H
|
||||
#define DEF_SCHOLOMANCE_H
|
||||
|
||||
#define TYPE_GANDLING 1
|
||||
#define DATA_DOCTORTHEOLENKRASTINOV_DEATH 2
|
||||
#define DATA_INSTRUCTORMALICIA_DEATH 3
|
||||
#define DATA_LADYILLUCIABAROV_DEATH 4
|
||||
#define DATA_LORDALEXEIBAROV_DEATH 5
|
||||
#define DATA_LOREKEEPERPOLKELT_DEATH 6
|
||||
#define DATA_THERAVENIAN_DEATH 7
|
||||
#define TYPE_KIRTONOS 8
|
||||
#endif
|
||||
uint32 const MAX_ENCOUNTER = 2;
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
TYPE_GANDLING = 1,
|
||||
DATA_DOCTORTHEOLENKRASTINOV_DEATH = 2,
|
||||
DATA_INSTRUCTORMALICIA_DEATH = 3,
|
||||
DATA_LADYILLUCIABAROV_DEATH = 4,
|
||||
DATA_LORDALEXEIBAROV_DEATH = 5,
|
||||
DATA_LOREKEEPERPOLKELT_DEATH = 6,
|
||||
DATA_THERAVENIAN_DEATH = 7,
|
||||
TYPE_KIRTONOS = 8
|
||||
};
|
||||
|
||||
enum GameobjectIds
|
||||
{
|
||||
GO_GATE_KIRTONOS = 175570,
|
||||
GO_GATE_GANDLING = 177374,
|
||||
GO_GATE_MALICIA = 177375,
|
||||
GO_GATE_THEOLEN = 177377,
|
||||
GO_GATE_POLKELT = 177376,
|
||||
GO_GATE_RAVENIAN = 177372,
|
||||
GO_GATE_BAROV = 177373,
|
||||
GO_GATE_ILLUCIA = 177371,
|
||||
GO_BRAZIER_OF_THE_HERALD = 175564
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user