diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp | 133 | ||||
| -rw-r--r-- | src/scripts/EasternKingdoms/Stratholme/stratholme.h | 17 |
2 files changed, 147 insertions, 3 deletions
diff --git a/src/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp b/src/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp index 09ccab27b9..8e14117944 100644 --- a/src/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp +++ b/src/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp @@ -23,6 +23,21 @@ const Position BlackGuardPos[10] = {4032.73f-2.0f, -3407.38f-2.0f, 115.56f, 0.0f} }; +// Creatures to be spawned during the trap events +static const uint32 aPlaguedCritters[] = +{ + NPC_PLAGUED_RAT, NPC_PLAGUED_MAGGOT, NPC_PLAGUED_INSECT +}; + +// Positions of the two Gate Traps +static const Position aGateTrap[] = +{ + {3612.29f, -3335.39f, 124.077f, 3.14159f}, // Scarlet side + {3919.88f, -3547.34f, 134.269f, 2.94961f} // Undead side +}; + +// uint32 m_uiGateTrapTimers[2][3] = { {0,0,0}, {0,0,0} }; + class instance_stratholme : public InstanceMapScript { public: @@ -54,6 +69,9 @@ class instance_stratholme : public InstanceMapScript _slaughterGateGUID = 0; _baronRivendareGUID = 0; + _gateTrapsCooldown[0] = false; + _gateTrapsCooldown[1] = false; + events.Reset(); } @@ -185,6 +203,18 @@ class instance_stratholme : public InstanceMapScript if (_slaughterProgress >= 2) go->SetGoState(GO_STATE_ACTIVE); break; + case GO_PORT_TRAP_GATE_1: + _trapGatesGUIDs[0] = go->GetGUID(); + break; + case GO_PORT_TRAP_GATE_2: + _trapGatesGUIDs[1] = go->GetGUID(); + break; + case GO_PORT_TRAP_GATE_3: + _trapGatesGUIDs[2] = go->GetGUID(); + break; + case GO_PORT_TRAP_GATE_4: + _trapGatesGUIDs[3] = go->GetGUID(); + break; } } @@ -203,6 +233,23 @@ class instance_stratholme : public InstanceMapScript } } + void DoSpawnPlaguedCritters(uint8 /*uiGate*/, Player* player) + { + if (!player) + return; + + + uint32 uiEntry = aPlaguedCritters[urand(0, 2)]; + for (uint8 i = 0; i < 30; ++i) + { + float x, y, z; + const Position pPos = { player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation() }; + player->GetRandomPoint(pPos, 8.0f, x, y, z); + z = player->GetPositionZ() + 1; + player->SummonCreature(uiEntry, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 0)->AI()->AttackStart(player); + } + } + void SetData(uint32 type, uint32 data) { switch (type) @@ -324,8 +371,88 @@ class instance_stratholme : public InstanceMapScript void Update(uint32 diff) { events.Update(diff); + + Map::PlayerList const& players = instance->GetPlayers(); + // Loop over the two Gate traps, each one has up to three timers (trap reset, gate opening delay, critters spawning delay) + for (uint8 i = 0; i < 2; i++) + { + // if the gate is in cooldown, skip the other checks + if (_gateTrapsCooldown[i]) + break; + + + // Check that the trap is not on cooldown, if so check if player/pet is in range + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + if (Player* player = itr->GetSource()) + { + // should pet also trigger the trap? could not find any source for it + if (player && !player->IsGameMaster() && player->IsWithinDist2d(aGateTrap[i].m_positionX, aGateTrap[i].m_positionY, 5.5f)) + { + // Check if timer was not already set by another player/pet a few milliseconds before + if (_gateTrapsCooldown[i]) + return; + + _gateTrapsCooldown[i] = true; + + // close the gates + if (_trapGatesGUIDs[2 * i]) + DoUseDoorOrButton(_trapGatesGUIDs[2 * i]); + if (_trapGatesGUIDs[2 * i + 1]) + DoUseDoorOrButton(_trapGatesGUIDs[2 * i + 1]); + + _trappedPlayerGUID = player->GetGUID(); + + if (i == 0) + { + // set timer to reset the trap + events.ScheduleEvent(EVENT_GATE1_TRAP, 30 * MINUTE * IN_MILLISECONDS); + // set timer to reopen gates + events.ScheduleEvent(EVENT_GATE1_DELAY, 20 * IN_MILLISECONDS); + // set timer to spawn the plagued critters + events.ScheduleEvent(EVENT_GATE1_CRITTER_DELAY, 2 * IN_MILLISECONDS); + } + else if (i == 1) + { + // set timer to reset the trap + events.ScheduleEvent(EVENT_GATE2_TRAP, 30 * MINUTE * IN_MILLISECONDS); + // set timer to reopen gates + events.ScheduleEvent(EVENT_GATE2_DELAY, 20 * IN_MILLISECONDS); + // set timer to spawn the plagued critters + events.ScheduleEvent(EVENT_GATE2_CRITTER_DELAY, 2 * IN_MILLISECONDS); + } + } + } + } + } + + int gate = 1; switch (events.ExecuteEvent()) { + case EVENT_GATE1_TRAP: + gate = 0; + case EVENT_GATE2_TRAP: + _gateTrapsCooldown[gate] = false; + break; + case EVENT_GATE1_DELAY: + gate = 0; + case EVENT_GATE2_DELAY: + if (_trapGatesGUIDs[2 * gate]) + DoUseDoorOrButton(_trapGatesGUIDs[2 * gate]); + if (_trapGatesGUIDs[2 * gate + 1]) + DoUseDoorOrButton(_trapGatesGUIDs[2 * gate + 1]); + break; + case EVENT_GATE1_CRITTER_DELAY: + gate = 0; + case EVENT_GATE2_CRITTER_DELAY: + if (_trappedPlayerGUID) + { + if (Player* pPlayer = instance->GetPlayer(_trappedPlayerGUID)) + { + DoSpawnPlaguedCritters(gate, pPlayer); + } + } + break; case EVENT_BARON_TIME: { --_baronRunTime; @@ -434,6 +561,10 @@ class instance_stratholme : public InstanceMapScript uint64 _slaughterGateGUID; uint64 _gauntletGateGUID; uint64 _baronRivendareGUID; + + bool _gateTrapsCooldown[2]; + uint64 _trappedPlayerGUID; + uint64 _trapGatesGUIDs[4]; }; InstanceScript* GetInstanceScript(InstanceMap* map) const @@ -445,4 +576,4 @@ class instance_stratholme : public InstanceMapScript void AddSC_instance_stratholme() { new instance_stratholme(); -}
\ No newline at end of file +} diff --git a/src/scripts/EasternKingdoms/Stratholme/stratholme.h b/src/scripts/EasternKingdoms/Stratholme/stratholme.h index f57877fe51..0ee7b2a1bd 100644 --- a/src/scripts/EasternKingdoms/Stratholme/stratholme.h +++ b/src/scripts/EasternKingdoms/Stratholme/stratholme.h @@ -28,7 +28,10 @@ enum CreatureIds NPC_RAMSTEIN_THE_GORGER = 10439, NPC_MINDLESS_UNDEAD = 11030, NPC_BLACK_GUARD = 10394, - NPC_YSIDA = 16031 + NPC_YSIDA = 16031, + NPC_PLAGUED_RAT = 10441, + NPC_PLAGUED_INSECT = 10461, + NPC_PLAGUED_MAGGOT = 10536, }; enum GameobjectIds @@ -41,7 +44,11 @@ enum GameobjectIds GO_GAUNTLET_GATE = 175374, GO_SLAUGTHER_GATE = 175373, GO_SLAUGHTER_GATE_SIDE = 175358, - GO_EXIT_GATE = 176424 + GO_EXIT_GATE = 176424, + GO_PORT_TRAP_GATE_1 = 175351, // Portcullis used in the gate traps (rats trap) + GO_PORT_TRAP_GATE_2 = 175350, // Gate trap scarlet side + GO_PORT_TRAP_GATE_3 = 175355, // Gate trap undead side + GO_PORT_TRAP_GATE_4 = 175354, }; enum MiscIds @@ -60,6 +67,12 @@ enum MiscIds EVENT_FORCE_SLAUGHTER_EVENT = 3, EVENT_SPAWN_BLACK_GUARD = 4, EVENT_EXECUTE_PRISONER = 5, + EVENT_GATE1_TRAP = 6, + EVENT_GATE1_DELAY = 7, + EVENT_GATE1_CRITTER_DELAY = 8, + EVENT_GATE2_TRAP = 9, + EVENT_GATE2_DELAY = 10, + EVENT_GATE2_CRITTER_DELAY = 11, SPELL_BARON_ULTIMATUM = 27861 }; |
