From d906671595184f941ffdeb4a0134996b3e5b9028 Mon Sep 17 00:00:00 2001 From: Rade Curic Date: Thu, 15 Jan 2026 19:58:19 +0100 Subject: [PATCH 1/5] Ability to check if player is editing (attached) object --- Server/Components/Objects/objects_impl.hpp | 21 ++++++++++++------- .../Pawn/Scripting/Object/PlayerNatives.cpp | 5 +++++ .../Pawn/Scripting/Player/Natives.cpp | 5 +++++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Server/Components/Objects/objects_impl.hpp b/Server/Components/Objects/objects_impl.hpp index fb826a11b..24dc600ca 100644 --- a/Server/Components/Objects/objects_impl.hpp +++ b/Server/Components/Objects/objects_impl.hpp @@ -482,7 +482,7 @@ class PlayerObjectData final : public IPlayerObjectData MarkedDynamicPoolStorage storage; FlatPtrHashSet attachedToPlayer_; bool inObjectSelection_; - bool inObjectEdit_; + ObjectEditingType objectEdit_; bool streamedGlobalObjects_; public: @@ -641,7 +641,7 @@ class PlayerObjectData final : public IPlayerObjectData void reset() override { - inObjectEdit_ = false; + objectEdit_ = ObjectEditingType::ObjectEditingType_None; inObjectSelection_ = false; streamedGlobalObjects_ = false; slotsOccupied_.reset(); @@ -651,7 +651,7 @@ class PlayerObjectData final : public IPlayerObjectData void beginSelecting() override { - inObjectEdit_ = false; + objectEdit_ = ObjectEditingType::ObjectEditingType_None; inObjectSelection_ = true; NetCode::RPC::PlayerBeginObjectSelect playerBeginObjectSelectRPC; PacketHelper::send(playerBeginObjectSelectRPC, player_); @@ -664,13 +664,18 @@ class PlayerObjectData final : public IPlayerObjectData bool editingObject() const override { - return inObjectEdit_; + return objectEdit_ != ObjectEditingType::ObjectEditingType_None; + } + + ObjectEditingType getEditingType() const override + { + return objectEdit_; } void endEditing() override { inObjectSelection_ = false; - inObjectEdit_ = false; + objectEdit_ = ObjectEditingType::ObjectEditingType_None; NetCode::RPC::PlayerCancelObjectEdit playerCancelObjectEditRPC; PacketHelper::send(playerCancelObjectEditRPC, player_); } @@ -678,7 +683,7 @@ class PlayerObjectData final : public IPlayerObjectData void beginEditing(IObject& object) override { inObjectSelection_ = false; - inObjectEdit_ = true; + objectEdit_ = ObjectEditingType::ObjectEditingType_Object; NetCode::RPC::PlayerBeginObjectEdit playerBeginObjectEditRPC; playerBeginObjectEditRPC.PlayerObject = false; @@ -689,7 +694,7 @@ class PlayerObjectData final : public IPlayerObjectData void beginEditing(IPlayerObject& object) override { inObjectSelection_ = false; - inObjectEdit_ = true; + objectEdit_ = ObjectEditingType::ObjectEditingType_Object; NetCode::RPC::PlayerBeginObjectEdit playerBeginObjectEditRPC; playerBeginObjectEditRPC.PlayerObject = true; @@ -749,7 +754,7 @@ class PlayerObjectData final : public IPlayerObjectData } inObjectSelection_ = false; - inObjectEdit_ = true; + objectEdit_ = ObjectEditingType::ObjectEditingType_AttachedObject; NetCode::RPC::PlayerBeginAttachedObjectEdit playerBeginAttachedObjectEditRPC; playerBeginAttachedObjectEditRPC.Index = index; diff --git a/Server/Components/Pawn/Scripting/Object/PlayerNatives.cpp b/Server/Components/Pawn/Scripting/Object/PlayerNatives.cpp index 296a07b3a..541f1a1c8 100644 --- a/Server/Components/Pawn/Scripting/Object/PlayerNatives.cpp +++ b/Server/Components/Pawn/Scripting/Object/PlayerNatives.cpp @@ -146,6 +146,11 @@ SCRIPT_API(BeginPlayerObjectEditing, bool(IPlayerObjectData& data, IPlayerObject return true; } +SCRIPT_API(IsPlayerEditingObject, bool(IPlayerObjectData& data)) +{ + return data.editingObject() == ObjectEditingType::ObjectEditingType_Object; +} + SCRIPT_API(SetPlayerObjectMaterial, bool(IPlayer& player, IPlayerObject& object, int materialIndex, int modelId, const std::string& textureLibrary, const std::string& textureName, uint32_t materialColour)) { object.setMaterial(materialIndex, modelId, textureLibrary, textureName, Colour::FromARGB(materialColour)); diff --git a/Server/Components/Pawn/Scripting/Player/Natives.cpp b/Server/Components/Pawn/Scripting/Player/Natives.cpp index 437c678ea..385b64439 100644 --- a/Server/Components/Pawn/Scripting/Player/Natives.cpp +++ b/Server/Components/Pawn/Scripting/Player/Natives.cpp @@ -609,6 +609,11 @@ SCRIPT_API(EditAttachedObject, bool(IPlayerObjectData& data, int index)) return true; } +SCRIPT_API(IsPlayerEditingAttachedObject, bool(IPlayerObjectData& data)) +{ + return data.getEditingType() == ObjectEditingType::ObjectEditingType_AttachedObject; +} + SCRIPT_API(EnablePlayerCameraTarget, bool(IPlayer& player, bool enable)) { player.useCameraTargeting(enable); From 537621aa0ad3a4fd2a229b507ddec953ec9cb442 Mon Sep 17 00:00:00 2001 From: Rade Curic Date: Thu, 15 Jan 2026 19:58:43 +0100 Subject: [PATCH 2/5] Update SDK submodule --- SDK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK b/SDK index 473b732b2..0f94f3c78 160000 --- a/SDK +++ b/SDK @@ -1 +1 @@ -Subproject commit 473b732b2de159773b2e2908fd11aa99f07db284 +Subproject commit 0f94f3c787bcef13b8c95e028f3d66a32ae9d6f7 From 73bf6f520b887231a14f173b6e1d77f1d8226ef9 Mon Sep 17 00:00:00 2001 From: Rade Curic Date: Thu, 15 Jan 2026 21:11:10 +0100 Subject: [PATCH 3/5] Validate object editing RPCs --- Server/Components/Objects/objects_impl.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/Components/Objects/objects_impl.hpp b/Server/Components/Objects/objects_impl.hpp index 24dc600ca..528f1546c 100644 --- a/Server/Components/Objects/objects_impl.hpp +++ b/Server/Components/Objects/objects_impl.hpp @@ -98,7 +98,7 @@ class ObjectComponent final : public IObjectsComponent, public CoreEventHandler, } IPlayerObjectData* data = queryExtension(peer); - if (data && data->editingObject()) + if (data && data->getEditingType() == ObjectEditingType::ObjectEditingType_Object) { if (onPlayerEditObjectRPC.Response == ObjectEditResponse_Cancel || onPlayerEditObjectRPC.Response == ObjectEditResponse_Final) @@ -164,7 +164,7 @@ class ObjectComponent final : public IObjectsComponent, public CoreEventHandler, } IPlayerObjectData* data = queryExtension(peer); - if (data && data->editingObject() && data->hasAttachedObject(onPlayerEditAttachedObjectRPC.Index)) + if (data && data->getEditingType() == ObjectEditingType::ObjectEditingType_AttachedObject && data->hasAttachedObject(onPlayerEditAttachedObjectRPC.Index)) { auto attachedObjectData = data->getAttachedObject(onPlayerEditAttachedObjectRPC.Index); From 24ab69781da37d7686ea9ee2a881b5d1f23a74f6 Mon Sep 17 00:00:00 2001 From: Rade Curic Date: Thu, 15 Jan 2026 21:20:05 +0100 Subject: [PATCH 4/5] Update SDK --- SDK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK b/SDK index 0f94f3c78..a312877f7 160000 --- a/SDK +++ b/SDK @@ -1 +1 @@ -Subproject commit 0f94f3c787bcef13b8c95e028f3d66a32ae9d6f7 +Subproject commit a312877f7a618e96104e087d9830ba1ebf1beafd From 6b9932a045f6c9e21ad367ef37052520fda24f34 Mon Sep 17 00:00:00 2001 From: Rade Curic Date: Thu, 15 Jan 2026 21:37:50 +0100 Subject: [PATCH 5/5] ABI fix --- Server/Components/Objects/objects_impl.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Server/Components/Objects/objects_impl.hpp b/Server/Components/Objects/objects_impl.hpp index 528f1546c..76e2fe5dc 100644 --- a/Server/Components/Objects/objects_impl.hpp +++ b/Server/Components/Objects/objects_impl.hpp @@ -667,11 +667,6 @@ class PlayerObjectData final : public IPlayerObjectData return objectEdit_ != ObjectEditingType::ObjectEditingType_None; } - ObjectEditingType getEditingType() const override - { - return objectEdit_; - } - void endEditing() override { inObjectSelection_ = false; @@ -761,6 +756,11 @@ class PlayerObjectData final : public IPlayerObjectData PacketHelper::send(playerBeginAttachedObjectEditRPC, player_); } + ObjectEditingType getEditingType() const override + { + return objectEdit_; + } + bool getStreamedGlobalObjects() const { return streamedGlobalObjects_;