scratch extesion: pointerlock by rssaromeo

none

目前为 2025-01-26 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name scratch extesion: pointerlock by rssaromeo
  3. // @version 2
  4. // @description none
  5. // @run-at document-start
  6. // @author rssaromeo
  7. // @license GPLv3
  8. // @match *://*/*
  9. // @tag lib
  10. // @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=
  11. // @grant none
  12. // @namespace https://greasyfork.org/users/1184528
  13. // ==/UserScript==
  14. ;(async () => {
  15. await loadlib("libloader").waitforlib("scratchextesnsionmanager")
  16. const {
  17. newext,
  18. newmenu,
  19. newblock,
  20. bt,
  21. inp,
  22. gettarget,
  23. totype,
  24. scratch_math,
  25. projectid,
  26. canvas,
  27. scratchvar,
  28. scratchlist,
  29. } = loadlib("scratchextesnsionmanager")
  30. var a = loadlib("allfuncs")
  31. var vm
  32. loadlib("libloader")
  33. .waitforlib("scratch")
  34. .then(() => (vm = loadlib("scratch").vm))
  35.  
  36. var mousepos = {}
  37. var pointerlock_active = false
  38. newext(
  39. "pointerlock",
  40. "rssaromeo",
  41. class {
  42. setpointerlock({ on }) {
  43. on = totype(on, "bool")
  44. if (on) pointerlock_active = true
  45. else {
  46. pointerlock_active = false
  47. document.exitPointerLock()
  48. }
  49. }
  50. getpointerlockengaged() {
  51. return !!document.pointerLockElement
  52. }
  53. getpointerlockstate() {
  54. if (!!document.pointerLockElement) return "active"
  55. if (pointerlock_active) return "waiting"
  56. return "dissabled"
  57. }
  58. pointerlock_mousex() {
  59. return mousepos.totalx
  60. }
  61. pointerlock_mousey() {
  62. return mousepos.totaly
  63. }
  64. pointerlock_deltax() {
  65. return mousepos.x
  66. }
  67. pointerlock_deltay() {
  68. return mousepos.y
  69. }
  70. pointerlock_resettotalpos() {
  71. mousepos = { x: 0, y: 0, totalx: 0, totaly: 0 }
  72. }
  73. },
  74. [
  75. newblock(
  76. bt.ret,
  77. "getpointerlockstate",
  78. "get pointerlock state"
  79. ),
  80. newblock(
  81. bt.bool,
  82. "getpointerlockengaged",
  83. "is pointerlock engaged?"
  84. ),
  85. newblock(bt.ret, "pointerlock_deltax", "pointerlock: delta x"),
  86. newblock(bt.ret, "pointerlock_mousex", "pointerlock: mouse x"),
  87. newblock(bt.ret, "pointerlock_deltay", "pointerlock: delta y"),
  88. newblock(bt.ret, "pointerlock_mousey", "pointerlock: mouse y"),
  89. newblock(
  90. bt.cmd,
  91. "pointerlock_resettotalpos",
  92. "pointerlock: reset mouse position to 0,0"
  93. ),
  94. newblock(bt.cmd, "setpointerlock", "set pointerlock [on]", [
  95. newmenu("setpointerlock", { items: ["true", "false"] }),
  96. ]),
  97. ],
  98. "50dd50",
  99. "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="
  100. )
  101.  
  102. await a(canvas).waituntil()
  103. window.onblur = () => {
  104. mousestate = {
  105. left: false,
  106. center: false,
  107. right: false,
  108. }
  109. }
  110. canvas().oncontextmenu = (e) => e.preventDefault()
  111.  
  112. canvas().onmousemove = (e) => {
  113. if (pointerlock_active && !!document.pointerLockElement) {
  114. mousepos.x = e.movementX
  115. mousepos.y = -e.movementY
  116. // if (Math.abs(mousepos.x) < 5) mousepos.x = 0
  117. // if (Math.abs(mousepos.y) < 5) mousepos.y = 0
  118. mousepos.totalx ??= 0
  119. mousepos.totaly ??= 0
  120. mousepos.totalx += mousepos.x
  121. mousepos.totaly += mousepos.y
  122. mousepos.justmoved = 1
  123. // scratchvar("__mousex", mousepos.x)
  124. // scratchvar("__mousey", mousepos.y)
  125. }
  126. }
  127. /*newfunc("vm.runtime._step", () => {
  128. if (!pointerlock_active && !document.pointerLockElement) {
  129. // mousepos.x = vm.runtime.ioDevices.mouse._scratchX
  130. // mousepos.y = vm.runtime.ioDevices.mouse._scratchY
  131. // scratchvar("__mousex", mousepos.x)
  132. // scratchvar("__mousey", mousepos.y)
  133. }
  134. if (!mousepos.justmoved) {
  135. mousepos.x = 0
  136. mousepos.y = 0
  137. }
  138. mousepos.justmoved = 0
  139. })*/
  140. // document.onpointerlockchange = () => {
  141. // scratchvar("__pointerlock", !!document.pointerLockElement)
  142. // }
  143.  
  144. canvas().addEventListener("click", async () => {
  145. if (pointerlock_active)
  146. await canvas().requestPointerLock({
  147. unadjustedMovement: true,
  148. })
  149. mousepos.x = 0
  150. mousepos.y = 0
  151. })
  152.  
  153. function newfunc(func1, func2) {
  154. eval(`var a = ${func1}
  155. var s = ${func2}
  156. ${func1} = function (...args) {
  157. try{
  158. s(arguments)
  159. }
  160. catch(e){console.error("${func1.replaceAll('"', '\\"')}", e)}
  161. return a.call(this, ...args)
  162. }`)
  163. }
  164. })()