Haxball Avatar Change

Sexy script for haxball

当前为 2020-10-08 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Haxball Avatar Change
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Sexy script for haxball
// @author       Of course from alpha the grey goat
// @match        https://www.haxball.com/play
// @grant        unsafeWindow
// ==/UserScript==

(function() {
    'use strict';

/// Haxball quick script for avatars, texts, spams. by alpha ///
/// For using this script, append the script into console log while haxball is on browser. ///
/// I recommend that backup this script for using again, if you lose it! ///

/////////////////****  CONFUGIRATIONS ****/////////////////
/////////////////****  CONFUGIRATIONS ****/////////////////
/////////////////****  CONFUGIRATIONS ****/////////////////

// You can configure avatars, keys to change modes

/// Default Avatar ///
// This is your default avatar. Your avatar returns default avatar 0.5(500ms) seconds after you use avatar keys. You can
// deactivate this by changing 'defAvatarActive' variable to false and you can set the delay of default avatar by miliseconds
// 1000ms = 1 second. 500ms = 0.5 second
// defAvatarMaxDelay is maximum delay time, when you increase delay if it passes maximum value it returns 250 miliseconds as delay;
// defAvatarDelayIncreasement is when you press the increasement key, it adds miliseconds increasement of your entered value

let defAvatar = "😄";
let defAvatarActive = true;
let defAvatarDelay = 500;
let defAvatarMaxDelay = 3000;
let defAvatarDelayIncreasement = 250;

/// You can store your emojis below here and copy paste it.
//😄🐐

/// Mode changing keys ///
// I added second key to change because when Caps Lock is active. If you have case-sentetive keys, you should use second config
// e.g. first key is 'g' second key is 'G'
// <<<EMPTY>>> means not used.

// When you want to return your default avatar above after pressing avatar keys
let defAvatarActiveKey1 = 'ş';
let defAvatarActiveKey2 = 'Ş';

// Key for changing main mode [Avatar, Text, Chat Spam, Avatar Spam]
let changeMainMode1 = 'Shift';
let changeMainMode2 = '<<<EMPTY>>>';

// Key for changing Avatar Slot [a1, a2, a3, a4]
let changeAvatarMode1 = ',';
let changeAvatarMode2 = '<<<EMPTY>>>';

// Key for changing Text Slot [t1, t2, t3, t4]
let changeTextMode1 = 'ü';
let changeTextMode2 = 'Ü';

// Key for changing Chat Spam Slot // IN CONSTRUCTION
let changeChatSpamMode1 = 'i';
let changeChatSpamMode2 = 'İ';

// Key for changing Avatar Spam Slot // IN CONSTRUCTION
let changeAvatarSpamMode1 = 'ç';
let changeAvatarSpamMode2 = 'Ç';

// Key for increasing default avatar delay;

let avatarReturnDelayIncreasement1 = '.';
let avatarReturnDelayIncreasement2 = '<<<EMPTY>>>';

// Key for changing default avatar in-game;

let defaultAvatarChangeKey1 = 'ç';
let defaultAvatarChangeKey2 = 'Ç';


/// Keys
// You can set the keys up from here to change avatar, type text and so on.
// These keys are important for using features of the script.
// For example key4 belongs to both configAvatar4 and configText4 below in confugiring avatars and texts.
// If you press key4 whereas a2(avatar slot #2) is activated, you select avatar of configAvatar4 and its second column.

let key1_1 = 'x'
let key1_2 = 'X'

let key2_1 = 'z'
let key2_2 = 'Z'

let key3_1 = 'c'
let key3_2 = 'C'

let key4_1 = 'w'
let key4_2 = 'W'

let key5_1 = 'a'
let key5_2 = 'A'

let key6_1 = 's'
let key6_2 = 'S'

let key7_1 = 'd'
let key7_2 = 'D'

let key8_1 = 'v'
let key8_2 = 'V'

let key9_1 = 'f'
let key9_2 = 'F'

/// Avatar Configuration ///
// You can change the avatar configurations from here. '[key]Button' variables represents the key
// and columns represents the inline mode(a1,a2,a3,a4). If you choose a1 mode, it will be avatar
// of first column of the depending key. a2 is second column from configurations below blah blah.
// e.g configAvatar4 variables fourth column is set to 👈 avatar. You can get this avatar when your a4 mode is active and press key4.
// You can keep them empty, if you wanna deactivate keys.
// e.g. First key of your config is set to 'x' 'X' key which is used for shooting. You don't want to change your avatar when shooting.

                     //a1  //a2  //a3 //a4
let configAvatar1 = ['👊🏿', '😝', 'a', '🐐'];

let configAvatar2 = ['🖕🏿', '😢', 'xD', '👑'];

let configAvatar3 = ['🍆', '😍', 'EZ', '🔥'];

let configAvatar4 = ['💩', '😎', ':D', '👆🏿'];

let configAvatar5 = ['🤡', '🥳', ':)','👈🏿'];

let configAvatar6 = ['👋🏿', '🤬', ':x','👇🏿'];

let configAvatar7 = ['❄️', '🤣', ':B','👉🏿'];

let configAvatar8 = ['👶🏻', '🤫', ':c','🤛🏿'];

let configAvatar9 = ['👄', '😴', ':@','🤜🏿'];

/// Text Configuration ///
// Same with avatar config by text mode.
// If you don't want to type anything, you must keep them empty.
// e.g. First key of your config is set to 'x' 'X' key which is used for shooting. You don't want to type anything when you press.

let configText1 = [
	"", // First column
	"", // Second column
	"", // Third column
	""  // Fourth column
];

let configText2 = [
	"Goooooooooooooooaaaalllll!!!",
	"",
	"",
	""
];

let configText3 = [
	"Pass!!!",
	"",
	"",
	""
];

let configText4 = [
	"Cmoonnn!!!",
	"",
	"",
	""
];

let configText5 = [
	"Nice Goal!!!",
	"",
	"",
	""
];

let configText6 = [
	"",
	"",
	"",
	""
];

let configText7 = [
	"",
	"",
	"",
	""
];

let configText8 = [
	"",
	"",
	"",
	""
];

let configText9 = [
	"",
	"",
	"",
	""
];

//////////////////
/// DEBUG MODE ///
//////////////////
// If you wanna see which key do you press via console, you should make this true
// This is useful when you wanna see which key do you wanna change modes with.
let debugModeActive = false;

//////////////**** CONFUGIRATION ENDS ****/////////////
//////////////**** CONFUGIRATION ENDS ****/////////////
//////////////**** CONFUGIRATION ENDS ****/////////////

let inputHax = null; //document.querySelector('.input input');
let buttonHax = null; //document.querySelector('.input button');

const modes = ['a', 't', "c", "s"];
let mode = modes[0];

const avatarModes = ["a1", "a2", "a3", "a4"];
const textModes = ["t1", "t2", "t3", "t4"];
const chatSpamModes = ["c1", "c2", "c3", "c4"];
const avatarSpamModes = ["s1", "s2", "s3", "s4"];

let avatarMode = avatarModes[0];
let textMode = textModes[0];
let chatSpamMode = chatSpamModes[0];
let avatarSpamMode = avatarSpamModes[0];
let lastAvatar = defAvatar;

let avatarPressed = 0;

let modeScreen = document.createElement('p');
let text = document.createTextNode('mode: ' + mode);
modeScreen.appendChild(text);
let body = document.querySelector('body');
body.prepend(modeScreen);
modeScreen.setAttribute('style', `position: fixed; right: 10%; bottom: 0%; color: white; background-color: rgba(0,0,255,0.44); font-size: 1.3rem; z-index: 9999999`);

let frameObj = document.querySelector('iframe.gameframe');
let frameWin = null;
let frameDoc = null;
if(frameObj != null)
{
	frameWin = frameObj.contentWindow;
}

if(frameWin == null)
{
	setInterval(function(){
		inputHax = document.querySelector('.input input');
		buttonHax = document.querySelector('.input button');
		console.log('Input Element Has Been Changed!')
	}, 2000)

	document.addEventListener('keydown', function(){
		press(event.key);
		debugMode(event.key);
	});
}
else
{
	frameDoc = frameWin.document;

	setInterval(function(){
		inputHax = frameDoc.querySelector('.input input');
		buttonHax = frameDoc.querySelector('.input button');
		frameDoc = frameWin.document;
		console.log('Input Element Has Been Changed!')
	}, 2000)

	frameWin.addEventListener('keydown', function(){
		press(event.key);
		debugMode(event.key);
	});
}

let displayMode = function(){

	let modeDisplay = null;

	switch(mode)
	{
		case modes[0]:
			modeDisplay = avatarMode;
		break;
		case modes[1]:
			modeDisplay = textMode;
		break;
		case modes[2]:
			modeDisplay = chatSpamMode;
		break;
		case modes[3]:
			modeDisplay = avatarSpamMode;
		break;
	}

	modeScreen.innerHTML = 'M: ' + modeDisplay + ' | Def Avt: ' + defAvatarActive + ' | Def Dly: ' + defAvatarDelay + ' | Def: ' + defAvatar;
}

let chatize = function(key)
{
	return '/avatar ' + key;
}

let changeAvatar = function(key)
{
	inputHax.value = chatize(key);
	buttonHax.click();
	lastAvatar = key;
	removeAvatarSet();
	if(defAvatarActive){
		returnDefAvatar();
	}
}

let press = function(key)
{
	if(key == defaultAvatarChangeKey1 || key == defaultAvatarChangeKey2)
	{
		defAvatar = lastAvatar;
		displayMode();
	}

	if(key == avatarReturnDelayIncreasement1 || key == avatarReturnDelayIncreasement2)
	{
		defAvatarDelay += defAvatarDelayIncreasement;
		if(defAvatarDelay > defAvatarMaxDelay)
		{
			defAvatarDelay = 250;
		}
		displayMode();
	}

	if(key == defAvatarActiveKey1 || key == defAvatarActiveKey2)
	{
		if(defAvatarActive)
		{
			defAvatarActive = false;
		}
		else
		{
			defAvatarActive = true;
		}
		displayMode();
	}

	if(key == changeMainMode1 || key == changeMainMode2)
	{
		let modesLen = modes.length;
		let modeIndex = modes.indexOf(mode);

		if(modeIndex < modesLen - 1)
		{
			mode = modes[modeIndex + 1];
			displayMode();
		}
		else
		{
			mode = modes[0];
			displayMode();
		}
	}

	if(key == changeAvatarMode1 || key == changeAvatarMode2)
	{
		let modesLen = avatarModes.length;
		let modeIndex = avatarModes.indexOf(avatarMode);

		if(modeIndex < modesLen - 1)
		{
			avatarMode = avatarModes[modeIndex + 1];
			displayMode();
		}
		else
		{
			avatarMode = avatarModes[0];
			displayMode();
		}
	}

	if(key == changeTextMode1 || key == changeTextMode2)
	{
		let modesLen = textModes.length;
		let modeIndex = textModes.indexOf(textMode);

		if(modeIndex < modesLen - 1)
		{
			textMode = textModes[modeIndex + 1];
			displayMode();
		}
		else
		{
			textMode = textModes[0];
			displayMode();
		}
	}

	if(key == changeChatSpamMode1 || key == changeChatSpamMode2)
	{
		let modesLen = chatSpamModes.length;
		let modeIndex = chatSpamModes.indexOf(chatSpamMode);

		if(modeIndex < modesLen - 1)
		{
			chatSpamMode = chatSpamModes[modeIndex + 1];
			displayMode();
		}
		else
		{
			chatSpamMode = chatSpamModes[0];
			displayMode();
		}
	}

	if(key == changeAvatarSpamMode1 || key == changeAvatarSpamMode2)
	{
		let modesLen = avatarSpamModes.length;
		let modeIndex = avatarSpamModes.indexOf(avatarSpamMode);

		if(modeIndex < modesLen - 1)
		{
			avatarSpamMode = avatarSpamModes[modeIndex + 1];
			displayMode();
		}
		else
		{
			avatarSpamMode = avatarSpamModes[0];
			displayMode();
		}
	}

	if(mode == 'a')
	{
		switch(key)
		{
			case key1_1:
			case key1_2:
				changeAvatar(configAvatar1[avatarModes.indexOf(avatarMode)]);
			break;
			case key2_1:
			case key2_2:
				changeAvatar(configAvatar2[avatarModes.indexOf(avatarMode)]);
			break;
			case key3_1:
			case key3_2:
				changeAvatar(configAvatar3[avatarModes.indexOf(avatarMode)]);
			break;
			case key4_1:
			case key4_2:
				changeAvatar(configAvatar4[avatarModes.indexOf(avatarMode)]);
			break;
			case key5_1:
			case key5_2:
				changeAvatar(configAvatar5[avatarModes.indexOf(avatarMode)]);
			break;
			case key6_1:
			case key6_2:
				changeAvatar(configAvatar6[avatarModes.indexOf(avatarMode)]);
			break;
			case key7_1:
			case key7_2:
				changeAvatar(configAvatar7[avatarModes.indexOf(avatarMode)]);
			break;
			case key8_1:
			case key8_2:
				changeAvatar(configAvatar8[avatarModes.indexOf(avatarMode)]);
			break;
			case key9_1:
			case key9_2:
				changeAvatar(configAvatar9[avatarModes.indexOf(avatarMode)]);
			break;
		}
	}

	if(mode == 't'){
		switch(key)
		{
			case key1_1:
			case key1_2:
				inputHax.value = configText1[textModes.indexOf(textMode)];
				buttonHax.click();
			break;
			case key2_1:
			case key2_2:
				inputHax.value = configText2[textModes.indexOf(textMode)];
				buttonHax.click();
			break;
			case key3_1:
			case key3_2:
				inputHax.value = configText3[textModes.indexOf(textMode)];
				buttonHax.click();
			break;
			case key4_1:
			case key4_2:
				inputHax.value = configText4[textModes.indexOf(textMode)];
				buttonHax.click();
			break;
			case key5_1:
			case key5_2:
				inputHax.value = configText5[textModes.indexOf(textMode)];
				buttonHax.click();
			break;
			case key6_1:
			case key6_2:
				inputHax.value = configText6[textModes.indexOf(textMode)];
				buttonHax.click();
			break;
			case key7_1:
			case key7_2:
				inputHax.value = configText7[textModes.indexOf(textMode)];
				buttonHax.click();
			break;
			case key8_1:
			case key8_2:
				inputHax.value = configText8[textModes.indexOf(textMode)];
				buttonHax.click();
			break;
			case key9_1:
			case key9_2:
				inputHax.value = configText9[textModes.indexOf(textMode)];
				buttonHax.click();
			break;
		}
	}

	removeAvatarSet();
}

let sleep = function(delay)
{
	return new Promise(resolve => setTimeout(resolve, delay));
}

let returnDefAvatar = async function()
{
	avatarPressed++;
	await sleep(defAvatarDelay);
	avatarPressed--;
	if(avatarPressed == 0)
	{
		inputHax.value = '/avatar ' + defAvatar;
		buttonHax.click();
		removeAvatarSet();
	}
}

let removeAvatarSet = function()
{
	unsafeWindow.noticeList = frameDoc.querySelectorAll('div.log p.notice');
	for(let i = 0; i < unsafeWindow.noticeList.length; i++)
	{
		if(unsafeWindow.noticeList[i].innerText == 'Avatar set')
		{
			unsafeWindow.noticeList[i].parentNode.removeChild(unsafeWindow.noticeList[i]);
		}
	}
}

let debugMode = function(key)
{
	if(debugModeActive)
	{
		console.log(key);
	}
}

displayMode();
})();