From e8ca1d5cd1a67a23292ff072176bbe021d65c453 Mon Sep 17 00:00:00 2001 From: Malcrom Date: Fri, 4 Jan 2013 01:00:51 -0330 Subject: Core/Scripting: Add Kirtonos The Herald to c++ scripting. Combat still not finished. --- src/server/scripts/EasternKingdoms/CMakeLists.txt | 1 + .../Scholomance/boss_kirtonos_the_herald.cpp | 293 +++++++++++++++++++++ .../Scholomance/instance_scholomance.cpp | 43 +-- .../EasternKingdoms/Scholomance/scholomance.h | 36 ++- 4 files changed, 345 insertions(+), 28 deletions(-) create mode 100644 src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt index 15faf9dfb83..f581baa31fa 100644 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt @@ -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 diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp new file mode 100644 index 00000000000..b969394fc6d --- /dev/null +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2008-2013 TrinityCore + * + * 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 . + */ + +#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; +} diff --git a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp index 583b9074433..fc966c4bbb9 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp @@ -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; + } }; }; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h index bae7c8c8efc..20b782fd43a 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h +++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h @@ -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 -- cgit v1.2.3 From 306d59cb51595fa6b3c3e3c52fbce3dca23ccf1d Mon Sep 17 00:00:00 2001 From: Malcrom Date: Fri, 4 Jan 2013 07:25:32 -0330 Subject: Core/Scripting: Add a few includes to boss_kirtonos_the_herald. --- .../scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index b969394fc6d..946b7b42f9e 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -18,6 +18,9 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "scholomance.h" +#include "MoveSplineInit.h" +#include "GameObjectAI.h" +#include "Player.h" enum Says { -- cgit v1.2.3 From bf19adec0f726f178571375092261e9463f0a210 Mon Sep 17 00:00:00 2001 From: Malcrom Date: Fri, 4 Jan 2013 12:34:35 -0330 Subject: Core/Scripts: Some cleanup for boss_kirtonos_the_herald script --- .../Scholomance/boss_kirtonos_the_herald.cpp | 53 +++++++++++++--------- 1 file changed, 31 insertions(+), 22 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index 946b7b42f9e..9ca9864bee9 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -43,14 +43,19 @@ enum Spells 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 + INTRO_1 = 1, + INTRO_2 = 2, + INTRO_3 = 3, + INTRO_4 = 4, + INTRO_5 = 5, + EVENT_SWOOP = 6, + EVENT_WING_FLAP = 7, + EVENT_PIERCE_ARMOR = 8, + EVENT_DISARM = 9, + EVENT_SHADOW_BOLT = 10, + EVENT_CURSE_OR_TONGUES = 11, + EVENT_DONINATE_MIND = 12, + EVENT_KIRTONOS_TRANSFORM = 13 }; enum Points @@ -59,6 +64,11 @@ enum Points POINT_KIRTONOS_LAND = 14 }; +enum Misc +{ + WEAPON_KIRTONOS_STAFF = 11365 +}; + Position const kirtonosIntroWaypoint[MAX_KIRTONOS_WAYPOINTS_INTRO] = { {316.7087f, 71.26834f, 104.5843f, 0.0f}, @@ -90,8 +100,6 @@ class boss_kirtonos_the_herald : public CreatureScript _combatPhase = 0; _summonPhase = 0; _summonTimer = 0; - if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) - gate->SetGoState(GO_STATE_ACTIVE); _Reset(); } @@ -148,7 +156,7 @@ class boss_kirtonos_the_herald : public CreatureScript me->SetDisableGravity(true); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - _summonPhase = 1; + _summonPhase = INTRO_1; _summonTimer = 1; _currentPoint = 0; } @@ -174,38 +182,38 @@ class boss_kirtonos_the_herald : public CreatureScript { switch (_summonPhase) { - case 1: + case INTRO_1: if (_currentPoint < POINT_KIRTONOS_LAND) me->GetMotionMaster()->MovePoint(_currentPoint, kirtonosIntroWaypoint[_currentPoint]); else { _summonTimer = 1000; - _summonPhase = 2; + _summonPhase = INTRO_2; } break; - case 2: + case INTRO_2: me->GetMotionMaster()->MovePoint(0, 299.4884f, 92.76137f, 105.6335f); _summonTimer = 1000; - _summonPhase = 3; + _summonPhase = INTRO_3; break; - case 3: + case INTRO_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; + _summonPhase = INTRO_4; break; - case 4: + case INTRO_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; + _summonPhase = INTRO_5; break; - case 5: + case INTRO_5: me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(11365)); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF)); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); _summonTimer = 0; @@ -273,6 +281,7 @@ class boss_kirtonos_the_herald : public CreatureScript enum Brazier_Of_The_Herald { NPC_KIRTONOS = 10506, + SOUND_SCREECH = 557 }; class go_brazier_of_the_herald : public GameObjectScript @@ -283,7 +292,7 @@ public: bool OnGossipHello(Player* player, GameObject* go) { go->UseDoorOrButton(); - go->PlayDirectSound(557,0); + go->PlayDirectSound(SOUND_SCREECH,0); player->SummonCreature(NPC_KIRTONOS, 315.028f, 70.53845f, 102.1496f, 0.3859715f, TEMPSUMMON_DEAD_DESPAWN, 900000); return true; } -- cgit v1.2.3 From 8ac5b3b7d6843e0eccee8e7f25b674eef4e7c482 Mon Sep 17 00:00:00 2001 From: Nay Date: Fri, 4 Jan 2013 21:15:18 +0000 Subject: Core/Player: Prevent a crash in CastedCreatureOrGO and add an assertion to KilledMonster --- src/server/game/AI/CoreAI/PetAI.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 8 ++++++++ src/server/game/Entities/Unit/Unit.cpp | 2 +- src/server/scripts/Commands/cs_lookup.cpp | 2 +- src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp | 4 ++-- 5 files changed, 13 insertions(+), 5 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index f30a7823be1..a8d2a2248ad 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -256,7 +256,7 @@ void PetAI::UpdateAI(const uint32 diff) me->UpdateSpeed(MOVE_RUN, true); me->UpdateSpeed(MOVE_WALK, true); me->UpdateSpeed(MOVE_FLIGHT, true); - + } void PetAI::UpdateAllies() diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 986eeb8e275..789f6b448da 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -16007,6 +16007,8 @@ void Player::ItemRemovedQuestCheck(uint32 entry, uint32 count) void Player::KilledMonster(CreatureTemplate const* cInfo, uint64 guid) { + ASSERT(cInfo); + if (cInfo->Entry) KilledMonsterCredit(cInfo->Entry, guid); @@ -16159,6 +16161,12 @@ void Player::CastedCreatureOrGO(uint32 entry, uint64 guid, uint32 spell_id) if (reqTarget != entry) // if entry doesn't match, check for killcredits referenced in template { CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(entry); + if (!cinfo) + { + sLog->outError(LOG_FILTER_PLAYER, "Player::CastedCreatureOrGO: GetCreatureTemplate failed for entry %u. Skipping.", entry); + continue; + } + for (uint8 k = 0; k < MAX_KILL_CREDIT; ++k) if (cinfo->KillCredit[k] == reqTarget) entry = cinfo->KillCredit[k]; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 233f88dc1d8..5d1ab9aa17a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12722,7 +12722,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) // to help prevent pet from lagging behind and despawning float dist = GetDistance(pOwner); float base_rate = 1.00f; // base speed is 100% of owner speed - + if (dist < 5) dist = 5; diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 3395047c720..2130e61cb47 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -1033,7 +1033,7 @@ public: found = true; } } - + if (!found) handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND); diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 25daff60761..952363c6dcf 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -153,13 +153,13 @@ enum Texts SAY_KILLED_PLAYER_P_THREE = 12, SAY_SPELL_CASTING_P_THREE = 13, SAY_DEATH, - + // Alexstrasza SAY_ONE = 0, SAY_TWO = 1, SAY_THREE = 2, SAY_FOUR = 3, - + // Power Sparks EMOTE_POWER_SPARK_SUMMONED = 0 }; -- cgit v1.2.3 From e0a5aabaf76359fd6e537ad06d4663924766e9d2 Mon Sep 17 00:00:00 2001 From: Malcrom Date: Fri, 4 Jan 2013 19:41:57 -0330 Subject: Core/Scripting: Update Kirtonos script. --- .../Scholomance/boss_kirtonos_the_herald.cpp | 130 ++++++++++++--------- 1 file changed, 78 insertions(+), 52 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index 9ca9864bee9..6b9f0f967df 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -34,7 +34,7 @@ enum Spells 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_KIRTONOS_TRANSFORM = 16467, SPELL_SHADOW_BOLT = 17228, SPELL_CURSE_OR_TONGUES = 12889, @@ -48,25 +48,26 @@ enum Events INTRO_3 = 3, INTRO_4 = 4, INTRO_5 = 5, - EVENT_SWOOP = 6, - EVENT_WING_FLAP = 7, - EVENT_PIERCE_ARMOR = 8, - EVENT_DISARM = 9, - EVENT_SHADOW_BOLT = 10, - EVENT_CURSE_OR_TONGUES = 11, - EVENT_DONINATE_MIND = 12, - EVENT_KIRTONOS_TRANSFORM = 13 + INTRO_6 = 6, + EVENT_SWOOP = 7, + EVENT_WING_FLAP = 8, + EVENT_PIERCE_ARMOR = 9, + EVENT_DISARM = 10, + EVENT_SHADOW_BOLT = 11, + EVENT_CURSE_OR_TONGUES = 12, + EVENT_DONINATE_MIND = 13, + EVENT_KIRTONOS_TRANSFORM = 14 }; enum Points { - MAX_KIRTONOS_WAYPOINTS_INTRO = 14, - POINT_KIRTONOS_LAND = 14 + MAX_KIRTONOS_WAYPOINTS_INTRO = 14, + POINT_KIRTONOS_LAND = 14 }; enum Misc { - WEAPON_KIRTONOS_STAFF = 11365 + WEAPON_KIRTONOS_STAFF = 11365 }; Position const kirtonosIntroWaypoint[MAX_KIRTONOS_WAYPOINTS_INTRO] = @@ -97,31 +98,26 @@ class boss_kirtonos_the_herald : public CreatureScript void Reset() { - _combatPhase = 0; - _summonPhase = 0; - _summonTimer = 0; + _introEvent = 0; + _introTimer = 0; _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 + _introTimer = 0; + _introEvent = 0; + events.ScheduleEvent(EVENT_SWOOP, urand(8000, 8000)); + events.ScheduleEvent(EVENT_WING_FLAP, urand(15000, 15000)); + events.ScheduleEvent(EVENT_PIERCE_ARMOR, urand(18000, 18000)); + events.ScheduleEvent(EVENT_DISARM, urand(22000, 22000)); + events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(42000, 42000)); + events.ScheduleEvent(EVENT_CURSE_OR_TONGUES, urand(53000, 53000)); + events.ScheduleEvent(EVENT_DONINATE_MIND, urand(34000, 48000)); + events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, urand(20000, 20000)); _EnterCombat(); } - void KilledUnit(Unit* /*victim*/) - { - - } - void JustDied(Unit* /*killer*/) { if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) @@ -156,9 +152,10 @@ class boss_kirtonos_the_herald : public CreatureScript me->SetDisableGravity(true); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - _summonPhase = INTRO_1; - _summonTimer = 1; + _introEvent = INTRO_1; + _introTimer = 1; _currentPoint = 0; + Talk(EMOTE_SUMMONED); } void JustSummoned(Creature* summon) @@ -176,53 +173,58 @@ class boss_kirtonos_the_herald : public CreatureScript void UpdateAI(uint32 const diff) { - if (_summonPhase) + if (_introEvent) { - if (_summonTimer <= diff) + if (_introTimer <= diff) { - switch (_summonPhase) + switch (_introEvent) { case INTRO_1: if (_currentPoint < POINT_KIRTONOS_LAND) me->GetMotionMaster()->MovePoint(_currentPoint, kirtonosIntroWaypoint[_currentPoint]); else { - _summonTimer = 1000; - _summonPhase = INTRO_2; + _introTimer = 1000; + _introEvent = INTRO_2; } break; case INTRO_2: + me->SetWalk(true); me->GetMotionMaster()->MovePoint(0, 299.4884f, 92.76137f, 105.6335f); - _summonTimer = 1000; - _summonPhase = INTRO_3; + _introTimer = 1000; + _introEvent = INTRO_3; break; case INTRO_3: if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) gate->SetGoState(GO_STATE_READY); me->SetFacingTo(0.01745329f); - _summonTimer = 3000; - _summonPhase = INTRO_4; + _introTimer = 3000; + _introEvent = INTRO_4; break; case INTRO_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 = INTRO_5; + _introTimer = 1000; + _introEvent = INTRO_5; break; case INTRO_5: me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF)); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); - _summonTimer = 0; - _summonPhase = 0; + _introTimer = 5000; + _introEvent = INTRO_6; + case INTRO_6: + me->GetMotionMaster()->MovePoint(0, 314.8673f, 90.3021f, 101.6459f); + _introTimer = 0; + _introEvent = 0; break; } } else - _summonTimer -= diff; + _introTimer -= diff; } if (!UpdateVictim()) @@ -239,19 +241,44 @@ class boss_kirtonos_the_herald : public CreatureScript { case EVENT_SWOOP: DoCast(me, SPELL_SWOOP); - events.ScheduleEvent(EVENT_SWOOP, urand(15000, 16000)); + events.ScheduleEvent(EVENT_SWOOP, urand(15000, 15000)); break; case EVENT_WING_FLAP: DoCast(me, SPELL_WING_FLAP); - events.ScheduleEvent(EVENT_WING_FLAP, urand(13000, 14000)); + events.ScheduleEvent(EVENT_WING_FLAP, urand(13000, 13000)); break; case EVENT_PIERCE_ARMOR: DoCastVictim(SPELL_PIERCE_ARMOR, true); - events.ScheduleEvent(EVENT_PIERCE_ARMOR, urand(16000, 17000)); + events.ScheduleEvent(EVENT_PIERCE_ARMOR, urand(12000, 12000)); break; case EVENT_DISARM: DoCastVictim(SPELL_DISARM, true); - events.ScheduleEvent(EVENT_DISARM, urand(11000, 12000)); + events.ScheduleEvent(EVENT_DISARM, urand(11000, 11000)); + break; + case EVENT_SHADOW_BOLT: + DoCastVictim(SPELL_SHADOW_BOLT, true); + events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(42000, 42000)); + break; + case EVENT_CURSE_OR_TONGUES: + DoCastVictim(SPELL_CURSE_OR_TONGUES, true); + events.ScheduleEvent(EVENT_CURSE_OR_TONGUES, urand(35000, 35000)); + break; + case EVENT_DONINATE_MIND: + DoCastVictim(SPELL_DONINATE_MIND, true); + events.ScheduleEvent(EVENT_DONINATE_MIND, urand(44000, 48000)); + break; + case EVENT_KIRTONOS_TRANSFORM: + if (me->HasAura(SPELL_KIRTONOS_TRANSFORM)) + { + me->RemoveAura(SPELL_KIRTONOS_TRANSFORM); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0)); + } + else + { + DoCast(me, SPELL_KIRTONOS_TRANSFORM); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF)); + } + events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, urand(16000, 18000)); break; default: break; @@ -262,9 +289,8 @@ class boss_kirtonos_the_herald : public CreatureScript } private: - uint8 _combatPhase; - uint8 _summonPhase; - uint32 _summonTimer; + uint8 _introEvent; + uint32 _introTimer; uint32 _currentPoint; }; -- cgit v1.2.3 From 3661353e129cf8efc9678c9b9ce926131049d554 Mon Sep 17 00:00:00 2001 From: Malcrom Date: Fri, 4 Jan 2013 19:58:16 -0330 Subject: Core/Scripting: Fix Typo. --- .../EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index 6b9f0f967df..091c9fd1f91 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -37,7 +37,7 @@ enum Spells SPELL_KIRTONOS_TRANSFORM = 16467, SPELL_SHADOW_BOLT = 17228, - SPELL_CURSE_OR_TONGUES = 12889, + SPELL_CURSE_OF_TONGUES = 12889, SPELL_DONINATE_MIND = 14515 }; @@ -54,7 +54,7 @@ enum Events EVENT_PIERCE_ARMOR = 9, EVENT_DISARM = 10, EVENT_SHADOW_BOLT = 11, - EVENT_CURSE_OR_TONGUES = 12, + EVENT_CURSE_OF_TONGUES = 12, EVENT_DONINATE_MIND = 13, EVENT_KIRTONOS_TRANSFORM = 14 }; @@ -112,7 +112,7 @@ class boss_kirtonos_the_herald : public CreatureScript events.ScheduleEvent(EVENT_PIERCE_ARMOR, urand(18000, 18000)); events.ScheduleEvent(EVENT_DISARM, urand(22000, 22000)); events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(42000, 42000)); - events.ScheduleEvent(EVENT_CURSE_OR_TONGUES, urand(53000, 53000)); + events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, urand(53000, 53000)); events.ScheduleEvent(EVENT_DONINATE_MIND, urand(34000, 48000)); events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, urand(20000, 20000)); _EnterCombat(); @@ -259,9 +259,9 @@ class boss_kirtonos_the_herald : public CreatureScript DoCastVictim(SPELL_SHADOW_BOLT, true); events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(42000, 42000)); break; - case EVENT_CURSE_OR_TONGUES: - DoCastVictim(SPELL_CURSE_OR_TONGUES, true); - events.ScheduleEvent(EVENT_CURSE_OR_TONGUES, urand(35000, 35000)); + case EVENT_CURSE_OF_TONGUES: + DoCastVictim(SPELL_CURSE_OF_TONGUES, true); + events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, urand(35000, 35000)); break; case EVENT_DONINATE_MIND: DoCastVictim(SPELL_DONINATE_MIND, true); -- cgit v1.2.3