aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-05-25 22:14:32 +0200
committerShauren <shauren.trinity@gmail.com>2022-05-25 22:14:32 +0200
commit630b60eb0dcd3d9ce41582664ab822b049365431 (patch)
treeb5d60fe41ca49846524ddbc7f9409194b76e7849 /src/server/scripts
parent3031fbb63bfb2df2aa041bd9c04c5c42b0c07c05 (diff)
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
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp2
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp2
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp38
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/go_icecrown_citadel_teleport.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp10
7 files changed, 36 insertions, 22 deletions
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<Transport*>(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<Transport*>(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<Transport*>(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<Transport>::Find(_transport))
+ go->AddObjectToRemoveList();
if (Transport* go = HashMapHolder<Transport>::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<Transport>::Find(instance->GetGuidData(DATA_ICECROWN_GUNSHIP_BATTLE)))
otherTransport->EnableMovement(true);
- me->GetTransport()->EnableMovement(true);
+
+ if (Transport* transport = dynamic_cast<Transport*>(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<Transport*>(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<Transport*>(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<Transport*>(me->GetTransport()))
orgrimsHammer->SummonPassenger(NPC_TELEPORT_PORTAL, OrgrimsHammerTeleportPortal, TEMPSUMMON_TIMED_DESPAWN, nullptr, 21000);
if (Transport* skybreaker = HashMapHolder<Transport>::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<Transport*>(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<Transport*>(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<Transport*>(me->GetTransport()))
skybreaker->SummonPassenger(NPC_TELEPORT_PORTAL, SkybreakerTeleportPortal, TEMPSUMMON_TIMED_DESPAWN, nullptr, 21000);
if (Transport* orgrimsHammer = HashMapHolder<Transport>::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<Transport*>(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();
}