Core/Transports: Fix few transport issues on relog.
Properly save transport related data to database when saving a Player . On Player login update the current position as relative to transport, in case the transport moved.
This commit is contained in:
1 parent
096cb6bf00
commit
f0c4d0ac05
2 files changed
+52
-28
No files matched your search
@@ -17031,7 +17031,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
|
||||
InitPrimaryProfessions(); // to max set before any spell loaded
|
||||
|
||||
// init saved position, and fix it later if problematic
|
||||
uint32 transGUID = fields[30].GetUInt32();
|
||||
uint32 transLowGUID = fields[30].GetUInt32();
|
||||
Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), fields[16].GetFloat());
|
||||
uint32 mapId = fields[15].GetUInt16();
|
||||
uint32 instanceId = fields[58].GetUInt32();
|
||||
@@ -17137,40 +17137,47 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
|
||||
}
|
||||
}
|
||||
// currently we do not support transport in bg
|
||||
else if (transGUID)
|
||||
else if (transLowGUID)
|
||||
{
|
||||
m_movementInfo.transport.guid = MAKE_NEW_GUID(transGUID, 0, HIGHGUID_MO_TRANSPORT);
|
||||
m_movementInfo.transport.pos.Relocate(fields[26].GetFloat(), fields[27].GetFloat(), fields[28].GetFloat(), fields[29].GetFloat());
|
||||
uint64 transGUID = MAKE_NEW_GUID(transLowGUID, 0, HIGHGUID_MO_TRANSPORT);
|
||||
|
||||
if (!Trinity::IsValidMapCoord(
|
||||
GetPositionX()+m_movementInfo.transport.pos.m_positionX, GetPositionY()+m_movementInfo.transport.pos.m_positionY,
|
||||
GetPositionZ()+m_movementInfo.transport.pos.m_positionZ, GetOrientation()+m_movementInfo.transport.pos.m_orientation) ||
|
||||
// transport size limited
|
||||
m_movementInfo.transport.pos.m_positionX > 250 || m_movementInfo.transport.pos.m_positionY > 250 || m_movementInfo.transport.pos.m_positionZ > 250)
|
||||
if (GameObject* go = HashMapHolder<GameObject>::Find(transGUID))
|
||||
m_transport = go->ToTransport();
|
||||
|
||||
if (m_transport)
|
||||
{
|
||||
TC_LOG_ERROR("entities.player", "Player (guidlow %d) have invalid transport coordinates (X: %f Y: %f Z: %f O: %f). Teleport to bind location.",
|
||||
guid, GetPositionX()+m_movementInfo.transport.pos.m_positionX, GetPositionY()+m_movementInfo.transport.pos.m_positionY,
|
||||
GetPositionZ()+m_movementInfo.transport.pos.m_positionZ, GetOrientation()+m_movementInfo.transport.pos.m_orientation);
|
||||
m_movementInfo.transport.guid = transGUID;
|
||||
float x = fields[26].GetFloat(), y = fields[27].GetFloat(), z = fields[28].GetFloat(), o = fields[29].GetFloat();
|
||||
m_movementInfo.transport.pos.Relocate(x, y, z, o);
|
||||
m_transport->CalculatePassengerPosition(x, y, z, &o);
|
||||
Relocate(x, y, z, o);
|
||||
|
||||
RelocateToHomebind();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GameObject* go = HashMapHolder<GameObject>::Find(m_movementInfo.transport.guid))
|
||||
m_transport = go->ToTransport();
|
||||
if (!Trinity::IsValidMapCoord(
|
||||
GetPositionX() + m_movementInfo.transport.pos.m_positionX, GetPositionY() + m_movementInfo.transport.pos.m_positionY,
|
||||
GetPositionZ() + m_movementInfo.transport.pos.m_positionZ, GetOrientation() + m_movementInfo.transport.pos.m_orientation) ||
|
||||
// transport size limited
|
||||
m_movementInfo.transport.pos.m_positionX > 250 || m_movementInfo.transport.pos.m_positionY > 250 || m_movementInfo.transport.pos.m_positionZ > 250)
|
||||
{
|
||||
TC_LOG_ERROR("entities.player", "Player (guidlow %d) have invalid transport coordinates (X: %f Y: %f Z: %f O: %f). Teleport to bind location.",
|
||||
guid, GetPositionX() + m_movementInfo.transport.pos.m_positionX, GetPositionY() + m_movementInfo.transport.pos.m_positionY,
|
||||
GetPositionZ() + m_movementInfo.transport.pos.m_positionZ, GetOrientation() + m_movementInfo.transport.pos.m_orientation);
|
||||
|
||||
if (m_transport)
|
||||
m_transport = NULL;
|
||||
|
||||
RelocateToHomebind();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_transport->AddPassenger(this);
|
||||
mapId = m_transport->GetMapId();
|
||||
}
|
||||
else
|
||||
{
|
||||
TC_LOG_ERROR("entities.player", "Player (guidlow %d) have problems with transport guid (%u). Teleport to bind location.",
|
||||
guid, transGUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
TC_LOG_ERROR("entities.player", "Player (guidlow %d) have problems with transport guid (%u). Teleport to bind location.",
|
||||
guid, transGUID);
|
||||
|
||||
RelocateToHomebind();
|
||||
}
|
||||
RelocateToHomebind();
|
||||
}
|
||||
}
|
||||
// currently we do not support taxi in instance
|
||||
@@ -18923,6 +18930,14 @@ void Player::SaveToDB(bool create /*=false*/)
|
||||
stmt->setFloat(index++, finiteAlways(GetPositionY()));
|
||||
stmt->setFloat(index++, finiteAlways(GetPositionZ()));
|
||||
stmt->setFloat(index++, finiteAlways(GetOrientation()));
|
||||
stmt->setFloat(index++, finiteAlways(GetTransOffsetX()));
|
||||
stmt->setFloat(index++, finiteAlways(GetTransOffsetY()));
|
||||
stmt->setFloat(index++, finiteAlways(GetTransOffsetZ()));
|
||||
stmt->setFloat(index++, finiteAlways(GetTransOffsetO()));
|
||||
uint32 transLowGUID = 0;
|
||||
if (GetTransport())
|
||||
transLowGUID = GetTransport()->GetGUIDLow();
|
||||
stmt->setUInt32(index++, transLowGUID);
|
||||
|
||||
std::ostringstream ss;
|
||||
ss << m_taxi;
|
||||
@@ -19035,6 +19050,15 @@ void Player::SaveToDB(bool create /*=false*/)
|
||||
stmt->setFloat(index++, finiteAlways(GetTeleportDest().GetOrientation()));
|
||||
}
|
||||
|
||||
stmt->setFloat(index++, finiteAlways(GetTransOffsetX()));
|
||||
stmt->setFloat(index++, finiteAlways(GetTransOffsetY()));
|
||||
stmt->setFloat(index++, finiteAlways(GetTransOffsetZ()));
|
||||
stmt->setFloat(index++, finiteAlways(GetTransOffsetO()));
|
||||
uint32 transLowGUID = 0;
|
||||
if (GetTransport())
|
||||
transLowGUID = GetTransport()->GetGUIDLow();
|
||||
stmt->setUInt32(index++, transLowGUID);
|
||||
|
||||
std::ostringstream ss;
|
||||
ss << m_taxi;
|
||||
stmt->setString(index++, ss.str());
|
||||
|
||||
@@ -353,16 +353,16 @@ void CharacterDatabaseConnection::DoPrepareStatements()
|
||||
|
||||
// Player saving
|
||||
PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
|
||||
"map, instance_id, instance_mode_mask, position_x, position_y, position_z, orientation, "
|
||||
"map, instance_id, instance_mode_mask, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, "
|
||||
"taximask, cinematic, "
|
||||
"totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, "
|
||||
"extra_flags, stable_slots, at_login, zone, "
|
||||
"death_expire_time, taxi_path, arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, "
|
||||
"todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, health, power1, power2, power3, "
|
||||
"power4, power5, power6, power7, latency, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels) VALUES "
|
||||
"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
|
||||
"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?,"
|
||||
"map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?,"
|
||||
"map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?,"
|
||||
"logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?,"
|
||||
"arenaPoints=?,totalHonorPoints=?,todayHonorPoints=?,yesterdayHonorPoints=?,totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,knownCurrencies=?,"
|
||||
"watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,speccount=?,activespec=?,exploredZones=?,"
|
||||
|
||||
Reference in new issue
Block a user