aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Entities/Creature/TemporarySummon.h1
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp13
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h2
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp38
4 files changed, 26 insertions, 28 deletions
diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h
index 985f9dc0e30..c4fe70a0983 100755
--- a/src/server/game/Entities/Creature/TemporarySummon.h
+++ b/src/server/game/Entities/Creature/TemporarySummon.h
@@ -35,6 +35,7 @@ class TempSummon : public Creature
void SaveToDB(uint32 /*mapid*/, uint8 /*spawnMask*/, uint32 /*phaseMask*/) {}
Unit* GetSummoner() const;
uint64 const& GetSummonerGUID() { return m_summonerGUID; }
+ TempSummonType const& GetSummonType() { return m_type; }
const SummonPropertiesEntry * const m_Properties;
private:
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index c63510d39a9..794a666b665 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -16506,7 +16506,7 @@ void Unit::ChangeSeat(int8 seatId, bool next)
ASSERT(false);
}
-void Unit::ExitVehicle()
+void Unit::ExitVehicle(Position const* exitPosition)
{
if (!m_vehicle)
return;
@@ -16525,23 +16525,26 @@ void Unit::ExitVehicle()
if (!m_vehicle)
return;
- //sLog->outError("exit vehicle");
-
m_vehicle->RemovePassenger(this);
// This should be done before dismiss, because there may be some aura removal
Vehicle *vehicle = m_vehicle;
m_vehicle = NULL;
- SetControlled(false, UNIT_STAT_ROOT);
+ SetControlled(false, UNIT_STAT_ROOT); // SMSG_MOVE_FORCE_UNROOT
+
+ if (exitPosition) // Exit position specified
+ Relocate(exitPosition);
+ else
+ Relocate(vehicle->GetBase()); // Relocate to vehicle base
//Send leave vehicle, not correct
if (GetTypeId() == TYPEID_PLAYER)
{
//this->ToPlayer()->SetClientControl(this, 1);
- this->ToPlayer()->SendTeleportAckPacket();
this->ToPlayer()->SetFallInformation(0, GetPositionZ());
}
+
WorldPacket data;
BuildHeartBeatMsg(&data);
SendMessageToSet(&data, false);
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 73d5cae78f0..25509e2230f 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2058,7 +2058,7 @@ class Unit : public WorldObject
bool CheckPlayerCondition(Player* pPlayer);
void EnterVehicle(Unit *base, int8 seatId = -1, AuraApplication const * aurApp = NULL) { EnterVehicle(base->GetVehicleKit(), seatId, aurApp); }
void EnterVehicle(Vehicle *vehicle, int8 seatId = -1, AuraApplication const * aurApp = NULL);
- void ExitVehicle();
+ void ExitVehicle(Position const* exitPosition = NULL);
void ChangeSeat(int8 seatId, bool next = true);
void BuildMovementPacket(ByteBuffer *data) const;
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index cc11ab514a5..bb8c443d09a 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -256,11 +256,23 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ
if (passenger->GetEntry() == entry)
{
ASSERT(passenger->GetTypeId() == TYPEID_UNIT);
- if (me->GetTypeId() == TYPEID_UNIT && me->ToCreature()->IsInEvadeMode() && passenger->ToCreature()->IsAIEnabled)
- passenger->ToCreature()->AI()->EnterEvadeMode();
- return;
+ if (me->GetTypeId() == TYPEID_UNIT)
+ {
+ if (me->ToCreature()->IsInEvadeMode() && passenger->ToCreature()->IsAIEnabled)
+ {
+ passenger->ToCreature()->AI()->EnterEvadeMode();
+ return;
+ }
+ else if (passenger->ToTempSummon()->GetSummonType() == TEMPSUMMON_MANUAL_DESPAWN)
+ {
+ passenger->ExitVehicle();
+ passenger->ToTempSummon()->DespawnOrUnsummon();
+ ASSERT(!GetPassenger(seatId))
+ }
+ }
}
- passenger->ExitVehicle(); // this should not happen
+ else
+ passenger->ExitVehicle(); // this should not happen
}
if (Creature *accessory = me->SummonCreature(entry, *me, TempSummonType(type), summonTime))
@@ -361,14 +373,6 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
if (me->IsInWorld())
{
- if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
- {
- WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8+4);
- data.append(me->GetPackGUID());
- data << uint32(2); // Counter
- me->SendMessageToSet(&data, false);
- }
-
// In some cases we send SMSG_SPLINE_MOVE_ROOT here (for creatures)
unit->SendMonsterMoveTransport(me);
@@ -429,20 +433,10 @@ void Vehicle::RemovePassenger(Unit *unit)
if (me->IsInWorld())
{
- if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
- {
- WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8+4);
- data.append(me->GetPackGUID());
- data << uint32(2); // Counter
- me->SendMessageToSet(&data, false);
- }
-
unit->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
unit->m_movementInfo.t_pos.Relocate(0, 0, 0, 0);
unit->m_movementInfo.t_time = 0;
unit->m_movementInfo.t_seat = 0;
-
- unit->Relocate(GetBase());
}
if (me->GetTypeId() == TYPEID_UNIT && me->ToCreature()->IsAIEnabled)