No Usernames

A userscript to remove all usernames from ingame

目前为 2022-07-25 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name No Usernames
  3. // @version 1.2.2
  4. // @author Blu
  5. // @description A userscript to remove all usernames from ingame
  6. // @match https://bonk.io/gameframe-release.html
  7. // @run-at document-start
  8. // @grant none
  9. // @namespace https://greasyfork.org/users/826975
  10. // ==/UserScript==
  11.  
  12. // for use as a userscript ensure you have Excigma's code injector userscript
  13. // https://greasyfork.org/en/scripts/433861-code-injector-bonk-io
  14.  
  15. const injectorName = `NoUsernames`;
  16. const errorMsg = `Whoops! ${injectorName} was unable to load.
  17. This may be due to an update to Bonk.io. If so, please report this error!
  18. This could also be because you have an extension that is incompatible with \
  19. ${injectorName}`;
  20.  
  21. // global variables for mod contained within object under this namespace
  22. window[injectorName] = {
  23. players: {
  24. usernames: {
  25. visible: true,
  26. alpha: 1
  27. },
  28. visible: true,
  29. alpha: 1
  30. },
  31. chat: {
  32. visible: true,
  33. alpha: 1
  34. }
  35. };
  36.  
  37. function injector(src){
  38. let newSrc = src;
  39. parent.document.querySelector('#adboxverticalCurse').style.zIndex = -1;
  40. let guiCSS = document.createElement('style');
  41. guiCSS.innerHTML = `
  42. .${injectorName}Menu {
  43. background-color: #cfd8cd;
  44. width: calc(35.2vw - 400px);
  45. min-width: 154px;
  46. max-width: 260px;
  47. position: absolute;
  48. right: 1%;
  49. top: 60px;
  50. border-radius: 7px;
  51. display: unset;
  52. transition: ease-in-out 100ms;
  53. bottom: auto;
  54. height: auto;
  55. max-height: 100%;
  56. overflow-y: visible;
  57. }
  58.  
  59. #${injectorName}MenuCollapse {
  60. position: absolute;
  61. right: 3px;
  62. top: 3px;
  63. width: 26px;
  64. height: 26px;
  65. border-radius: 2px;
  66. text-transform: full-width;
  67. visibility: visible;
  68. }
  69.  
  70. #${injectorName}MenuControls {
  71. width:100%;
  72. }
  73. .${injectorName}SubMenu {
  74. margin: 2%;
  75. background: rgba(94, 114, 90, .15);
  76. border-radius: 2px;
  77. overflow-x: hidden;
  78. }
  79. element::-webkit-scrollbar {
  80. display: none; /* for Chrome, Safari, and Opera */
  81. }
  82. .${injectorName}SubMenu p {
  83. text-align: left;
  84. padding-left: 5%;
  85. margin: 0;
  86. }
  87. .${injectorName}SubMenu td:nth-child(2) {
  88. text-align: right;
  89. }`;
  90. document.getElementsByTagName('head')[0].appendChild(guiCSS);
  91. let gui = document.createElement('div');
  92. document.getElementById('pagecontainer').appendChild(gui);
  93. let collapseMenu = `
  94. let menu = document.querySelector('#${injectorName}Menu');
  95. let submenus = [...menu.querySelectorAll('.NoUsernamesSubMenu')];
  96. let button = document.querySelector('#${injectorName}MenuCollapse');
  97. // maximize menu
  98. if(menu.style.visibility == 'hidden'){
  99. menu.style.minWidth = '';
  100. menu.style.width = '';
  101. menu.style.minHeight = '';
  102. menu.style.maxHeight = '';
  103. menu.style.visibility = '';
  104. submenus.forEach(n=>n.style.visibility='');
  105. button.innerText = '-';
  106. // minimize menu
  107. } else {
  108. menu.style.minWidth = 0;
  109. menu.style.width = 0;
  110. menu.style.minHeight = 0;
  111. menu.style.maxHeight = 0;
  112. menu.style.visibility = 'hidden';
  113. submenus.forEach(n=>n.style.visibility='hidden');
  114. button.innerText = '+';
  115. }
  116. `;
  117. gui.outerHTML = `
  118. <div class="windowShadow ${injectorName}Menu newbonklobby_elementcontainer" id="${injectorName}Menu" style="display: none;">
  119. <div class="newbonklobby_boxtop newbonklobby_boxtop_classic" style='overflow-x: auto'>
  120. <div id="${injectorName}MenuCollapse" class="newbonklobby_settings_button brownButton brownButton_classic buttonShadow" onclick="${collapseMenu}">-</div>
  121. Settings
  122. </div>
  123. <div class="${injectorName}SubMenu">
  124. <div class="newbonklobby_boxtop newbonklobby_boxtop_classic">
  125. <p>Players</p>
  126. </div>
  127. <table>
  128. <tr>
  129. <td class="mapeditor_rightbox_table">
  130. Visible
  131. </td>
  132. <td>
  133. <input type="checkbox" checked onchange="window.${injectorName}.players.visible = !window.${injectorName}.players.visible">
  134. </td>
  135. </tr>
  136. <tr>
  137. <td class="mapeditor_rightbox_table">
  138. Opacity
  139. </td>
  140. <td>
  141. <input type="range" style="width: 5vw" value=100 oninput="window.${injectorName}.players.alpha = this.value/100">
  142. </td>
  143. </tr>
  144. <tr>
  145. <td colspan="2">
  146. <div class="${injectorName}SubMenu">
  147. <div class="newbonklobby_boxtop newbonklobby_boxtop_classic">
  148. <p>Usernames</p>
  149. </div>
  150. <table>
  151. <tr>
  152. <td class="mapeditor_rightbox_table">
  153. Visible
  154. </td>
  155. <td>
  156. <input type="checkbox" checked onchange="window.${injectorName}.players.usernames.visible = !window.${injectorName}.players.usernames.visible">
  157. </td>
  158. </tr>
  159. <tr>
  160. <td class="mapeditor_rightbox_table">
  161. Opacity
  162. </td>
  163. <td>
  164. <input type="range" style="width: 5vw" value=100 oninput="window.${injectorName}.players.usernames.alpha = this.value/100">
  165. </td>
  166. </tr>
  167. </table>
  168. </div>
  169. </td>
  170. </tr>
  171. </table>
  172. </div>
  173. <div class="${injectorName}SubMenu">
  174. <div class="newbonklobby_boxtop newbonklobby_boxtop_classic">
  175. <p>Chat</p>
  176. </div>
  177. <table>
  178. <tr>
  179. <td class="mapeditor_rightbox_table">
  180. Visible
  181. </td>
  182. <td>
  183. <input type="checkbox" checked onchange="window.${injectorName}.chat.visible = !window.${injectorName}.chat.visible; window.${injectorName}.chatWindow.style.opacity = +window.${injectorName}.chat.visible;">
  184. </td>
  185. </tr>
  186. <tr>
  187. <td class="mapeditor_rightbox_table">
  188. Opacity
  189. </td>
  190. <td>
  191. <input type="range" style="width: 5vw" value=100 oninput="window.${injectorName}.chat.alpha = this.value/100; window.${injectorName}.chatWindow.style.opacity = window.${injectorName}.chat.alpha;">
  192. </td>
  193. </tr>
  194. </table>
  195. </div>
  196. </div>`;
  197.  
  198. // hide gui when not in lobby
  199. let lobbyShowFunction = newSrc.match(/this\[([\w$]{1,4}\[[0-9]+\]\[[0-9]+\])\]=function\(\).{30,200}true;\$\(document\)/)[1];
  200. newSrc = newSrc.replace(`this[${lobbyShowFunction}]=function(){`, `this[${lobbyShowFunction}]=function(){ document.querySelector('#${injectorName}Menu').style.display = 'none';`);
  201. // hide gui when returning to main screen
  202. let returnToMainFunction = newSrc.match(/this\[([\w$]{1,4}\[[0-9]+\]\[[0-9]+\])\]=function\(\).{30,200};[\w$]{2,4}\(\);[\w$]{2,4}\[[0-9]+\]\[[\w$]{2,4}\[[0-9]+\]\[[0-9]+\]\]\(\);[\w$]{2,4}\(\);/)[1];
  203. newSrc = newSrc.replace(`this[${returnToMainFunction}]=function(){`, `this[${returnToMainFunction}]=function(){ document.querySelector('#${injectorName}Menu').style.display = 'none';`);
  204. // show gui when game shown
  205. let fadeInFunction = newSrc.match(/function ([\w$]{2,4})\(\)\{.{30,300}new TWEEN/)[1];
  206. newSrc = newSrc.replace(`function ${fadeInFunction}(){`, `function ${fadeInFunction}(){ document.querySelector('#${injectorName}Menu').style.display = '';`);
  207. // control player and username visibility
  208. let discID = newSrc.match(/this.discGraphics\[([\w$]{2,4})\]=null;\}/)[1];
  209. newSrc = newSrc.replace(`this.discGraphics[${discID}]=null;}`, `this.discGraphics[${discID}]=null;} else {
  210. if(this.discGraphics[${discID}]){
  211. this.discGraphics[${discID}].nameText.visible = window.${injectorName}.players.usernames.visible;
  212. this.discGraphics[${discID}].nameText.alpha = window.${injectorName}.players.usernames.alpha;
  213. if(this.discGraphics[${discID}].playerID != this.localPlayerID){
  214. this.discGraphics[${discID}].container.visible = window.${injectorName}.players.visible;
  215. this.discGraphics[${discID}].container.alpha = window.${injectorName}.players.alpha;
  216. }
  217. }
  218. }`);
  219. // get chat window when building renderer
  220. let buildRendererFunction = newSrc.match(/(build\([\w$]{2,4},[\w$]{2,4}\)) \{.{30,150}=new [\w$]{2,4}\[[0-9]+\]\(/)[1];
  221. newSrc = newSrc.replace(`${buildRendererFunction} {`, `${buildRendererFunction} {
  222. window.${injectorName}.chatWindow = document.querySelector('#ingamechatbox');
  223. `);
  224. if(src === newSrc) throw "Injection failed!";
  225. console.log(injectorName+" injector run");
  226. return newSrc;
  227. }
  228.  
  229. // Compatibility with Excigma's code injector userscript
  230. if(!window.bonkCodeInjectors) window.bonkCodeInjectors = [];
  231. window.bonkCodeInjectors.push(bonkCode => {
  232. try {
  233. return injector(bonkCode);
  234. } catch (error) {
  235. alert(errorMsg);
  236. throw error;
  237. }
  238. });
  239.  
  240. console.log(injectorName+" injector loaded");