Bonk Better Spawns

Helps to change the initial position of the player without using teams and without opening editor.

安装此脚本
作者推荐脚本

您可能也喜欢Bonk Host

安装此脚本
  1. // ==UserScript==
  2. // @name Bonk Better Spawns
  3. // @namespace https://greasyfork.org/en/users/1272759
  4. // @version 1.41
  5. // @description Helps to change the initial position of the player without using teams and without opening editor.
  6. // @author Apx
  7. // @match https://bonk.io/*
  8. // @match https://bonkisback.io/*
  9. // @run-at document-start
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13. const scriptName = 'Bonk Better Spawns';
  14.  
  15. function injector (src) {
  16. let newSrc = src;
  17. window.BBSpawns = {
  18. avatarData: [],
  19. spawnId: -1,
  20. playersSelected: [],
  21. spawnSelected: -1,
  22. spawnPointData: [],
  23. lastMap: null,
  24. keepPositions: [],
  25. spawnIdFJ: -1,
  26. blankMap: {v: 1, s: { re: false, nc: false, pq: 1, gd: 25, fl: false }, physics: { shapes: [], fixtures: [], bodies: [], bro: [], joints: [], ppm: 12 }, spawns: [], capZones: [], m: { a: "noauthor", n: "noname", dbv: 2, dbid: -1, authid: -1, date: "", rxid: 0, rxn: "", rxa: "", rxdb: 1, cr: [], pub: false, mo: "" } },
  27. map: () => {return window.BBSpawns.blankMap},
  28. savedSpawnPointData: {},
  29. mapSelected: null,
  30. }
  31.  
  32. const PIXI = window.PIXI;
  33. const spawnRenderer = PIXI.autoDetectRenderer({width: 36, height: 36, antialias: true, transparent: true});
  34. const indicatorRenderer = PIXI.autoDetectRenderer({width: 24, height: 24, antialias: true, transparent: true});
  35.  
  36. let BBSpawnsCSS = document.createElement('style');
  37. BBSpawnsCSS.innerHTML = `
  38. #bbspawns {
  39. width: 100%;
  40. height: 100%;
  41. position: absolute;
  42. }
  43. #bbs_container {
  44. width: fit-content;
  45. height: fit-content;
  46. position: absolute;
  47. top: 0;
  48. bottom: 0;
  49. left: 0;
  50. right: 0;
  51. margin: auto;
  52. }
  53. #bbs {
  54. width: 750px;
  55. height: 500px;
  56. display: flex;
  57. top: 0;
  58. bottom: 0;
  59. left: 0;
  60. right: 0;
  61. justify-content: space-between;
  62. }
  63. #bbs_shadow {
  64. outline: 3000px solid rgba(0, 0, 0, 0.50);
  65. }
  66. #bbs_leftbox {
  67. width: 200px;
  68. position: relative;
  69. background-color: #cfd8dc;
  70. border-radius: 7px;
  71. height: 100%;
  72. }
  73. #bbs_midbox {
  74. width: 200px;
  75. position: relative;
  76. background-color: #cfd8dc;
  77. border-radius: 7px;
  78. height: 100%;
  79. }
  80. #bbs_rightbox {
  81. width: calc(100% - 435px);
  82. position: relative;
  83. background-color: #cfd8dc;
  84. border-radius: 7px;
  85. height: 100%;
  86. }/*
  87. .newbonklobby_playerentry_selected {
  88. width: 100%;
  89. height: 47px;
  90. font-family: "futurept_b1";
  91. position: relative;
  92. font-size: 15px;
  93. cursor: pointer;
  94. box-sizing: border-box;
  95. border-left: 4px solid #cfd8dc;
  96. border-right: 4px solid #cfd8dc;
  97. border-top: 4px solid #cfd8dc;
  98. background-color: #55bad430 !important;
  99. vertical-align: top;
  100. }*/
  101. .newbonklobby_playerentry_indicator {
  102. width: 12px;
  103. height: 12px;
  104. position: absolute;
  105. right: 2px;
  106. top: 2px;
  107. }
  108. .bbs_entry {
  109. width: 100%;
  110. height: 47px;
  111. font-family: "futurept_b1";
  112. position: relative;
  113. font-size: 15px;
  114. cursor: pointer;
  115. box-sizing: border-box;
  116. border-left: 4px solid #cfd8dc;
  117. border-right: 4px solid #cfd8dc;
  118. border-top: 4px solid #cfd8dc;
  119. vertical-align: top;
  120. overflow-x: hidden;
  121. background-color: rgba(0, 0, 0, 0.02);
  122. }
  123. .bbs_entry_highlighted {
  124. width: 100%;
  125. height: 47px;
  126. font-family: "futurept_b1";
  127. position: relative;
  128. font-size: 15px;
  129. cursor: pointer;
  130. box-sizing: border-box;
  131. border-left: 4px solid #cfd8dc;
  132. border-right: 4px solid #cfd8dc;
  133. border-top: 4px solid #cfd8dc;
  134. background-color: #55bad430 !important;
  135. vertical-align: top;
  136. overflow-x: hidden;
  137. background-color: rgba(0, 0, 0, 0.02);
  138. }
  139. #bbs_rightbox_buttoncontainer {
  140. display: flex;
  141. flex-direction: row;
  142. justify-content: space-around;
  143. width: 95%;
  144. margin: auto;
  145. position: absolute;
  146. bottom: 12px;
  147. left: 0;
  148. right: 0;
  149. }
  150. .bbs_rightbox_bottombutton {
  151. display: inline-block;
  152. height: 35px;
  153. line-height: 35px;
  154. flex-basis: 65px;
  155. flex-grow: 0.2;
  156. }
  157. .bbs_entry:hover {
  158. background-color: rgba(100,100,100,0.10);
  159. }
  160. .bbs_spawnentry_name {
  161. color: #000000;
  162. position: absolute;
  163. left: 42px;
  164. top: 2px;
  165. pointer-events: none;
  166. white-space: pre;
  167. }
  168. .bbs_spawnentry_id_forjoiningplayers {
  169. color: #ab00ab;
  170. font-weight: bold;
  171. position: absolute;
  172. left: 42px;
  173. bottom: 2px;
  174. pointer-events: none;
  175. }
  176. .bbs_elementcontainer {
  177. width: 100%;
  178. position: absolute;
  179. overflow-y: auto;
  180. top: 34px;
  181. }
  182. .bbs_scroll {
  183. overflow-y: auto;
  184. }
  185. .bbbs_scroll::-webkit-scrollbar-track {
  186. background-color: #cfd8dc;
  187. }
  188. .bbs_scroll::-webkit-scrollbar-thumb {
  189. background-color: #757575;
  190. }
  191. .bbs_scroll::-webkit-scrollbar {
  192. height: 12px;
  193. width: 0.6em;
  194. background-color: #cfd8dc;
  195. }
  196. #bbs_playerentry_elementcontainer {
  197. height: calc(100% - 119px);
  198. }
  199. #bbs_spawnentry_elementcontainer {
  200. height: calc(100% - 140px);
  201. }
  202. #bbs_spawncount {
  203. color: #efefef;
  204. width: 70%;
  205. position: absolute;
  206. top: 42px;
  207. text-align: center;
  208. height: 20px;
  209. background-color: rgba(58, 84, 98, 0.4);
  210. border-radius: 4px;
  211. left: 0;
  212. right: 0;
  213. margin: auto;
  214. font-family: 'futurept_b1';
  215. white-space: pre;
  216. overflow-x: clip;
  217. }
  218. .bbs_mapimage {
  219. width: calc(100% - 20px);
  220. margin: 10px;
  221. margin-top: 44px;
  222. position: relative;
  223. }
  224. .bbs_bottomButtoncontainer {
  225. width: 90%;
  226. position: absolute;
  227. bottom: 0;
  228. height: fit-content;
  229. padding: 10px 5% 0 5%;
  230. }
  231. .bbs_bottomButton {
  232. margin-bottom: 4px;
  233. }
  234. #bbs_maplist {
  235. position: relative;
  236. height: calc(100% - 317px);
  237. margin: 10px;
  238. margin-top: 0;
  239. background-color: rgba(58, 58, 58, 0.14);
  240. border: 1px solid #989898;
  241. overflow-y: auto;
  242. }
  243. #bbs_maplist_statustext {
  244. text-align: center;
  245. font-family: futurept_medium;
  246. color: #4e4e4e;
  247. width: 100%;
  248. top: calc(50% - 10.5px);
  249. position: absolute;
  250. }
  251. .bbs_maplist_mapdiv {
  252. position: relative;
  253. width: calc(100% - 10px);
  254. height: 80px;
  255. margin: 5px;
  256. left: 0;
  257. right: 0;
  258. background-color: #cfd8dc;
  259. }
  260. .bbs_maplist_mapdiv:hover {
  261. background-color: rgba(100,100,100,0.10);
  262. }
  263. .bbs_maplist_mapdiv_highlighted {
  264. background-color: #afcfdd !important;
  265. }
  266. .bbs_maplist_mapdiv_name {
  267. position: absolute;
  268. font-family: futurept_medium;
  269. font-style: italic;
  270. color: #3a4b4e;
  271. font-size: 17px;
  272. left: 10px;
  273. top: 5px;
  274. }
  275. .bbs_maplist_mapdiv_author {
  276. position: absolute;
  277. font-family: futurept_medium;
  278. color: #4d4e4ea2;
  279. font-size: 15px;
  280. left: 15px;
  281. top: 28px;
  282. }
  283. .bbs_maplist_mapdiv_mode {
  284. position: absolute;
  285. font-family: futurept_medium;
  286. color: #4d4e4ea2;
  287. font-size: 13px;
  288. left: 15px;
  289. top: 55px;
  290. }
  291. .bbs_maplist_mapdiv_map {
  292. position: absolute;
  293. background-color: #4d4e4e12;
  294. font-size: 13px;
  295. right: 5px;
  296. top: 5px;
  297. aspect-ratio: 73 / 50;
  298. height: calc(100% - 10px);
  299. }
  300. `;
  301.  
  302. document.getElementsByTagName('head')[0].appendChild(BBSpawnsCSS);
  303. let BBSpawnsMenu = document.createElement('div');
  304. document.getElementById('newbonkgamecontainer').appendChild(BBSpawnsMenu);
  305. BBSpawnsMenu.outerHTML = `
  306. <div id="bbspawns" style="visibility: hidden; opacity: 0; z-index: 2;">
  307. <div id="bbs_shadow"></div>
  308. <div id="bbs_container">
  309. <div id="bbs">
  310. <div id="bbs_leftbox">
  311. <div class="windowTopBar windowTopBar_classic">Players</div>
  312. <div id="bbs_playerentry_elementcontainer" class="bbs_elementcontainer bbs_scroll"></div>
  313. <div class="bbs_bottomButtoncontainer">
  314. <div id="bbs_applybutton" class="brownButton brownButton_classic buttonShadow bbs_bottomButton">Apply</div>
  315. <div id="bbs_clearplayerpointbutton" class="brownButton brownButton_classic buttonShadow bbs_bottomButton">Clear Spawn Point</div>
  316. <div id="bbs_clearplayerselectionbutton" class="brownButton brownButton_classic buttonShadow bbs_bottomButton">Clear Selection</div>
  317. </div>
  318. </div>
  319. <div id="bbs_midbox">
  320. <div class="windowTopBar windowTopBar_classic">Spawns</div>
  321. <div id="bbs_spawnentry_elementcontainer" class="bbs_elementcontainer bbs_scroll"></div>
  322. <div id="bbs_spawncount" style"display: none;"></div>
  323. <div class="bbs_bottomButtoncontainer">
  324. <div id="bbs_forjoiningbutton" class="brownButton brownButton_classic buttonShadow">For Joining Players</div>
  325. <div id="bbs_clearspawnidbutton" class="brownButton brownButton_classic buttonShadow bbs_bottomButton">Clear</div>
  326. <div id="bbs_foreveryonebutton" class="brownButton brownButton_classic buttonShadow bbs_bottomButton">For Everyone In The Room</div>
  327. <div id="bbs_clearspawnselectionbutton" class="brownButton brownButton_classic buttonShadow bbs_bottomButton">Clear Selection</div>
  328. </div>
  329. </div>
  330. <div id="bbs_rightbox">
  331. <div class="windowTopBar windowTopBar_classic">Map Previev</div>
  332. <div id="bbs_maplist" class="bbs_scroll">
  333. <div id="bbs_maplist_statustext">No maps yet</div>
  334. </div>
  335. <div id="bbs_rightbox_buttoncontainer">
  336. <div id="bbs_loadbutton" class="bbs_rightbox_bottombutton brownButton brownButton_classic buttonShadow bbs_bottomButton">Load</div>
  337. <div id="bbs_deletebutton" class="bbs_rightbox_bottombutton brownButton brownButton_classic buttonShadow bbs_bottomButton">Delete</div>
  338. <div id="bbs_deleteallbutton" class="bbs_rightbox_bottombutton brownButton brownButton_classic buttonShadow bbs_bottomButton">Delete All</div>
  339. </div>
  340. </div>
  341. </div>
  342. <div id="bbs_closebutton" class="windowCloseButton brownButton brownButton_classic buttonShadow"></div>
  343. </div>
  344. </div>
  345. `;
  346.  
  347. // draw spawn (as avatar)
  348. const drawSpawn = spawnData => {
  349. let teams = [spawnData.f,spawnData.r,spawnData.b,spawnData.gr,spawnData.ye, (spawnData.f + spawnData.r + spawnData.b + spawnData.gr + spawnData.ye)];
  350. let spawn = new PIXI.Graphics();
  351. let mask = new PIXI.Graphics();
  352. spawn.beginFill(0x91ada7);
  353. spawn.drawCircle(0,0,15,1);
  354. spawn.x = 18;
  355. spawn.y = 18;
  356. spawn.endFill();
  357. for(let i = 0; i < teams[5]; i++){
  358. let color;
  359. if(teams[0]){
  360. teams[0] = false;
  361. color = 0x1abc9c;
  362. }
  363. else if(teams[1]){
  364. teams[1] = false;
  365. color = 0xd32f2f;
  366. }
  367. else if(teams[2]){
  368. teams[2] = false;
  369. color = 0x448aff;
  370. }
  371. else if(teams[3]){
  372. teams[3] = false;
  373. color = 0x177819;
  374. }
  375. else if(teams[4]){
  376. teams[4] = false;
  377. color = 0xffd90e;
  378. }
  379. spawn.beginFill(color);
  380. spawn.drawRect(((1/teams[5])*i - 0.5)*30,-15,30,30);
  381. spawn.endFill();
  382. spawn.rotation = 45 * (Math.PI/180);
  383. }
  384. mask.beginFill(0);
  385. mask.drawCircle(18,18,15,1);
  386. spawn.mask = mask;
  387. let renderer = spawnRenderer;
  388. renderer.render(spawn);
  389. return renderer.extract.image();
  390. }
  391.  
  392. // draw indicator
  393. window.BBSpawns.drawIndicator = (element, id) => {
  394. if(!element || window.BBSpawns.spawnPointData[id] == undefined || !window.BBSpawns.map().spawns[window.BBSpawns.spawnPointData[id]] || window.BBSpawns.tools.networkEngine.hostID != window.BBSpawns.tools.networkEngine.getLSID()) return;
  395. const teamColor = spawn => {
  396. if(spawn.r) return 0xd32f2f;
  397. if(spawn.b) return 0x448aff;
  398. if(spawn.gr) return 0x177819;
  399. if(spawn.ye) return 0xffd90e;
  400. return 0x1abc9c;
  401. }
  402. let renderer = indicatorRenderer;
  403. let container = new PIXI.Container();
  404. let circle = new PIXI.Graphics();
  405. circle.beginFill(teamColor(window.BBSpawns.map().spawns[window.BBSpawns.spawnPointData[id]]));
  406. circle.drawCircle(12,12,12);
  407. circle.endFill();
  408. container.addChild(circle);
  409. let text = new PIXI.Text(window.BBSpawns.spawnPointData[id] + 1, {
  410. fontFamily: "futurept_medium",
  411. fontSize: 20,
  412. fill: 0xffffff,
  413. });
  414. text.transform.position.x = -text.width / 2 + 12;
  415. text.transform.position.y = -text.height / 2 + 12;
  416. container.addChild(text);
  417. renderer.render(container);
  418. let extracted = renderer.extract.image();
  419. extracted.className = "newbonklobby_playerentry_indicator";
  420. element.appendChild(extracted);
  421. }
  422.  
  423. //*only maps in which you have saved any\n spawn point data will appear here.*
  424. document.getElementById("bbs_maplist_statustext").onmouseover = () => {
  425. document.getElementById("bbs_maplist_statustext").textContent = `*only maps in which you have saved any\n spawn point data will appear here.*`;
  426. }
  427.  
  428. document.getElementById("bbs_maplist_statustext").onmouseout = () => {
  429. document.getElementById("bbs_maplist_statustext").textContent = `No maps yet`;
  430. }
  431.  
  432. window.BBSpawns.exitMenu = () => {
  433. if(window.BBSpawns.lobby) window.BBSpawns.lobby.updatePlayers();
  434. window.anime({
  435. targets: document.getElementById("bbspawns"),
  436. opacity: "0",
  437. autoplay: true,
  438. duration: 130,
  439. easing: "easeOutCubic",
  440. complete: () => {
  441. document.getElementById("bbspawns").style.visibility = "hidden";
  442. }
  443. });
  444. clearChildren(document.getElementById("bbs_playerentry_elementcontainer"));
  445. clearChildren(document.getElementById("bbs_spawnentry_elementcontainer"));
  446. }
  447.  
  448. // Exit Button
  449. document.getElementById("bbs_closebutton").onclick = window.BBSpawns.exitMenu;
  450.  
  451. // Apply
  452. document.getElementById("bbs_applybutton").onclick = () => {
  453. if(window.BBSpawns.spawnSelected == -1) return;
  454. for(let i = 0; i < window.BBSpawns.playersSelected.length; i++) {
  455. window.BBSpawns.spawnPointData[window.BBSpawns.playersSelected[i]] = window.BBSpawns.spawnSelected;
  456. window.BBSpawns.keepPositions[window.BBSpawns.playersSelected[i]] = window.BBSpawns.spawnSelected;
  457. }
  458. window.BBSpawns.spawnSelected = -1;
  459. window.BBSpawns.playersSelected = [];
  460. window.BBSpawns.updateEntries();
  461. }
  462. // Clear Spawn Point
  463. document.getElementById("bbs_clearplayerpointbutton").onclick = () => {
  464. for(let i = 0; i < window.BBSpawns.playersSelected.length; i++){
  465. window.BBSpawns.spawnPointData[window.BBSpawns.playersSelected[i]] = null;
  466. window.BBSpawns.keepPositions[window.BBSpawns.playersSelected[i]] = null;
  467. }
  468. let players = document.getElementById("bbs_playerentry_elementcontainer").children;
  469. window.BBSpawns.playersSelected = [];
  470. window.BBSpawns.updateEntries();
  471. }
  472.  
  473. // Clear Player Selection
  474. document.getElementById("bbs_clearplayerselectionbutton").onclick = () => {
  475. window.BBSpawns.playersSelected = [];
  476. window.BBSpawns.updateEntries();
  477. }
  478.  
  479. // Spawn Point For Everyone Joining Room
  480. document.getElementById("bbs_forjoiningbutton").onclick = () => {
  481. window.BBSpawns.spawnIdFJ = window.BBSpawns.spawnSelected;
  482. window.BBSpawns.spawnSelected = -1;
  483. window.BBSpawns.updateEntries();
  484. }
  485.  
  486. // Clear Spawn Point For Everyone Joining Room
  487. document.getElementById("bbs_clearspawnidbutton").onclick = () => {
  488. window.BBSpawns.spawnIdFJ = -1;
  489. window.BBSpawns.spawnSelected = -1;
  490. window.BBSpawns.updateEntries();
  491. }
  492.  
  493. // Spawn Point For Everyone
  494. document.getElementById("bbs_foreveryonebutton").onclick = () => {
  495. if(window.BBSpawns.spawnSelected == -1) return;
  496. for(let i = 0; i < window.BBSpawns.players.length; i++){
  497. if(window.BBSpawns.players[i]){
  498. window.BBSpawns.spawnPointData[i] = window.BBSpawns.spawnSelected;
  499. window.BBSpawns.keepPositions[i] = window.BBSpawns.spawnSelected;
  500. }
  501. }
  502. window.BBSpawns.spawnSelected = -1;
  503. window.BBSpawns.playersSelected = [];
  504. window.BBSpawns.updateEntries();
  505. }
  506.  
  507. document.getElementById("bbs_clearspawnselectionbutton").onclick = () => {
  508. window.BBSpawns.spawnSelected = -1;
  509. window.BBSpawns.updateEntries();
  510. }
  511.  
  512. // Load map from map list
  513. document.getElementById("bbs_loadbutton").onclick = () => {
  514. if(!window.BBSpawns.savedSpawnPointData[window.BBSpawns.mapSelected]) return;
  515. let map = window.BBSpawns.savedSpawnPointData[window.BBSpawns.mapSelected].map;
  516. window.BBSpawns.lastMap = map;
  517. window.BBSpawns.mapAdd(map);
  518. window.BBSpawns.exitMenu();
  519. }
  520.  
  521. // Delete map from map list
  522. document.getElementById("bbs_deletebutton").onclick = () => {
  523. if(!window.BBSpawns.savedSpawnPointData[window.BBSpawns.mapSelected]) return;
  524. delete window.BBSpawns.savedSpawnPointData[window.BBSpawns.mapSelected];
  525. updateMapList();
  526. }
  527.  
  528. // Delete all maps from map list
  529. document.getElementById("bbs_deleteallbutton").onclick = () => {
  530. window.BBSpawns.savedSpawnPointData = {};
  531. updateMapList();
  532. }
  533.  
  534. // create image
  535. const mapImage = spawnId => {
  536. window.BBSpawns.spawnId = spawnId;
  537. let mapImg = window.BBSpawns.createMapImage(window.BBSpawns.map(),(document.getElementById("bbs_rightbox").clientWidth-20)/730);
  538. window.BBSpawns.spawnId = null;
  539. mapImg.classList.add("bbs_mapimage");
  540. [...document.getElementById("bbs_rightbox").children].forEach((element) => {if(element.className == "bbs_mapimage") element.parentNode.removeChild(element)});
  541. document.getElementById("bbs_rightbox").insertBefore(mapImg, document.getElementById("bbs_maplist"));
  542. }
  543. const clearChildren = element => {
  544. while(element.children.length > 0) element.removeChild(element.firstChild);
  545. }
  546.  
  547. const updateMapList = () => {
  548. window.BBSpawns.mapSelected = null;
  549. [...document.getElementById("bbs_maplist").children].forEach((element) => {if(element.classList.contains("bbs_maplist_mapdiv")) element.parentNode.removeChild(element)});
  550. let maps = Object.values(window.BBSpawns.savedSpawnPointData);
  551. if(maps.length == 0){
  552. document.getElementById("bbs_maplist_statustext").style.visibility = "inherit";
  553. document.getElementById("bbs_loadbutton").classList.add("brownButtonDisabled");
  554. document.getElementById("bbs_deletebutton").classList.add("brownButtonDisabled");
  555. document.getElementById("bbs_deleteallbutton").classList.add("brownButtonDisabled");
  556. return;
  557. } else {
  558. document.getElementById("bbs_maplist_statustext").style.visibility = "hidden";
  559. document.getElementById("bbs_loadbutton").classList.remove("brownButtonDisabled");
  560. document.getElementById("bbs_deletebutton").classList.remove("brownButtonDisabled");
  561. document.getElementById("bbs_deleteallbutton").classList.remove("brownButtonDisabled");
  562. }
  563. for(let mapID = maps.length-1; mapID >= 0; mapID--){
  564. let id = Object.keys(window.BBSpawns.savedSpawnPointData)[mapID];
  565. let div = document.createElement("div");
  566. div.className = "bbs_maplist_mapdiv";
  567. let name = document.createElement("div");
  568. name.className = "bbs_maplist_mapdiv_name";
  569. name.textContent = maps[mapID].map.m.n;
  570. let author = document.createElement("div");
  571. author.className = "bbs_maplist_mapdiv_author";
  572. author.textContent = "by " + maps[mapID].map.m.a;
  573. let mode = document.createElement("div");
  574. mode.className = "bbs_maplist_mapdiv_mode";
  575. let modeText = "Any Mode";
  576. if(window.BBSpawns.modes[maps[mapID].map.m.mo]) modeText = window.BBSpawns.modes[maps[mapID].map.m.mo].lobbyName;
  577. mode.textContent = modeText;
  578. let mapElement = document.createElement("div");
  579. mapElement.className = "bbs_maplist_mapdiv_map";
  580. div.ondblclick = () => {
  581. window.BBSpawns.mapSelected = id;
  582. if(!window.BBSpawns.savedSpawnPointData[window.BBSpawns.mapSelected]) return;
  583. let map = window.BBSpawns.savedSpawnPointData[window.BBSpawns.mapSelected].map;
  584. window.BBSpawns.lastMap = map;
  585. window.BBSpawns.mapAdd(map);
  586. window.BBSpawns.exitMenu();
  587. }
  588. div.onclick = () => {
  589. if(div.classList.contains("bbs_maplist_mapdiv_highlighted")) {
  590. div.classList.remove("bbs_maplist_mapdiv_highlighted");
  591. window.BBSpawns.mapSelected = null;
  592. }
  593. else {
  594. div.classList.add("bbs_maplist_mapdiv_highlighted");
  595. window.BBSpawns.mapSelected = id;
  596. }
  597. }
  598. div.appendChild(name);
  599. div.appendChild(author);
  600. div.appendChild(mode);
  601. div.appendChild(mapElement);
  602. if(window.BBSpawns.savedSpawnPointData[Object.keys(window.BBSpawns.savedSpawnPointData)[mapID]].mapImage == null){
  603. mapElement.appendChild(window.BBSpawns.createMapImage(maps[mapID].map,70/500));
  604. window.BBSpawns.savedSpawnPointData[id].mapImage = mapElement.lastChild;
  605. } else mapElement.appendChild(window.BBSpawns.savedSpawnPointData[Object.keys(window.BBSpawns.savedSpawnPointData)[mapID]].mapImage);
  606. document.getElementById("bbs_maplist").appendChild(div);
  607. }
  608. }
  609.  
  610.  
  611. window.BBSpawns.updateEntries = () => {
  612. if(document.getElementById("bbspawns").style.visibility != "inherit") return;
  613. clearChildren(document.getElementById("bbs_playerentry_elementcontainer"));
  614. clearChildren(document.getElementById("bbs_spawnentry_elementcontainer"));
  615. // players
  616. for(let id = 0; id < window.BBSpawns.players.length; id++){
  617. let player = window.BBSpawns.players[id];
  618. if(player){
  619. let playerentry = document.createElement("div");
  620. playerentry.classList.add(window.BBSpawns.playersSelected.find((x) => x == id) != undefined? "bbs_entry_highlighted" : "bbs_entry");
  621. playerentry.ondblclick = () => {
  622. if(window.BBSpawns.spawnSelected != -1){
  623. window.BBSpawns.spawnPointData[id] = window.BBSpawns.spawnSelected;
  624. window.BBSpawns.keepPositions[id] = window.BBSpawns.spawnSelected;
  625. } else {
  626. window.BBSpawns.spawnPointData[id] = null;
  627. window.BBSpawns.keepPositions[id] = null;
  628. }
  629. window.BBSpawns.playersSelected.splice(window.BBSpawns.playersSelected.indexOf(id));
  630. if(window.BBSpawns.playersSelected.length == 0) window.BBSpawns.spawnSelected = -1;
  631. window.BBSpawns.updateEntries();
  632. }
  633. playerentry.onclick = () => {
  634. if(playerentry.classList.contains("bbs_entry")){
  635. playerentry.classList.remove("bbs_entry");
  636. playerentry.classList.add("bbs_entry_highlighted");
  637. window.BBSpawns.playersSelected.push(id);
  638. } else {
  639. playerentry.classList.remove("bbs_entry_highlighted");
  640. playerentry.classList.add("bbs_entry");
  641. window.BBSpawns.playersSelected.splice(window.BBSpawns.playersSelected.indexOf(id));
  642. }
  643. }
  644. playerentry.onmouseenter = window.BBSpawns.sounds.rlh;
  645. playerentry.onmousedown = window.BBSpawns.sounds.rlc;
  646. let playerskin = document.createElement("div");
  647. playerskin.classList.add("newbonklobby_playerentry_avatar");
  648. if(window.BBSpawns.avatarData[id] && window.BBSpawns.avatarData[id][1]){
  649. playerskin.appendChild(window.BBSpawns.avatarData[id][1].cloneNode(true));
  650. } else {
  651. try {
  652. window.BBSpawns.createImage(player.avatar, 0, playerskin, "", 36, 36, window.BBSpawns.avatarData, id, 0, 2, 0.08, 0.3);
  653. } catch (e) {}
  654. }
  655. window.BBSpawns.drawIndicator(playerskin,id);
  656. let playername = document.createElement("div");
  657. playername.classList.add("newbonklobby_playerentry_name");
  658. playername.textContent = player.userName;
  659. let playerlevel = document.createElement("div");
  660. playerlevel.classList.add("newbonklobby_playerentry_level");
  661. playerlevel.textContent = player.guest?"Guest":"Level "+player.level;
  662. let playerspawnid = document.createElement("div");
  663. playerspawnid.classList.add("newbonklobby_playerentry_balance");
  664. playerspawnid.textContent = window.BBSpawns.spawnPointData[id] == null? "N/A" : window.BBSpawns.spawnPointData[id] + 1;
  665. playerentry.appendChild(playerskin);
  666. playerentry.appendChild(playername);
  667. playerentry.appendChild(playerlevel);
  668. playerentry.appendChild(playerspawnid);
  669. document.getElementById("bbs_playerentry_elementcontainer").appendChild(playerentry);
  670. }
  671. }
  672. // spawns
  673. let spawns = window.BBSpawns.map().spawns;
  674. for(let id = 0; id < spawns.length; id++){
  675. if(spawns[id]){
  676. let spawnentry = document.createElement("div");
  677. spawnentry.classList.add(window.BBSpawns.spawnSelected == id? "bbs_entry_highlighted" : "bbs_entry");
  678. spawnentry.ondblclick = () => {
  679. spawnentry.classList.remove("bbs_entry_highlighted");
  680. spawnentry.classList.add("bbs_entry");
  681. window.BBSpawns.spawnSelected = -1;
  682. for(let i = 0; i < window.BBSpawns.playersSelected.length; i++) window.BBSpawns.spawnPointData[window.BBSpawns.playersSelected[i]] = id;
  683. window.BBSpawns.playersSelected = [];
  684. window.BBSpawns.updateEntries();
  685. }
  686. spawnentry.onclick = () => {
  687. if(spawnentry.classList.contains("bbs_entry_highlighted")){
  688. spawnentry.classList.remove("bbs_entry_highlighted");
  689. spawnentry.classList.add("bbs_entry");
  690. window.BBSpawns.spawnSelected = -1;
  691. } else {
  692. for(let element = 0; element < document.getElementById("bbs_spawnentry_elementcontainer").children.length; element++){
  693. let elem = document.getElementById("bbs_spawnentry_elementcontainer").children[element];
  694. elem.classList.remove("bbs_entry_highlighted");
  695. elem.classList.add("bbs_entry");
  696. }
  697. spawnentry.classList.remove("bbs_entry");
  698. spawnentry.classList.add("bbs_entry_highlighted");
  699. window.BBSpawns.spawnSelected = id;
  700. }
  701. }
  702. spawnentry.onmouseenter = window.BBSpawns.sounds.rlh;
  703. spawnentry.onmousedown = window.BBSpawns.sounds.rlc;
  704. let spawnteams = document.createElement("div");
  705. spawnteams.classList.add("newbonklobby_playerentry_avatar");
  706. spawnteams.appendChild(drawSpawn(spawns[id]));
  707. let spawnname = document.createElement("div");
  708. spawnname.classList.add("bbs_spawnentry_name");
  709. spawnname.textContent = spawns[id].n;
  710. let spawnid = document.createElement("div");
  711. if(window.BBSpawns.spawnIdFJ == id) spawnid.classList.add("bbs_spawnentry_id_forjoiningplayers");
  712. else spawnid.classList.add("newbonklobby_playerentry_level");
  713. spawnid.textContent = `Spawn ID: ${id + 1}`;
  714. spawnentry.addEventListener("mouseover", () => mapImage(id));
  715. spawnentry.addEventListener("mouseout", () => mapImage());
  716. spawnentry.appendChild(spawnteams);
  717. spawnentry.appendChild(spawnname);
  718. spawnentry.appendChild(spawnid);
  719. document.getElementById("bbs_spawnentry_elementcontainer").appendChild(spawnentry);
  720. }
  721. }
  722. let spawnentrycontainer = document.getElementById("bbs_spawnentry_elementcontainer");
  723. let spawncount = document.getElementById("bbs_spawncount");
  724. if(spawnentrycontainer.scrollHeight > spawnentrycontainer.clientHeight){
  725. spawncount.textContent = "Spawn count - " + spawns.length;
  726. spawncount.style.display = "block";
  727.  
  728. } else spawncount.style.display = "none";
  729. }
  730.  
  731. window.BBSpawns.updateSPData = () => {
  732. let map = window.BBSpawns.map();
  733. let lastMap = window.BBSpawns.lastMap;
  734. let clear = () => {
  735. window.BBSpawns.spawnPointData = [];
  736. window.BBSpawns.keepPositions = [];
  737. window.BBSpawns.spawnIdFJ = -1;
  738. }
  739. let mapsEqual = () => {
  740. let m = [Object.create(map),Object.create(lastMap)];
  741. m[0].m = m[1].m = null;
  742. if(JSON.stringify(m[0]) == JSON.stringify(m[1])) return true;
  743. }
  744. if(lastMap != null && map.spawns.length == lastMap.spawns.length){
  745. if(
  746. map.m.rxid == lastMap.m.dbid ||
  747. map.m.dbid == lastMap.m.rxid ||
  748. map.m.dbid == lastMap.m.dbid ||
  749. (lastMap.m.dbid == -1 && map.m.dbid != 0 && mapsEqual())
  750. ){} else {
  751. clear();
  752. }
  753. } else {
  754. clear();
  755. }
  756. window.BBSpawns.lastMap = map;
  757.  
  758. }
  759.  
  760. window.BBSpawns.roomLeave = () => {
  761. window.BBSpawns.avatarData = [];
  762. window.BBSpawns.lobby = null;
  763. window.BBSpawns.spawnPointData = [];
  764. window.BBSpawns.keepPositions = [];
  765. window.BBSpawns.lastMap = null;
  766. window.BBSpawns.playersSelected = [];
  767. window.BBSpawns.spawnIdFJ = -1;
  768. window.BBSpawns.map = () => {return window.BBSpawns.blankMap};
  769. window.BBSpawns.savedSpawnPointData = {};
  770. }
  771.  
  772. window.BBSpawns.displayWindow = () => {
  773. clearChildren(document.getElementById("bbs_playerentry_elementcontainer"));
  774. clearChildren(document.getElementById("bbs_spawnentry_elementcontainer"));
  775. if(document.getElementById("bbspawns").style.visibility != "inherit"){
  776. document.getElementById("bbspawns").style.visibility = "inherit";
  777. document.getElementById("bbspawns").style.opacity = "0";
  778. window.anime({
  779. targets: document.getElementById("bbspawns"),
  780. opacity: "1",
  781. autoplay: true,
  782. duration: 250,
  783. easing: "easeOutCubic",
  784. });
  785. }
  786. window.BBSpawns.updateSPData();
  787. window.BBSpawns.updateEntries();
  788. mapImage();
  789. updateMapList();
  790. }
  791.  
  792. window.BBSpawns.onMapChange = (newMap) => {
  793. let map = window.BBSpawns.map();
  794. if(window.BBSpawns.spawnPointData.length != 0 && map.m.dbid > -1){
  795. let data = {
  796. spawns: map.spawns.length,
  797. spdata: window.BBSpawns.spawnPointData,
  798. map: map,
  799. mapImage: null,
  800. };
  801. window.BBSpawns.savedSpawnPointData["b" + map.m.rxdb + "-" + map.m.dbid] = data;
  802. window.BBSpawns.spawnPointData = [];
  803. }
  804. let id = "b" + newMap.m.rxdb + "-" + newMap.m.dbid;
  805. if(window.BBSpawns.savedSpawnPointData[id] && window.BBSpawns.savedSpawnPointData[id].spawns == newMap.spawns.length){
  806. window.BBSpawns.spawnPointData = window.BBSpawns.savedSpawnPointData[id].spdata;
  807. window.BBSpawns.newestMap = newMap;
  808. }
  809. window.BBSpawns.lobby.updatePlayers();
  810. }
  811.  
  812.  
  813. const bigvar = newSrc.match(/[A-Za-z0-9$_]+\[[0-9]{6}\]/)[0].split('[')[0];
  814. const closePlayerentryMenu = newSrc.match(/this\[[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]\[[0-9]{1,5}]]\);[A-Za-z0-9\$_]{3}\(\);}/)[0].split(";")[1];
  815. const lobbyPlayerIDRegex = newSrc.match(/\[];[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=\[];[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=function\([A-Za-z0-9\$_]{3}/)[0].split('(')[1];
  816. const createImageRegex = newSrc.match(/]]]\);}else {try{.../)[0].split("try{")[1].split("[")[0];
  817. const updatePlayersRegex = newSrc.match(/=\[];[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=\[];[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=function\([A-Za-z0-9\$_]{3}\){/);
  818. const imageRender = newSrc.match(/(?<=\);function )[A-Za-z0-9\$_]{1,3}(?=\([A-Za-z0-9\$_,]{7}\){\"use strict\")/)[0];
  819. const mapAddRegex = newSrc.match(/;}}\);};function [A-Za-z0-9\$_]{1,3}/)[0].split(" ")[1];
  820.  
  821. //get players
  822. const playerList = newSrc.match(/=\[];[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=\[];[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=function\([A-Za-z0-9\$_]{3}\){.*?\){/)[0].split("if(")[1].match(/[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]\[[0-9]{1,3}]/)[0];
  823. const avatarData = newSrc.match(/(?<=36,36,)[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]/)[0];
  824. newSrc = newSrc.replace(updatePlayersRegex, updatePlayersRegex[0] + `window.BBSpawns.players = ${playerList};window.BBSpawns.avatarData = ${avatarData};`);
  825.  
  826. // create button
  827. const moveToButtonRegex = newSrc.match(/\(\);}\);}if/);
  828. const soundsRegex = newSrc.match(/0x424242\);[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]/)[0].split(';')[1];
  829. let setSpawnPointButton = `
  830. let button = document.createElement("div");
  831. button.classList.add("newbonklobby_playerentry_menu_button");
  832. button.classList.add("brownButton");
  833. button.classList.add("brownButton_classic");
  834. button.classList.add("buttonShadow");
  835. document.getElementsByClassName("newbonklobby_playerentry_menu")[0].appendChild(button);
  836. window.BBSpawns.sounds = ${soundsRegex};
  837. window.BBSpawns.sounds.setButtonSounds([...document.getElementById("bbspawns").getElementsByClassName("buttonShadow")]);
  838. button.textContent = "Set spawn point";
  839. button.onclick = function () {
  840. window.BBSpawns.playersSelected = [${lobbyPlayerIDRegex}];
  841. window.BBSpawns.displayWindow();
  842. ${closePlayerentryMenu};
  843. }
  844. `;
  845. newSrc = newSrc.replace(moveToButtonRegex, moveToButtonRegex[0].split('}if')[0] + setSpawnPointButton + '}if');
  846.  
  847. // test
  848. const gameRegex = newSrc.match(/30000\){.*?}.*?(?==)/)[0].split("}")[1];
  849.  
  850. // thamks salama
  851. const lobbyThings = newSrc.match(/== 13\){...\(\);}}/)[0];
  852. newSrc = newSrc.replace(lobbyThings, lobbyThings + `window.BBSpawns.lobby = this;window.BBSpawns.mapAdd = ${mapAddRegex};`);
  853. const toolRegex = newSrc.match(/=new [A-Za-z0-9\$_]{1,3}\(this,[A-Za-z0-9\$_]{1,3}\[0\]\[0\],[A-Za-z0-9\$_]{1,3}\[0\]\[1\]\);/);
  854. newSrc = newSrc.replace(toolRegex, toolRegex + "window.BBSpawns.tools = this;");
  855. const modeRegex = newSrc.match(/[A-Za-z0-9\$_]{3}\[[0-9]{1,3}\]=class [A-Za-z0-9\$_]{3}\{constructor.{1,400}this\[[A-Za-z0-9\$_]{3}(\[[0-9]{1,3}\]){2}\]=2;/)[0].split("=")[0];
  856.  
  857. const setMapRegex = newSrc.match(/[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=this\[[A-Za-z0-9\$_\[\]]*?;[A-Za-z0-9\$_]{3}\[0]\[2].*?=/)[0].split(";")[1];
  858. let thing = newSrc.match(RegExp(setMapRegex.split("2][")[0].replaceAll("[", "\\[")+"2]\\[[A-Za-z0-9\$_]{3}\\[[0-9]{1,3}]\\["+setMapRegex.split("][")[3]+".*?;","g"));
  859. for(let i = 0; i < thing.length;i++) newSrc = newSrc.replace(thing[i], `window.BBSpawns.onMapChange(${thing[i].split("=")[1].replace(";","")});${thing[i]};`);
  860.  
  861. // spawn selection & spawn color fix
  862. const spawnColorRegex = newSrc.match(/(?<=5\){[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=0xffd90e;}).*?]]\(.*?\);(?=[A-Za-z0-9\$_]{3}.[A-Za-z0-9\$_]{3}\([0-9]{1,3}\))/);
  863. const spawnTeamsRegex = newSrc.match(/[A-Za-z0-9\$_]{1,3}\[[0-9]{1,3}]=3;}else if\(.{0,300}== false\){continue;}[^;]*?\({x:/);
  864. let spawn = spawnTeamsRegex[0].split("==")[0].split("if(")[1].match(/.*?(?=\[...\[[0-9]{1,3}]\[[0-9]{1,3}]] )/)[0];
  865. let spawnTeams = `
  866. else if(${spawn}.gr == true){
  867. ${spawnTeamsRegex[0].split("=3")[0]} = 4;
  868. }
  869. else if(${spawn}.ye == true){
  870. ${spawnTeamsRegex[0].split("=3")[0]} = 5;
  871. }
  872. else
  873. `;
  874. newSrc = newSrc.replace(spawnColorRegex, spawnColorRegex[0].split("(")[0] + `(window.BBSpawns.spawnId==${newSrc.match(/(?<==false;}for\()[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]/)[0]}?0xffffff:` + spawnColorRegex[0].split("(")[1]);
  875. newSrc = newSrc.replace(spawnTeamsRegex, spawnTeamsRegex[0].split("else")[0] + spawnTeams + spawnTeamsRegex[0].split("else")[1].replace("continue;", ""));
  876.  
  877. let f8h = newSrc.match(/(?<=\)\){)while.*?}/)[0].split("(")[1].split("][")[0] + `]`;
  878. newSrc = newSrc.replace(newSrc.match(/(?<=\)\){)while.*?}/), newSrc.match(/(?<=\)\){)while.*?}/) + `if(${f8h.substring(0,3)}[0][2].className == "newbonklobby_playerentry_avatar"){window.BBSpawns.drawIndicator(${f8h.substring(0,3)}[0][2],${f8h.substring(0,3)}[0][7])}`);
  879.  
  880. const playerentryRegex = newSrc.match(/(?<=;).{0,30}=[A-Za-z0-9\$_]{3}\[[0-9]{1,3}];[A-Za-z0-9\$_]{1,3}\[[0-9]{1,3}]\[[A-Za-z0-9\$_]{1,3}\[0]\[0]]=[A-Za-z0-9\$_]{3}\[[0-9]{1,3}];/);
  881. newSrc = newSrc.replace(playerentryRegex,`;window.BBSpawns.drawIndicator(${playerentryRegex[0].split(";")[1].split("=")[1]}.children[0],arguments[0]);` + playerentryRegex[0]);
  882.  
  883. // get some things i need (map && create map image)
  884. const createRoomRegex = newSrc.match(/\(0,[A-Za-z0-9\$_]{1,3}\.[A-Za-z0-9\$_]{1,3}\(.[0-9]{1,4}\)\);.{0,50}=3;}else/g);
  885. newSrc = newSrc.replace(createRoomRegex, createRoomRegex[0].split(';')[0] + `;${createRoomRegex[0].split(";")[1]};
  886. window.BBSpawns.modes = ${modeRegex}.modes;
  887. window.BBSpawns.map = () => {
  888. if(window.BBSpawns.newestMap == ${createRoomRegex[0].match(/(?<=;).*?\[.*?(?=\[)/)}.map) delete window.BBSpawns.newestMap;
  889. if(window.BBSpawns.newestMap) return window.BBSpawns.newestMap;
  890. return ${createRoomRegex[0].match(/(?<=;).*?\[.*?(?=\[)/)}.map;
  891. };
  892. window.BBSpawns.createImage = ${createImageRegex}.createImage;
  893. window.BBSpawns.tools.networkEngine.on("newPlayerJoined", player => {
  894. if(window.BBSpawns.spawnIdFJ != -1){
  895. window.BBSpawns.spawnPointData[player] = window.BBSpawns.spawnIdFJ;
  896. window.BBSpawns.keepPositions[player] = window.BBSpawns.spawnIdFJ;
  897. }
  898. window.BBSpawns.updateEntries();
  899. });
  900. window.BBSpawns.tools.networkEngine.on("nameChange", window.BBSpawns.updateEntries);
  901. window.BBSpawns.tools.networkEngine.on("playerLevelledUp", window.BBSpawns.updateEntries);
  902. window.BBSpawns.tools.networkEngine.on("playerLeft", window.BBSpawns.updateEntries);
  903. window.BBSpawns.createMapImage = ${newSrc.match(/(?<=\);}this\[.{0,8}\[[0-9]{1,5}]]\(\);.{0,8}=)[A-Za-z0-9\$_]{1,3}/)}.createImage;
  904. }else`);
  905.  
  906. // put players on their initial positions
  907. let newStateRegex = newSrc.match(/B;}[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=.*?\(.*?,true\);/)[0];
  908. newSrc = newSrc.replace(newStateRegex, newStateRegex + `
  909. let discs = ${newStateRegex.split("}")[1].split("=")[0]}.discs;
  910. let map = window.BBSpawns.map();
  911. let keepPos = document.getElementById("hostPlayerMenuKeepPositions") && document.getElementById("hostPlayerMenuKeepPositions").checked;
  912. if(!keepPos) window.BBSpawns.keepPositions = Object.create(window.BBSpawns.spawnPointData);
  913. window.BBSpawns.updateSPData();
  914. if(
  915. !!${gameRegex} &&
  916. window.bonkHost &&
  917. ${bigvar}.bonkHost.state &&
  918. keepPos &&
  919. window.bonkHost.toolFunctions.getGameSettings().map.s.re &&
  920. window.bonkHost.toolFunctions.getGameSettings().ga === "b" &&
  921. ${bigvar}.bonkHost.state.mm.dbid == window.bonkHost.toolFunctions.getGameSettings().map.m.dbid &&
  922. ${bigvar}.bonkHost.state.mm.dbv == window.bonkHost.toolFunctions.getGameSettings().map.m.dbv
  923. ){
  924. for(let disc = 0; disc < discs.length; disc++){
  925. if(discs[disc] != null && window.BBSpawns.keepPositions[disc] != null){
  926. discs[disc].x = (map.spawns[window.BBSpawns.keepPositions[disc]].x + 365) / map.physics.ppm;
  927. discs[disc].y = (map.spawns[window.BBSpawns.keepPositions[disc]].y + 250) / map.physics.ppm;
  928. discs[disc].xv = map.spawns[window.BBSpawns.keepPositions[disc]].xv / map.physics.ppm;
  929. discs[disc].yv = map.spawns[window.BBSpawns.keepPositions[disc]].yv / map.physics.ppm;
  930. discs[disc].sx = discs[disc].x;
  931. discs[disc].sy = discs[disc].y;
  932. discs[disc].sxv = discs[disc].xv;
  933. discs[disc].syv = discs[disc].yv;
  934. window.BBSpawns.keepPositions[disc] = undefined;
  935. ${bigvar}.bonkHost.state.discs[disc] = undefined;
  936. }
  937. }
  938. }else{
  939. for(let disc = 0; disc < discs.length; disc++){
  940. if(discs[disc] != null && window.BBSpawns.spawnPointData[disc] != null){
  941. discs[disc].x = (map.spawns[window.BBSpawns.spawnPointData[disc]].x + 365) / map.physics.ppm;
  942. discs[disc].y = (map.spawns[window.BBSpawns.spawnPointData[disc]].y + 250) / map.physics.ppm;
  943. discs[disc].xv = map.spawns[window.BBSpawns.spawnPointData[disc]].xv / map.physics.ppm;
  944. discs[disc].yv = map.spawns[window.BBSpawns.spawnPointData[disc]].yv / map.physics.ppm;
  945. discs[disc].sx = discs[disc].x;
  946. discs[disc].sy = discs[disc].y;
  947. discs[disc].sxv = discs[disc].xv;
  948. discs[disc].syv = discs[disc].yv;
  949. }
  950. }
  951. }
  952. window.BBSpawns.exitMenu();
  953. `);
  954. let roomLeaveRegex = newSrc.match(/\(\);[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]=null;}[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]\[[A-Za-z0-9\$_]{3}\[[0-9]{1,3}]\[[0-9]{1,3}]]=null;/g);
  955. newSrc = newSrc.replace(roomLeaveRegex, roomLeaveRegex + `window.BBSpawns.roomLeave();window.BBSpawns.exitMenu();`);
  956. console.log(`${scriptName} injector run`);
  957. return newSrc;
  958. }
  959.  
  960. if(!window.bonkCodeInjectors) window.bonkCodeInjectors = [];
  961.  
  962. window.bonkCodeInjectors.push(bonkCode => {
  963. try {
  964. return injector(bonkCode);
  965. } catch (error) {
  966. alert(`Whoops! ${scriptName} was unable to load.`);
  967. throw error;
  968. }
  969. });
  970.  
  971. console.log(`${scriptName} injector loaded`);