aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp15
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h2
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp31
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp12
4 files changed, 38 insertions, 22 deletions
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index be440d3859e..74173774391 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -744,6 +744,12 @@ void Vehicle::RemovePendingEventsForSeat(int8 seatId)
}
}
+VehicleJoinEvent::~VehicleJoinEvent()
+{
+ if (Target)
+ Target->RemovePendingEvent(this);
+}
+
/**
* @fn bool VehicleJoinEvent::Execute(uint64, uint32)
*
@@ -762,7 +768,7 @@ void Vehicle::RemovePendingEventsForSeat(int8 seatId)
bool VehicleJoinEvent::Execute(uint64, uint32)
{
ASSERT(Passenger->IsInWorld());
- ASSERT(Target->GetBase()->IsInWorld());
+ ASSERT(Target && Target->GetBase()->IsInWorld());
Target->RemovePendingEventsForSeat(Seat->first);
@@ -831,10 +837,6 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
// Actually quite a redundant hook. Could just use OnAddPassenger and check for unit typemask inside script.
if (Passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
sScriptMgr->OnInstallAccessory(Target, Passenger->ToCreature());
-
- // update all passenger's positions
- //Passenger's spline OR vehicle movement will update positions
- //RelocatePassengers(_me->GetPositionX(), _me->GetPositionY(), _me->GetPositionZ(), _me->GetOrientation());
}
return true;
@@ -853,6 +855,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
void VehicleJoinEvent::Abort(uint64)
{
+ /// Check if the Vehicle was already uninstalled, in which case all auras were removed already
if (Target)
{
sLog->outDebug(LOG_FILTER_VEHICLES, "Passenger GuidLow: %u, Entry: %u, board on vehicle GuidLow: %u, Entry: %u SeatId: %d cancelled",
@@ -864,7 +867,7 @@ void VehicleJoinEvent::Abort(uint64)
Target->GetBase()->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE, Passenger->GetGUID());
}
else
- sLog->outDebug(LOG_FILTER_VEHICLES, "Passenger GuidLow: %u, Entry: %u, board on destroyed vehicle SeatId: %d cancelled",
+ sLog->outDebug(LOG_FILTER_VEHICLES, "Passenger GuidLow: %u, Entry: %u, board on uninstalled vehicle SeatId: %d cancelled",
Passenger->GetGUIDLow(), Passenger->GetEntry(), (int32)Seat->first);
if (Passenger->IsInWorld() && Passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index b8ed3a8f947..70b821de912 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -113,7 +113,7 @@ class VehicleJoinEvent : public BasicEvent
friend class Vehicle;
protected:
VehicleJoinEvent(Vehicle* v, Unit* u) : Target(v), Passenger(u), Seat(Target->Seats.end()) {}
- ~VehicleJoinEvent() { Target->RemovePendingEvent(this); }
+ ~VehicleJoinEvent();
bool Execute(uint64, uint32);
void Abort(uint64);
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index bafd9a4510b..47e39574690 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -66,6 +66,9 @@ enum Events
EVENT_MOVE_TO_VORTEX_POINT = 22, // This should be fixed someday in core, we can't call new movement from MovementInform
EVENT_START_FIRST_RANDOM_PORTAL = 23, // There is something that is still loading when we first enter instance and it breaks
// first visual cast of intro portal beam mechanic, so we need short delay from the event.
+ EVENT_DELAY_MOVE_TO_DESTROY_P = 24, // If Malygos is too close to destroy platform point and transition from II to III is hit,
+ // this event will be sheduled to start after 5 seconds so there is enough time for "dimension change".
+
// ============ NEXUS LORDS ============
EVENT_ARCANE_SHOCK = 1,
EVENT_HASTE_BUFF = 2,
@@ -489,9 +492,13 @@ public:
DummyEntryCheckPredicate pred;
summons.DoAction(ACTION_DELAYED_DESPAWN, pred);
Talk(SAY_END_P_TWO);
- me->GetMotionMaster()->Initialize();
+ me->GetMotionMaster()->Clear(false);
me->StopMoving();
- me->GetMotionMaster()->MovePoint(POINT_DESTROY_PLATFORM_P_TWO, MalygosPositions[0]);
+ if (me->GetPositionZ() > 300.0f)
+ events.ScheduleEvent(EVENT_DELAY_MOVE_TO_DESTROY_P, 5*IN_MILLISECONDS, 0, PHASE_TWO);
+ else
+ me->GetMotionMaster()->MovePoint(POINT_DESTROY_PLATFORM_P_TWO, MalygosPositions[0]);
+
events.ScheduleEvent(EVENT_LIGHT_DIMENSION_CHANGE, 1*IN_MILLISECONDS, 0, PHASE_TWO);
break;
case ACTION_HANDLE_RESPAWN:
@@ -834,14 +841,17 @@ public:
}
break;
case EVENT_FLY_OUT_OF_PLATFORM:
- if (Creature* alexstraszaBunny = me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID)))
+ if (!_performingDestroyPlatform)
{
- Position randomPosOnRadius;
- // Hardcodded retail value, reason is Z getters can fail... (TO DO: Change to getter when height calculation works on 100%!)
- randomPosOnRadius.m_positionZ = 283.0521f;
- alexstraszaBunny->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 120.0f, alexstraszaBunny->GetAngle(me));
- me->GetMotionMaster()->MovePoint(POINT_FLY_OUT_OF_PLATFORM_P_TWO, randomPosOnRadius);
- _flyingOutOfPlatform = true;
+ if (Creature* alexstraszaBunny = me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID)))
+ {
+ Position randomPosOnRadius;
+ // Hardcodded retail value, reason is Z getters can fail... (TO DO: Change to getter when height calculation works on 100%!)
+ randomPosOnRadius.m_positionZ = 283.0521f;
+ alexstraszaBunny->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 120.0f, alexstraszaBunny->GetAngle(me));
+ me->GetMotionMaster()->MovePoint(POINT_FLY_OUT_OF_PLATFORM_P_TWO, randomPosOnRadius);
+ _flyingOutOfPlatform = true;
+ }
}
if (_arcaneReinforcements && instance)
@@ -925,6 +935,9 @@ public:
case EVENT_LIGHT_DIMENSION_CHANGE:
SendLightOverride(LIGHT_CHANGE_DIMENSIONS, 2*IN_MILLISECONDS);
break;
+ case EVENT_DELAY_MOVE_TO_DESTROY_P:
+ me->GetMotionMaster()->MovePoint(POINT_DESTROY_PLATFORM_P_TWO, MalygosPositions[0]);
+ break;
case EVENT_MOVE_TO_P_THREE_POINT:
Talk(SAY_START_P_THREE);
me->GetMotionMaster()->MovePoint(POINT_IDLE_P_THREE, MalygosPositions[4]);
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
index da008d10367..079732b0f14 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
@@ -157,12 +157,12 @@ public:
if (unit->GetTypeId() != TYPEID_PLAYER)
return;
- // For some reason player continues sometimes to be moving after death on this map,
- // perhaps only client side issue am not entirtly sure.
- // This fix not being able to press release button.
- // Variation of this with some check needs to be implemented somewhere within core code.
- // It'll stay here until someone find where and why the leak happens.
- unit->StopMoving();
+ // Player continues to be moving after death no matter if spline will be cleared along with all movements,
+ // so on next world tick was all about delay if box will pop or not (when new movement will be registered)
+ // since in EoE you never stop falling. However root at this precise* moment works,
+ // it will get cleared on release. If by any chance some lag happen "Reload()" and "RepopMe()" works,
+ // last test I made now gave me 50/0 of this bug so I can't do more about it.
+ unit->SetControlled(true, UNIT_STATE_ROOT);
}
void ProcessEvent(WorldObject* /*obj*/, uint32 eventId)