From 0f1bce32fb6c6ac40d3a304b4ffd352e7140d29e Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Tue, 10 Nov 2026 13:07:29 -0600 Subject: [PATCH] fix: only the owner of a property changes it The messages that set a property's privacy option and name, start and finish building, place, move and remove models and change a model's behaviors were handled for any player on the property, and outside of a property they used a property that is not there. They are now only handled for the owner of the property the player is on. Only an item from a model inventory is placed as a model. Co-Authored-By: Claude Fable 5.2 --- .../dComponents/Property/PropertyManagementComponent.cpp | 9 +++++++++ dGame/dGameMessages/PropertyMessages.cpp | 8 ++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/dGame/dComponents/Property/PropertyManagementComponent.cpp b/dGame/dComponents/Property/PropertyManagementComponent.cpp index 1a9f1ba7e..4012f006a 100644 --- a/dGame/dComponents/Property/PropertyManagementComponent.cpp +++ b/dGame/dComponents/Property/PropertyManagementComponent.cpp @@ -529,6 +529,15 @@ void PropertyManagementComponent::UpdateModelPosition(Entity& builder, const LWO return; } + // Only a model is placed on a property + const auto* const itemInventory = item->GetInventory(); + const auto itemInventoryType = itemInventory ? itemInventory->GetType() : eInventoryType::INVALID; + if (itemInventoryType != eInventoryType::MODELS && itemInventoryType != eInventoryType::MODELS_IN_BBB && itemInventoryType != eInventoryType::TEMP_MODELS) { + LOG("Item %llu (LOT %i) is not in a model inventory and can not be placed", id, item->GetLot()); + + return; + } + const NiQuaternion originalRotation = rotation; if (rotation != QuatUtils::IDENTITY) { rotation = { rotation.w, rotation.z, rotation.y, rotation.x }; diff --git a/dGame/dGameMessages/PropertyMessages.cpp b/dGame/dGameMessages/PropertyMessages.cpp index 25c3a6212..0709904a3 100644 --- a/dGame/dGameMessages/PropertyMessages.cpp +++ b/dGame/dGameMessages/PropertyMessages.cpp @@ -444,11 +444,11 @@ namespace GameMessages { } void PropertyContentsFromClient::Handle(Entity& entity, const SystemAddress& sysAddr) { - User* user = UserManager::Instance()->GetUser(sysAddr); + const auto* const player = PlayerManager::GetPlayer(sysAddr); + const auto* const propertyManagementComponent = PropertyManagementComponent::Instance(); + if (!player || !propertyManagementComponent) return; - Entity* player = Game::entityManager->GetEntity(user->GetLoggedInChar()); - - const auto& models = PropertyManagementComponent::Instance()->GetModels(); + const auto& models = propertyManagementComponent->GetModels(); GetModelsOnProperty modelsOnProperty; modelsOnProperty.target = player->GetObjectID(); modelsOnProperty.models = { models.begin(), models.end() };