 
        Greasy Fork is available in English.
A userscript to add custom gamemode VarTOL to bonk.io
当前为 
// ==UserScript==
// @name         bonk-vartol
// @version      1.1.2
// @author       Blu
// @description  A userscript to add custom gamemode VarTOL to bonk.io
// @match        https://bonk.io/gameframe-release.html
// @run-at       document-start
// @grant        none
// @namespace http://greasyfork.icu/users/826975
// ==/UserScript==
 
// for use as a userscript ensure you have Excigma's code injector userscript
// http://greasyfork.icu/en/scripts/433861-code-injector-bonk-io
 
const injectorName = `VarTOL`;
const errorMsg = `Whoops! ${injectorName} was unable to load.
This may be due to an update to Bonk.io. If so, please report this error!
This could also be because you have an extension that is incompatible with \
${injectorName}`;
 
 
 
function injector(src){
	let newSrc = src;
  
  // Add the VTOL movement code
  newSrc = newSrc.replace(`T7k[68][u7k[7][101]](u7k[3]);}`, VARTOL_GAME);
  
  // Allow VarTOL to be selected
	newSrc=newSrc.replace(`[G9b.z43(107),G9b.z43(1131),G9b.z43(1132),G9b.z43(1133),`, VARTOL_MODE);
	newSrc=newSrc.replace(`v2k[10][v2k[7][551]][G9b.A43(116)]={lobbyName:G9b.A43(2094),gameStartName:G9b.A43(2095),lobbyDescription:G9b.z43(2096),tutorialTitle:G9b.A43(2097),tutorialText:G9b.A43(2098),forceTeams:true,forceTeamCount:2,editorCanTarget:false};`, MODE_METADATA);
  
  // register outline, bow, and jetpack graphics
  newSrc = newSrc.replace(`this[o1k[7][149]][o1k[7][118]] == G9b.z43(1132)`, `this[o1k[7][149]][o1k[7][118]] == G9b.z43(1132) || this.gameSettings.mo == "var"`);
  newSrc = newSrc.replace(`this[o1k[7][149]][o1k[7][118]] == G9b.A43(1132)`, `this[o1k[7][149]][o1k[7][118]] == G9b.A43(1132) || this.gameSettings.mo == "var"`);
	newSrc = newSrc.replace(`build(Y7E,N7E) {`,RENDER_JETPACK);
  
  // Attempt to add var in same places as ar
  // recover cooldown a1a +8 to 1000
  newSrc = newSrc.replace(`&& (T7k[0][4][T7k[2][118]] == "ar" ||`,`&& (T7k[0][4][T7k[2][118]] == "ar" || T7k[0][4].mo == "var" ||`);
  // arrow direction and charge
  newSrc = newSrc.replace(`if(T7k[0][4][T7k[2][118]] == "ar" ||`, `if(T7k[0][4][T7k[2][118]] == "ar" || T7k[0][4].mo == "var" ||`);
  // doArrows
  newSrc = newSrc.replace(`this[G0M[149]][G0M[118]] == "ar"`, `this[G0M[149]][G0M[118]] == "ar" || this.gameSettings.mo == "var"`);
  // start with half arrow charge
  newSrc = newSrc.replace(`k7k[0][5][k7k[4][118]] == G9b.z43(1131)`, `k7k[0][5][k7k[4][118]] == G9b.z43(1131) || k7k[0][5].mo == "var"`);
  
  // Attempt to add var in same places as v
  // body rotation true
  newSrc = newSrc.replace(`if(T7k[0][4][T7k[2][118]] == "v"){T7k[46][T7k[2][198]]=false;`, `if(T7k[0][4][T7k[2][118]] == "v" || T7k[0][4].mo == "var"){T7k[46][T7k[2][198]]=false;`);
  // vtolwing physics
  newSrc = newSrc.replace(`){T7k[72]=new v2k[13]();`, `|| T7k[0][4].mo == "var"){T7k[72]=new v2k[13]();`);
  // ??? draw rects but not called :/
  // newSrc = newSrc.replace(`if(B1V[0][3][B1V[3][118]] == S9L.C1E(62)){B`, `if(B1V[0][3][B1V[3][118]] == S9L.C1E(62) || B1V[0][3][B1V[3][118]] == "var"){debugger; B`);
  // ??? idek
  // newSrc = newSrc.replace(`B1V[0][3][B1V[3][118]] == S9L.C1E(62)){f`, `B1V[0][3][B1V[3][118]] == S9L.C1E(62) || B1V[0][3][B1V[3][118]] == "var"){f`);
  
  // Account for body rotation when firing
  newSrc = newSrc.replace(`T7k[4][T7k[653]][T7k[2][190]] *`, ARROW_COMPENSATION);
 
	if(src === newSrc) throw "Injection failed!";
	console.log(injectorName+" injector run");
	return newSrc;
}
 
 
 
