OWOP Zpeed

A script for OurWorldOfPixels that lets you easily change your moving speed and zoom.

  1. // Changed in 0.3.1: Added zoom seekbar and now using current speed instead of 1
  2. // More changes in^: Speed can no longer be changed to 0, added double-click tip, sync with zoom and speed updates
  3. // Changes in 0.3.2: Values update while you slide the thumb
  4. // Changes in 0.3.3: Some stuff did not get saved...
  5. // Changes in 0.3.4: Fixed 'double click reset' error
  6. // Changes in 0.4.1: Added automove and arrow key highlight (click the button to automove)!
  7. // Changes in 0.4.2: Removed a debug leftover
  8. // Changes in 0.4.3: Added violentmonkey support
  9.  
  10. // ==UserScript==
  11. // @name OWOP Zpeed
  12. // @namespace https://greasyfork.org/users/200700
  13. // @version 0.4.3
  14. // @description A script for OurWorldOfPixels that lets you easily change your moving speed and zoom.
  15. // @author SuperOP535
  16. // @match *://*.ourworldofpixels.com/*
  17. // @grant none
  18. // ==/UserScript==
  19.  
  20. function openSeekbarWindow() {
  21. document.body.appendChild(OWOP.util.mkHTML('style', {
  22. innerHTML: '.zpslider { -moz-appearance:none;-webkit-appearance:none;appearance:none;height:6px;outline:none;float:right; }' +
  23. '.zpbutton { vertical-align: top; display: inline-block; width: 1.4em; height: 1.4em; margin: 1px; padding: 0 0 0 1px; user-select: none; border: 1px solid white; color: white; background: black; }' +
  24. '.zpbutton:hover { background: gray; }' +
  25. '.zpbutton.active { color: black; background: white; }'
  26. } ));
  27. OWOP.windowSys.addWindow(new OWOP.windowSys.class.window('OWOP Zpeed by SuperOP535', {}, function(win) {
  28. win.container.title = 'Tip: You can double-click a seekbar to reset it to default value';
  29. win.container.style.height = '58px';
  30. win.container.style.overflow = 'hidden';
  31. win.addObj(document.createTextNode('Speed: '));
  32. var speedbar = OWOP.util.mkHTML('input', {
  33. type: 'range', className: 'zpslider',
  34. min: 1, max: 100,
  35. value: OWOP.options.movementSpeed,
  36. oninput: function() {
  37. OWOP.options.movementSpeed = this.value;
  38. }, ondblclick:function() {
  39. this.value = 1;
  40. this.oninput();
  41. }
  42. });
  43. win.addObj(speedbar);
  44. // sync with speed updates
  45. Object.defineProperty(OWOP.options, 'movementSpeed', { get: function() { return speedbar.value; }, set: function(a) { speedbar.value=a; } });
  46. win.addObj(OWOP.util.mkHTML('br'));
  47. win.addObj(document.createTextNode('Zoom: '));
  48. var zoombar = OWOP.util.mkHTML('input', {
  49. type: 'range', className: 'zpslider',
  50. value: OWOP.camera.zoom, min: OWOP.options.zoomLimitMin, max: OWOP.options.zoomLimitMax,
  51. oninput: function() {
  52. OWOP.camera.zoom = this.value;
  53. }, ondblclick: function() {
  54. this.value = OWOP.options.defaultZoom;
  55. this.oninput();
  56. }
  57. });
  58. win.addObj(zoombar);
  59. // sync with zoom updates
  60. var zoomsetOld = Object.getOwnPropertyDescriptor(OWOP.camera, 'zoom').set;
  61. Object.defineProperty(OWOP.camera, 'zoom', { set: function(a) { zoombar.value=a; zoomsetOld.call(OWOP.camera, a); } });
  62.  
  63. var mvbtncontainer = OWOP.util.mkHTML('div', { style: 'margin-top: 6px; text-align: center; margin: auto;' });
  64.  
  65. var kc = { left: 37, up: 38, down: 40, right: 39 };
  66. var ck = { 37: 'left', 38: 'up', 40: 'down', 39: 'right' };
  67. var kd = { left: false, up: false, down: false, right: false };
  68.  
  69. var mvbtns = {};
  70.  
  71. function mvbtn(dir) {
  72. var elm = mvbtns[dir];
  73. if(elm.className.slice(-6) === 'active') {
  74. if(kd[dir]) window.dispatchEvent(new KeyboardEvent('keyup', {keyCode: kc[dir]}));
  75. elm.className = 'zpbutton';
  76. } else {
  77. if(!kd[dir]) window.dispatchEvent(new KeyboardEvent('keydown', {keyCode: kc[dir]}));
  78. elm.className += ' active';
  79. }
  80. }
  81.  
  82. mvbtns.left = OWOP.util.mkHTML('div', {
  83. className: 'zpbutton',
  84. onclick: function() { mvbtn('left'); },
  85. innerHTML: '\uD83E\uDC44'
  86. });
  87. mvbtncontainer.appendChild(mvbtns.left);
  88.  
  89. mvbtns.up = OWOP.util.mkHTML('div', {
  90. className: 'zpbutton',
  91. onclick: function() { mvbtn('up'); },
  92. innerHTML: '\uD83E\uDC45'
  93. });
  94. mvbtncontainer.appendChild(mvbtns.up);
  95.  
  96. mvbtns.down = OWOP.util.mkHTML('div', {
  97. className: 'zpbutton',
  98. onclick: function() { mvbtn('down'); },
  99. innerHTML: '\uD83E\uDC47'
  100. });
  101. mvbtncontainer.appendChild(mvbtns.down);
  102.  
  103. mvbtns.right = OWOP.util.mkHTML('div', {
  104. className: 'zpbutton',
  105. onclick: function() { mvbtn('right'); },
  106. innerHTML: '\uD83E\uDC46'
  107. });
  108. mvbtncontainer.appendChild(mvbtns.right);
  109.  
  110. win.addObj(mvbtncontainer);
  111.  
  112. window.addEventListener('keydown', function(e) {
  113. if(ck.hasOwnProperty(e.keyCode)) {
  114. kd[ck[e.keyCode]] = true;
  115. mvbtns[ck[e.keyCode]].className = 'zpbutton active';
  116. }
  117. });
  118.  
  119. window.addEventListener('keyup', function(e) {
  120. if(ck.hasOwnProperty(e.keyCode)) {
  121. kd[ck[e.keyCode]] = false;
  122. mvbtns[ck[e.keyCode]].className = 'zpbutton';
  123. }
  124. });
  125. }).move(window.innerWidth - 280, 32));
  126. }
  127.  
  128. if(typeof OWOP != 'undefined') openSeekbarWindow();
  129. window.addEventListener('load', function() {
  130. setTimeout(openSeekbarWindow, 1234);
  131. });