From e513ae79e13dae7011ff492bc4951a3be57b5c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Thu, 16 Jan 2025 16:33:03 +0100 Subject: [PATCH 1/5] [Pointer lock] Allow multi-touch devices to use the pointer lock --- extensions/reviewed/MousePointerLock.json | 429 +++++++++++++++++++++- 1 file changed, 422 insertions(+), 7 deletions(-) diff --git a/extensions/reviewed/MousePointerLock.json b/extensions/reviewed/MousePointerLock.json index 052eab82d..070b5ea93 100644 --- a/extensions/reviewed/MousePointerLock.json +++ b/extensions/reviewed/MousePointerLock.json @@ -8,7 +8,7 @@ "name": "MousePointerLock", "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Virtual Reality/Virtual Reality_360_rotate_vr_movement.svg", "shortDescription": "This behavior removes the limit on the distance the mouse can move and hides the cursor.", - "version": "0.1.9", + "version": "0.2.0", "description": [ "This behavior removes the limit on the distance the mouse can move and hides the cursor.", "", @@ -36,7 +36,23 @@ ], "dependencies": [], "globalVariables": [], - "sceneVariables": [], + "sceneVariables": [ + { + "name": "TouchId", + "type": "number", + "value": -1 + }, + { + "name": "OldX", + "type": "number", + "value": 0 + }, + { + "name": "OldY", + "type": "number", + "value": 0 + } + ], "eventsFunctions": [ { "fullName": "", @@ -61,10 +77,12 @@ "}, false);", "", "document.addEventListener(\"pointerlockerror\", (e) => {", - " if (!gdjs._MousePointerLockExtension.retried) {", + " if (gdjs._MousePointerLockExtension.retried) {", + " ", + " } else {", " canvas.requestPointerLock();", " gdjs._MousePointerLockExtension.retried = true;", - " } ", + " }", "});" ], "parameterObjects": "", @@ -75,6 +93,100 @@ "parameters": [], "objectGroups": [] }, + { + "fullName": "", + "functionType": "Action", + "name": "onScenePreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "-1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MousePointerLock::isEmulatingPointerLock" + }, + "parameters": [ + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MousePointerLock::SetMovementX" + }, + "parameters": [ + "", + "=", + "MousePointerLock::TouchX(TouchId) - OldX", + "" + ] + }, + { + "type": { + "value": "MousePointerLock::SetMovementY" + }, + "parameters": [ + "", + "=", + "MousePointerLock::TouchY(TouchId) - OldY", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldX", + "=", + "MousePointerLock::TouchX(TouchId)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldY", + "=", + "MousePointerLock::TouchY(TouchId)" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + }, { "fullName": "", "functionType": "Action", @@ -102,18 +214,73 @@ "name": "RequestPointerLock", "sentence": "Request Pointer Lock", "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "-1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(0)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldX", + "=", + "MousePointerLock::TouchX(TouchId)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldY", + "=", + "MousePointerLock::TouchY(TouchId)" + ] + } + ] + }, { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ "const canvas = runtimeScene.getGame().getRenderer().getCanvas();\r", "if (canvas.requestPointerLock && !document.pointerLockElement) {\r", - " canvas.requestPointerLock({ unadjustedMovement: true });\r", " gdjs._MousePointerLockExtension.retried = false;\r", + " canvas.requestPointerLock({ unadjustedMovement: true });\r", "}" ], "parameterObjects": "", "useStrict": true, - "eventsSheetExpanded": true + "eventsSheetExpanded": false } ], "parameters": [], @@ -126,6 +293,22 @@ "name": "ExitPointerLock", "sentence": "Exit pointer lock", "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "-1" + ] + } + ] + }, { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ @@ -147,10 +330,81 @@ "functionType": "Condition", "name": "isPointerLocked", "sentence": "The mouse pointer is locked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + ">=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "<", + "0" + ] + }, + { + "type": { + "value": "MousePointerLock::isPointerActuallyLocked" + }, + "parameters": [ + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the mouse pointer is actually locked.", + "fullName": "Pointer is actually locked", + "functionType": "Condition", + "name": "isPointerActuallyLocked", + "private": true, + "sentence": "The mouse pointer actually is locked", "events": [ { "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "eventsFunctionContext.returnValue = document.pointerLockElement ? true : false;", + "inlineCode": "eventsFunctionContext.returnValue = !!document.pointerLockElement;", "parameterObjects": "", "useStrict": true, "eventsSheetExpanded": false @@ -159,6 +413,53 @@ "parameters": [], "objectGroups": [] }, + { + "description": "Check if the mouse pointer lock is emulated.", + "fullName": "Pointer lock is emulated", + "functionType": "Condition", + "name": "isEmulatingPointerLock", + "private": true, + "sentence": "The mouse pointer is lock is emulated", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "MousePointerLock::isPointerActuallyLocked" + }, + "parameters": [ + "", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + ">=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + }, { "description": "Check if the locked pointer is moving.", "fullName": "Locked pointer is moving", @@ -220,6 +521,7 @@ "fullName": "Pointer X movement", "functionType": "ExpressionAndCondition", "name": "MovementX", + "private": true, "sentence": "the movement of the locked pointer on the X axis", "events": [ { @@ -236,11 +538,36 @@ "parameters": [], "objectGroups": [] }, + { + "description": "the movement of the locked pointer on the X axis.", + "fullName": "Pointer X movement", + "functionType": "ActionWithOperator", + "getterName": "MovementX", + "name": "SetMovementX", + "private": true, + "sentence": "the movement of the locked pointer on the X axis", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const value = eventsFunctionContext.getArgument(\"Value\");\r", + "gdjs._MousePointerLockExtension.movementX = value;\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, { "description": "the movement of the pointer on the Y axis.", "fullName": "Pointer Y movement", "functionType": "ExpressionAndCondition", "name": "MovementY", + "private": true, "sentence": "the movement of the pointer on the Y axis", "events": [ { @@ -256,6 +583,94 @@ }, "parameters": [], "objectGroups": [] + }, + { + "description": "the movement of the locked pointer on the X axis.", + "fullName": "Pointer X movement", + "functionType": "ActionWithOperator", + "getterName": "MovementY", + "name": "SetMovementY", + "private": true, + "sentence": "the movement of the locked pointer on the X axis", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const value = eventsFunctionContext.getArgument(\"Value\");\r", + "gdjs._MousePointerLockExtension.movementY = value;\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Return the X position of a specific touch", + "fullName": "Touch X position", + "functionType": "Expression", + "name": "TouchX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const touchId = eventsFunctionContext.getArgument(\"NewTouchId\");", + "eventsFunctionContext.returnValue = runtimeScene.getGame().getInputManager().getTouchX(touchId);", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Touch identifier", + "name": "NewTouchId", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the Y position of a specific touch", + "fullName": "Touch Y position", + "functionType": "Expression", + "name": "TouchY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const touchId = eventsFunctionContext.getArgument(\"NewTouchId\");", + "eventsFunctionContext.returnValue = runtimeScene.getGame().getInputManager().getTouchY(touchId);", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Touch identifier", + "name": "NewTouchId", + "type": "expression" + } + ], + "objectGroups": [] } ], "eventsBasedBehaviors": [ From 8abc4122e70e6af79fa575f941ce2bc7ecb90286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Thu, 16 Jan 2025 20:17:35 +0100 Subject: [PATCH 2/5] Allow to define a speed factor for the emulation with touch --- extensions/reviewed/MousePointerLock.json | 151 +++++++++++++++------- 1 file changed, 106 insertions(+), 45 deletions(-) diff --git a/extensions/reviewed/MousePointerLock.json b/extensions/reviewed/MousePointerLock.json index 070b5ea93..5ec97803f 100644 --- a/extensions/reviewed/MousePointerLock.json +++ b/extensions/reviewed/MousePointerLock.json @@ -51,6 +51,11 @@ "name": "OldY", "type": "number", "value": 0 + }, + { + "name": "TouchSpeedFactor", + "type": "number", + "value": 4 } ], "eventsFunctions": [ @@ -72,8 +77,10 @@ "};", "", "canvas.addEventListener(\"pointermove\", (e) => {", - " gdjs._MousePointerLockExtension.movementX += e.movementX || 0;", - " gdjs._MousePointerLockExtension.movementY += e.movementY || 0;", + " if (!!document.pointerLockElement) {", + " gdjs._MousePointerLockExtension.movementX += e.movementX || 0;", + " gdjs._MousePointerLockExtension.movementY += e.movementY || 0;", + " }", "}, false);", "", "document.addEventListener(\"pointerlockerror\", (e) => {", @@ -98,32 +105,25 @@ "functionType": "Action", "name": "onScenePreEvents", "sentence": "", + "events": [], + "parameters": [], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onScenePostEvents", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "HasTouchEnded" - }, - "parameters": [ - "", - "TouchId" - ] - } + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "gdjs._MousePointerLockExtension.movementX = 0;\r", + "gdjs._MousePointerLockExtension.movementY = 0;" ], - "actions": [ - { - "type": { - "value": "SetNumberVariable" - }, - "parameters": [ - "TouchId", - "=", - "-1" - ] - } - ] + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false }, { "type": "BuiltinCommonInstructions::Standard", @@ -146,7 +146,7 @@ "parameters": [ "", "=", - "MousePointerLock::TouchX(TouchId) - OldX", + "(MousePointerLock::TouchX(TouchId) - OldX) * TouchSpeedFactor", "" ] }, @@ -157,7 +157,7 @@ "parameters": [ "", "=", - "MousePointerLock::TouchY(TouchId) - OldY", + "(MousePointerLock::TouchY(TouchId) - OldY) * TouchSpeedFactor", "" ] }, @@ -182,26 +182,32 @@ ] } ] - } - ], - "parameters": [], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "onScenePostEvents", - "sentence": "", - "events": [ + }, { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "gdjs._MousePointerLockExtension.movementX = 0;\r", - "gdjs._MousePointerLockExtension.movementY = 0;" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } ], - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "-1" + ] + } + ] } ], "parameters": [], @@ -671,6 +677,61 @@ } ], "objectGroups": [] + }, + { + "description": "the speed factor for touch movement", + "fullName": "Speed factor for touch movement", + "functionType": "ExpressionAndCondition", + "name": "TouchSpeedFactor", + "sentence": "the speed factor for touch movement", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchSpeedFactor" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "TouchSpeedFactor", + "name": "SetTouchSpeedFactor", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchSpeedFactor", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] } ], "eventsBasedBehaviors": [ From 41b50c03b1e87409e60327705fe3eb55336977a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Thu, 16 Jan 2025 21:27:48 +0100 Subject: [PATCH 3/5] Typo --- extensions/reviewed/MousePointerLock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/reviewed/MousePointerLock.json b/extensions/reviewed/MousePointerLock.json index 5ec97803f..29935bdba 100644 --- a/extensions/reviewed/MousePointerLock.json +++ b/extensions/reviewed/MousePointerLock.json @@ -679,7 +679,7 @@ "objectGroups": [] }, { - "description": "the speed factor for touch movement", + "description": "the speed factor for touch movement.", "fullName": "Speed factor for touch movement", "functionType": "ExpressionAndCondition", "name": "TouchSpeedFactor", From 7244f5d0dfb96b0d36bd92a9b9fb2ce46a9121e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Fri, 17 Jan 2025 11:30:38 +0100 Subject: [PATCH 4/5] Clean up the code. --- extensions/reviewed/MousePointerLock.json | 131 +++++++++++++++------- 1 file changed, 88 insertions(+), 43 deletions(-) diff --git a/extensions/reviewed/MousePointerLock.json b/extensions/reviewed/MousePointerLock.json index 29935bdba..53055b54d 100644 --- a/extensions/reviewed/MousePointerLock.json +++ b/extensions/reviewed/MousePointerLock.json @@ -32,7 +32,8 @@ "pointer" ], "authorIds": [ - "Zu55H5hcb9YmZTltIVOTAFDJQyB2" + "Zu55H5hcb9YmZTltIVOTAFDJQyB2", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" ], "dependencies": [], "globalVariables": [], @@ -68,29 +69,63 @@ { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ - "const canvas = runtimeScene.getGame().getRenderer().getCanvas();", + "class PointerLockHandler {", + " movementX = 0;", + " movementY = 0;", + " retried = false;", + " /**", + " * @type {gdjs.RuntimeGame}", + " */", + " game;", "", - "gdjs._MousePointerLockExtension = {", - " movementX: 0,", - " movementY: 0,", - " retried: false,", - "};", + " /**", + " * @param {gdjs.RuntimeGame} game", + " */", + " constructor(game) {", + " this.game = game;", + " const canvas = game.getRenderer().getCanvas();", + "", + " canvas.addEventListener(\"pointermove\", event => {", + " if (!!document.pointerLockElement) {", + " this.movementX += event.movementX || 0;", + " this.movementY += event.movementY || 0;", + " }", + " }, false);", + "", + " document.addEventListener(\"pointerlockerror\", event => {", + " if (!this.retried) {", + " canvas.requestPointerLock();", + " this.retried = true;", + " }", + " });", + " }", + "", + " requestPointerLock() {", + " const canvas = this.game.getRenderer().getCanvas();", + " if (canvas.requestPointerLock && !document.pointerLockElement) {", + " this.retried = false;", + " canvas.requestPointerLock({ unadjustedMovement: true });", + " }", + " }", + "", + " exitPointerLock() {", + " if (document.exitPointerLock) {", + " document.exitPointerLock();", + " }", + " }", "", - "canvas.addEventListener(\"pointermove\", (e) => {", - " if (!!document.pointerLockElement) {", - " gdjs._MousePointerLockExtension.movementX += e.movementX || 0;", - " gdjs._MousePointerLockExtension.movementY += e.movementY || 0;", + " isPointerLocked() {", + " return !!document.pointerLockElement;", " }", - "}, false);", "", - "document.addEventListener(\"pointerlockerror\", (e) => {", - " if (gdjs._MousePointerLockExtension.retried) {", - " ", - " } else {", - " canvas.requestPointerLock();", - " gdjs._MousePointerLockExtension.retried = true;", + " resetMovement() {", + " this.movementX = 0;", + " this.movementY = 0;", " }", - "});" + "};", + "", + "gdjs._MousePointerLockExtension = { handler: new PointerLockHandler(runtimeScene.getGame()) };", + "" ], "parameterObjects": "", "useStrict": true, @@ -100,15 +135,6 @@ "parameters": [], "objectGroups": [] }, - { - "fullName": "", - "functionType": "Action", - "name": "onScenePreEvents", - "sentence": "", - "events": [], - "parameters": [], - "objectGroups": [] - }, { "fullName": "", "functionType": "Action", @@ -118,8 +144,10 @@ { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ - "gdjs._MousePointerLockExtension.movementX = 0;\r", - "gdjs._MousePointerLockExtension.movementY = 0;" + "const { handler } = gdjs._MousePointerLockExtension;\r", + "\r", + "handler.resetMovement();\r", + "" ], "parameterObjects": "", "useStrict": true, @@ -278,11 +306,10 @@ { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ - "const canvas = runtimeScene.getGame().getRenderer().getCanvas();\r", - "if (canvas.requestPointerLock && !document.pointerLockElement) {\r", - " gdjs._MousePointerLockExtension.retried = false;\r", - " canvas.requestPointerLock({ unadjustedMovement: true });\r", - "}" + "const { handler } = gdjs._MousePointerLockExtension;\r", + "\r", + "handler.requestPointerLock();\r", + "" ], "parameterObjects": "", "useStrict": true, @@ -318,9 +345,11 @@ { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ - "if (document.exitPointerLock) {\r", - " document.exitPointerLock();\r", - "}" + "\r", + "const { handler } = gdjs._MousePointerLockExtension;\r", + "\r", + "handler.exitPointerLock();\r", + "" ], "parameterObjects": "", "useStrict": true, @@ -410,7 +439,13 @@ "events": [ { "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "eventsFunctionContext.returnValue = !!document.pointerLockElement;", + "inlineCode": [ + "\r", + "const { handler } = gdjs._MousePointerLockExtension;\r", + "\r", + "eventsFunctionContext.returnValue = handler.isPointerLocked();\r", + "" + ], "parameterObjects": "", "useStrict": true, "eventsSheetExpanded": false @@ -532,7 +567,11 @@ "events": [ { "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "eventsFunctionContext.returnValue = gdjs._MousePointerLockExtension.movementX || 0;", + "inlineCode": [ + "\r", + "eventsFunctionContext.returnValue = gdjs._MousePointerLockExtension.handler.movementX || 0;\r", + "" + ], "parameterObjects": "", "useStrict": true, "eventsSheetExpanded": false @@ -556,8 +595,9 @@ { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ + "\r", "const value = eventsFunctionContext.getArgument(\"Value\");\r", - "gdjs._MousePointerLockExtension.movementX = value;\r", + "gdjs._MousePointerLockExtension.handler.movementX = value;\r", "" ], "parameterObjects": "", @@ -578,7 +618,11 @@ "events": [ { "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "eventsFunctionContext.returnValue = gdjs._MousePointerLockExtension.movementY || 0;", + "inlineCode": [ + "\r", + "eventsFunctionContext.returnValue = gdjs._MousePointerLockExtension.handler.movementY || 0;\r", + "" + ], "parameterObjects": "", "useStrict": true, "eventsSheetExpanded": false @@ -602,8 +646,9 @@ { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ + "\r", "const value = eventsFunctionContext.getArgument(\"Value\");\r", - "gdjs._MousePointerLockExtension.movementY = value;\r", + "gdjs._MousePointerLockExtension.handler.movementY = value;\r", "" ], "parameterObjects": "", From 482412d0d3b3de6e8b4dbb63149b67fd6f5dc162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Fri, 17 Jan 2025 11:34:14 +0100 Subject: [PATCH 5/5] Declar JS usage --- scripts/lib/ExtensionsValidatorExceptions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lib/ExtensionsValidatorExceptions.js b/scripts/lib/ExtensionsValidatorExceptions.js index f0f1ca9fa..97389eb68 100644 --- a/scripts/lib/ExtensionsValidatorExceptions.js +++ b/scripts/lib/ExtensionsValidatorExceptions.js @@ -310,7 +310,7 @@ const extensionsAllowedProperties = { ], }, MousePointerLock: { - gdjsAllowedProperties: ['_MousePointerLockExtension'], + gdjsAllowedProperties: ['_MousePointerLockExtension', 'RuntimeGame'], gdjsEvtToolsAllowedProperties: [], runtimeSceneAllowedProperties: [], javaScriptObjectAllowedProperties: [],