// Adds VarTOL to mode selection button
const VARTOL_MODE= `[G9b.z43(107),G9b.z43(1131),G9b.z43(1132),G9b.z43(1133),"var",`;
// Adds VarTOL to bonk mode directory
const MODE_METADATA= `v2k[10][v2k[7][551]][G9b.A43(116)]={lobbyName:G9b.A43(2094),gameStartName:G9b.A43(2095),lobbyDescription:G9b.z43(2096),tutorialTitle:G9b.A43(2097),tutorialText:G9b.A43(2098),forceTeams:true,forceTeamCount:2,editorCanTarget:false}; v2k[10].modes.var = {lobbyName:"VarTOL",gameStartName:"VARTOL",lobbyDescription:"VTOL and Arrows had a baby. And this baby knows how to rock.",tutorialTitle:"VarTOL Mode",tutorialText:"•Fly around with the arrow keys\\r\\n•Hold Z to draw an arrow\\r\\n•Hold X to make yourself heavier",forceTeams:false,forceTeamCount:null,editorCanTarget:false};`;
// Renders jetpack
const RENDER_JETPACK=`
build(Y7E,N7E) {
  var o1k=[arguments];
  o1k[7]=v8yy;
	if(this.gameSettings.mo == "var") {
		this.VTOLWing = new PIXI.Graphics();
		this.VTOLWing.beginFill(0xff3030);
		this.VTOLWing.drawRect(
			this.radius * (-E.footHW + E.footOffsetX),
			this.radius * (-E.footHH + E.footOffsetY),
			this.radius * (E.footHW * 6),
			this.radius * (E.footHH * 2)
		);
		this.container.addChild(this.VTOLWing);
	}`;
 
const VARTOL_GAME = `T7k[68][u7k[7][101]](u7k[3]);} if (T7k[0][4].mo == "var") {
  let player = T7k[4][T7k[653]];
	let fullPowerMultiplier = (-22/30)*T7k[915];
	let weakMultiplier = 0.12;
  
	let fullPower = new v2k[1](0,fullPowerMultiplier);
	fullPower = player.body.GetWorldVector(fullPower,fullPower);
	let weakPower = new v2k[1](0,fullPowerMultiplier*weakMultiplier);
	weakPower = player.body.GetWorldVector(weakPower, weakPower);
  
	let leftWing = player.body.GetWorldPoint(new v2k[1](E.footOffsetX*T7k[915], E.footOffsetY*T7k[915]));
	let rightWing = player.body.GetWorldPoint(new v2k[1](-E.footOffsetX*T7k[915], E.footOffsetY*T7k[915]));
  
	let jetpackInput = "none";
  let playerInput = T7k[0][1][T7k[653]];
  if(playerInput.up) jetpackInput = "both";
  if(player.ds == 0){
    if(playerInput.left) jetpackInput = "right";
    if(playerInput.right) jetpackInput = "left";
    if(playerInput.left && playerInput.right) jetpackInput = "both";
  }
  
	if(jetpackInput=="both") {
		player.body.ApplyImpulse(fullPower,leftWing);
		player.body.ApplyImpulse(fullPower,rightWing);
	}
	if(jetpackInput=="left") {
		player.body.ApplyImpulse(fullPower,leftWing);
		player.body.ApplyImpulse(weakPower,rightWing);
	}
	if(jetpackInput=="right") {
		player.body.ApplyImpulse(weakPower,leftWing);
		player.body.ApplyImpulse(fullPower,rightWing);
	}
}`;
// Calculate player angle from rotation matrix and add to the arrow's angle
const ARROW_COMPENSATION = `(T7k[4][T7k[653]][T7k[2][190]] + (-Math.round(Math.atan2(T7k[4][T7k[653]].body.m_xf.R.col2.x, T7k[4][T7k[653]].body.m_xf.R.col1.x) * (180/Math.PI)))) *`;
 
 
 
// Compatibility with Excigma's code injector userscript
if(!window.bonkCodeInjectors) window.bonkCodeInjectors = [];
window.bonkCodeInjectors.push(bonkCode => {
	try {
		return injector(bonkCode);
	} catch (error) {
		alert(errorMsg);
		throw error;
	}
});
 
console.log(injectorName+" injector loaded");