// ==UserScript== // @name bonk editor // @version e1.1_t1.2 // @description Makes editor a bit better // @author Apx // @match https://bonk.io/gameframe-release.html // @match https://bonkisback.io/gameframe-release.html // @run-at document-end // @namespace https://greasyfork.org/users/1272759 // @grant none // @downloadURL none // ==/UserScript== const scriptName = "editer"; const guiSettings = { noWindow: true, settingsContent: null, bonkLIBVersion: "1.1.3", modVersion: "1.0_1.2", } window.bonkEditor = { rangeView: 100 * 1024, lineWidth: function (width) { console.log(arguments) return window.bonkEditor.arguments[1] == "editor"? width*2/arguments[1].transform.scale.x : width; }, } function injector(src){ let newSrc = src; let CSS = document.createElement('style'); CSS.innerHTML = ` #mapeditor_colorpicker_transparency_slider{ margin-left: 0px; background-color: transparent; margin-top: -2px; } #mapeditor_colorpicker_alphalabel{ color:#ffffff; } `; document.getElementsByTagName('head')[0].appendChild(CSS); let label = document.createElement('span'); document.getElementById('mapeditor_colorpicker').insertBefore(label, document.getElementById("mapeditor_colorpicker_existingcontainer")); label.outerHTML = `Alpha (0)`; let slider = document.createElement('input'); document.getElementById('mapeditor_colorpicker').insertBefore(slider, document.getElementById("mapeditor_colorpicker_existingcontainer")); slider.outerHTML = ``; function patch (src, newsrc) { newSrc = newSrc.replace(src, newsrc); }; function log(regex){ console.log(typeof(regex) == "string"?regex:(Array.isArray(regex)?regex:newSrc.match(regex))); }; // bonk alpha (only v49 support) let r1 = newSrc.match(/E80\[5]\[E80\[9]\[116]] <= 0xffffff/); let r2 = newSrc.match(/this\[m\$J\[1571]]\[m\$J\[430]]\(I80\[m\$J\[116]]\);/); let r3 = newSrc.match(/x6Z\[840]\[x6Z\[8]\[430]]\(x6Z\[519]\[x6Z\[8]\[116]]\);/); // editor let r4 = newSrc.match(/T_U\[8]\[T_U\[6]\[1017]]/g); let r5 = newSrc.match(/\(1,T_U\[89]\)\(a2T\(T_U\[14],T_U\[77],T_U\[47]\)\);/); let r6 = newSrc.match(/function\(x6s\){var H\$J=\[arguments];H\$J\[1]=M\$QCc;R3M\[9]\[H\$J\[1]\[116]]=H\$J\[0]\[0];N_A\(true\);k7V\.t8H\(\);R3M\[31]\[H\$J\[1]\[461]]\[H\$J\[1]\[1025]]=t\$e\[61]\[H\$J\[1]\[1029]]\(H\$J\[0]\[0]\);}/); let r7 = newSrc.match(/var J22=\[arguments];/); let r8 = newSrc.match(/\(1,T_U\[89]\)\(T_U\[71]\);/); // editor const widthRoundingRegex = newSrc.match(/[a-zA-Z0-9\$_]{3}\[[0-9]{1,3}]]\[[a-zA-Z0-9\$_]{3}\[[0-9]{1,3}]\[[0-9]{1,3}]]=Math\[[a-zA-Z0-9\$_]{3}\[[0-9]{1,3}]\[[0-9]{1,3}]]\([a-zA-Z0-9\$_]{3}\[[0-9]{2,3}]\);[a-zA-Z0-9\$_]{3}\(true\)/)[0]; const rectPosRegex = newSrc.match(/[a-zA-Z0-9\$_]{3}\[[0-9]{1,3}]\[[a-zA-Z0-9\$_]{3}\[[0-9]{1,3}]\[[0-9]{1,3}]]\[[0-1]]=Math\[[a-zA-Z0-9\$_]{3}\[[0-9]{1,3}]\[[0-9]{1,3}]]\([a-zA-Z0-9\$_\[\]]+\);/g).map((x) => {return x.split("=")}); const platZindex = newSrc.match(/function [a-zA-Z0-9\$_]{3}\(\){[a-zA-Z0-9-+=_ \$;\(\)[\]{}\.,!]*?}}[a-zA-Z0-9\$_]{3}\(\);[a-zA-Z0-9\$_]{3}\(true\);}/g)[0]; const arrayBufferRegex = newSrc.match(/(?<=new ArrayBuffer\()k7V\.Q5\$\(100,1024\)/)[0]; const spawnId = newSrc.match(/[a-zA-Z0-9\$_]{3}\[[0-9]{1,3}](?=--;}else {(?!if))/)[0]; patch(r5, `(1,T_U[89])(a2T(T_U[14],T_U[77],T_U[47]),document.getElementById("mapeditor_colorpicker_transparency_slider").value);`); patch(r6, `function(x6s,alph){var H$J=[arguments];H$J[1]=M$QCc;R3M[9][H$J[1][116]]=H$J[0][0]+(alph==1?0:(Math.round((alph*100+1))*0x1000000));let textValue = alph;if(alph==1){textValue = "Opaque";}else if(alph==0){textValue = "Invisible";}document.getElementById("mapeditor_colorpicker_alphalabel").textContent = \`Transparency (\${textValue})\`;N_A(true);k7V.t8H();R3M[31][H$J[1][461]][H$J[1][1025]]=t$e[61][H$J[1][1029]](H$J[0][0]);}`); patch(r7, r7+`document.getElementById("mapeditor_colorpicker_transparency_slider").value = ((J22[0][0] >> 24 & 255)-1)/100<0?1:((J22[0][0] >> 24 & 255)-1)/100;`); patch(r8, `(1,T_U[89])(T_U[71],document.getElementById("mapeditor_colorpicker_transparency_slider").value);`); patch(r4, `document.getElementById("mapeditor_colorpicker_transparency_slider").onchange = function () {h1N(false)};document.getElementById("mapeditor_colorpicker_transparency_slider").oninput = function () {h1N(false)};`+r4); patch(r1, r1+`ff`); patch(r2, `let alpha = ((I80[m$J[116]] >> 24 & 255)-1)/100;this[m$J[1571]][m$J[430]](parseInt(t$e[61].numToHex(I80[m$J[116]]).substring(1),16),(alpha<0?1:Math.min(alpha,1)));`); patch(r3, `let alpha = ((x6Z[519][x6Z[8][116]] >> 24 & 255)-1)/100;x6Z[840][x6Z[8][430]](parseInt(t$e[61].numToHex(x6Z[519][x6Z[8][116]]).substring(1),16),(alpha<0?1:Math.min(alpha,1)));`); // move up / down spawns const vars = platZindex.match(/(? 250000){ window.bonkEditor.menu.showStatusMessage("* Protected from being kicked out of the room.","#b53030",false); return; } ws.call(this,args); } if(src === newSrc) throw "Injection failed!"; console.log(`${scriptName} injector run`); return newSrc; } if(!window.bonkCodeInjectors) window.bonkCodeInjectors = []; window.bonkCodeInjectors.push(bonkCode => { try { return injector(bonkCode); } catch (error) { alert(`Whoops! ${scriptName} was unable to load.`); throw error; } }); if (window.bonkHUD) { const label = (target, text, ...elements) => { let div = document.createElement("div"); let labelElement = document.createElement("label"); labelElement.classList.add("bonkhud-settings-label"); labelElement.textContent = text; labelElement.style.marginRight = "5px"; labelElement.style.display = "inline-block"; labelElement.style.verticalAlign = "middle"; target.appendChild(div); div.appendChild(labelElement); for(let element in elements) div.appendChild(elements[element]) } const option = (target, text, value) => { let option = document.createElement("option"); option.value = value; option.textContent = text; target.appendChild(option) } let settings = window.bonkHUD.generateSection(); guiSettings.settingsContent = settings; const ind = window.bonkHUD.createMod("bonk editor & transparency", guiSettings); let rangeView = document.createElement("input"); rangeView.style.width = "40px"; rangeView.style.height = "19px"; rangeView.value = "100"; rangeView.oninput = (event) => { event.target.value = event.target.value.replaceAll(/[^0-9]+/g, ''); event.target.value = String(Math.min(Math.max(parseInt(event.target.value) || 0, 0), 1024)); if(event.target.parentNode.lastChild.nodeName == "SPAN") return; let span = document.createElement("span"); span.textContent = "* not applied"; span.style["margin-left"] = "5px"; span.style.color = "#000000aa"; event.target.parentNode.appendChild(span); } let unit = document.createElement("select"); option(unit, "KB", "1"); option(unit, "MB", "2"); unit.onchange = (event) => { if(event.target.parentNode.lastChild.nodeName == "SPAN") return; let span = document.createElement("span"); span.textContent = "* not applied"; span.style["margin-left"] = "5px"; span.style.color = "#000000aa"; event.target.parentNode.appendChild(span); }; let applyButton = window.bonkHUD.generateButton("Apply"); applyButton.style.display = "inline-block"; applyButton.style.padding = "0 5px"; applyButton.onclick = () => { window.bonkEditor.rangeView = parseInt(rangeView.value) * (1024 ** parseInt(unit.value)); if(unit.parentNode.lastChild.nodeName == "SPAN") unit.parentNode.removeChild(unit.parentNode.lastChild); } label(settings, "Array buffer range view", rangeView, unit, applyButton); settings.appendChild(applyButton); window.bonkHUD.updateStyleSettings(); }