Paper.IO Enhanced

Zoom hack, game speed change hack, and instant movement hack.

目前为 2023-02-27 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Paper.IO Enhanced
  3. // @namespace -
  4. // @version 1.1.0
  5. // @description Zoom hack, game speed change hack, and instant movement hack.
  6. // @author NotYou
  7. // @match *://paper-io.com/*
  8. // @match *://*.paper-io.com/*
  9. // @run-at document-start
  10. // @license GPL-3.0-or-later
  11. // @grant none
  12. // @icon data:image/png;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe8MAYnvDAHp7wwB6e8MAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvDAMp7wwD/e8MA/3vDAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7wwDKe8MA/3vDAP97wwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfcQAyn3EAP99xAD/fcQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIHGAMqBxgD/gcYA/4HGAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHyQDKh8kA/4fJAP+HyQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjcwAyo3MAP+NzAD/jcwAsI7MAJSOzACUhrgAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJPPAMqTzwD/k88A/5PPAP+TzwD/k88A/4q5DfqKtxdaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACb0wDKm9MA/5vTAP+b0wD/m9MA/5vTAP+Rvif/kLss+pG8MVoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAodYDyqHWA/+h1gP/oNYBhp/VAFyf1QBcnc4X7J3OGP+ezhf6oNMOIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKnaKMqp2ij/qdoo/6naKEAAAAAAAAAAAKnaKOKp2ij/qdoo/6naKCoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACv3UHKr91B/6/dQf+v3UFAAAAAAAAAAACv3UHir91B/6/dQf+v3UEqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr9VclK/UX/+v1F//tN1WwrXgVK614FSur9Ve9q/UX/+v1F7gsdpUEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/QbASx0XCisdFx/7nfY/+64mD/uuJg/7LTb/+x0XDgsNBtIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtdN3ArbUeqK+4W//v+Rt/7/kbf+31nngtdN4IgAAAAAAAAAAAAAAALXTdwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC614AEweR2QMLmdELC5nRCvNt8GgAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAPH/AADx/wAA8f8AAPH/AADx/wAA8D8AAPAfAADwDwAA8McAAPHHAADxxwAA8AcAAPgPAAD8HwAA//8AAA==
  13. // ==/UserScript==
  14.  
  15. (function() {
  16. const MIN_ZOOM = 0.5
  17. const MAX_ZOOM = 3.5
  18.  
  19. const MIN_GAME_SPEED = 10
  20. const MAX_GAME_SPEED = 1000
  21.  
  22. const DEBUG_LEVEL = 2 /* 0 - disabled; 1 - info; 2 - errors */
  23.  
  24. class Hack {
  25. static init(paper_api) {
  26. const GAME = paper_api.game
  27. const CONFIG = GAME.config
  28. const SCENE = getScene()
  29.  
  30. debug('log', this.name + ' initialized!')
  31.  
  32. class GameSpeedHack {
  33. static init(maxGameSpeed, minGameSpeed) {
  34. window.addEventListener('wheel', e => {
  35. if(e.ctrlKey) {
  36. e.preventDefault()
  37.  
  38. let isPositive = e.deltaY > 0
  39.  
  40. CONFIG.unitSpeed += isPositive ? -2.5 : 2.5
  41.  
  42. let current = CONFIG.unitSpeed
  43.  
  44. CONFIG.unitSpeed = minmax(current, minGameSpeed, maxGameSpeed)
  45. }
  46. })
  47. }
  48. }
  49.  
  50. class ZoomHack {
  51. static init(maxZoom, minZoom) {
  52. window.addEventListener('wheel', e => {
  53. if(!e.ctrlKey) {
  54. let isPositive = e.deltaY > 0
  55.  
  56. SCENE.maxScale += isPositive ? -0.5 : 0.5
  57.  
  58. let current = SCENE.maxScale
  59.  
  60. SCENE.maxScale = minmax(current, minZoom, maxZoom)
  61. }
  62. })
  63. }
  64. }
  65.  
  66. class InstantMovement {
  67. static init(listenersData) {
  68. listenersData.forEach(data => {
  69.  
  70. try {
  71. window.addEventListener('keydown', e => {
  72. try {
  73. if(e.code === data.code) {
  74. const PLAYER = GAME.player
  75.  
  76. PLAYER.position[data.direction] += 10 * (data.isNegative ? -1 : 1)
  77. }
  78. } catch(err) {
  79. debug('error', data, err)
  80. }
  81. })
  82. } catch(e) {
  83. debug('error', this.name, data, e)
  84. }
  85. })
  86. }
  87. }
  88.  
  89. GameSpeedHack.init(
  90. MAX_GAME_SPEED,
  91. MIN_GAME_SPEED
  92. )
  93.  
  94. ZoomHack.init(
  95. MAX_ZOOM,
  96. MIN_ZOOM
  97. )
  98.  
  99. InstantMovement.init([{
  100. code: 'KeyW',
  101. direction: 'y',
  102. isNegative: true,
  103. }, {
  104. code: 'KeyS',
  105. direction: 'y',
  106. isNegative: false,
  107. }, {
  108. code: 'KeyA',
  109. direction: 'x',
  110. isNegative: true,
  111. }, {
  112. code: 'KeyD',
  113. direction: 'x',
  114. isNegative: false,
  115. }])
  116.  
  117. function getScene() {
  118. if(paper_api.configs) {
  119. return paper_api.configs.paper2_classic
  120. }
  121.  
  122. return paper_api.config
  123. }
  124. }
  125. }
  126.  
  127. const API_PROPS = ['paper2api', 'paper2']
  128.  
  129. waitForProperty(window, API_PROPS).then(paperapi => {
  130. waitForProperty(paperapi, ['game']).then(() => {
  131. Hack.init(paperapi)
  132. })
  133. })
  134.  
  135. function minmax(n, min, max) {
  136. return Math.max(min, Math.min(n, max))
  137. }
  138.  
  139. function debug(level, ...args) {
  140. let _level;
  141.  
  142. switch (level) {
  143. case 'log':
  144. _level = 0
  145. break
  146. case 'error':
  147. _level = 1
  148. break
  149. }
  150.  
  151. if(DEBUG_LEVEL > _level) {
  152. console[level].apply(this, args)
  153. }
  154. }
  155.  
  156. /* lets pretend, that this is ok */
  157.  
  158. function waitForProperty(target, props) {
  159. let tries = 0
  160.  
  161. try {
  162. return new Promise(res => {
  163. let intervalId = setInterval(() => {
  164. tries++
  165.  
  166. let validProp = props.find(prop => target[prop])
  167.  
  168. if(validProp) {
  169. clearInterval(intervalId)
  170. return res(target[validProp])
  171. }
  172.  
  173. if(tries > 6) {
  174. throw new Error('Timeout error, cannot find properties: "' + props + '" in target object.')
  175. }
  176. }, 1e3)
  177. })
  178. } catch(e) {
  179. debug('error', 'waitForProperty', e)
  180. }
  181. }
  182. })()