Improved Bullet Stacking By Mekhi Maragh

Makes some tanks more powerful (Tri-angle branch, spread shot, penta shot, octo tank, gunner trapper, streamliner).

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Improved Bullet Stacking By Mekhi Maragh
// @include	    *://arras.io/*
// @author      Mekhi MAragh
// @description Makes some tanks more powerful (Tri-angle branch, spread shot, penta shot, octo tank, gunner trapper, streamliner).
// @connect	    diep.io
// @namespace   aaa
// @version 69
// ==/UserScript==
 
/*
How to Use:
Press Shift+R to cycle through the tanks.
Press Shift+Q to disable/enable the script.
Press I to hide the dialog. (The script remains functional, though).
Hold rightclick to activate . For best results, leave autofire off for a bit before doing so.
If necessary, press Shift+M to re-calibrate the script. Wait for the ms to stabilise.
Note: This calibration may break for Triple Twin, and is unnecessary for Streamliner.
*/
(function(){//info
	if(window.updateInfo) return;
 
 
	var info = {};
	var info_container = document.createElement("div");
	info_container.style.position = "fixed";
	info_container.style.color = "blue";
	info_container.style["pointer-events"] = "none";
	document.body.appendChild(info_container);
 
	function toggle_info_container(e){
		if(e.key == "i"){
			info_container.style.display = info_container.style.display=="block" ? "none" : "block";
		}
	}
	window.addEventListener("keyup", toggle_info_container);
 
	window.updateInfo = function(key, value){
		if(!value) delete info[key];
		else info[key] = value;
		var s = "";
		for(var _key in info){
			s += info[_key] + "\n";
		}
		info_container.innerText = s;
	};
})();
 
function MeasureCycle(){
	var canvas = document.getElementById("canvas");
	var ctx = canvas.getContext("2d");
	var real_arc = ctx.arc;
	var real_setTransform = ctx.setTransform;
 
	var a;
	var tx = 0, ty = 0;
	var a11 = 1;
 
	var state = false;
	var found = false;
	var inA = null;
	var direction = 1;
 
	var frameRequest;
	var intervalEMA = null; // ms
 
	function arc(){
		real_arc.apply(ctx, arguments);
 
		if(!found){
			var aimX = window.innerWidth / 2 + 50 * direction;
			var aimY = window.innerHeight / 2;
			found = (tx - a11 < aimX) && (tx + a11 > aimX) && (ty - a11 < aimY) && (ty + a11 > aimY);
		}
	}
 
	function setTransform(b11, b12, b21, b22, bx, by){
		real_setTransform.apply(ctx, arguments);
		tx = bx, ty = by, a11 = b11;
	}
 
	function onFrame(_a){
		frameRequest = window.requestAnimationFrame(onFrame);
		a = _a;
		if(!state && found){
			if(inA){
				var da = a - inA;
				inA = a;
				intervalEMA = intervalEMA ? 0.8 * intervalEMA + 0.2 * da : da;
				window.updateInfo && window.updateInfo(
					"intervalEMA",
					"Fire Period: " + intervalEMA.toString().substr(0, 5) + "ms"
				);
 
			}else{
				inA = a;
			}
		}
		state = found;
		found = false;
	}
 
	function onMouseEvent(e){
		e.stopPropagation();
	}
 
	this.start = function(_direction){
		_direction = _direction || 1;
		direction = _direction > 0 ? 1 : -1;
		inA = null;
		intervalEMA = null;
		state = found = false;
 
		ctx.setTransform = setTransform;
		ctx.arc = arc;
 
		var aimX = window.innerWidth / 2 + 50 * direction;
		var aimY = window.innerHeight / 2;
		canvas.dispatchEvent(new MouseEvent("mousemove", {clientX: aimX, clientY: aimY}));
		canvas.dispatchEvent(new MouseEvent("mousedown", {clientX: aimX, clientY: aimY}));
 
		window.addEventListener("mousemove", onMouseEvent, true);
		window.addEventListener("mouseup", onMouseEvent, true);
		window.addEventListener("mousedown", onMouseEvent, true);
		frameRequest = window.requestAnimationFrame(onFrame);
 
		window.updateInfo && window.updateInfo("measuring", "Measuring...");
	}
 
	this.terminate = function(){
		ctx.setTransform = real_setTransform;
		ctx.arc = real_arc;
 
		window.removeEventListener("mousemove", onMouseEvent, true);
		window.removeEventListener("mousedown", onMouseEvent, true);
		window.removeEventListener("mouseup", onMouseEvent, true);
		window.cancelAnimationFrame(frameRequest);
 
		canvas.dispatchEvent(new MouseEvent("mouseup", {clientX: 10, clientY: 10}));
 
		window.updateInfo && window.updateInfo("measuring", null);
		return intervalEMA;
	}
};
 
