diff --git a/hippolyzer/apps/proxy.py b/hippolyzer/apps/proxy.py index daa9dac..00ab787 100644 --- a/hippolyzer/apps/proxy.py +++ b/hippolyzer/apps/proxy.py @@ -43,7 +43,7 @@ class SelectionManagerAddon(BaseAddon): LOG.debug(f"Don't know about selected {local_id}, requesting object") needed_objects.add(local_id) - if needed_objects: + if needed_objects and session.session_manager.settings.ALLOW_AUTO_REQUEST_OBJECTS: region.objects.request_objects(needed_objects) # ParcelDwellRequests are sent whenever "about land" is opened. This gives us a # decent mechanism for selecting parcels. diff --git a/hippolyzer/lib/proxy/object_manager.py b/hippolyzer/lib/proxy/object_manager.py index a45f7b2..7497418 100644 --- a/hippolyzer/lib/proxy/object_manager.py +++ b/hippolyzer/lib/proxy/object_manager.py @@ -106,6 +106,8 @@ class ProxyWorldObjectManager(ClientWorldObjectManager): ) def _handle_object_update_cached_misses(self, region_handle: int, missing_locals: Set[int]): + if not self._settings.ALLOW_AUTO_REQUEST_OBJECTS: + return if self._settings.AUTOMATICALLY_REQUEST_MISSING_OBJECTS: # Schedule these local IDs to be requested soon if the viewer doesn't request # them itself. Ideally we could just mutate the CRC of the ObjectUpdateCached @@ -120,14 +122,15 @@ class ProxyWorldObjectManager(ClientWorldObjectManager): def _run_object_update_hooks(self, obj: Object, updated_props: Set[str], update_type: UpdateType): super()._run_object_update_hooks(obj, updated_props, update_type) region = self._session.region_by_handle(obj.RegionHandle) - if obj.PCode == PCode.AVATAR and "ParentID" in updated_props: - if obj.ParentID and not region.objects.lookup_localid(obj.ParentID): - # If an avatar just sat on an object we don't know about, add it to the queued - # cache misses and request if if the viewer doesn't. This should happen - # regardless of the auto-request object setting because otherwise we have no way - # to get a sitting agent's true region location, even if it's ourself. - region.objects.queued_cache_misses.add(obj.ParentID) - region.objects.request_missed_cached_objects_soon() + if self._settings.ALLOW_AUTO_REQUEST_OBJECTS: + if obj.PCode == PCode.AVATAR and "ParentID" in updated_props: + if obj.ParentID and not region.objects.lookup_localid(obj.ParentID): + # If an avatar just sat on an object we don't know about, add it to the queued + # cache misses and request if if the viewer doesn't. This should happen + # regardless of the auto-request object setting because otherwise we have no way + # to get a sitting agent's true region location, even if it's ourself. + region.objects.queued_cache_misses.add(obj.ParentID) + region.objects.request_missed_cached_objects_soon() AddonManager.handle_object_updated(self._session, region, obj, updated_props) def _run_kill_object_hooks(self, obj: Object): diff --git a/hippolyzer/lib/proxy/settings.py b/hippolyzer/lib/proxy/settings.py index 46e1afa..a722d32 100644 --- a/hippolyzer/lib/proxy/settings.py +++ b/hippolyzer/lib/proxy/settings.py @@ -28,6 +28,9 @@ class ProxySettings(Settings): PROXY_BIND_ADDR: str = EnvSettingDescriptor("127.0.0.1", "HIPPO_BIND_HOST", str) REMOTELY_ACCESSIBLE: bool = SettingDescriptor(False) USE_VIEWER_OBJECT_CACHE: bool = SettingDescriptor(False) + # Whether having the proxy do automatic internal requests objects is allowed at all + ALLOW_AUTO_REQUEST_OBJECTS: bool = SettingDescriptor(True) + # Whether the viewer should request any directly referenced objects it didn't know about. AUTOMATICALLY_REQUEST_MISSING_OBJECTS: bool = SettingDescriptor(False) ADDON_SCRIPTS: List[str] = SettingDescriptor(list) FILTERS: Dict[str, str] = SettingDescriptor(dict)