aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp42
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp66
-rw-r--r--src/server/game/Entities/Transport/Transport.h12
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp24
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h14
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h25
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h1
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiersImpl.h7
-rw-r--r--src/server/game/Maps/Map.cpp16
9 files changed, 94 insertions, 113 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index ea18a9836a7..9843936946c 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2178,26 +2178,8 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
if (!(options & TELE_TO_NOT_LEAVE_COMBAT))
CombatStop();
- // new final coordinates
- float final_x = x;
- float final_y = y;
- float final_z = z;
- float final_o = orientation;
-
- // Calculate final positions if on transport
- if (m_transport)
- {
- float tx, ty, tz, to;
- m_movementInfo.transport.pos.GetPosition(tx, ty, tz, to);
-
- final_x = x + tx * std::cos(orientation) - ty * std::sin(orientation);
- final_y = y + ty * std::cos(orientation) + tx * std::sin(orientation);
- final_z = z + tz;
- final_o = Position::NormalizeOrientation(orientation + m_movementInfo.transport.pos.GetOrientation());
- }
-
// this will be used instead of the current location in SaveToDB
- m_teleport_dest = WorldLocation(mapid, final_x, final_y, final_z, final_o);
+ m_teleport_dest = WorldLocation(mapid, x, y, z, orientation);
SetFallInformation(0, z);
// code for finish transfer called in WorldSession::HandleMovementOpcodes()
@@ -2208,7 +2190,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
{
Position oldPos;
GetPosition(&oldPos);
- Relocate(final_x, final_y, final_z, final_o);
+ Relocate(z, y, z, orientation);
SendTeleportAckPacket();
SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
}
@@ -2304,25 +2286,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
if (oldmap)
oldmap->RemovePlayerFromMap(this, false);
- // new final coordinates
- float final_x = x;
- float final_y = y;
- float final_z = z;
- float final_o = orientation;
-
- // Calculate final positions if on transport
- if (m_transport)
- {
- float tx, ty, tz, to;
- m_movementInfo.transport.pos.GetPosition(tx, ty, tz, to);
-
- final_x = x + tx * std::cos(orientation) - ty * std::sin(orientation);
- final_y = y + ty * std::cos(orientation) + tx * std::sin(orientation);
- final_z = z + tz;
- final_o = Position::NormalizeOrientation(orientation + m_movementInfo.transport.pos.GetOrientation());
- }
-
- m_teleport_dest = WorldLocation(mapid, final_x, final_y, final_z, final_o);
+ m_teleport_dest = WorldLocation(mapid, x, y, z, orientation);
SetFallInformation(0, z);
// if the player is saved before worldportack (at logout for example)
// this will be used instead of the current location in SaveToDB
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index ea8aae2af8c..45c104c4bf3 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -163,13 +163,14 @@ void Transport::Update(uint32 diff)
if (GetGOInfo()->moTransport.canBeStopped)
SetGoState(GO_STATE_ACTIVE);
- // Departure event
- if (_currentFrame->IsTeleportFrame())
- TeleportTransport(_nextFrame->Node->mapid, _nextFrame->Node->x, _nextFrame->Node->y, _nextFrame->Node->z);
-
sScriptMgr->OnRelocate(this, _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z);
TC_LOG_DEBUG(LOG_FILTER_TRANSPORTS, "Transport %u (%s) moved to node %u %u %f %f %f", GetEntry(), GetName().c_str(), _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z);
+
+ // Departure event
+ if (_currentFrame->IsTeleportFrame())
+ if (TeleportTransport(_nextFrame->Node->mapid, _nextFrame->Node->x, _nextFrame->Node->y, _nextFrame->Node->z))
+ return; // Update more in new map thread
}
// Set position
@@ -237,6 +238,10 @@ Creature* Transport::CreateNPCPassenger(uint32 guid, CreatureData const* data)
creature->SetHomePosition(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation());
creature->SetTransportHomePosition(creature->m_movementInfo.transport.pos);
+ /// @HACK - transport models are not added to map's dynamic LoS calculations
+ /// because the current GameObjectModel cannot be moved without recreating
+ creature->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);
+
if (!creature->IsPositionValid())
{
TC_LOG_ERROR(LOG_FILTER_TRANSPORTS, "Creature (guidlow %d, entry %d) not created. Suggested coordinates aren't valid (X: %f Y: %f)",creature->GetGUIDLow(),creature->GetEntry(),creature->GetPositionX(),creature->GetPositionY());
@@ -294,30 +299,6 @@ GameObject* Transport::CreateGOPassenger(uint32 guid, GameObjectData const* data
return go;
}
-void Transport::CalculatePassengerPosition(float& x, float& y, float& z, float* o /*= NULL*/) const
-{
- float inx = x, iny = y, inz = z;
- if (o)
- *o = Position::NormalizeOrientation(GetOrientation() + *o);
-
- x = GetPositionX() + inx * std::cos(GetOrientation()) - iny * std::sin(GetOrientation());
- y = GetPositionY() + iny * std::cos(GetOrientation()) + inx * std::sin(GetOrientation());
- z = GetPositionZ() + inz;
-}
-
-void Transport::CalculatePassengerOffset(float& x, float& y, float& z, float* o /*= NULL*/) const
-{
- if (o)
- *o = Position::NormalizeOrientation(*o - GetOrientation());
-
- z -= GetPositionZ();
- y -= GetPositionY(); // y = searchedY * std::cos(o) + searchedX * std::sin(o)
- x -= GetPositionX(); // x = searchedX * std::cos(o) + searchedY * std::sin(o + pi)
- float inx = x, iny = y;
- y = (iny - inx * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation()));
- x = (inx + iny * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation()));
-}
-
void Transport::UpdatePosition(float x, float y, float z, float o)
{
bool newActive = GetMap()->IsGridLoaded(x, y);
@@ -422,7 +403,7 @@ float Transport::CalculateSegmentPos(float now)
return segmentPos / frame.NextDistFromPrev;
}
-void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
+bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
{
Map const* oldMap = GetMap();
@@ -465,23 +446,27 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
{
WorldObject* obj = (*itr++);
+ float destX, destY, destZ, destO;
+ obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
+ TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, GetOrientation());
+
switch (obj->GetTypeId())
{
case TYPEID_UNIT:
if (!IS_PLAYER_GUID(obj->ToUnit()->GetOwnerGUID())) // pets should be teleported with player
- obj->ToCreature()->FarTeleportTo(newMap, x, y, z, obj->GetOrientation());
+ obj->ToCreature()->FarTeleportTo(newMap, destX, destY, destZ, destO);
break;
case TYPEID_GAMEOBJECT:
{
GameObject* go = obj->ToGameObject();
go->GetMap()->RemoveFromMap(go, false);
- Relocate(x, y, z, go->GetOrientation());
+ Relocate(destX, destY, destZ, destO);
SetMap(newMap);
newMap->AddToMap(go);
break;
}
case TYPEID_PLAYER:
- if (!obj->ToPlayer()->TeleportTo(newMapid, x, y, z, GetOrientation(), TELE_TO_NOT_LEAVE_TRANSPORT))
+ if (!obj->ToPlayer()->TeleportTo(newMapid, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT))
_passengers.erase(obj);
break;
default:
@@ -489,17 +474,28 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
}
}
+ Relocate(x, y, z, GetOrientation());
GetMap()->AddToMap<Transport>(this);
+ return true;
}
else
{
// Teleport players, they need to know it
for (std::set<WorldObject*>::iterator itr = _passengers.begin(); itr != _passengers.end(); ++itr)
+ {
if ((*itr)->GetTypeId() == TYPEID_PLAYER)
- (*itr)->ToUnit()->NearTeleportTo(x, y, z, GetOrientation());
- }
+ {
+ float destX, destY, destZ, destO;
+ (*itr)->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
+ TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, GetOrientation());
- UpdatePosition(x, y, z, GetOrientation());
+ (*itr)->ToUnit()->NearTeleportTo(destX, destY, destZ, destO);
+ }
+ }
+
+ UpdatePosition(x, y, z, GetOrientation());
+ return false;
+ }
}
void Transport::UpdatePassengerPositions(std::set<WorldObject*>& passengers)
diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h
index 0d020fe2c34..0145ec608ae 100644
--- a/src/server/game/Entities/Transport/Transport.h
+++ b/src/server/game/Entities/Transport/Transport.h
@@ -46,10 +46,16 @@ class Transport : public GameObject, public TransportBase
GameObject* CreateGOPassenger(uint32 guid, GameObjectData const* data);
/// This method transforms supplied transport offsets into global coordinates
- void CalculatePassengerPosition(float& x, float& y, float& z, float* o = NULL) const;
+ void CalculatePassengerPosition(float& x, float& y, float& z, float* o /*= NULL*/) const
+ {
+ TransportBase::CalculatePassengerPosition(x, y, z, o, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
+ }
/// This method transforms supplied global coordinates into local offsets
- void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const;
+ void CalculatePassengerOffset(float& x, float& y, float& z, float* o /*= NULL*/) const
+ {
+ TransportBase::CalculatePassengerOffset(x, y, z, o, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
+ }
uint32 GetPeriod() const { return GetUInt32Value(GAMEOBJECT_LEVEL); }
void SetPeriod(uint32 period) { SetUInt32Value(GAMEOBJECT_LEVEL, period); }
@@ -72,7 +78,7 @@ class Transport : public GameObject, public TransportBase
private:
void MoveToNextWaypoint();
float CalculateSegmentPos(float perc);
- void TeleportTransport(uint32 newMapid, float x, float y, float z);
+ bool TeleportTransport(uint32 newMapid, float x, float y, float z);
void UpdatePassengerPositions(std::set<WorldObject*>& passengers);
void DoEventIfAny(KeyFrame const& node, bool departure);
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index 88c9ab203b0..5a82fdcd098 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -679,30 +679,6 @@ uint8 Vehicle::GetAvailableSeatCount() const
return ret;
}
-void Vehicle::CalculatePassengerPosition(float& x, float& y, float& z, float* o /*= NULL*/) const
-{
- float inx = x, iny = y, inz = z;
- if (o)
- *o = Position::NormalizeOrientation(GetBase()->GetOrientation() + *o);
-
- x = GetBase()->GetPositionX() + inx * std::cos(GetBase()->GetOrientation()) - iny * std::sin(GetBase()->GetOrientation());
- y = GetBase()->GetPositionY() + iny * std::cos(GetBase()->GetOrientation()) + inx * std::sin(GetBase()->GetOrientation());
- z = GetBase()->GetPositionZ() + inz;
-}
-
-void Vehicle::CalculatePassengerOffset(float& x, float& y, float& z, float* o /*= NULL*/) const
-{
- if (o)
- *o = Position::NormalizeOrientation(*o - GetBase()->GetOrientation());
-
- z -= GetBase()->GetPositionZ();
- y -= GetBase()->GetPositionY(); // y = searchedY * std::cos(o) + searchedX * std::sin(o)
- x -= GetBase()->GetPositionX(); // x = searchedX * std::cos(o) + searchedY * std::sin(o + pi)
- float inx = x, iny = y;
- y = (iny - inx * std::tan(GetBase()->GetOrientation())) / (std::cos(GetBase()->GetOrientation()) + std::sin(GetBase()->GetOrientation()) * std::tan(GetBase()->GetOrientation()));
- x = (inx + iny * std::tan(GetBase()->GetOrientation())) / (std::cos(GetBase()->GetOrientation()) + std::sin(GetBase()->GetOrientation()) * std::tan(GetBase()->GetOrientation()));
-}
-
/**
* @fn void Vehicle::RemovePendingEvent(VehicleJoinEvent* e)
*
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index f71ccded926..7dc9c36ecef 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -89,10 +89,20 @@ class Vehicle : public TransportBase
void InitMovementInfoForBase();
/// This method transforms supplied transport offsets into global coordinates
- void CalculatePassengerPosition(float& x, float& y, float& z, float* o = NULL) const;
+ void CalculatePassengerPosition(float& x, float& y, float& z, float* o /*= NULL*/) const
+ {
+ TransportBase::CalculatePassengerPosition(x, y, z, o,
+ GetBase()->GetPositionX(), GetBase()->GetPositionY(),
+ GetBase()->GetPositionZ(), GetBase()->GetOrientation());
+ }
/// This method transforms supplied global coordinates into local offsets
- void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const;
+ void CalculatePassengerOffset(float& x, float& y, float& z, float* o /*= NULL*/) const
+ {
+ TransportBase::CalculatePassengerOffset(x, y, z, o,
+ GetBase()->GetPositionX(), GetBase()->GetPositionY(),
+ GetBase()->GetPositionZ(), GetBase()->GetOrientation());
+ }
void RemovePendingEvent(VehicleJoinEvent* e);
void RemovePendingEventsForSeat(int8 seatId);
diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h
index 1c3a57593c3..0290ecf7859 100644
--- a/src/server/game/Entities/Vehicle/VehicleDefines.h
+++ b/src/server/game/Entities/Vehicle/VehicleDefines.h
@@ -105,6 +105,31 @@ public:
/// This method transforms supplied global coordinates into local offsets
virtual void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const = 0;
+
+protected:
+ static void CalculatePassengerPosition(float& x, float& y, float& z, float* o, float transX, float transY, float transZ, float transO)
+ {
+ float inx = x, iny = y, inz = z;
+ if (o)
+ *o = Position::NormalizeOrientation(transO + *o);
+
+ x = transX + inx * std::cos(transO) - iny * std::sin(transO);
+ y = transY + iny * std::cos(transO) + inx * std::sin(transO);
+ z = transZ + inz;
+ }
+
+ static void CalculatePassengerOffset(float& x, float& y, float& z, float* o, float transX, float transY, float transZ, float transO)
+ {
+ if (o)
+ *o = Position::NormalizeOrientation(*o - transO);
+
+ z -= transZ;
+ y -= transY; // y = searchedY * std::cos(o) + searchedX * std::sin(o)
+ x -= transX; // x = searchedX * std::cos(o) + searchedY * std::sin(o + pi)
+ float inx = x, iny = y;
+ y = (iny - inx * std::tan(transO)) / (std::cos(transO) + std::sin(transO) * std::tan(transO));
+ x = (inx + iny * std::tan(transO)) / (std::cos(transO) + std::sin(transO) * std::tan(transO));
+ }
};
#endif
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index 7bf50b60c1c..24c44eb0c56 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -164,7 +164,6 @@ namespace Trinity
template<class T> void Visit(GridRefManager<T> &m);
void Visit(PlayerMapType &) { }
void Visit(CorpseMapType &) { }
- void Visit(CreatureMapType &);
};
// SEARCHERS & LIST SEARCHERS & WORKERS
diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h
index deb8fa49a6c..dc0e99aaded 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h
@@ -38,13 +38,6 @@ inline void Trinity::VisibleNotifier::Visit(GridRefManager<T> &m)
}
}
-inline void Trinity::ObjectUpdater::Visit(CreatureMapType &m)
-{
- for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
- if (iter->GetSource()->IsInWorld())
- iter->GetSource()->Update(i_timeDiff);
-}
-
// SEARCHERS & LIST SEARCHERS & WORKERS
// WorldObject searchers & workers
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 64c3a186d33..a9de03cd325 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2426,8 +2426,20 @@ void Map::RemoveAllObjectsInRemoveList()
bool on = itr->second;
i_objectsToSwitch.erase(itr);
- if ((obj->GetTypeId() == TYPEID_UNIT || obj->GetTypeId() == TYPEID_GAMEOBJECT) && !obj->IsPermanentWorldObject())
- SwitchGridContainers(obj, on);
+ if (!obj->IsPermanentWorldObject())
+ {
+ switch (obj->GetTypeId())
+ {
+ case TYPEID_UNIT:
+ SwitchGridContainers<Creature>(obj->ToCreature(), on);
+ break;
+ case TYPEID_GAMEOBJECT:
+ SwitchGridContainers<GameObject>(obj->ToGameObject(), on);
+ break;
+ default:
+ break;
+ }
+ }
}
//TC_LOG_DEBUG(LOG_FILTER_MAPS, "Object remover 1 check.");