diff options
Diffstat (limited to 'src')
5 files changed, 216 insertions, 248 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 55dcb21db4a..4b2c5e29d35 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7691,7 +7691,7 @@ void Player::DuelComplete(DuelCompleteType type) // Honor points after duel (the winner) - ImpConfig if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL)) duel->opponent->RewardHonor(NULL, 1, amount); - + break; default: break; @@ -9671,6 +9671,16 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) bf->FillInitialWorldStates(data); break; } + case 4820: + if (instance && mapid == 668) + instance->FillInitialWorldStates(data); + else + { + data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED + data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT + } + break; + // No break here, intended. default: data << uint32(0x914) << uint32(0x0); // 7 diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a8b17fbf097..9adcbdd9365 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12454,7 +12454,7 @@ void Unit::setDeathState(DeathState s) SetPower(getPowerType(), 0); // players in instance don't have ZoneScript, but they have InstanceScript - if (ZoneScript* zoneScript = GetZoneScript() ? GetZoneScript() : (ZoneScript*)GetInstanceScript()) + if (ZoneScript* zoneScript = GetZoneScript() ? GetZoneScript() : GetInstanceScript()) zoneScript->OnUnitDeath(this); } else if (s == JUST_RESPAWNED) diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index c694508969b..a64f2cf5467 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -539,7 +539,6 @@ class npc_jaina_or_sylvanas_hor : public CreatureScript { instance->SetData(DATA_INTRO_EVENT, DONE); instance->ProcessEvent(0, EVENT_SPAWN_WAVES); - //instance->SetData(DATA_WAVE_COUNT, SPECIAL); // start first wave } // Loralen or Koreln disappearAndDie() if (Creature* lichking = me->GetCreature(*me, lichkingGUID)) @@ -655,7 +654,22 @@ enum TrashEvents struct npc_gauntlet_trash : public ScriptedAI { - npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature) { } + npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature), + instance(creature->GetInstanceScript()) + { + } + + void Reset() + { + me->CastSpell(me, SPELL_WELL_OF_SOULS, true); + events.Reset(); + } + + void EnterEvadeMode() + { + if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED) + instance->SetData(DATA_WAVE_COUNT, NOT_STARTED); + } void SetData(uint32 type, uint32 value) { @@ -674,6 +688,8 @@ struct npc_gauntlet_trash : public ScriptedAI } protected: + EventMap events; + InstanceScript* instance; uint32 InternalWaveId; }; @@ -682,28 +698,10 @@ class npc_ghostly_priest : public CreatureScript public: npc_ghostly_priest() : CreatureScript("npc_ghostly_priest") { } - CreatureAI* GetAI(Creature* creature) const - { - return new npc_ghostly_priestAI(creature); - } - struct npc_ghostly_priestAI : public npc_gauntlet_trash { npc_ghostly_priestAI(Creature* creature) : npc_gauntlet_trash(creature) { - instance = me->GetInstanceScript(); - me->CastSpell(me, SPELL_WELL_OF_SOULS, true); - } - - InstanceScript* instance; - - EventMap events; - - void Reset() - { - events.Reset(); - if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED) - instance->SetData(DATA_WAVE_COUNT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) @@ -760,6 +758,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const + { + return new npc_ghostly_priestAI(creature); + } }; class npc_phantom_mage : public CreatureScript @@ -767,28 +769,10 @@ class npc_phantom_mage : public CreatureScript public: npc_phantom_mage() : CreatureScript("npc_phantom_mage") { } - CreatureAI* GetAI(Creature* creature) const - { - return new npc_phantom_mageAI(creature); - } - struct npc_phantom_mageAI : public npc_gauntlet_trash { npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature) { - instance = me->GetInstanceScript(); - me->CastSpell(me, SPELL_WELL_OF_SOULS, true); - } - - InstanceScript* instance; - - EventMap events; - - void Reset() - { - events.Reset(); - if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED) - instance->SetData(DATA_WAVE_COUNT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) @@ -840,6 +824,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const + { + return new npc_phantom_mageAI(creature); + } }; class npc_phantom_hallucination : public CreatureScript @@ -847,11 +835,6 @@ class npc_phantom_hallucination : public CreatureScript public: npc_phantom_hallucination() : CreatureScript("npc_phantom_hallucination") { } - CreatureAI* GetAI(Creature* creature) const - { - return new npc_phantom_hallucinationAI(creature); - } - struct npc_phantom_hallucinationAI : public npc_phantom_mage::npc_phantom_mageAI { npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature) {} @@ -862,6 +845,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const + { + return new npc_phantom_hallucinationAI(creature); + } }; class npc_shadowy_mercenary : public CreatureScript @@ -869,28 +856,10 @@ class npc_shadowy_mercenary : public CreatureScript public: npc_shadowy_mercenary() : CreatureScript("npc_shadowy_mercenary") { } - CreatureAI* GetAI(Creature* creature) const - { - return new npc_shadowy_mercenaryAI(creature); - } - struct npc_shadowy_mercenaryAI : public npc_gauntlet_trash { npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature) { - instance = me->GetInstanceScript(); - me->CastSpell(me, SPELL_WELL_OF_SOULS, true); - } - - InstanceScript* instance; - - EventMap events; - - void Reset() - { - events.Reset(); - if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED) - instance->SetData(DATA_WAVE_COUNT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) @@ -936,6 +905,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const + { + return new npc_shadowy_mercenaryAI(creature); + } }; class npc_spectral_footman : public CreatureScript @@ -943,28 +916,10 @@ class npc_spectral_footman : public CreatureScript public: npc_spectral_footman() : CreatureScript("npc_spectral_footman") { } - CreatureAI* GetAI(Creature* creature) const - { - return new npc_spectral_footmanAI(creature); - } - struct npc_spectral_footmanAI : public npc_gauntlet_trash { npc_spectral_footmanAI(Creature* creature) : npc_gauntlet_trash(creature) { - instance = me->GetInstanceScript(); - me->CastSpell(me, SPELL_WELL_OF_SOULS, true); - } - - InstanceScript* instance; - - EventMap events; - - void Reset() - { - events.Reset(); - if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED) - instance->SetData(DATA_WAVE_COUNT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) @@ -1004,6 +959,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const + { + return new npc_spectral_footmanAI(creature); + } }; class npc_tortured_rifleman : public CreatureScript @@ -1011,28 +970,10 @@ class npc_tortured_rifleman : public CreatureScript public: npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { } - CreatureAI* GetAI(Creature* creature) const - { - return new npc_tortured_riflemanAI(creature); - } - struct npc_tortured_riflemanAI : public npc_gauntlet_trash { npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature) { - instance = me->GetInstanceScript(); - me->CastSpell(me, SPELL_WELL_OF_SOULS, true); - } - - InstanceScript* instance; - - EventMap events; - - void Reset() - { - events.Reset(); - if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED) - instance->SetData(DATA_WAVE_COUNT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) @@ -1080,6 +1021,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const + { + return new npc_tortured_riflemanAI(creature); + } }; @@ -1191,6 +1136,7 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const { return new npc_frostworn_generalAI(creature); @@ -1247,6 +1193,7 @@ public: DoMeleeAttackIfReady(); } }; + CreatureAI* GetAI(Creature* creature) const { return new npc_spiritual_reflectionAI(creature); @@ -1255,58 +1202,57 @@ public: class at_hor_intro_start : public AreaTriggerScript { - public: - at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") {} - - bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) - { - InstanceScript* instance = player->GetInstanceScript(); - - if (player->isGameMaster()) - return true; +public: + at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") {} - if (instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED) - { - instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS); - } + bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) + { + InstanceScript* instance = player->GetInstanceScript(); + if (player->isGameMaster()) return true; + + if (instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED) + { + instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS); } + + return true; + } }; class at_hor_waves_restarter : public AreaTriggerScript { - public: - at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") {} +public: + at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") {} - bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) - { - InstanceScript* instance = player->GetInstanceScript(); + bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) + { + InstanceScript* instance = player->GetInstanceScript(); - if (player->isGameMaster()) - return true; + if (player->isGameMaster()) + return true; + + if (instance->GetData(DATA_WAVE_COUNT)) + return true; - if (instance->GetData(DATA_WAVE_COUNT)) - return true; + if (instance->GetData(DATA_INTRO_EVENT) == DONE && instance->GetBossState(DATA_MARWYN_EVENT) != DONE) + { + instance->ProcessEvent(0, EVENT_SPAWN_WAVES); - if (instance->GetData(DATA_INTRO_EVENT) == DONE && instance->GetBossState(DATA_MARWYN_EVENT) != DONE && instance->GetData(DATA_WAVE_COUNT) == NOT_STARTED) + if (Creature* falric = player->GetCreature(*player, instance->GetData64(DATA_FALRIC_EVENT))) { - instance->ProcessEvent(0, EVENT_SPAWN_WAVES); - //instance->SetData(DATA_WAVE_COUNT, SPECIAL); - - if (Creature* falric = player->GetCreature(*player, instance->GetData64(DATA_FALRIC_EVENT))) - { - falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true); - falric->SetVisible(true); - } - if (Creature* marwyn = player->GetCreature(*player, instance->GetData64(DATA_MARWYN_EVENT))) - { - marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true); - marwyn->SetVisible(true); - } + falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true); + falric->SetVisible(true); + } + if (Creature* marwyn = player->GetCreature(*player, instance->GetData64(DATA_MARWYN_EVENT))) + { + marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true); + marwyn->SetVisible(true); } - return true; } + return true; + } }; void AddSC_halls_of_reflection() diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h index 958ecc24aa1..4787a6b9fdc 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h @@ -94,7 +94,7 @@ enum GameObjects enum HorWorldStates { - WORLD_STATE_HOR = 4884, + WORLD_STATE_HOR_WAVES_ENABLED = 4884, WORLD_STATE_HOR_WAVE_COUNT = 4882, }; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp index 88a36926512..43d065d5f7d 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp @@ -98,7 +98,7 @@ public: void OnCreatureCreate(Creature* creature) { - Map::PlayerList const &players = instance->GetPlayers(); + Map::PlayerList const& players = instance->GetPlayers(); if (!players.isEmpty()) if (Player* player = players.begin()->getSource()) _teamInInstance = player->GetTeam(); @@ -176,6 +176,12 @@ public: } } + void FillInitialWorldStates(WorldPacket& data) + { + data << uint32(WORLD_STATE_HOR_WAVES_ENABLED) << uint32(0); + data << uint32(WORLD_STATE_HOR_WAVE_COUNT) << uint32(0); + } + bool SetBossState(uint32 type, EncounterState state) { if (!InstanceScript::SetBossState(type, state)) @@ -185,7 +191,10 @@ public: { case DATA_FALRIC_EVENT: if (state == DONE) + { + ++_waveCount; events.ScheduleEvent(EVENT_NEXT_WAVE, 60000); + } break; case DATA_MARWYN_EVENT: if (state == DONE) @@ -207,9 +216,6 @@ public: void SetData(uint32 type, uint32 data) { - if (_waveCount && data == NOT_STARTED) - ProcessEvent(NULL, EVENT_DO_WIPE); - switch (type) { case DATA_INTRO_EVENT: @@ -226,8 +232,8 @@ public: _introEvent = data; break; case DATA_WAVE_COUNT: - if (data == SPECIAL) - events.ScheduleEvent(EVENT_NEXT_WAVE, 10000); + if (_waveCount && data == NOT_STARTED) + ProcessEvent(NULL, EVENT_DO_WIPE); break; case DATA_FROSWORN_EVENT: if (data == DONE) @@ -243,102 +249,6 @@ public: SaveToDB(); } - uint32 GetData(uint32 type) const - { - switch (type) - { - case DATA_WAVE_COUNT: - return _waveCount; - case DATA_TEAM_IN_INSTANCE: - return _teamInInstance; - case DATA_INTRO_EVENT: - return _introEvent; - case DATA_FROSWORN_EVENT: - return _frostwornGeneral; - default: - break; - } - - return 0; - } - - uint64 GetData64(uint32 type) const - { - switch (type) - { - case DATA_FALRIC_EVENT: - return _falricGUID; - case DATA_MARWYN_EVENT: - return _marwynGUID; - case DATA_FROSWORN_EVENT: - return _frostwornGeneralGUID; - case DATA_FROSTWORN_DOOR: - return _frostwornDoorGUID; - case DATA_FROSTMOURNE: - return _frostmourneGUID; - default: - break; - } - - return 0; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral; - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(in); - - char dataHead1, dataHead2; - - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'H' && dataHead2 == 'R') - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - - SetBossState(i, EncounterState(tmpState)); - } - - uint32 temp = 0; - loadStream >> temp; - if (temp == DONE) - SetData(DATA_INTRO_EVENT, DONE); - else - SetData(DATA_INTRO_EVENT, NOT_STARTED); - - loadStream >> temp; - if (temp == DONE) - SetData(DATA_FROSWORN_EVENT, DONE); - else - SetData(DATA_FROSWORN_EVENT, NOT_STARTED); - } - else - OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; - } // wave scheduling,checked when wave npcs die void OnUnitDeath(Unit* unit) @@ -367,7 +277,10 @@ public: // because the current npc returns isAlive when OnUnitDeath happens // we check if the number of dead npcs is equal to the list-1 if (deadNpcs == waveGuidList[internalWaveId].size() - 1) + { + ++_waveCount; events.ScheduleEvent(EVENT_NEXT_WAVE, 10000); + } break; } } @@ -383,7 +296,6 @@ public: switch (events.ExecuteEvent()) { case EVENT_NEXT_WAVE: - ++_waveCount; ProcessEvent(NULL, EVENT_ADD_WAVE); break; } @@ -395,7 +307,8 @@ public: { // spawning all wave npcs at once case EVENT_SPAWN_WAVES: - DoUpdateWorldState(WORLD_STATE_HOR, 1); + _waveCount = 1; + DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1); DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount); { std::list<uint32> possibilityList, tempList; @@ -434,10 +347,10 @@ public: } } } - SetData(DATA_WAVE_COUNT, SPECIAL); + events.ScheduleEvent(EVENT_NEXT_WAVE, 10000); break; case EVENT_ADD_WAVE: - DoUpdateWorldState(WORLD_STATE_HOR, 1); + DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1); DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount); HandleGameObject(_entranceDoorGUID, false); @@ -459,19 +372,21 @@ public: uint32 bossIndex = (_waveCount / 5) - 1; if (GetBossState(DATA_FALRIC_EVENT + bossIndex) != DONE) { - if (Creature* boss = instance->GetCreature(bossIndex ? _marwynGUID :_falricGUID)) + if (Creature* boss = instance->GetCreature(bossIndex ? _marwynGUID : _falricGUID)) if (boss->AI()) boss->AI()->DoAction(ACTION_ENTER_COMBAT); } else if (_waveCount != 10) + { + ++_waveCount; events.ScheduleEvent(EVENT_NEXT_WAVE, 10000); + } } break; case EVENT_DO_WIPE: - //SetData(DATA_WAVE_COUNT, NOT_STARTED); _waveCount = 0; events.Reset(); - DoUpdateWorldState(WORLD_STATE_HOR, 1); + DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1); DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount); HandleGameObject(_entranceDoorGUID, true); @@ -481,11 +396,11 @@ public: marwyn->SetVisible(false); //despawn wave npcs - for (uint8 i = 0; i < 8; i++) + for (uint8 i = 0; i < 8; ++i) { for (std::set<uint64>::const_iterator itr = waveGuidList[i].begin(); itr != waveGuidList[i].end(); ++itr) if (Creature* creature = instance->GetCreature(*itr)) - creature->DespawnOrUnsummon(); + creature->DespawnOrUnsummon(1); waveGuidList[i].clear(); } @@ -493,6 +408,103 @@ public: } } + uint32 GetData(uint32 type) const + { + switch (type) + { + case DATA_WAVE_COUNT: + return _waveCount; + case DATA_TEAM_IN_INSTANCE: + return _teamInInstance; + case DATA_INTRO_EVENT: + return _introEvent; + case DATA_FROSWORN_EVENT: + return _frostwornGeneral; + default: + break; + } + + return 0; + } + + uint64 GetData64(uint32 type) const + { + switch (type) + { + case DATA_FALRIC_EVENT: + return _falricGUID; + case DATA_MARWYN_EVENT: + return _marwynGUID; + case DATA_FROSWORN_EVENT: + return _frostwornGeneralGUID; + case DATA_FROSTWORN_DOOR: + return _frostwornDoorGUID; + case DATA_FROSTMOURNE: + return _frostmourneGUID; + default: + break; + } + + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral; + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* in) + { + if (!in) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(in); + + char dataHead1, dataHead2; + + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'H' && dataHead2 == 'R') + { + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + + SetBossState(i, EncounterState(tmpState)); + } + + uint32 temp = 0; + loadStream >> temp; + if (temp == DONE) + SetData(DATA_INTRO_EVENT, DONE); + else + SetData(DATA_INTRO_EVENT, NOT_STARTED); + + loadStream >> temp; + if (temp == DONE) + SetData(DATA_FROSWORN_EVENT, DONE); + else + SetData(DATA_FROSWORN_EVENT, NOT_STARTED); + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + private: uint64 _falricGUID; uint64 _marwynGUID; |