- // ==UserScript==
- // @name scratch extesion: pointerlock by rssaromeo
- // @version 2
- // @description none
- // @run-at document-start
- // @author rssaromeo
- // @license GPLv3
- // @match *://*/*
- // @tag lib
- // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAA8dJREFUeF7Vm/1x1DAQxW1aoIU0QGjlUgLUABVADaSE1EJo4BqAGWo4Zi8RoxP78fZDtsl/Gduy3m/frmRJty4T/h5+P1wmNLs8vX1aq9sta3CWaElwFYwSAFuLb1AqIKQA7CV8dEUGRBhARPz521lN4buPd+EUj0JwA/AItwRbaiNAvCBcAFDxWeEjGC8IDwQYgCW+WrTkDhQGCgECcBTxDUolBBOAJn6rqGfcYDlBBVAh/vnT89/+33+9t+qe+zriBg2CCKBCPKnpAdD/KITHzz9uYHz48i41hEoQWABV4jkACIRRPD1jAaB7LDdwEFwAIjk/OqCFUXNCFIAFAQKARN9jTwmA5AROPOoAZJQYIdw4ABFPL/F0UgPAQchEvy8SWjr0ECAAo/UlAK0Dfb5aAHoIHrDWcOEGgEZfc8DYKQKBAGgQqqLvSYWrAzziW+OWC3oY7y/2AtH3lR+RkeqvucFyggoAqfooCAsCByArHhkV0gC8juBAzIq+lQpUDNeI/TXLRRwxK/oWALouAkDsXwFCaoOcgk6brRFBS4VpADyjxSigT5MqCFIxZAFko98LomFQynEt+v21mRA2AdDEoCC4QlkBgXPBpgCyILIQDgOAQKBuoHuragIEoDL/qfPcVNgjnptRZpwwQvgnBY4MoMHIDJG7A5Ci32yOuiMKYVcAlvje7igI7/fCfwPAO2KgIHYD4Ik+N0GqcsShAFifyCMIFAI9JzliFwDZ6EdBcBBMAPSyyqFQ+hbwRr9B6OcA1qf3CACaCFUDkDoZASBNgNDF1MMAqBTfp4e1X7E5gMrok9DMFFhaFNl8QSQS/Yq1AdeCSEUdiESfIozsI0ScIAI4/TxdFmZJfn2zLudH/VSXd01Qiv4oqBqCtjdwlX76dXrZuViXZaUNilcg0eEQjb4WyUoIEoDrsjjplpbGKwFEFjWqIIQBRGqBFv1I7mYhQFtjmgu8EKo3OKVVpbH+cHAt8a9Z/9JUxQ4ROiPTiqd0zXKCB4D7fADqghnR74F4jtsg0b9xQHtRxgmzAXDp4Ik8Pa8ekcmmgjUXj1ife6Y5QSqqWtUf23OdEkNToUpopB3U+q3t6QclIyKiz3jFszUAqQXtnuhEKSpQei5yQNJ0gFUPjgIhI151gMcJe9QGSzhX8TkHmcflUSdsCaFKPOQArxNmpQYiGo167wTIAVEIFa5AhUfEuxzQU7N+QqNVeWvk8Ahu77F+FaL1x+WAKgiVw2BGfNgBRwCRFQ7NA9BIZVICfUd/X5X4EgeMAmbBqBTd9/kPiqWdQ5N12vYAAAAASUVORK5CYII=
- // @grant none
- // @namespace https://greasyfork.org/users/1184528
- // ==/UserScript==
- ;(async () => {
- await loadlib("libloader").waitforlib("scratchextesnsionmanager")
- const {
- newext,
- newmenu,
- newblock,
- bt,
- inp,
- gettarget,
- totype,
- scratch_math,
- projectid,
- canvas,
- scratchvar,
- scratchlist,
- } = loadlib("scratchextesnsionmanager")
- var a = loadlib("allfuncs")
- var vm
- loadlib("libloader")
- .waitforlib("scratch")
- .then(() => (vm = loadlib("scratch").vm))
-
- var mousepos = {}
- var pointerlock_active = false
- newext(
- "pointerlock",
- "rssaromeo",
- class {
- setpointerlock({ on }) {
- on = totype(on, "bool")
- if (on) pointerlock_active = true
- else {
- pointerlock_active = false
- document.exitPointerLock()
- }
- }
- getpointerlockengaged() {
- return !!document.pointerLockElement
- }
- getpointerlockstate() {
- if (!!document.pointerLockElement) return "active"
- if (pointerlock_active) return "waiting"
- return "dissabled"
- }
- pointerlock_mousex() {
- return mousepos.totalx
- }
- pointerlock_mousey() {
- return mousepos.totaly
- }
- pointerlock_deltax() {
- return mousepos.x
- }
- pointerlock_deltay() {
- return mousepos.y
- }
- pointerlock_resettotalpos() {
- mousepos = { x: 0, y: 0, totalx: 0, totaly: 0 }
- }
- },
- [
- newblock(
- bt.ret,
- "getpointerlockstate",
- "get pointerlock state"
- ),
- newblock(
- bt.bool,
- "getpointerlockengaged",
- "is pointerlock engaged?"
- ),
- newblock(bt.ret, "pointerlock_deltax", "pointerlock: delta x"),
- newblock(bt.ret, "pointerlock_mousex", "pointerlock: mouse x"),
- newblock(bt.ret, "pointerlock_deltay", "pointerlock: delta y"),
- newblock(bt.ret, "pointerlock_mousey", "pointerlock: mouse y"),
- newblock(
- bt.cmd,
- "pointerlock_resettotalpos",
- "pointerlock: reset mouse position to 0,0"
- ),
- newblock(bt.cmd, "setpointerlock", "set pointerlock [on]", [
- newmenu("setpointerlock", { items: ["true", "false"] }),
- ]),
- ],
- "50dd50",
- "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAA8dJREFUeF7Vm/1x1DAQxW1aoIU0QGjlUgLUABVADaSE1EJo4BqAGWo4Zi8RoxP78fZDtsl/Gduy3m/frmRJty4T/h5+P1wmNLs8vX1aq9sta3CWaElwFYwSAFuLb1AqIKQA7CV8dEUGRBhARPz521lN4buPd+EUj0JwA/AItwRbaiNAvCBcAFDxWeEjGC8IDwQYgCW+WrTkDhQGCgECcBTxDUolBBOAJn6rqGfcYDlBBVAh/vnT89/+33+9t+qe+zriBg2CCKBCPKnpAdD/KITHzz9uYHz48i41hEoQWABV4jkACIRRPD1jAaB7LDdwEFwAIjk/OqCFUXNCFIAFAQKARN9jTwmA5AROPOoAZJQYIdw4ABFPL/F0UgPAQchEvy8SWjr0ECAAo/UlAK0Dfb5aAHoIHrDWcOEGgEZfc8DYKQKBAGgQqqLvSYWrAzziW+OWC3oY7y/2AtH3lR+RkeqvucFyggoAqfooCAsCByArHhkV0gC8juBAzIq+lQpUDNeI/TXLRRwxK/oWALouAkDsXwFCaoOcgk6brRFBS4VpADyjxSigT5MqCFIxZAFko98LomFQynEt+v21mRA2AdDEoCC4QlkBgXPBpgCyILIQDgOAQKBuoHuragIEoDL/qfPcVNgjnptRZpwwQvgnBY4MoMHIDJG7A5Ci32yOuiMKYVcAlvje7igI7/fCfwPAO2KgIHYD4Ik+N0GqcsShAFifyCMIFAI9JzliFwDZ6EdBcBBMAPSyyqFQ+hbwRr9B6OcA1qf3CACaCFUDkDoZASBNgNDF1MMAqBTfp4e1X7E5gMrok9DMFFhaFNl8QSQS/Yq1AdeCSEUdiESfIozsI0ScIAI4/TxdFmZJfn2zLudH/VSXd01Qiv4oqBqCtjdwlX76dXrZuViXZaUNilcg0eEQjb4WyUoIEoDrsjjplpbGKwFEFjWqIIQBRGqBFv1I7mYhQFtjmgu8EKo3OKVVpbH+cHAt8a9Z/9JUxQ4ROiPTiqd0zXKCB4D7fADqghnR74F4jtsg0b9xQHtRxgmzAXDp4Ik8Pa8ekcmmgjUXj1ife6Y5QSqqWtUf23OdEkNToUpopB3U+q3t6QclIyKiz3jFszUAqQXtnuhEKSpQei5yQNJ0gFUPjgIhI151gMcJe9QGSzhX8TkHmcflUSdsCaFKPOQArxNmpQYiGo167wTIAVEIFa5AhUfEuxzQU7N+QqNVeWvk8Ahu77F+FaL1x+WAKgiVw2BGfNgBRwCRFQ7NA9BIZVICfUd/X5X4EgeMAmbBqBTd9/kPiqWdQ5N12vYAAAAASUVORK5CYII="
- )
-
- await a(canvas).waituntil()
- window.onblur = () => {
- mousestate = {
- left: false,
- center: false,
- right: false,
- }
- }
- canvas().oncontextmenu = (e) => e.preventDefault()
-
- canvas().onmousemove = (e) => {
- if (pointerlock_active && !!document.pointerLockElement) {
- mousepos.x = e.movementX
- mousepos.y = -e.movementY
- // if (Math.abs(mousepos.x) < 5) mousepos.x = 0
- // if (Math.abs(mousepos.y) < 5) mousepos.y = 0
- mousepos.totalx ??= 0
- mousepos.totaly ??= 0
- mousepos.totalx += mousepos.x
- mousepos.totaly += mousepos.y
- mousepos.justmoved = 1
- // scratchvar("__mousex", mousepos.x)
- // scratchvar("__mousey", mousepos.y)
- }
- }
- /*newfunc("vm.runtime._step", () => {
- if (!pointerlock_active && !document.pointerLockElement) {
- // mousepos.x = vm.runtime.ioDevices.mouse._scratchX
- // mousepos.y = vm.runtime.ioDevices.mouse._scratchY
- // scratchvar("__mousex", mousepos.x)
- // scratchvar("__mousey", mousepos.y)
- }
- if (!mousepos.justmoved) {
- mousepos.x = 0
- mousepos.y = 0
- }
- mousepos.justmoved = 0
- })*/
- // document.onpointerlockchange = () => {
- // scratchvar("__pointerlock", !!document.pointerLockElement)
- // }
-
- canvas().addEventListener("click", async () => {
- if (pointerlock_active)
- await canvas().requestPointerLock({
- unadjustedMovement: true,
- })
- mousepos.x = 0
- mousepos.y = 0
- })
-
- function newfunc(func1, func2) {
- eval(`var a = ${func1}
- var s = ${func2}
- ${func1} = function (...args) {
- try{
- s(arguments)
- }
- catch(e){console.error("${func1.replaceAll('"', '\\"')}", e)}
- return a.call(this, ...args)
- }`)
- }
- })()