From baea567f241701897d55b312a57d41b70002bc69 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 9 Dec 2025 20:59:46 -0700 Subject: [PATCH] Add setting to disable token auto-rotation (closes #12) --- langs/en-ca.json | 4 ++ module/oft.mjs | 4 +- module/settings/preventTokenRotation.mjs | 48 ++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 module/settings/preventTokenRotation.mjs diff --git a/langs/en-ca.json b/langs/en-ca.json index a182d15..4f5e0b6 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -21,6 +21,10 @@ "name": "Hotbar Button Size", "hint": "(v13+) Changes the size of the hotbar buttons to a size you prefer." }, + "preventTokenRotation": { + "name": "Prevent Token Auto-Rotation", + "hint": "(v13+, GM-Only) This prevents tokens from rotating while you are moving them allowing you to more easily use POG-style tokens without them being rotated automatically by Foundry." + }, "preventUserConfigOpen": { "name": "Prevent Auto User Config", "hint": "(v13+) Prevents Foundry from opening the User Configuration when a player loads into the world." diff --git a/module/oft.mjs b/module/oft.mjs index eec822e..53d3b77 100644 --- a/module/oft.mjs +++ b/module/oft.mjs @@ -7,6 +7,7 @@ import { autoUnpauseOnLoad } from "./settings/autoUnpauseOnLoad.mjs"; import { chatSidebarBackground } from "./settings/chatSidebarBackground.mjs"; import { hotbarButtonGap } from "./settings/hotbarButtonGap.mjs"; import { hotbarButtonSize } from "./settings/hotbarButtonSize.mjs"; +import { preventTokenRotation } from "./settings/preventTokenRotation.mjs"; import { preventUserConfigOpen } from "./settings/preventUserConfigOpen.mjs"; import { repositionHotbar } from "./settings/repositionHotbar.mjs"; import { startingSidebarTab } from "./settings/startingSidebarTab.mjs"; @@ -14,10 +15,10 @@ import { startSidebarExpanded } from "./settings/startSidebarExpanded.mjs"; // Apps import { DevSettingsMenu } from "./apps/DevSettingsMenu.mjs"; +import { HotbarSettingsMenu } from "./apps/HotbarSettingsMenu.mjs"; // Misc import { __ID__ } from "./consts.mjs"; -import { HotbarSettingsMenu } from "./apps/HotbarSettingsMenu.mjs"; Hooks.on(`setup`, () => { @@ -45,5 +46,6 @@ Hooks.on(`setup`, () => { chatSidebarBackground(); startSidebarExpanded(); startingSidebarTab(); + preventTokenRotation(); preventUserConfigOpen(); }); diff --git a/module/settings/preventTokenRotation.mjs b/module/settings/preventTokenRotation.mjs new file mode 100644 index 0000000..cff7ec5 --- /dev/null +++ b/module/settings/preventTokenRotation.mjs @@ -0,0 +1,48 @@ +import { __ID__ } from "../consts.mjs"; +import { Logger } from "../utils/Logger.mjs"; + +const key = `preventTokenRotation`; + +export function preventTokenRotation() { + + const prevented = Hooks.call(`${__ID__}.preventSetting`, key); + if (!prevented) { + Logger.log(`Preventing setting "${key}" from being registered`); + return; + }; + + /** @type {number|null} */ + let hookID = null; + + // #region Registration + Logger.log(`Registering setting: ${key}`); + game.settings.register(__ID__, key, { + name: `OFT.setting.${key}.name`, + hint: `OFT.setting.${key}.hint`, + scope: `world`, + type: Boolean, + default: true, + config: true, + requiresReload: false, + onChange: (newValue) => { + if (newValue) { + hookID = Hooks.on(`preMoveToken`, preMoveTokenHandler); + } else if (hookID != null) { + Hooks.off(`preMoveToken`, hookID); + }; + }, + }); + // #endregion Registration + + // #region Implementation + if (game.settings.get(__ID__, key)) { + hookID = Hooks.on(`preMoveToken`, preMoveTokenHandler); + }; + // #endregion Implementation +}; + +// #region Helpers +function preMoveTokenHandler(_token, update) { + update.autoRotate = false; +}; +// #endregion Helpers