From 630b60eb0dcd3d9ce41582664ab822b049365431 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 25 May 2022 22:14:32 +0200 Subject: Core/GameObjects: Transport (type 11) improvements * Fully synchronize serverside animation progress with client * Implemented updating passenger positions on elevators * Removed visibility hack for elevators that always forced CreateObject packet to be sent to client --- src/server/scripts/Commands/cs_debug.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 2 +- src/server/scripts/Commands/cs_npc.cpp | 2 +- .../boss_icecrown_gunship_battle.cpp | 38 +++++++++++++--------- .../go_icecrown_citadel_teleport.cpp | 2 +- .../Northrend/IcecrownCitadel/icecrown_citadel.h | 2 +- .../IcecrownCitadel/instance_icecrown_citadel.cpp | 10 ++++-- 7 files changed, 36 insertions(+), 22 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index f03829e4642..69dd3e9fcee 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1207,7 +1207,7 @@ public: static bool HandleDebugTransportCommand(ChatHandler* handler, std::string operation) { - Transport* transport = handler->GetPlayer()->GetTransport(); + Transport* transport = dynamic_cast(handler->GetPlayer()->GetTransport()); if (!transport) return false; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index f944120ee3e..367b42e9ec1 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -283,7 +283,7 @@ public: zoneId, (zoneEntry ? zoneEntry->AreaName[handler->GetSessionDbcLocale()] : unknown), areaId, (areaEntry ? areaEntry->AreaName[handler->GetSessionDbcLocale()] : unknown), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation()); - if (Transport* transport = object->GetTransport()) + if (Transport* transport = dynamic_cast(object->GetTransport())) handler->PSendSysMessage(LANG_TRANSPORT_POSITION, transport->GetGOInfo()->moTransport.SpawnMap, object->GetTransOffsetX(), object->GetTransOffsetY(), object->GetTransOffsetZ(), object->GetTransOffsetO(), transport->GetEntry(), transport->GetName().c_str()); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index e7198d0afff..e48c800b294 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -124,7 +124,7 @@ public: Player* chr = handler->GetSession()->GetPlayer(); Map* map = chr->GetMap(); - if (Transport* trans = chr->GetTransport()) + if (Transport* trans = dynamic_cast(chr->GetTransport())) { ObjectGuid::LowType guid = sObjectMgr->GenerateCreatureSpawnId(); CreatureData& data = sObjectMgr->NewOrExistCreatureData(guid); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index 9927849fe6b..7cd4452a088 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -490,12 +490,15 @@ private: class ResetEncounterEvent : public BasicEvent { public: - ResetEncounterEvent(Unit* caster, uint32 spellId, ObjectGuid otherTransport) : _caster(caster), _spellId(spellId), _otherTransport(otherTransport) { } + ResetEncounterEvent(Unit* caster, uint32 spellId, ObjectGuid transport, ObjectGuid otherTransport) : _caster(caster), _spellId(spellId), + _transport(transport), _otherTransport(otherTransport) { } bool Execute(uint64, uint32) override { _caster->CastSpell(_caster, _spellId, true); - _caster->GetTransport()->AddObjectToRemoveList(); + + if (Transport* go = HashMapHolder::Find(_transport)) + go->AddObjectToRemoveList(); if (Transport* go = HashMapHolder::Find(_otherTransport)) go->AddObjectToRemoveList(); @@ -506,6 +509,7 @@ public: private: Unit* _caster; uint32 _spellId; + ObjectGuid _transport; ObjectGuid _otherTransport; }; @@ -688,7 +692,7 @@ class npc_gunship : public CreatureScript if (_summonedFirstMage) return; - if (me->GetTransport()->GetEntry() != uint32(_teamInInstance == HORDE ? GO_THE_SKYBREAKER_H : GO_ORGRIMS_HAMMER_A)) + if (me->GetTransport()->GetTransportGUID() != me->GetInstanceScript()->GetGuidData(DATA_ENEMY_GUNSHIP)) return; if (!me->HealthBelowPctDamaged(90, damage)) @@ -706,8 +710,8 @@ class npc_gunship : public CreatureScript _died = true; - bool isVictory = me->GetTransport()->GetEntry() == GO_THE_SKYBREAKER_H || me->GetTransport()->GetEntry() == GO_ORGRIMS_HAMMER_A; InstanceScript* instance = me->GetInstanceScript(); + bool isVictory = me->GetTransport()->GetTransportGUID() == instance->GetGuidData(DATA_ENEMY_GUNSHIP); instance->SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, isVictory ? DONE : FAIL); if (Creature* creature = me->FindNearestCreature(me->GetEntry() == NPC_ORGRIMS_HAMMER ? NPC_THE_SKYBREAKER : NPC_ORGRIMS_HAMMER, 200.0f)) { @@ -770,7 +774,9 @@ class npc_gunship : public CreatureScript if (Transport* otherTransport = HashMapHolder::Find(instance->GetGuidData(DATA_ICECROWN_GUNSHIP_BATTLE))) otherTransport->EnableMovement(true); - me->GetTransport()->EnableMovement(true); + + if (Transport* transport = dynamic_cast(me->GetTransport())) + transport->EnableMovement(true); if (Creature* ship = me->FindNearestCreature(_teamInInstance == HORDE ? NPC_ORGRIMS_HAMMER : NPC_THE_SKYBREAKER, 200.0f)) { @@ -790,8 +796,8 @@ class npc_gunship : public CreatureScript else { uint32 teleportSpellId = _teamInInstance == HORDE ? SPELL_TELEPORT_PLAYERS_ON_RESET_H : SPELL_TELEPORT_PLAYERS_ON_RESET_A; - me->m_Events.AddEvent(new ResetEncounterEvent(me, teleportSpellId, me->GetInstanceScript()->GetGuidData(DATA_ENEMY_GUNSHIP)), - me->m_Events.CalculateTime(8s)); + me->m_Events.AddEventAtOffset(new ResetEncounterEvent(me, teleportSpellId, instance->GetGuidData(DATA_ICECROWN_GUNSHIP_BATTLE), + instance->GetGuidData(DATA_ENEMY_GUNSHIP)), 8s); } } @@ -841,7 +847,7 @@ struct npc_high_overlord_saurfang_igb : public ScriptedAI _instance(creature->GetInstanceScript()) { _controller.ResetSlots(HORDE); - _controller.SetTransport(creature->GetTransport()); + _controller.SetTransport(dynamic_cast(creature->GetTransport())); me->SetRegenerateHealth(false); me->m_CombatDistance = 70.0f; _firstMageCooldown = GameTime::Now() + 60s; @@ -951,7 +957,8 @@ struct npc_high_overlord_saurfang_igb : public ScriptedAI bool OnGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override { me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - me->GetTransport()->EnableMovement(true); + if (Transport* transport = dynamic_cast(me->GetTransport())) + transport->EnableMovement(true); _events.SetPhase(PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_H_1, 5s, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_H_2, 16s, 0, PHASE_INTRO); @@ -1019,7 +1026,7 @@ struct npc_high_overlord_saurfang_igb : public ScriptedAI _controller.SummonCreatures(SLOT_MAGE_1, SLOT_MAGE_2); _controller.SummonCreatures(SLOT_MARINE_1, Is25ManRaid() ? SLOT_MARINE_4 : SLOT_MARINE_2); _controller.SummonCreatures(SLOT_SERGEANT_1, Is25ManRaid() ? SLOT_SERGEANT_2 : SLOT_SERGEANT_1); - if (Transport* orgrimsHammer = me->GetTransport()) + if (Transport* orgrimsHammer = dynamic_cast(me->GetTransport())) orgrimsHammer->SummonPassenger(NPC_TELEPORT_PORTAL, OrgrimsHammerTeleportPortal, TEMPSUMMON_TIMED_DESPAWN, nullptr, 21000); if (Transport* skybreaker = HashMapHolder::Find(_instance->GetGuidData(DATA_ICECROWN_GUNSHIP_BATTLE))) @@ -1094,7 +1101,7 @@ struct npc_muradin_bronzebeard_igb : public ScriptedAI _instance(creature->GetInstanceScript()) { _controller.ResetSlots(ALLIANCE); - _controller.SetTransport(creature->GetTransport()); + _controller.SetTransport(dynamic_cast(creature->GetTransport())); me->SetRegenerateHealth(false); me->m_CombatDistance = 70.0f; _firstMageCooldown = GameTime::Now() + 60s; @@ -1204,7 +1211,8 @@ struct npc_muradin_bronzebeard_igb : public ScriptedAI bool OnGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override { me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - me->GetTransport()->EnableMovement(true); + if (Transport* transport = dynamic_cast(me->GetTransport())) + transport->EnableMovement(true); _events.SetPhase(PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_A_1, 5s); _events.ScheduleEvent(EVENT_INTRO_A_2, 10s, 0, PHASE_INTRO); @@ -1276,7 +1284,7 @@ struct npc_muradin_bronzebeard_igb : public ScriptedAI _controller.SummonCreatures(SLOT_MAGE_1, SLOT_MAGE_2); _controller.SummonCreatures(SLOT_MARINE_1, Is25ManRaid() ? SLOT_MARINE_4 : SLOT_MARINE_2); _controller.SummonCreatures(SLOT_SERGEANT_1, Is25ManRaid() ? SLOT_SERGEANT_2 : SLOT_SERGEANT_1); - if (Transport* skybreaker = me->GetTransport()) + if (Transport* skybreaker = dynamic_cast(me->GetTransport())) skybreaker->SummonPassenger(NPC_TELEPORT_PORTAL, SkybreakerTeleportPortal, TEMPSUMMON_TIMED_DESPAWN, nullptr, 21000); if (Transport* orgrimsHammer = HashMapHolder::Find(_instance->GetGuidData(DATA_ICECROWN_GUNSHIP_BATTLE))) @@ -1402,7 +1410,7 @@ struct npc_gunship_boarding_addAI : public gunship_npc_AI float x, y, z, o; otherTransportPos.GetPosition(x, y, z, o); - Transport* myTransport = me->GetTransport(); + TransportBase* myTransport = me->GetTransport(); if (!myTransport) return; @@ -2010,7 +2018,7 @@ class spell_igb_burning_pitch_selector : public SpellScript targets.remove_if([team](WorldObject* target) -> bool { - if (Transport* transport = target->GetTransport()) + if (Transport* transport = dynamic_cast(target->GetTransport())) return transport->GetEntry() != uint32(team == HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A); return true; }); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/go_icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/go_icecrown_citadel_teleport.cpp index 7e1259fdcc4..72bdf4c087f 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/go_icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/go_icecrown_citadel_teleport.cpp @@ -72,7 +72,7 @@ class icecrown_citadel_teleport : public GameObjectScript // If the player is on the ship, Unit::NearTeleport() will try to keep the player on the ship, causing issues. // For that we simply always remove the player from the ship. - if (Transport* transport = player->GetTransport()) + if (TransportBase* transport = player->GetTransport()) transport->RemovePassenger(player); player->CastSpell(player, spell->Id, true); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index 8dd11837c8c..1f14b55b647 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -352,7 +352,7 @@ enum ICGameObjectsIds GO_SPIRIT_ALARM_3 = 201816, GO_SPIRIT_ALARM_4 = 201817, - // Lord Marrogar + // Lord Marrowgar GO_DOODAD_ICECROWN_ICEWALL02 = 201910, GO_ICEWALL = 201911, GO_LORD_MARROWGAR_S_ENTRANCE = 201857, diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index cedebba8633..4a737757efb 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -536,7 +536,10 @@ class instance_icecrown_citadel : public InstanceMapScript case GO_LADY_DEATHWHISPER_ELEVATOR: LadyDeathwisperElevatorGUID = go->GetGUID(); if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE) - go->SetTransportState(GO_STATE_TRANSPORT_ACTIVE); + { + go->SetGoState(GO_STATE_TRANSPORT_ACTIVE); + go->HandleCustomTypeCommand(GameObjectType::SetTransportAutoCycleBetweenStopFrames(true)); + } break; case GO_THE_SKYBREAKER_H: case GO_ORGRIMS_HAMMER_A: @@ -874,7 +877,10 @@ class instance_icecrown_citadel : public InstanceMapScript SetTeleporterState(teleporter, true); if (GameObject* elevator = instance->GetGameObject(LadyDeathwisperElevatorGUID)) - elevator->SetTransportState(GO_STATE_TRANSPORT_ACTIVE); + { + elevator->SetGoState(GO_STATE_TRANSPORT_ACTIVE); + elevator->HandleCustomTypeCommand(GameObjectType::SetTransportAutoCycleBetweenStopFrames(true)); + } SpawnGunship(); } -- cgit v1.2.3