(function(){
	var cycleRate = 0.003125; // ms^-1
	var maxAngle = Math.PI * 45 / 180;
    var secAngle = 0;
    var cycleCounter = 1;
	var NCANNON = 3;
	var angleUnit = maxAngle / (NCANNON - 1);
    var secUnit = secAngle;
    var ax30945=1;
    var sec=false;
	var tankData = [
        {name: "Tri-angle Stack", cycleRate: 0.003125, maxAngle: Math.PI * 150 / 180, secondaryAngle: Math.PI * 150 / 180, NCANNON: 2},
        {name: "Fighter Stack", cycleRate: 0.003135, maxAngle: Math.PI * 90 / 175, secondaryAngle: Math.PI/2, NCANNON: 2},
        {name: "bycycle's retarded script", cycleRate: 0.003125, maxAngle: Math.PI, secondaryAngle: Math.PI, NCANNON: 2},
		{name: "Penta Stack broken", cycleRate: 0.003125, maxAngle: Math.PI/4, secondaryAngle: Math.PI/4, NCANNON: 3},
		{name: "Spread Stack boken", cycleRate: 0.001555, maxAngle: Math.PI * 75 / 180, secondaryAngle: Math.PI * 75 / 180, NCANNON: 6},
		{name: "Octo Stack", cycleRate: 0.003125, maxAngle: Math.PI/4, secondaryAngle: Math.PI/4, NCANNON: 2},
        {name: "GunnerTrapper",cycleRate: 0.0125, maxAngle: Math.PI, secondaryAngle: Math.PI, NCANNON: 2},
        {name: "Streamliner Spread", cycleRate: 0.0625, maxAngle: Math.PI * 15 / 180, secondaryAngle: Math.PI * 15 / 180, NCANNON: 3},
        {name: "random spinny flick shit idk", cycleRate: 0.001, maxAngle: 0, secondaryAngle: 0, NCANNON: 2},
	];
	var tankIndex = 0;
 
	var measure = new MeasureCycle();
	var measuring = false;
 
	var effective = false;
	var frameRequest;
    var toggle1 = true;
    var toggle2 = false;
	var canvas = window.document.getElementById("canvas");
 
	var mouseX;
	var mouseY;
	var a = 0;
	var startA = 0;
	var artificialMouseMove = false;
 
	var disabled = false;
	function onMouseDown(e){
		if(e.button == 2){
            sec=false;
			if(!effective){
				startA = a - 25;
				mouseX = e.clientX;
				mouseY = e.clientY;
				canvas.dispatchEvent(new MouseEvent("mousedown", {clientX: mouseX, clientY: mouseY}));
			}
			effective = true;
                    cycleCounter=0;
		}
	}
 
	function onMouseUp(e){
		if(e.button == 2){
			if(effective){
				canvas.dispatchEvent(new MouseEvent("mouseup", {clientX: mouseX, clientY: mouseY}));
			}
			effective = false;
		}
	}
 
	function onMouseMove(e){
		if(effective){
			if(!artificialMouseMove){
				e.stopPropagation();
				mouseX = e.clientX;
				mouseY = e.clientY;
			}
		}else{
			mouseX = e.clientX;
			mouseY = e.clientY;
		}
	}
 
	function update(_a){
		frameRequest = window.requestAnimationFrame(update);
		a = _a;
 
		if(effective){
			var da = a - startA;
			var state = Math.floor(cycleRate * da * NCANNON) % (NCANNON * 2);
			var state1 = state % NCANNON;
			var state2 = Math.floor(state / NCANNON);
            var remainder=cycleRate*da*NCANNON-Math.floor(cycleRate*da*NCANNON);
			var angle = angleUnit * state1 * ax30945;
            var angle2 = secUnit * state1 * ax30945;
			var cx = window.innerWidth / 2;
			var cy = window.innerHeight / 2;
			window.updateInfo && window.updateInfo("reeeee", remainder);
 
            if (toggle2 && state1==0) {
                toggle2=false;
                cycleCounter++;
            }
            if (state1!=0) toggle2=true;
            if (cycleCounter%3==2) angle=angle2;
            //if (remainder>0.5) angle=0;
            //if (cycleCounter%2==1) angle=-angle;
			var sin = Math.sin(angle);
			var cos = Math.cos(angle);
 
			var x = mouseX - cx;
			var y = mouseY - cy;
			var _x = cos * x - sin * y;
			var _y = sin * x + cos * y;
			x = _x + cx;
			y = _y + cy;
 
			artificialMouseMove = true;
			canvas.dispatchEvent(new MouseEvent("mousemove", {clientX: x, clientY: y}));
			artificialMouseMove = false;
		} else {
            var data = tankData[tankIndex];
            if (data.name=="random spinny flick shit idk") {
                da = a - startA;
			state = Math.floor(0.01 * da * 4) % (4 * 2);
			 state1 = state % 4;
			 state2 = Math.floor(state / 4);
			 angle = Math.PI/3 * state1;
 
			 cx = window.innerWidth / 2;
			 cy = window.innerHeight / 2;
			 sin = Math.sin(angle);
			 cos = Math.cos(angle);
 
			 x = mouseX - cx;
			 y = mouseY - cy;
			 _x = cos * x - sin * y;
			 _y = sin * x + cos * y;
			x = _x + cx;
			y = _y + cy;
 
			artificialMouseMove = true;
			canvas.dispatchEvent(new MouseEvent("mousemove", {clientX: x, clientY: y}));
			artificialMouseMove = false;
            }
        }
	}
 
	function onKeyUp(e){
	    if(e.key == "Z") {
	        ax30945=1;
	    }
		if(e.key == "Q"){
			disabled = !disabled;
			if(disabled){
				if(measuring){
					cycleRate = 1 / measure.terminate();
					measuring = false;
				} else stop();
			}else start();
			window.updateInfo && window.updateInfo("off", disabled ? "Disabled." : null);
			return;
		}
 
		if(disabled) return;
 
		if(e.key == "N"){
			if(measuring){
				cycleRate = 1 / measure.terminate();
				start();
				measuring = false;
			}else{
				stop();
				measure.start(mouseX - window.innerWidth / 2);
				measuring = true;
			}
		}else if(e.key == "R"){
			changeTank((tankIndex + 1) % tankData.length);
		}
	}
 
	function changeTank(index){
		var data = tankData[index];
		tankIndex = index;
 
		cycleRate = data.cycleRate; // ms^-1
		maxAngle = data.maxAngle;
        secAngle = data.secondaryAngle;
		NCANNON = data.NCANNON;
		angleUnit = maxAngle / (NCANNON - 1);
        secUnit = secAngle / (NCANNON - 1);
 
		window.updateInfo && window.updateInfo("changeTank", "Tank: " + data.name);
	}
 
	function init(){
		window.addEventListener("keyup", onKeyUp);
		start();
		changeTank(0);
	}
 
	function start(){
		canvas.addEventListener("mousedown", onMouseDown);
		canvas.addEventListener("mouseup", onMouseUp);
		window.addEventListener("mousemove", onMouseMove, true);
		frameRequest = window.requestAnimationFrame(update);
	}
 
	function stop(){
		canvas.removeEventListener("mousedown", onMouseDown);
		canvas.removeEventListener("mouseup", onMouseUp);
		window.removeEventListener("mousemove", onMouseMove, true);
		window.cancelAnimationFrame(frameRequest);
		effective = false;
	}
 
 
	init();
 
})();