diff --git a/ChestPreview/ChestPreview/Configs/Config.cs b/ChestPreview/ChestPreview/Configs/Config.cs index 1edde81..c2cd4d5 100644 --- a/ChestPreview/ChestPreview/Configs/Config.cs +++ b/ChestPreview/ChestPreview/Configs/Config.cs @@ -21,4 +21,8 @@ public sealed class Config public string BlacklistedContainers { get; set; } = ""; public bool GroundStorageOnlyContainers { get; set; } = true; + + public bool TogglePreview { get; set; } = false; + + public bool TogglePreviewNearby { get; set; } = false; } \ No newline at end of file diff --git a/ChestPreview/ChestPreview/Core/ChestPreviewModSystem.cs b/ChestPreview/ChestPreview/Core/ChestPreviewModSystem.cs index a7d6e73..25822fd 100644 --- a/ChestPreview/ChestPreview/Core/ChestPreviewModSystem.cs +++ b/ChestPreview/ChestPreview/Core/ChestPreviewModSystem.cs @@ -20,6 +20,9 @@ public class ChestPreviewModSystem : ModSystem private StorageHoverHudRenderer? storageHoverHudRenderer; private WorldBillboardRenderer? worldBillboardRenderer; + public bool PreviewNearbyToggleState { get; private set; } = false; + public bool PreviewToggleState { get; private set; } = false; + public override bool ShouldLoad(EnumAppSide forSide) => forSide is EnumAppSide.Client; public override void StartClientSide(ICoreClientAPI api) @@ -35,6 +38,24 @@ public class ChestPreviewModSystem : ModSystem worldBillboardRenderer = new WorldBillboardRenderer(api, config, cardRenderer); api.Event.RegisterRenderer(worldBillboardRenderer, EnumRenderStage.AfterOIT, "chestpreview-world-billboard-preview"); + + api.Input.SetHotKeyHandler( + hotkeyCode: PREVIEW_CONTAINERS_HOTKEY_CODE, + keycomb => + { + if (!config.TogglePreview) return false; + this.PreviewToggleState = !this.PreviewToggleState; + return true; + }); + + api.Input.SetHotKeyHandler( + hotkeyCode: PREVIEW_CONTAINERS_NEARBY_HOTKEY_CODE, + keycomb => + { + if (!config.TogglePreviewNearby) return false; + this.PreviewNearbyToggleState = !this.PreviewNearbyToggleState; + return true; + }); } public override void Dispose() diff --git a/ChestPreview/ChestPreview/PreviewTargetProvider.cs b/ChestPreview/ChestPreview/PreviewTargetProvider.cs index 2c918be..fe76ed2 100644 --- a/ChestPreview/ChestPreview/PreviewTargetProvider.cs +++ b/ChestPreview/ChestPreview/PreviewTargetProvider.cs @@ -24,6 +24,7 @@ internal partial class PreviewTargetProvider(ICoreClientAPI api, Config config) private readonly Config config = config; private readonly List nearbyContainerEntities = []; private float nearbyScanAccumulator; + private Lazy coreModSystem = new Lazy(() => api.ModLoader.GetModSystem()); public void CollectTargets(float deltaTime, List targets) { @@ -83,13 +84,39 @@ internal partial class PreviewTargetProvider(ICoreClientAPI api, Config config) private string GetActiveMode() { - if (IsHotkeyHeld(ChestPreviewModSystem.PREVIEW_CONTAINERS_NEARBY_HOTKEY_CODE)) + if (IsPreviewContainersNearbyActive()) return PreviewModes.ON_NEARBY_CONTAINERS; - if (config.HoldKey && !IsHotkeyHeld(ChestPreviewModSystem.PREVIEW_CONTAINERS_HOTKEY_CODE)) - return PreviewModes.NONE; + return IsPreviewContainersActive() ? PreviewModes.Normalize(config.Mode) : PreviewModes.NONE; + } - return PreviewModes.Normalize(config.Mode); + private bool IsPreviewContainersNearbyActive() + { + if (config.TogglePreviewNearby) + { + return coreModSystem.Value.PreviewNearbyToggleState; + } + else + { + return IsHotkeyHeld(ChestPreviewModSystem.PREVIEW_CONTAINERS_NEARBY_HOTKEY_CODE); + } + } + + private bool IsPreviewContainersActive() + { + if (config.TogglePreview) + { + return coreModSystem.Value.PreviewToggleState; + } + else if (config.HoldKey) + { + return IsHotkeyHeld(ChestPreviewModSystem.PREVIEW_CONTAINERS_HOTKEY_CODE); + } + else + { + // Always + return true; + } } private bool IsHotkeyHeld(string hotkeyCode) diff --git a/ChestPreview/ChestPreview/assets/chestpreview/config/configlib-patches.json b/ChestPreview/ChestPreview/assets/chestpreview/config/configlib-patches.json index 765be73..bceaab5 100644 --- a/ChestPreview/ChestPreview/assets/chestpreview/config/configlib-patches.json +++ b/ChestPreview/ChestPreview/assets/chestpreview/config/configlib-patches.json @@ -90,11 +90,25 @@ "clientSide": true }, { - "code": "GroundStorageOnlyContainers", - "comment": "config-desc-GroundStorageOnlyContainers", - "type": "boolean", - "default": true, - "clientSide": true + "code": "GroundStorageOnlyContainers", + "comment": "config-desc-GroundStorageOnlyContainers", + "type": "boolean", + "default": true, + "clientSide": true + }, + { + "code": "TogglePreview", + "comment": "config-desc-TogglePreview", + "type": "boolean", + "default": false, + "clientSide": true + }, + { + "code": "TogglePreviewNearby", + "comment": "config-desc-TogglePreviewNearby", + "type": "boolean", + "default": false, + "clientSide": true } ] } \ No newline at end of file diff --git a/ChestPreview/ChestPreview/assets/chestpreview/lang/en.json b/ChestPreview/ChestPreview/assets/chestpreview/lang/en.json index 10bf30a..680f229 100644 --- a/ChestPreview/ChestPreview/assets/chestpreview/lang/en.json +++ b/ChestPreview/ChestPreview/assets/chestpreview/lang/en.json @@ -10,5 +10,7 @@ "config-desc-WhitelistedContainersOnly": "If true, only container codes in WhitelistedContainers are handled.", "config-desc-GroundStorageOnlyContainers": "If true, groundstorage previews only appear when the stored item has its own inventory (for example bags/backpacks).", "config-desc-WhitelistedContainers": "Allowed container codes, separated by comma, semicolon, or spaces. No effectif WhitelistedContainersOnly==false.", - "config-desc-BlacklistedContainers": "Blocked container codes, separated by comma, semicolon, or spaces." + "config-desc-BlacklistedContainers": "Blocked container codes, separated by comma, semicolon, or spaces.", + "config-desc-TogglePreview": "If true, \"Preview container\" is toggled on/off with the key instead of being held. HoldKey will be ignored.", + "config-desc-TogglePreviewNearby": "If true, \"Preview containers nearby\" is toggled on/off with the key instead of being held. Note: Toggle may not work with modifier-only key combinations (e.g. Ctrl+Shift). You might need to reassign the hotkey." } \ No newline at end of file