From de2bea7129a527f8ce4681cfdd11882d5fe56d31 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Thu, 15 Jan 2026 22:49:24 -0600 Subject: [PATCH] feat(object): implement UpdateOutOfRangeObjects --- src/object/client/MessageHandlers.cpp | 45 ++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/object/client/MessageHandlers.cpp b/src/object/client/MessageHandlers.cpp index ec8b950..1d64e77 100644 --- a/src/object/client/MessageHandlers.cpp +++ b/src/object/client/MessageHandlers.cpp @@ -34,7 +34,50 @@ int32_t SkipPartialObjectUpdate(CDataStore* msg) { } void UpdateOutOfRangeObjects(CDataStore* msg) { - WHOA_UNIMPLEMENTED(); + uint32_t count; + msg->Get(count); + + // TODO CVehiclePassenger_C::StartAddingPendingRescueTransitions(); + + auto startPos = msg->Tell(); + + // Pass 1 + + for (int32_t i = 0; i < count; i++) { + SmartGUID guid; + *msg >> guid; + + if (guid == ClntObjMgrGetActivePlayer()) { + continue; + } + + auto object = FindActiveObject(guid); + + if (object) { + HandleObjectOutOfRangePass1(object, OUT_OF_RANGE_0); + } + } + + msg->Seek(startPos); + + // Pass 2 + + for (int32_t i = 0; i < count; i++) { + SmartGUID guid; + *msg >> guid; + + if (guid == ClntObjMgrGetActivePlayer()) { + continue; + } + + auto object = FindActiveObject(guid); + + if (object && !object->IsObjectLocked()) { + HandleObjectOutOfRangePass2(object); + } + } + + // TODO CVehiclePassenger_C::ExecutePendingRescueTransitions(); } int32_t UpdateObject(CDataStore* msg) {