--- a/src/game/GridNotifiers.cpp +++ b/src/game/GridNotifiers.cpp @@ -42,18 +42,18 @@ VisibleNotifier::Notify() Player& player = *i_camera.GetOwner(); // at this moment i_clientGUIDs have guids that not iterate at grid level checks // but exist one case when this possible and object not out of range: transports - if(Transport* transport = player.GetTransport()) - { - for(Transport::PlayerSet::const_iterator itr = transport->GetPassengers().begin();itr!=transport->GetPassengers().end();++itr) - { - if (i_clientGUIDs.find((*itr)->GetGUID()) != i_clientGUIDs.end()) - { - // ignore far sight case - (*itr)->UpdateVisibilityOf(*itr, &player); - player.UpdateVisibilityOf(&player, *itr, i_data, i_visibleNow); - i_clientGUIDs.erase((*itr)->GetGUID()); - } - } + if(Transport* transport = player.GetTransport()) + { + for(Transport::PlayerSet::const_iterator itr = transport->GetPlayerPassengers().begin();itr!=transport->GetPlayerPassengers().end();++itr) + { + if (i_clientGUIDs.find((*itr)->GetGUID()) != i_clientGUIDs.end()) + { + // ignore far sight case + (*itr)->UpdateVisibilityOf(*itr, &player); + player.UpdateVisibilityOf(&player, *itr, i_data, i_visibleNow); + i_clientGUIDs.erase((*itr)->GetGUID()); + } + } } // generate outOfRange for not iterate objects --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -37,6 +37,7 @@ #include "GMTicketMgr.h" #include "WaypointManager.h" #include "Util.h" +#include "Transports.h" #include #include #include @@ -1113,6 +1114,18 @@ bool ChatHandler::HandleNpcAddCommand(co return false; } + if (chr->GetTransport()) + { + pCreature->SetTransport(chr->GetTransport()); + pCreature->m_movementInfo.SetTransportData(ObjectGuid(HIGHGUID_MO_TRANSPORT, chr->GetTransport()->GetGUID()), chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO(), 0, -1); + map->CreatureRelocation(pCreature, chr->GetTransport()->GetPositionX() + chr->GetTransOffsetX(), chr->GetTransport()->GetPositionY() + chr->GetTransOffsetY(), chr->GetTransport()->GetPositionZ() + chr->GetTransOffsetZ(), chr->GetTransOffsetO()); + chr->GetTransport()->AddCreaturePassenger(pCreature); + pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); + pCreature->AIM_Initialize(); + map->Add(pCreature); + return true; + } + pCreature->Relocate(x,y,z,o); if (!pCreature->IsPositionValid()) --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -1361,7 +1361,7 @@ void Map::SendInitSelf( Player * player // build other passengers at transport also (they always visible and marked as visible and will not send at visibility update at add to map if(Transport* transport = player->GetTransport()) { - for(Transport::PlayerSet::const_iterator itr = transport->GetPassengers().begin();itr!=transport->GetPassengers().end();++itr) + for(Transport::PlayerSet::const_iterator itr = transport->GetPlayerPassengers().begin();itr!=transport->GetPlayerPassengers().end();++itr) { if(player!=(*itr) && player->HaveAtClient(*itr)) { --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -1097,9 +1097,9 @@ void ObjectMgr::LoadCreatures() uint32 count = 0; // 0 1 2 3 QueryResult *result = WorldDatabase.Query("SELECT creature.guid, id, map, modelid," - // 4 5 6 7 8 9 10 11 - "equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint," - // 12 13 14 15 16 17 18 19 + // 4 5 6 7 8 9 10 11 12 13 14 15 16 + "equipment_id, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, spawntimesecs, spawndist, currentwaypoint," + // 17 18 19 20 21 22 23 24 "curhealth, curmana, DeathState, MovementType, spawnMask, phaseMask, event, pool_entry " "FROM creature LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid " "LEFT OUTER JOIN pool_creature ON creature.guid = pool_creature.guid"); @@ -1158,17 +1158,22 @@ void ObjectMgr::LoadCreatures() data.posY = fields[ 6].GetFloat(); data.posZ = fields[ 7].GetFloat(); data.orientation = fields[ 8].GetFloat(); - data.spawntimesecs = fields[ 9].GetUInt32(); - data.spawndist = fields[10].GetFloat(); - data.currentwaypoint= fields[11].GetUInt32(); - data.curhealth = fields[12].GetUInt32(); - data.curmana = fields[13].GetUInt32(); - data.is_dead = fields[14].GetBool(); - data.movementType = fields[15].GetUInt8(); - data.spawnMask = fields[16].GetUInt8(); - data.phaseMask = fields[17].GetUInt16(); - int16 gameEvent = fields[18].GetInt16(); - int16 PoolId = fields[19].GetInt16(); + data.trans_x = fields[ 9].GetFloat(); + data.trans_y = fields[10].GetFloat(); + data.trans_z = fields[11].GetFloat(); + data.trans_o = fields[12].GetFloat(); + data.transguid = fields[13].GetUInt32(); + data.spawntimesecs = fields[14].GetUInt32(); + data.spawndist = fields[15].GetFloat(); + data.currentwaypoint= fields[16].GetUInt32(); + data.curhealth = fields[17].GetUInt32(); + data.curmana = fields[18].GetUInt32(); + data.is_dead = fields[19].GetBool(); + data.movementType = fields[20].GetUInt8(); + data.spawnMask = fields[21].GetUInt8(); + data.phaseMask = fields[22].GetUInt16(); + int16 gameEvent = fields[23].GetInt16(); + int16 PoolId = fields[24].GetInt16(); MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid); if(!mapEntry) --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -196,6 +196,11 @@ struct CreatureData float posY; float posZ; float orientation; + float trans_x; + float trans_y; + float trans_z; + float trans_o; + uint32 transguid; uint32 spawntimesecs; float spawndist; uint32 currentwaypoint; --- a/src/game/Player.h +++ b/src/game/Player.h @@ -2221,17 +2221,6 @@ class MANGOS_DLL_SPEC Player : public Un ObjectGuid const& GetFarSightGuid() const { return GetGuidValue(PLAYER_FARSIGHT); } - // Transports - Transport * GetTransport() const { return m_transport; } - void SetTransport(Transport * t) { m_transport = t; } - - float GetTransOffsetX() const { return m_movementInfo.GetTransportPos()->x; } - float GetTransOffsetY() const { return m_movementInfo.GetTransportPos()->y; } - float GetTransOffsetZ() const { return m_movementInfo.GetTransportPos()->z; } - float GetTransOffsetO() const { return m_movementInfo.GetTransportPos()->o; } - uint32 GetTransTime() const { return m_movementInfo.GetTransportTime(); } - int8 GetTransSeat() const { return m_movementInfo.GetTransportSeat(); } - uint32 GetSaveTimer() const { return m_nextSave; } void SetSaveTimer(uint32 timer) { m_nextSave = timer; } @@ -2555,10 +2544,6 @@ class MANGOS_DLL_SPEC Player : public Un float m_rest_bonus; RestType rest_type; ////////////////////Rest System///////////////////// - - // Transports - Transport * m_transport; - uint32 m_resetTalentsCost; time_t m_resetTalentsTime; uint32 m_usedTalentCount; --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -35,6 +35,7 @@ #include "Path.h" #include "WorldPacket.h" #include "Timer.h" +#include "Transports.h" #include enum SpellInterruptFlags @@ -1415,6 +1416,16 @@ class MANGOS_DLL_SPEC Unit : public Worl void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false); + Transport* GetTransport() const { return m_transport; } + void SetTransport(Transport* t) { m_transport = t; } + + float GetTransOffsetX() const { return m_movementInfo.GetTransportPos()->x; } + float GetTransOffsetY() const { return m_movementInfo.GetTransportPos()->y; } + float GetTransOffsetZ() const { return m_movementInfo.GetTransportPos()->z; } + float GetTransOffsetO() const { return m_movementInfo.GetTransportPos()->o; } + uint32 GetTransTime() const { return m_movementInfo.GetTransportTime(); } + int8 GetTransSeat() const { return m_movementInfo.GetTransportSeat(); } + void MonsterMove(float x, float y, float z, uint32 transitTime); void MonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0); @@ -1962,6 +1973,8 @@ class MANGOS_DLL_SPEC Unit : public Worl GuardianPetList m_guardianPets; + Transport* m_transport; + uint64 m_TotemSlot[MAX_TOTEM_SLOT]; }; --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -136,6 +136,11 @@ Creature::~Creature() { CleanupsBeforeDelete(); + if (GetTransport()) + { + GetTransport()->RemoveCreaturePassenger(this); + } + m_vendorItemCounts.clear(); delete i_AI; @@ -924,6 +929,7 @@ void Creature::SaveToDB(uint32 mapid, ui CreatureData& data = sObjectMgr.NewOrExistCreatureData(m_DBTableGuid); uint32 displayId = GetNativeDisplayId(); + uint32 transGUID = (GetTransport()) ? GetTransport()->GetGUID() : 0; // check if it's a custom model and if not, use 0 for displayId CreatureInfo const *cinfo = GetCreatureInfo(); @@ -966,6 +972,11 @@ void Creature::SaveToDB(uint32 mapid, ui data.posY = GetPositionY(); data.posZ = GetPositionZ(); data.orientation = GetOrientation(); + data.trans_x = GetTransOffsetX(); + data.trans_y = GetTransOffsetY(); + data.trans_y = GetTransOffsetZ(); + data.trans_o = GetTransOffsetO(); + data.transguid = transGUID; data.spawntimesecs = m_respawnDelay; // prevent add data integrity problems data.spawndist = GetDefaultMovementType()==IDLE_MOTION_TYPE ? 0 : m_respawnradius; @@ -996,6 +1007,11 @@ void Creature::SaveToDB(uint32 mapid, ui << GetPositionY() << "," << GetPositionZ() << "," << GetOrientation() << "," + << GetTransOffsetX() << "," + << GetTransOffsetY() << "," + << GetTransOffsetZ() << "," + << GetTransOffsetO() << "," + << transGUID << "," << m_respawnDelay << "," //respawn time << (float) m_respawnradius << "," //spawn distance (float) << (uint32) (0) << "," //currentwaypoint @@ -1164,7 +1180,32 @@ bool Creature::LoadFromDB(uint32 guid, M if(!Create(guid, map, data->phaseMask, data->id, team, data)) return false; - Relocate(data->posX, data->posY, data->posZ, data->orientation); + if (data->transguid > 0) + { + m_movementInfo.SetTransportData(ObjectGuid(HIGHGUID_MO_TRANSPORT, data->transguid), data->trans_x, data->trans_y, data->trans_z, data->trans_o, 0, -1); + for (MapManager::TransportSet::const_iterator iter = sMapMgr.m_Transports.begin(); iter != sMapMgr.m_Transports.end(); ++iter) + { + if( (*iter)->GetGUIDLow() == data->transguid) + { + SetTransport(*iter); + GetTransport()->AddCreaturePassenger(this); + SetLocationMapId(GetTransport()->GetMapId()); + Relocate(GetTransport()->GetPositionX() + data->trans_x, GetTransport()->GetPositionY() + data->trans_y, GetTransport()->GetPositionZ() + data->trans_z, data->trans_o); + break; + } + } + } + else if (GetTransport()) + { + m_movementInfo.SetTransportData(ObjectGuid(HIGHGUID_MO_TRANSPORT, GetTransport()->GetGUID()), GetTransOffsetX(), GetTransOffsetY(), GetTransOffsetZ(), GetTransOffsetO(), 0, -1); + GetTransport()->AddCreaturePassenger(this); + SetLocationMapId(GetTransport()->GetMapId()); + Relocate(GetTransport()->GetPositionX() + GetTransOffsetX(), GetTransport()->GetPositionY() + GetTransOffsetY(), GetTransport()->GetPositionZ() + GetTransOffsetZ(), GetTransOffsetO()); + } + else + { + Relocate(data->posX, data->posY, data->posZ, data->orientation); + } if(!IsPositionValid()) { --- a/src/game/Transports.cpp +++ b/src/game/Transports.cpp @@ -23,6 +23,7 @@ #include "ObjectMgr.h" #include "ObjectGuid.h" #include "Path.h" +#include "Unit.h" #include "WorldPacket.h" #include "DBCStores.h" @@ -431,7 +432,7 @@ void Transport::TeleportTransport(uint32 Map const* oldMap = GetMap(); Relocate(x, y, z); - for(PlayerSet::iterator itr = m_passengers.begin(); itr != m_passengers.end();) + for(PlayerSet::iterator itr = m_player_passengers.begin(); itr != m_player_passengers.end();) { PlayerSet::iterator it2 = itr; ++itr; @@ -439,7 +440,7 @@ void Transport::TeleportTransport(uint32 Player *plr = *it2; if(!plr) { - m_passengers.erase(it2); + m_player_passengers.erase(it2); continue; } @@ -458,6 +459,19 @@ void Transport::TeleportTransport(uint32 //player far teleport would try to create same instance, but we need it NOW for transport... //correct me if I'm wrong O.o Map * newMap = sMapMgr.CreateMap(newMapid, this); + for (CreatureSet::iterator itr = m_creature_passengers.begin(); itr != m_creature_passengers.end(); ++itr) + { + if(!(*itr)) + { + m_creature_passengers.erase(itr); + continue; + } + + (*itr)->RemoveFromWorld(); + (*itr)->SetMap(newMap); + newMap->CreatureRelocation(*itr, GetPositionX() + x, GetPositionY() + y, GetPositionZ() + z, (*itr)->GetOrientation()); + newMap->Add(*itr); + } SetMap(newMap); if(oldMap != newMap) @@ -467,23 +481,66 @@ void Transport::TeleportTransport(uint32 } } -bool Transport::AddPassenger(Player* passenger) +bool Transport::AddPlayerPassenger(Player* passenger) { - if (m_passengers.find(passenger) == m_passengers.end()) - { - DETAIL_LOG("Player %s boarded transport %s.", passenger->GetName(), GetName()); - m_passengers.insert(passenger); - } + if (m_player_passengers.find(passenger) != m_player_passengers.end()) + return false; + + m_player_passengers.insert(passenger); + + DEBUG_LOG("Player %s boarded transport %s.", passenger->GetName(), GetName()); + return true; } -bool Transport::RemovePassenger(Player* passenger) +bool Transport::AddCreaturePassenger(Creature* passenger) { - if (m_passengers.erase(passenger)) - DETAIL_LOG("Player %s removed from transport %s.", passenger->GetName(), GetName()); + if (m_creature_passengers.find(passenger) != m_creature_passengers.end()) + return false; + + m_creature_passengers.insert(passenger); + + DEBUG_LOG("Creature %s boarded transport %s.", passenger->GetName(), GetName()); + return true; } +bool Transport::RemovePlayerPassenger(Player* passenger) +{ + if (!m_player_passengers.erase(passenger)) + return false; + + DEBUG_LOG("Player %s removed from transport %s.", passenger->GetName(), GetName()); + + return true; +} + +bool Transport::RemoveCreaturePassenger(Creature* passenger) +{ + if (!m_creature_passengers.erase(passenger)) + return false; + + DEBUG_LOG("Creature %s removed from transport %s.", passenger->GetName(), GetName()); + + return true; +} + +void Transport::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) +{ + for (CreatureSet::const_iterator itr = m_creature_passengers.begin(); itr != m_creature_passengers.end(); ++itr) + { + if (!(*itr)) + { + m_creature_passengers.erase(itr); + continue; + } + + (*itr)->BuildCreateUpdateBlockForPlayer(data, target); + } + + Object::BuildCreateUpdateBlockForPlayer(data, target); +} + void Transport::Update(uint32 /*p_time*/) { if (m_WayPoints.size() <= 1) @@ -519,6 +576,17 @@ void Transport::Update(uint32 /*p_time*/ } */ + for (CreatureSet::const_iterator itr = m_creature_passengers.begin(); itr != m_creature_passengers.end(); itr++) + { + if (!(*itr)) + { + m_creature_passengers.erase(itr); + continue; + } + + (*itr)->GetMap()->CreatureRelocation(*itr, m_curr->second.x + (*itr)->GetTransOffsetX(), m_curr->second.y + (*itr)->GetTransOffsetY(), m_curr->second.z + (*itr)->GetTransOffsetZ(), (*itr)->GetTransOffsetO()); + } + m_nextNodeTime = m_curr->first; if (m_curr == m_WayPoints.begin()) --- a/src/game/Transports.h +++ b/src/game/Transports.h @@ -33,11 +33,18 @@ class Transport : public GameObject bool Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags); bool GenerateWaypoints(uint32 pathid, std::set &mapids); void Update(uint32 p_time); - bool AddPassenger(Player* passenger); - bool RemovePassenger(Player* passenger); + bool AddPlayerPassenger(Player* passenger); + bool AddCreaturePassenger(Creature* passenger); + bool RemovePlayerPassenger(Player* passenger); + bool RemoveCreaturePassenger(Creature* passenger); typedef std::set PlayerSet; - PlayerSet const& GetPassengers() const { return m_passengers; } + typedef std::set CreatureSet; + + PlayerSet const& GetPlayerPassengers() const { return m_player_passengers; } + CreatureSet const& GetCreaturePassengers() const { return m_creature_passengers; } + + void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target); private: struct WayPoint @@ -65,7 +72,8 @@ class Transport : public GameObject uint32 m_pathTime; uint32 m_timer; - PlayerSet m_passengers; + PlayerSet m_player_passengers; + CreatureSet m_creature_passengers; public: WayPointMap m_WayPoints; --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -48,6 +48,7 @@ #include "Traveller.h" #include "VMapFactory.h" #include "MovementGenerator.h" +#include "Transports.h" #include #include @@ -230,6 +231,8 @@ Unit::Unit() m_CombatTimer = 0; m_lastManaUseTimer = 0; + m_transport = NULL; + //m_victimThreat = 0.0f; for (int i = 0; i < MAX_SPELL_SCHOOL; ++i) m_threatModifier[i] = 1.0f; @@ -344,8 +347,13 @@ void Unit::SendMonsterMove(float NewPosX float moveTime = (float)Time; - WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) ); + WorldPacket data( (m_transport) ? SMSG_MONSTER_MOVE_TRANSPORT : SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) ); data << GetPackGUID(); + if (m_transport) + { + data.appendPackGUID(m_transport->GetGUID()); + data << uint8(0); + } data << uint8(0); // new in 3.1 bool, used to toggle MOVEFLAG2_UNK4 = 0x0040 on client side data << GetPositionX() << GetPositionY() << GetPositionZ(); data << uint32(getMSTime()); @@ -377,7 +385,14 @@ void Unit::SendMonsterMove(float NewPosX data << uint32(flags); // splineflags data << uint32(moveTime); // Time in between points data << uint32(1); // 1 single waypoint - data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B + if (m_transport) + { + data << m_movementInfo.GetTransportPos()->x << m_movementInfo.GetTransportPos()->y << m_movementInfo.GetTransportPos()->z; + } + else + { + data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B + } va_end(vargs); --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -266,24 +266,24 @@ void WorldSession::HandleMovementOpcodes } // if we boarded a transport, add us to it - if (plMover && !plMover->m_transport) + if (plMover && !plMover->GetTransport()) { // elevators also cause the client to send MOVEFLAG_ONTRANSPORT - just unmount if the guid can be found in the transport list for (MapManager::TransportSet::const_iterator iter = sMapMgr.m_Transports.begin(); iter != sMapMgr.m_Transports.end(); ++iter) { if ((*iter)->GetObjectGuid() == movementInfo.GetTransportGuid()) { - plMover->m_transport = (*iter); - (*iter)->AddPassenger(plMover); + plMover->SetTransport(*iter); + (*iter)->AddPlayerPassenger(plMover); break; } } } } - else if (plMover && plMover->m_transport) // if we were on a transport, leave + else if (plMover && plMover->GetTransport()) // if we were on a transport, leave { - plMover->m_transport->RemovePassenger(plMover); - plMover->m_transport = NULL; + plMover->GetTransport()->RemovePlayerPassenger(plMover); + plMover->SetTransport(NULL); movementInfo.ClearTransportData(); } --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -407,8 +407,6 @@ UpdateMask Player::updateVisualBits; Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputationMgr(this), m_mover(this), m_camera(this) { - m_transport = 0; - m_speakTime = 0; m_speakCount = 0; @@ -621,9 +619,9 @@ Player::~Player () delete PlayerTalkClass; - if (m_transport) - { - m_transport->RemovePassenger(this); + if (GetTransport()) + { + GetTransport()->RemovePlayerPassenger(this); } for(size_t x = 0; x < ItemSetEff.size(); x++) @@ -1749,10 +1747,10 @@ bool Player::TeleportTo(uint32 mapid, fl } // if we were on a transport, leave - if (!(options & TELE_TO_NOT_LEAVE_TRANSPORT) && m_transport) - { - m_transport->RemovePassenger(this); - m_transport = NULL; + if (!(options & TELE_TO_NOT_LEAVE_TRANSPORT) && GetTransport()) + { + GetTransport()->RemovePlayerPassenger(this); + SetTransport(NULL); m_movementInfo.ClearTransportData(); } @@ -1769,7 +1767,7 @@ bool Player::TeleportTo(uint32 mapid, fl // reset movement flags at teleport, because player will continue move with these flags after teleport m_movementInfo.SetMovementFlags(MOVEFLAG_NONE); - if ((GetMapId() == mapid) && (!m_transport)) + if ((GetMapId() == mapid) && !GetTransport()) { //lets reset far teleport flag if it wasn't reset during chained teleports SetSemaphoreTeleportFar(false); @@ -1877,15 +1875,15 @@ bool Player::TeleportTo(uint32 mapid, fl // send transfer packets WorldPacket data(SMSG_TRANSFER_PENDING, (4+4+4)); data << uint32(mapid); - if (m_transport) - { - data << uint32(m_transport->GetEntry()); + if (GetTransport()) + { + data << uint32(GetTransport()->GetEntry()); data << uint32(GetMapId()); } GetSession()->SendPacket(&data); data.Initialize(SMSG_NEW_WORLD, (20)); - if (m_transport) + if (GetTransport()) { data << uint32(mapid); data << float(m_movementInfo.GetTransportPos()->x); @@ -1915,7 +1913,7 @@ bool Player::TeleportTo(uint32 mapid, fl float final_z = z; float final_o = orientation; - if (m_transport) + if (GetTransport()) { final_x += m_movementInfo.GetTransportPos()->x; final_y += m_movementInfo.GetTransportPos()->y; @@ -15201,14 +15199,14 @@ bool Player::LoadFromDB( uint32 guid, Sq break; } - m_transport = *iter; - m_transport->AddPassenger(this); - SetLocationMapId(m_transport->GetMapId()); - break; - } - } - - if(!m_transport) + SetTransport(*iter); + GetTransport()->AddPlayerPassenger(this); + SetLocationMapId(GetTransport()->GetMapId()); + break; + } + } + + if(!GetTransport()) { sLog.outError("Player (guidlow %d) have problems with transport guid (%u). Teleport to default race/class locations.", guid,transGUID); @@ -16736,8 +16734,8 @@ void Player::SaveToDB() ss << finiteAlways(m_movementInfo.GetTransportPos()->y) << ", "; ss << finiteAlways(m_movementInfo.GetTransportPos()->z) << ", "; ss << finiteAlways(m_movementInfo.GetTransportPos()->o) << ", "; - if (m_transport) - ss << m_transport->GetGUIDLow(); + if (GetTransport()) + ss << GetTransport()->GetGUIDLow(); else ss << "0"; ss << ", ";