aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIanislav Vasilev <ianislav_vasilev@abv.bg>2019-05-24 09:45:37 +0300
committerGiacomo Pozzoni <giacomopoz@gmail.com>2019-05-24 08:45:37 +0200
commit45887846b69bce88086121f87fa40d923d6ac8b8 (patch)
tree157b56d0d2f6d68e87d9cce09501d61f55bd4bb0 /src
parent1e1d626da0e0dd8263ea3e1d7e7890074be7335c (diff)
Scripts/Zul'Gurub 22974 high priestess marli hatching eggs (#23212)
* Issue 22974: Initial bugfix suggestion. * Fixed allignment. * Removed unused call. * Initial spider spawn targeting is done. * Resolves issue 22874. Initial implementation suggestion. * Commenting out dead code. * Reordered private members to meet standards of member initializer list. * Removing unused parameter and changing data structure from list to vector. * Changed list to vector in the grid notifier. * Removing comments and fixing identation. * Stupid collapsed blocks. * Scripts/Misc: Change IsSummonedBy(Unit*) to IsSummonedBy(WorldObject*) * Scripts/Misc: Fix build * Core/TempSummons: Rename GetSummoner() to GetSummonerUnit() * Core/TempSummons: Add support to TempSummons::GetSummoner() to return GameObject too * Fix build * Core/TempSummons: Allow GameObject to be owner of TempSummon * Core/TempSummons: Add support to SAI for GameObject owner of TempSummon * Scripts/Misc: Fix no-pch build * Cleaned up all the core changes and scripted eggs and spell according to pull request comments. * Fix no-pch build. * Fix no-pch build 2. * Added sql file for the spell and gameobject script. * Update 2019_05_20_00_world.sql * Added conditions to spell thanks @xvywh and some minor changes to the code. * Removed some strange leftovers. * Removed obsolete brackets. * Rename 2019_05_20_00_world.sql to 2019_05_24_00_world.sql
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp99
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h1
3 files changed, 92 insertions, 16 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
index 5b176155aae..b611e76e316 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
@@ -23,10 +23,16 @@ SDComment: Charging healers and casters not working. Perhaps wrong Spell Timers.
SDCategory: Zul'Gurub
EndScriptData */
+#include "SpellScript.h"
+#include "SpellInfo.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "TemporarySummon.h"
#include "zulgurub.h"
+#include "InstanceScript.h"
+#include "GameObjectAI.h"
+#include "GameObject.h"
+#include "Object.h"
enum Says
{
@@ -43,6 +49,8 @@ enum Spells
SPELL_ENVOLWINGWEB = 24110,
SPELL_POISON_VOLLEY = 24099,
SPELL_SPIDER_FORM = 24084,
+ SPELL_HATCH_EGGS = 24083,
+ SPELL_HATCH_SPIDER_EGG = 24082,
// The Spider Spell
SPELL_LEVELUP = 24312 // Not right Spell.
};
@@ -51,7 +59,7 @@ enum Events
{
EVENT_SPAWN_START_SPIDERS = 1, // Phase 1
EVENT_POISON_VOLLEY = 2, // Phase All
- EVENT_SPAWN_SPIDER = 3, // Phase All
+ EVENT_HATCH_SPIDER_EGG = 3, // Phase All
EVENT_CHARGE_PLAYER = 4, // Phase 3
EVENT_ASPECT_OF_MARLI = 5, // Phase 2
EVENT_TRANSFORM = 6, // Phase 2
@@ -67,7 +75,8 @@ enum Phases
enum Misc
{
- NPC_SPIDER = 15041
+ NPC_SPIDER = 15041,
+ GOB_SPIDER_EGG = 179985,
};
// AWFUL HACK WARNING
@@ -89,6 +98,17 @@ class boss_marli : public CreatureScript
{
if (events.IsInPhase(PHASE_THREE))
me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack
+
+ std::list<GameObject*> eggs;
+ me->GetGameObjectListWithEntryInGrid(eggs, GOB_SPIDER_EGG);
+
+ for(GameObject* egg : eggs)
+ {
+ egg->Respawn();
+ egg->UpdateObjectVisibility(true);
+ }
+
+ summons.DespawnAll();
_Reset();
}
@@ -105,6 +125,12 @@ class boss_marli : public CreatureScript
Talk(SAY_AGGRO);
}
+ void JustSummoned(Creature* creature) override
+ {
+ creature->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM));
+ summons.Summon(creature);
+ }
+
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -120,20 +146,18 @@ class boss_marli : public CreatureScript
switch (eventId)
{
case EVENT_SPAWN_START_SPIDERS:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- Talk(SAY_SPIDER_SPAWN);
- for (uint8 i = 0; i < 4; ++i)
- if (Creature* spider = me->SummonCreature(NPC_SPIDER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000))
- spider->AI()->AttackStart(target);
- }
+ {
+ Talk(SAY_SPIDER_SPAWN);
+ DoCastAOE(SPELL_HATCH_EGGS);
+
events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO);
events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO);
events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s);
- events.ScheduleEvent(EVENT_SPAWN_SPIDER, 30s);
+ events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 30s);
events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO);
events.SetPhase(PHASE_TWO);
break;
+ }
case EVENT_POISON_VOLLEY:
DoCastVictim(SPELL_POISON_VOLLEY, true);
events.ScheduleEvent(EVENT_POISON_VOLLEY, 10s, 20s);
@@ -142,11 +166,9 @@ class boss_marli : public CreatureScript
DoCastVictim(SPELL_ASPECT_OF_MARLI, true);
events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, urand(13000, 18000), 0, PHASE_TWO);
break;
- case EVENT_SPAWN_SPIDER:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- if (Creature* spider = me->SummonCreature(NPC_SPIDER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000))
- spider->AI()->AttackStart(target);
- events.ScheduleEvent(EVENT_SPAWN_SPIDER, 12s, 17s);
+ case EVENT_HATCH_SPIDER_EGG:
+ me->CastSpell(me, SPELL_HATCH_SPIDER_EGG);
+ events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s);
break;
case EVENT_TRANSFORM:
{
@@ -164,6 +186,7 @@ class boss_marli : public CreatureScript
ModifyThreatByPercent(me->GetVictim(), -100);
events.ScheduleEvent(EVENT_CHARGE_PLAYER, 1500ms, 0, PHASE_THREE);
events.ScheduleEvent(EVENT_TRANSFORM_BACK, 25s, 0, PHASE_THREE);
+ events.CancelEvent(EVENT_HATCH_SPIDER_EGG);
events.SetPhase(PHASE_THREE);
break;
}
@@ -198,7 +221,7 @@ class boss_marli : public CreatureScript
events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO);
events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO);
events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s);
- events.ScheduleEvent(EVENT_SPAWN_SPIDER, 30s);
+ events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s);
events.ScheduleEvent(EVENT_TRANSFORM, urand(35000, 60000), 0, PHASE_TWO);
events.SetPhase(PHASE_TWO);
break;
@@ -221,6 +244,31 @@ class boss_marli : public CreatureScript
}
};
+class gob_spider_egg : public GameObjectScript
+{
+ public: gob_spider_egg() : GameObjectScript("gob_spider_egg") { }
+
+ struct gob_spider_eggAI : public GameObjectAI
+ {
+ gob_spider_eggAI(GameObject* gob) : GameObjectAI(gob), _instance(gob->GetInstanceScript()) { }
+
+ void JustSummoned(Creature* creature) override
+ {
+ if (Creature * marli = _instance->GetCreature(DATA_MARLI))
+ marli->AI()->JustSummoned(creature);
+
+ me->SetRespawnCompatibilityMode(true);
+ }
+ private:
+ InstanceScript* const _instance;
+ };
+
+ GameObjectAI* GetAI(GameObject* gob) const override
+ {
+ return GetZulGurubAI<gob_spider_eggAI>(gob);
+ }
+};
+
// Spawn of Marli
class npc_spawn_of_marli : public CreatureScript
{
@@ -270,8 +318,27 @@ class npc_spawn_of_marli : public CreatureScript
}
};
+class spell_hatch_spiders : public SpellScript
+{
+ PrepareSpellScript(spell_hatch_spiders);
+
+ void HandleObjectAreaTargetSelect(std::list<WorldObject*>& targets)
+ {
+ targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
+ targets.resize(GetSpellInfo()->MaxAffectedTargets);
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hatch_spiders::HandleObjectAreaTargetSelect, EFFECT_0, TARGET_GAMEOBJECT_DEST_AREA);
+ }
+
+};
+
void AddSC_boss_marli()
{
new boss_marli();
new npc_spawn_of_marli();
+ new gob_spider_egg();
+ RegisterSpellScript(spell_hatch_spiders);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index 21169f56bc8..6d634ef4f87 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
@@ -36,6 +36,11 @@ DoorData const doorData[] =
{ 0, 0, DOOR_TYPE_ROOM } // END
};
+ObjectData const creatureData[] =
+{
+ { NPC_PRIESTESS_MARLI, DATA_MARLI }
+};
+
class instance_zulgurub : public InstanceMapScript
{
public: instance_zulgurub(): InstanceMapScript(ZGScriptName, 309) { }
@@ -46,6 +51,7 @@ class instance_zulgurub : public InstanceMapScript
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
+ LoadObjectData(creatureData, nullptr);
LoadDoorData(doorData);
}
@@ -57,6 +63,8 @@ class instance_zulgurub : public InstanceMapScript
void OnCreatureCreate(Creature* creature) override
{
+ InstanceScript::OnCreatureCreate(creature);
+
switch (creature->GetEntry())
{
case NPC_ZEALOT_LORKHAN:
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index 763982cd6bb..3cc5ccda57b 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -49,6 +49,7 @@ enum ZGCreatureIds
NPC_ZULIAN_PROWLER = 15101, // Arlokk Event
NPC_ZEALOT_LORKHAN = 11347,
NPC_ZEALOT_ZATH = 11348,
+ NPC_PRIESTESS_MARLI = 14510,
NPC_HIGH_PRIEST_THEKAL = 14509,
NPC_JINDO_THE_HEXXER = 11380,
NPC_NIGHTMARE_ILLUSION = 15163,