mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 10:53:44 +00:00
fix: save_property_location saves the position on the property too
The zone was saved on a property but the position wasn't (the physics component kept its own "not a property" check), so logging back in put the character at their old main world coordinates on the property map, outside it. Both now use Character::SavesLocationInThisZone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -283,11 +283,8 @@ void Character::SaveXMLToDatabase() {
|
|||||||
character->SetAttribute("cc", m_Coins);
|
character->SetAttribute("cc", m_Coins);
|
||||||
|
|
||||||
auto zoneInfo = Game::zoneManager->GetZone()->GetZoneID();
|
auto zoneInfo = Game::zoneManager->GetZone()->GetZoneID();
|
||||||
// Where the character logs back in. Not a property (a clone) unless save_property_location is 1: by default
|
|
||||||
// logging in from a property goes to the last world before it.
|
|
||||||
const bool savesHere = zoneInfo.GetCloneID() == 0 || (Game::config && Game::config->GetValue("save_property_location") == "1");
|
|
||||||
// lzid garbage, binary concat of zoneID, zoneInstance and zoneClone
|
// lzid garbage, binary concat of zoneID, zoneInstance and zoneClone
|
||||||
if (zoneInfo.GetMapID() != 0 && savesHere && !Game::zoneManager->GetDisableSaveLocation()) {
|
if (SavesLocationInThisZone()) {
|
||||||
uint64_t lzidConcat = zoneInfo.GetCloneID();
|
uint64_t lzidConcat = zoneInfo.GetCloneID();
|
||||||
lzidConcat = (lzidConcat << 16) | uint16_t(zoneInfo.GetInstanceID());
|
lzidConcat = (lzidConcat << 16) | uint16_t(zoneInfo.GetInstanceID());
|
||||||
lzidConcat = (lzidConcat << 16) | uint16_t(zoneInfo.GetMapID());
|
lzidConcat = (lzidConcat << 16) | uint16_t(zoneInfo.GetMapID());
|
||||||
@@ -657,3 +654,10 @@ void Character::SetBillboardVisible(bool visible) {
|
|||||||
ownerBillboardState.target = m_OurEntity->GetObjectID();
|
ownerBillboardState.target = m_OurEntity->GetObjectID();
|
||||||
ownerBillboardState.Send(m_OurEntity->GetSystemAddress());
|
ownerBillboardState.Send(m_OurEntity->GetSystemAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Character::SavesLocationInThisZone() {
|
||||||
|
const auto zoneInfo = Game::zoneManager->GetZone()->GetZoneID();
|
||||||
|
if (zoneInfo.GetMapID() == 0 || Game::zoneManager->GetDisableSaveLocation()) return false;
|
||||||
|
// By default logging in from a property goes to the last world before it
|
||||||
|
return zoneInfo.GetCloneID() == 0 || (Game::config && Game::config->GetValue("save_property_location") == "1");
|
||||||
|
}
|
||||||
|
|||||||
@@ -102,6 +102,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
uint32_t GetPropertyCloneID() const { return m_PropertyCloneID; }
|
uint32_t GetPropertyCloneID() const { return m_PropertyCloneID; }
|
||||||
|
|
||||||
|
// Whether a character's location (zone and position) is saved in the zone this world runs, for logging back in
|
||||||
|
// there: not the character select world, nor where the zone says not to, nor a property (a clone) unless
|
||||||
|
// save_property_location is 1
|
||||||
|
static bool SavesLocationInThisZone();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the last login of this character in MS
|
* Gets the last login of this character in MS
|
||||||
* @return the last login of this character
|
* @return the last login of this character
|
||||||
|
|||||||
@@ -191,9 +191,7 @@ void ControllablePhysicsComponent::UpdateXml(tinyxml2::XMLDocument& doc) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto zoneInfo = Game::zoneManager->GetZone()->GetZoneID();
|
if (Character::SavesLocationInThisZone()) {
|
||||||
|
|
||||||
if (zoneInfo.GetMapID() != 0 && zoneInfo.GetCloneID() == 0 && !Game::zoneManager->GetDisableSaveLocation()) {
|
|
||||||
character->SetAttribute("lzx", m_Position.x);
|
character->SetAttribute("lzx", m_Position.x);
|
||||||
character->SetAttribute("lzy", m_Position.y);
|
character->SetAttribute("lzy", m_Position.y);
|
||||||
character->SetAttribute("lzz", m_Position.z);
|
character->SetAttribute("lzz", m_Position.z);
|
||||||
|
|||||||
Reference in New Issue
Block a user