// ==UserScript== // @name !!!!Rumble // @version 4 // @namespace Hear the rumble // @author Project Victory // @description yo listen yu hear that killer is in jungle // @match *://*.moomoo.io/* // @icon https://i.makeagif.com/media/2-18-2019/fv-EMn.gif // @grant none // @downloadURL https://update.greasyfork.icu/scripts/495540/%21%21%21%21Rumble.user.js // @updateURL https://update.greasyfork.icu/scripts/495540/%21%21%21%21Rumble.meta.js // ==/UserScript== var RainbowCycle = 0; var cycle = 0; var HPBarColor = "black"; var NameBarColor = "black"; setInterval(() => { if (RainbowCycle > 359) { // If Rainbow Reached Maximum RainbowCycle = 0; // Restart (); } else { /*for(let i = 0; i< 30; i++)*/ RainbowCycle++; //RainbowCycle++; HPBarColor = `hsla(${RainbowCycle}, 100%, 50%, 30)`; } }, 20); //http://127.0.0.1:5500/ let useHack = true; let log = console.log; let testMode = window.location.hostname == "127.0.0.1"; let imueheua = false; function getEl(id) { return document.getElementById(id); } ! function(run) { if (!run) return; let codes = { setup: () => { "use strict"; let newFont = document.createElement("link"); newFont.rel = "stylesheet"; newFont.href = "https://fonts.googleapis.com/css?family=Ubuntu:700"; newFont.type = "text/css"; document.body.append(newFont); let min = document.createElement("script"); min.src = "https://rawgit.com/kawanet/msgpack-lite/master/dist/msgpack.min.js"; document.body.append(min); }, main: () => { if (!useHack) { return; } "use strict"; let o = window.config; // CLIENT: o.clientSendRate = 0; // Aim Packet Send Rate o.serverUpdateRate = 9; // UI: o.deathFadeout = 0; // CHECK IN SANDBOX: o.isSandbox = window.location.hostname == "sandbox.moomoo.io"; // CUSTOMIZATION: o.skinColors = ["#bf8f54", "#cbb091", "#896c4b", "#fadadc", "#ececec", "#c37373", "#4c4c4c", "#ecaff7", "#738cc3", "#8bc373", "#91b2db"]; o.weaponVariants = [{ id: 0, src: "", xp: 0, val: 1, }, { id: 1, src: "_g", xp: 3000, val: 1.1, }, { id: 2, src: "_d", xp: 7000, val: 1.18, }, { id: 3, src: "_r", poison: true, xp: 12000, val: 1.18, }, { id: 4, src: "_e", poison: true, heal: true, xp: 24000, val: 1.18, }]; // VISUAL: o.anotherVisual = false; o.useWebGl = false; o.resetRender = false; function waitTime(timeout) { return new Promise((done) => { setTimeout(() => { done(); }, timeout); }); } let changed = false; let botSkts = []; // STORAGE: let canStore; if (typeof(Storage) !== "undefined") { canStore = true; } function saveVal(name, val) { if (canStore) localStorage.setItem(name, val); } function deleteVal(name) { if (canStore) localStorage.removeItem(name); } function getSavedVal(name) { if (canStore) return localStorage.getItem(name); return null; } // CONFIGS: let gC = function(a, b) { try { let res = JSON.parse(getSavedVal(a)); if (typeof res === "object") { return b; } else { return res; } } catch (e) { alert("dieskid"); return b; } }; function setCommands() { return { "help": { desc: "Show Commands", action: function(message) { for (let cmds in commands) { addMenuChText("/" + cmds, commands[cmds].desc, "lime", 1); } } }, "clear": { desc: "Clear Chats", action: function(message) { resetMenuChText(); } }, "debug": { desc: "Debug Mod For Development", action: function(message) { addDeadPlayer(player); addMenuChText("Debug", "Done", "#99ee99", 1); } }, "play": { desc: "Play Music ( /play [link] )", action: function(message) { let link = message.split(" "); if (link[1]) { let audio = new Audio(link[1]); audio.play(); } else { addMenuChText("Warn", "Enter Link ( /play [link] )", "#99ee99", 1); } } }, "bye": { desc: "Leave Game", action: function(message) { window.leave(); } }, }; } function setConfigs() { return { killChat: true, autoBuy: true, autoBuyEquip: true, autoPush: true, revTick: true, spikeTick: true, predictTick: true, autoPlace: true, autoReplace: true, antiTrap: true, slowOT: false, attackDir: true, noDir: false, showDir: false, autoRespawn: false, fpsboost: false, PredictiveBull: true, doTickHealing: true, ShowStacked: true, doUpperCaseChatting: true, TryHardMode: true, ReverseInstaPatched: true, PredictivePlacer: true, PredictiveInsta: true, AntiBowInsta: true, PredictiveHeal: true, doSimpleAntiInsta: true, HoldingQforlag: true, doAutoBullTick: true, doRenderKMTexture: true, doAntiKickAtPacketLimit: true, AddAdditionalRangeOnLag: true, FastTurretHatPATCHED: false, SecondaryOnCounter: true, doAutoSpinningPATCHED: false, AutoAttackPATCHED: false, }; } let commands = setCommands(); let os = setConfigs(); window.removeConfigs = function() { for (let cF in os) { deleteVal(cF, os[cF]); } }; for (let cF in os) { os[cF] = gC(cF, os[cF]); } // MENU FUNCTIONS: window.changeMenu = function() {}; window.debug = function() {}; window.toggleNight = function() {}; window.wasdMode = function() {}; // PAGE 1: window.startGrind = function() {}; // PAGE 3: window.connectFillBots = function() {}; window.destroyFillBots = function() {}; window.tryConnectBots = function() {}; window.destroyBots = function() {}; window.resBuild = function() {}; window.toggleBotsCircle = function() {}; window.toggleVisual = function() {}; // SOME FUNCTIONS: window.prepareUI = function() {}; window.leave = function() {}; // nah hahahahahhh why good ping window.ping = imueheua ? 86 : 0; class HtmlAction { constructor(element) { this.element = element; }; add(code) { if (!this.element) return undefined; this.element.innerHTML += code; }; newLine(amount) { let result = `
`; if (amount > 0) { result = ``; for (let i = 0; i < amount; i++) { result += `
`; } } this.add(result); }; checkBox(setting) { let newCheck = ``; this.add(newCheck); }; text(setting) { let newText = ``; this.add(newText); }; select(setting) { let newSelect = ``; for (let options in setting.option) { newSelect += ``; } newSelect += ``; this.add(newSelect); }; button(setting) { let newButton = ``; setting.innerHTML && (newButton += setting.innerHTML); newButton += ``; this.add(newButton); }; selectMenu(setting) { let newSelect = ``; let last; let i = 0; for (let options in setting.menu) { newSelect += ``; i++; } newSelect += ``; this.add(newSelect); i = 0; for (let options in setting.menu) { window[options + "Func"] = function() { setting.menu[options] = getEl("check_" + options).checked ? true : false; saveVal(options, setting.menu[options]); getEl("O_" + options).style.color = setting.menu[options] ? "#000" : "#fff"; getEl("O_" + options).style.background = setting.menu[options] ? "#8ecc51" : "#cc5151"; //getEl(setting.id).style.color = setting.menu[options] ? "#8ecc51" : "#cc5151"; }; this.checkBox({ id: "check_" + options, style: `display: ${i == 0 ? "inline-block" : "none"};`, class: "checkB", onclick: `window.${options + "Func"}()`, checked: setting.menu[options] }); i++; } last = "check_" + getEl(setting.id).value.split("_")[1]; window[setting.id + "Func"] = function() { getEl(last).style.display = "none"; last = "check_" + getEl(setting.id).value.split("_")[1]; getEl(last).style.display = "inline-block"; //getEl(setting.id).style.color = setting.menu[last.split("_")[1]] ? "#8ecc51" : "#fff"; }; }; }; class Html { constructor() { this.element = null; this.action = null; this.divElement = null; this.startDiv = function(setting, func) { let newDiv = document.createElement("div"); setting.id && (newDiv.id = setting.id); setting.style && (newDiv.style = setting.style); setting.class && (newDiv.className = setting.class); this.element.appendChild(newDiv); this.divElement = newDiv; let addRes = new HtmlAction(newDiv); typeof func == "function" && func(addRes); }; this.addDiv = function(setting, func) { let newDiv = document.createElement("div"); setting.id && (newDiv.id = setting.id); setting.style && (newDiv.style = setting.style); setting.class && (newDiv.className = setting.class); setting.appendID && getEl(setting.appendID).appendChild(newDiv); this.divElement = newDiv; let addRes = new HtmlAction(newDiv); typeof func == "function" && func(addRes); }; }; set(id) { this.element = getEl(id); this.action = new HtmlAction(this.element); }; resetHTML(text) { if (text) { this.element.innerHTML = ``; } else { this.element.innerHTML = ``; } }; setStyle(style) { this.element.style = style; }; setCSS(style) { this.action.add(``); }; }; let HTML2 = new Html(); function getEl(id) { return document.getElementById(id); } let firstConfig = []; let streamerMode = false; const HTML = { newLine: function(amount) { let text = ``; for (let i = 0; i < amount; i++) { text += `
`; } return text; }, line: function() { return `
`; }, text: function(id, value, size, length) { return ``; }, checkBox: function(id, name, checked, rl) { return `${rl ? name + ` ` : ``}${rl ? `` : ` ` + name}`; }, button: function(id, name, onclick, classs) { return ``; }, select: function(id, selects) { let text = ``; } } ); return text; }, modChange: function(id, selects) { console.log("test"); }, mod: function(id, selects) { let text = ` `; } if (i == 0) { firstConfig.push(e.value + "C"); } } ); selects.forEach((e,i)=>{ text += ``; } ); return text; }, hotkey: function(id, value, size, length) { return ``; }, hotkey2: function(id, value, size, length) { return ``; }, BetttttaCh: function(id) { return ``; }, }; var toggles = {}; window.toggles = toggles; function generateNewToggle(label, id, isChecked, style) { toggles[id] = function() { return document.getElementById(id).checked; }; return ` ${label} `; } function generateNewList(label, id, configs) { let content = `${label} `; return content; } function setConfig(elements, id) { for(let i = 0; i < elements.length; i++) { document.getElementById(elements[i][3]).style.display = id == elements[i][0] ? "inline-block" : "none"; } } function addEventListen(id, configs) { let interval = setInterval(() => { if(document.getElementById(id) != null) { document.getElementById(id).addEventListener("change", function() { setConfig(configs, document.getElementById(id).value); }); clearInterval(interval); } }, 0); } function generateNewConfig(label, id, configs) { let content = `${label} `; for(let i = 0; i < configs.length; i++) { content += generateNewToggle("", configs[i][3], configs[i][2], !i ? "display: inline-block;" : "display: none;"); } addEventListen(id, configs); return content; } /* */ let Wut = "Select"; // menu html let modMenus = document.createElement("div"); modMenus.id = "modMenus"; document.body.append(modMenus); modMenus.style = ` display: block; padding: 10px; border-radius: 15px; background-color: rgba(0, 0, 0, 0.25); border-radius: 3px; position: absolute; left: 20px; top: 20px; min-width: 300px; max-width: 410px; min-height: 400; max-height 400px; transition: 1s; `; let canmove = true; function updateInnerHTML() { modMenus.innerHTML = `
Magick:
${HTML.button("boosteruseitems", "Toggle Booster w/ item", "", "nothing")}
${HTML.button("PlaceEveryTickTogl", "Toggle PlaceEveryTick", "", "nothing")} | true
Create clan: ${HTML.text("ccv", "clan", "20", "7")}${HTML.button("ccf", "Create clan", `document.createAlliance(document.getElementById("ccv").value)`, "nothing")}
${HTML.select("autoupgrade", [ { name: "Autoupgrade to DH", value: "dh", }, { name: "Autoupgrade to KH", value: "kh", }, { name: "Autoupgrade to PH", value: "ph", }, { name: "Autoupgrade to SM", value: "sm", }, { name: "Autoupgrade to PM", value: "pm", }, { name: "Autoupgrade to KM", value: "km", }, { name: "Autoupgrade to DM", value: "dm", }, ])} ${HTML.checkBox("aaauaua", "", false)}
7-Slot: ${HTML.select("7slot", [{ name: "Teleporter", value: "38", selected: true, }, { name: "Turret", value: "33", }, { name: "Platform", value: "34", }, { name: "Healing pad", value: "35", }, { name: "Blocker", value: "37", }, ])}
Upgrade To Insta: ${HTML.select("upgradeinstatypebad", [{ name: "SM", value: "sm", }, { name: "KH", value: "kh", }, { name: "HP", value: "hp", }, ])} ${HTML.checkBox("upgradeinstatypeCheck", "", true)}
${HTML.mod("os", [ { name: "doBuildingHealth", value: "bh", checked: true, }, { name: "1v7 heal", value: "1v7heal", Checked:true, }, { name: "AddAdditionalRangeOnLag", value: "addictdist", checked: true, }, { name: "doAntiKickAtPacketLimit", value: "ak", checked: true, }, { name: "doAutoBullTick", value: "bulltick", checked: true, }, { name: "doAutoOneTick", value: "aOT", checked: true, }, { name: "doUseAutoInstaPress", value: "useautoInstaong", checked: true, }, { name: "doWheelUseHats", value: "wheelUseHats", }, { name: "doBetaAntiSync", value: "antisync", checked: true, }, { name: "doAutoQOnHighPing", value: "autoq", }, { name: "doPermanentAutoQ", value: "evautoq", }, { name: "pABUser", value: "usepabprosecc", checked: true, }, { name: "1v2 heal", value: "simpleheal", checked: true, }, { name: "1v5 heal", value: "tickheal", checked: true, }, { name: "doAutoReplace", value: "replc", checked: true, }, { name: "doPrePlace", value: "preplacer", checked: true, }, { name: "doPlacementEveryTick", value: "abplace", checked: true, }, { name: "doAutoSpikeTickOnReplaced", value: "spiketick", checked: true, }, { name: "doExtraAutoSpikeTick", value: "ExtraSpikeTick1", checked: true, }, { name: "doPermanentAntiEmp", value: "simpleEmpAnti", }, { name: "doUseTurretOnCounter", value: "countertur", checked: true, }, { name: "doUseSecondaryOnCounter", value: "countersec", }, { name: "doClickCombat", value: "clicktype", }, { name: "doInstaOneShot", value: "oneShotInsta", checked: true, }, { name: "doAutoSpinning", value: "spin", }, { name: "doAutoBuyHats", value: "autoBuyHats1beta", }, { name: "doAutoGG", value: "autogg", checked: true, }, { name: "doAutoSync", value: "autosyncsec", checked: true, }, { name: "doAutoSyncHit", value: "autosyncHited", checked: true, }, { name: "doUpperCaseChatting", value: "chatc", }, { name: "doTryHardMode", value: "tryhard", checked: true, }, { name: "doAlwaysRevInsta", value: "alwaysrev", }, { name: "doTurretReloadBar", value: "turrreloadbars", }, { name: "doRenderKMTexture", value: "kmtexture", checked: true, }, { name: "doShowStackedAnimtext", value: "stacktext", }, { name: "doDisableAnimtext", value: "hidetext", }, { name: "doWeaponRange", value: "WeaponRange", checked: true, }, { name: "doEnemyInfoStatus", value: "EnemyDtatInfoBar", checked: true, }, { name: "doSmartEmpSoldierAnti", value: "SmartEmpSoldierAnti", checked: true, }, { name: "doPlacementVisual", value: "placeVis", }, { name: "doWeaponRange", value: "backupNobull", checked: true, }, { name: "doEnemyInfoStatus", value: "turretCombat", checked: true, }, { name: "doSmartEmpSoldierAnti", value: "safeAntiSpikeTick", checked: true, }, { name: "doBotMovementToNear", value: "botmove", }, { name: "doShowBotsOnMinimap", value: "showbotsonmap", checked: true, }, { name: "doBotsShowEnemy", value: "botusetracers", }, ])}
${HTML.checkBox("weaponGrind", "Ruby farm?", false)}
${HTML.checkBox("grindsec", "autoRubySec", true)}
Freecam: none


Freecam hotkey: ${HTML.hotkey("freecumLOL", "/", "2", "1")}
Debug hotkey: ${HTML.hotkey("debugkey", "Z", "2", "1")}
Bot connector hotkey: ${HTML.hotkey("botkey", "G", "2", "1")}
No-Bull management hotkey: ${HTML.hotkey2("NobullMangeKey", "T", "2", "1")} ${HTML.select("NBmanStats", [{ name: "None", value: "none", }, { name: "increment NB Count", value: "INnbCn", selected: true, }, ])} ${HTML.BetttttaCh("NobullMangeKey")}
Spike hotkey: ${HTML.hotkey("spikekey", "v", "2", "1")}
Trap/Boost hotkey: ${HTML.hotkey("trapkey", "f", "2", "1")}
Healing hotkey: ${HTML.hotkey("Qhotkeys", "q", "2", "1")}
Instakill hotkey: ${HTML.hotkey("instakillkey", "r", "2", "1")}
Autobull hotkey: ${HTML.hotkey("autobullkey", "j", "2", "1")}
Turret/Teleport hotkey: ${HTML.hotkey("turretkey", "h", "2", "1")}
3x compact windmills hotkey: ${HTML.hotkey("3windmillskey", "b", "2", "1")}
Toggle advanced placer hotkey: ${HTML.hotkey("millkey", "z", "2", "1")}
One Tick insta hotkey: ${HTML.hotkey("lagkey", "t", "2", "1")}
Ratio hotkey: ${HTML.hotkey("ezkey", "@", "2", "1")}
Zoom hotkey: ${HTML.hotkey("zoomkey", "-", "2", "1")}
Zoom reset key: ${HTML.hotkey("zoomresetkey", "=", "2", "1")}
Song hotkey: ${HTML.hotkey("songkey", "C", "2", "1")}
Song: ${HTML.select("songs", [{ name: "CRVN - Nobody", value: "1", }, { name: "Dave Rodgers - Ae86", value: "2", }, { name: "Dr Love - Don't Stand So Close", value: "3", }, { name: "Domastic - Heartless", value: "4", }, { name: "PVRIS - Burn It All Down", value: "5", }, { name: "Crypt x Joey Nato - Invincible", value: "6", selected: true, }, ])}${HTML.checkBox("showch", "", false)}
Scroll Macro Mode: ${HTML.select("ScrMacro", [{ name: "Bull Tick Sync / Emp Overrides", value: "1", selected: true, }, { name: "Dave Rodgers - Ae86", value: "2", }, { name: "Dr Love - Don't Stand So Close", value: "3", }, { name: "Domastic - Heartless", value: "4", }, { name: "PVRIS - Burn It All Down", value: "5", }, { name: "Crypt x Joey Nato - Invincible", value: "6", }, ])}
Aim Boost-Spike At Nearest Enemy? ${HTML.checkBox("AIMboostSpikes", "", false)}
Auto-Boost Spike space key (State: )
Object for the boost item placer: ${HTML.select("placeoINboost", [{ name: "Walls", value: "1", }, { name: "Spikes", value: "2", }, { name: "Windmills", value: "3", selected: true, }, { name: "Trap/Boosts", value: "4", }, { name: "Teleport/Turrets", value: "5", }, ])}
Extra Performance Mode: ${HTML.select("ExtraPerformanceMode", [{ name: "Anti Bull", value: "antibull", selected: true, }, { name: "Bull tick", value: "bulltick", }, { name: "Instachaining", value: "instachaining", }, ])}
Extra Performance? ${HTML.checkBox("ExtraPerformanceButton", "", false)}
Object for the placer: ${HTML.select("placeo", [ { name: "Walls", value: "1",}, { name: "Spikes", value: "2",}, { name: "Windmills", value: "3", selected: true,}, { name: "Trap/Boosts", value: "4",}, { name: "Teleport/Turrets", value: "5",}, ])}
anti
${HTML.checkBox("soldieranti", "soldierAntiInsta", true)}
${HTML.checkBox("soldierempanti", "soldierEmpAntiInsta", true)}
${HTML.checkBox("antitick", "anti0Tick", true)}
${HTML.checkBox("antirange", "antiRangedInsta", true)}
autoBreak
${HTML.checkBox("earlyab", "early", true)}
earlyWaitTime
${HTML.text("earlytime", "10", "6", "5")}
${HTML.checkBox("abactive", "activate", true)}



One-way: ${HTML.button("streamer", "Streamer Mode", "", "nothing")}
One-way: (Rejoin on server) ${HTML.button("serverwarper", "Rejoin", `document.warpServer()`, "nothing")}
`; } updateInnerHTML(); getEl("streamer").onclick = function() { streamerMode = !streamerMode; }; getEl("ccv").onfocus = function() { canmove = false; }; getEl("ccv").onblur = function() { canmove = true; }; getEl("PlaceEveryTickTogl").onclick = function() { //placeEveryTick1 = !placeEveryTick1; }; let oldSelect = firstConfig[0]; let newSelect = firstConfig[0]; getEl("os").onchange = function() { let value = getEl("os").value; let sliced = function(val) { return val.slice(0, val.length - 1); }; oldSelect = newSelect; newSelect = value; getEl(sliced(oldSelect)).style.display = "none"; getEl(sliced(newSelect)).style.display = "inline-block"; } ; let WS = undefined; let socketID = undefined; let useWasd = false; let secPacket = 0; let secMax = 110; let secTime = 1000; let firstSend = { sec: false }; let game = { tick: 0, tickQueue: [], tickBase: function(set, tick) { if (this.tickQueue[this.tick + tick]) { this.tickQueue[this.tick + tick].push(set); } else { this.tickQueue[this.tick + tick] = [set]; } }, tickRate: (1000 / o.serverUpdateRate), tickSpeed: 0, lastTick: performance.now() }; let modConsole = []; let dontSend = false; let fpsTimer = { last: 0, time: 0, ltime: 0 } let lastMoveDir = undefined; let lastsp = ["cc", 1, "__proto__"]; WebSocket.prototype.nsend = WebSocket.prototype.send; WebSocket.prototype.send = function(message) { if (!WS) { WS = this; WS.addEventListener("message", function(msg) { getMessage(msg); }); WS.addEventListener("close", (event) => { if (event.code == 4001) { window.location.reload(); } }); } if (WS == this) { dontSend = false; // EXTRACT DATA ARRAY: let data = new Uint8Array(message); let parsed = window.msgpack.decode(data); let type = parsed[0]; data = parsed[1]; // SEND MESSAGE: if (type == "6") { if (data[0]) { // ANTI PROFANITY: let profanity = ["cunt", "whore", "fuck", "shit", "faggot", "nigger", "nigga", "dick", "vagina", "minge", "cock", "rape", "cum", "sex", "tits", "penis", "clit", "pussy", "meatcurtain", "jizz", "prune", "douche", "wanker", "damn", "bitch", "dick", "fag", "bastard", ]; let tmpString; profanity.forEach((profany) => { if (data[0].indexOf(profany) > -1) { tmpString = ""; for (let i = 0; i < profany.length; ++i) { if (i == 1) { tmpString += String.fromCharCode(0); } tmpString += profany[i]; } let re = new RegExp(profany, "g"); data[0] = data[0].replace(re, tmpString); } }); // FIX CHAT: data[0] = data[0].slice(0, 30); } } else if (type == "L") { // MAKE SAME CLAN: data[0] = data[0] + (String.fromCharCode(0).repeat(7)); data[0] = data[0].slice(0, 7); } else if (type == "M") { // APPLY CYAN COLOR: data[0].name = data[0].name == "" ? "unknown" : data[0].name; data[0].moofoll = true; data[0].skin = data[0].skin == 10 ? "__proto__" : data[0].skin; lastsp = [data[0].name, data[0].moofoll, data[0].skin]; } else if (type == "D") { if ((my.lastDir == data[0]) || [null, undefined].includes(data[0])) { dontSend = true; } else { my.lastDir = data[0]; } } else if (type == "d") { if (!data[2]) { dontSend = true; } else { if (![null, undefined].includes(data[1])) { my.lastDir = data[1]; } } } else if (type == "K") { if (!data[1]) { dontSend = true; } } else if (type == "S") { dontSend = true; } else if (type == "a") { if (data[1]) { if (player.moveDir == data[0]) { dontSend = true; } player.moveDir = data[0]; } else { dontSend = true; } } if (!dontSend) { let binary = window.msgpack.encode([type, data]); this.nsend(binary); // START COUNT: if (!firstSend.sec) { firstSend.sec = true; setTimeout(() => { firstSend.sec = false; secPacket = 0; }, secTime); } secPacket++; } } else { this.nsend(message); } } function packet(type) { // EXTRACT DATA ARRAY: let data = Array.prototype.slice.call(arguments, 1); // SEND MESSAGE: let binary = window.msgpack.encode([type, data]); WS.send(binary); } function origPacket(type) { // EXTRACT DATA ARRAY: let data = Array.prototype.slice.call(arguments, 1); // SEND MESSAGE: let binary = window.msgpack.encode([type, data]); WS.nsend(binary); } window.leave = function() { origPacket("kys", { "frvr is so bad": true, "sidney is too good": true, "dev are too weak": true, }); }; //...lol let io = { send: packet }; function getMessage(message) { let data = new Uint8Array(message.data); let parsed = window.msgpack.decode(data); let type = parsed[0]; data = parsed[1]; let events = { A: setInitData, // id: setInitData, //B: disconnect, C: setupGame, // 1: setupGame, D: addPlayer, // 2: addPlayer, E: removePlayer, // 4: removePlayer, a: updatePlayers, // 33: updatePlayers, G: updateLeaderboard, // 5: updateLeaderboard,here H: loadGameObject, // 6: loadGameObject, I: loadAI, // a: loadAI, J: animateAI, // aa: animateAI, K: gatherAnimation, // 7: gatherAnimation, L: wiggleGameObject, // 8: wiggleGameObject, M: shootTurret, // sp: shootTurret, N: updatePlayerValue, // 9: updatePlayerValue, O: updateHealth, // h: updateHealth,//here P: killPlayer, // 11: killPlayer, Q: killObject, // 12: killObject, R: killObjects, // 13: killObjects, S: updateItemCounts, // 14: updateItemCounts, T: updateAge, // 15: updateAge, U: updateUpgrades, // 16: updateUpgrades, V: updateItems, // 17: updateItems, X: addProjectile, // 18: addProjectile, Y: remProjectile, // 19: remProjectile, //Z: serverShutdownNotice, //0: addAlliance, //1: deleteAlliance, 2: allianceNotification, // an: allianceNotification, 3: setPlayerTeam, // st: setPlayerTeam, 4: setAlliancePlayers, // sa: setAlliancePlayers, 5: updateStoreItems, // us: updateStoreItems, 6: receiveChat, // ch: receiveChat, 7: updateMinimap, // mm: updateMinimap, 8: showText, // t: showText, 9: pingMap, // p: pingMap, 0: pingSocketResponse, }; if (type == "io-init") { socketID = data[0]; } else { if (events[type]) { events[type].apply(undefined, data); } } } // MATHS: Math.lerpAngle = function(value1, value2, amount) { let difference = Math.abs(value2 - value1); if (difference > Math.PI) { if (value1 > value2) { value2 += Math.PI * 2; } else { value1 += Math.PI * 2; } } let value = value2 + ((value1 - value2) * amount); if (value >= 0 && value <= Math.PI * 2) return value; return value % (Math.PI * 2); }; // REOUNDED RECTANGLE: CanvasRenderingContext2D.prototype.roundRect = function(x, y, w, h, r) { if (w < 2 * r) r = w / 2; if (h < 2 * r) r = h / 2; if (r < 0) r = 0; this.beginPath(); this.moveTo(x + r, y); this.arcTo(x + w, y, x + w, y + h, r); this.arcTo(x + w, y + h, x, y + h, r); this.arcTo(x, y + h, x, y, r); this.arcTo(x, y, x + w, y, r); this.closePath(); return this; }; // GLOBAL VALUES: let petals = []; let allChats = []; let ticks = { tick: 0, delay: 0, time: [], manage: [], }; let ais = []; let players = []; let alliances = []; let alliancePlayers = []; let allianceNotifications = []; let gameObjects = []; let projectiles = []; let deadPlayers = []; let breakObjects = []; let player; let playerSID; let _; let enemy = []; let nears = []; let near = []; let my = { reloaded: false, waitHit: 0, autoAim: false, revAim: false, ageInsta: true, reSync: false, bullTick: 0, anti0Tick: 0, antiSync: false, safePrimary: function(_) { return [0, 8].includes(_.primaryIndex); }, safeSecondary: function(_) { return [10, 11, 14].includes(_.secondaryIndex); }, lastDir: 0, autoPush: false, pushData: {} } // FIND OBJECTS BY ID/SID: function findID(_, tmp) { return _.find((THIS) => THIS.id == tmp); } function findSID(_, tmp) { return _.find((THIS) => THIS.sid == tmp); } function findPlayerByID(id) { return findID(players, id); } function findPlayerBySID(sid) { return findSID(players, sid); } function findAIBySID(sid) { return findSID(ais, sid); } function findObjectBySid(sid) { return findSID(gameObjects, sid); } function findProjectileBySid(sid) { return findSID(gameObjects, sid); } let gameName = getEl("gameName"); let adCard = getEl("adCard"); adCard.remove(); let promoImageHolder = getEl("promoImgHolder"); promoImageHolder.remove(); let menuText = getEl("desktopInstructions"); menuText.innerHTML = ` Movement: W, A, S, D
Toggle Menu: ESC
InstaKill: R

Mouse:
Left: Bull
Middle: Range
Right: Tank
`; $("#guideCard").css({ height: "415px", "max-height": "700px", }); let partyButton = getEl("partyButton"); let joinPartyButton = getEl("joinPartyButton"); let settingsButton = getEl("settingsButton"); let settingsButtonTitle = settingsButton.getElementsByTagName("span")[0]; let allianceButton = getEl("allianceButton"); let storeButton = getEl("storeButton"); let serverBrowser = getEl("serverBrowser"); let nativeResolutionCheckbox = getEl("nativeResolution"); let showPingCheckbox = getEl("showPing"); let playMusicCheckbox = getEl("playMusic"); let pingDisplay = getEl("pingDisplay"); let shutdownDisplay = getEl("shutdownDisplay"); let setupCard = getEl("setupCard"); let menuContainer = getEl("menuContainer"); let guideCard = getEl("guideCard"); let loadingText = getEl("loadingText"); let gameUI = getEl("gameUI"); let resourceDisplay = document.getElementById("resDisplay"); let scoreDisplay = getEl("scoreDisplay"); let foodDisplay = getEl("foodDisplay"); let woodDisplay = getEl("woodDisplay"); let stoneDisplay = getEl("stoneDisplay"); let killCounter = getEl("killCounter"); let topinfoHolder = getEl("topInfoHolder"); let leaderboard = getEl("leaderboard"); let nameInput = getEl("nameInput"); let ageText = getEl("ageText"); let ageBarBody = getEl("ageBarBody"); let allianceHolder = getEl("allianceHolder"); let allianceManager = getEl("allianceManager"); let skinColorHolder = getEl("skinColorHolder"); let chatButton = getEl("chatButton"); chatButton.remove(); let gameCanvas = getEl("gameCanvas"); let be = gameCanvas.getContext("2d"); let mapDisplay = getEl("mapDisplay"); let mapContext = mapDisplay.getContext("2d"); mapDisplay.width = 300; mapDisplay.height = 300; let storeMenu = getEl("storeMenu"); let storeHolder = getEl("storeHolder"); let upgradeHolder = getEl("upgradeHolder"); let upgradeCounter = getEl("upgradeCounter"); let chatBox = getEl("chatBox"); let chatHolder = getEl("chatHolder"); let actionBar = getEl("actionBar"); let leaderboardData = getEl("leaderboardData"); let itemInfoHolder = getEl("itemInfoHolder"); let menuCardHolder = getEl("menuCardHolder"); let mainMenu = getEl("mainMenu"); mainMenu.style.backgroundImage = "url('https://usagif.com/wp-content/uploads/gify/39-anime-dance-girl-usagif-title.gif')"; mainMenu.style.backgroundSize = "cover"; let diedText = getEl("diedText"); let screenWidth; let screenHeight; let maxScreenWidth = o.maxScreenWidth; let maxScreenHeight = o.maxScreenHeight; let pixelDensity = 1; let delta; let now; let lastUpdate = performance.now(); let camX; let camY; let tmpDir; let mouseX = 0; let mouseY = 0; let allianceMenu = getEl("allianceMenu"); let waterMult = 1; let waterPlus = 0; let outlineColor = "#525252"; let darkOutlineColor = "#3d3f42"; let outlineWidth = 5.5; let isNight = false; let firstSetup = true; let keys = {}; let moveKeys = { 87: [0, -1], 38: [0, -1], 83: [0, 1], 40: [0, 1], 65: [-1, 0], 37: [-1, 0], 68: [1, 0], 39: [1, 0], }; let attackState = 0; let inGame = false; let macro = {}; let mills = { w: false, a: false, s: false, d: false, posx: 0, posy: 0, aim: 0, place: false, }; let lastDir; let lastLeaderboardData = []; // ON LOAD: let inWindow = true; window.onblur = function() { inWindow = false; }; window.onfocus = function() { inWindow = true; if (player && player.alive) { // resetMoveDir(); } }; let ms = { avg: 0, max: 0, min: Infinity, }; function pingSocketResponse() { let pingTime = window.pingTime; const pingDisplay = document.getElementById("pingDisplay"); pingDisplay.innerText = "Ping: " + pingTime + " ms"; ms.max = isNaN(ms.max) ? pingTime : Math.max(ms.max, pingTime); ms.min = isNaN(ms.min) ? pingTime : Math.min(ms.min, pingTime); ms.avg = Math.floor([(window.pingTime + ms.max + ms.min)/3]); } function zoomVision() { if (maxScreenWidth != o.maxScreenWidth * 1.5 || maxScreenHeight != o.maxScreenHeight * 1.5) { maxScreenWidth = o.maxScreenWidth * 1.5; maxScreenHeight = o.maxScreenHeight * 1.5; resize(); } } let resetZoomOn = 1; function resetZoom() { if (maxScreenWidth != o.maxScreenWidth * resetZoomOn || maxScreenHeight != o.maxScreenHeight * resetZoomOn) { maxScreenWidth = o.maxScreenWidth * resetZoomOn; maxScreenHeight = o.maxScreenHeight * resetZoomOn; resize(); } } let placeVisible = []; let profanityList = ["cunt", "whore", "fuck", "shit", "faggot", "nigger", "nigga", "dick", "vagina", "minge", "cock", "rape", "cum", "sex", "tits", "penis", "clit", "pussy", "meatcurtain", "jizz", "prune", "douche", "wanker", "damn", "bitch", "dick", "fag", "bastard" ]; /** CLASS CODES */ class Utils { constructor() { // MATH UTILS: let mathABS = Math.abs, mathCOS = Math.cos, mathSIN = Math.sin, mathPOW = Math.pow, mathSQRT = Math.sqrt, mathATAN2 = Math.atan2, mathPI = Math.PI; let _this = this; // GLOBAL UTILS: this.round = function(n, v) { return Math.round(n * v) / v; }; this.toRad = function(angle) { return angle * (mathPI / 180); }; this.toAng = function(radian) { return radian / (mathPI / 180); }; this.randInt = function(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }; this.randFloat = function(min, max) { return Math.random() * (max - min + 1) + min; }; this.lerp = function(value1, value2, amount) { return value1 + (value2 - value1) * amount; }; this.decel = function(val, cel) { if (val > 0) val = Math.max(0, val - cel); else if (val < 0) val = Math.min(0, val + cel); return val; }; this.getDistance = function(x1, y1, x2, y2) { return mathSQRT((x2 -= x1) * x2 + (y2 -= y1) * y2); }; this.getDist = function(tmp1, tmp2, type1, type2) { let tmpXY1 = { x: type1 == 0 ? tmp1.x : type1 == 1 ? tmp1.x1 : type1 == 2 ? tmp1.x2 : type1 == 3 && tmp1.x3, y: type1 == 0 ? tmp1.y : type1 == 1 ? tmp1.y1 : type1 == 2 ? tmp1.y2 : type1 == 3 && tmp1.y3, }; let tmpXY2 = { x: type2 == 0 ? tmp2.x : type2 == 1 ? tmp2.x1 : type2 == 2 ? tmp2.x2 : type2 == 3 && tmp2.x3, y: type2 == 0 ? tmp2.y : type2 == 1 ? tmp2.y1 : type2 == 2 ? tmp2.y2 : type2 == 3 && tmp2.y3, }; return mathSQRT((tmpXY2.x -= tmpXY1.x) * tmpXY2.x + (tmpXY2.y -= tmpXY1.y) * tmpXY2.y); }; this.getDirection = function(x1, y1, x2, y2) { return mathATAN2(y1 - y2, x1 - x2); }; this.getDirect = function(tmp1, tmp2, type1, type2) { let tmpXY1 = { x: type1 == 0 ? tmp1.x : type1 == 1 ? tmp1.x1 : type1 == 2 ? tmp1.x2 : type1 == 3 && tmp1.x3, y: type1 == 0 ? tmp1.y : type1 == 1 ? tmp1.y1 : type1 == 2 ? tmp1.y2 : type1 == 3 && tmp1.y3, }; let tmpXY2 = { x: type2 == 0 ? tmp2.x : type2 == 1 ? tmp2.x1 : type2 == 2 ? tmp2.x2 : type2 == 3 && tmp2.x3, y: type2 == 0 ? tmp2.y : type2 == 1 ? tmp2.y1 : type2 == 2 ? tmp2.y2 : type2 == 3 && tmp2.y3, }; return mathATAN2(tmpXY1.y - tmpXY2.y, tmpXY1.x - tmpXY2.x); }; this.getAngleDist = function(a, b) { let p = mathABS(b - a) % (mathPI * 2); return (p > mathPI ? (mathPI * 2) - p : p); }; this.isNumber = function(n) { return (typeof n == "number" && !isNaN(n) && isFinite(n)); }; this.isString = function(s) { return (s && typeof s == "string"); }; this.kFormat = function(num) { return num > 999 ? (num / 1000).toFixed(1) + "k" : num; }; this.sFormat = function(num) { let fixs = [{ num: 1e3, string: "k" }, { num: 1e6, string: "m" }, { num: 1e9, string: "b" }, { num: 1e12, string: "q" } ].reverse(); let sp = fixs.find(v => num >= v.num); if (!sp) return num; return (num / sp.num).toFixed(1) + sp.string; }; this.capitalizeFirst = function(string) { return string.charAt(0).toUpperCase() + string.slice(1); }; this.fixTo = function(n, v) { return parseFloat(n.toFixed(v)); }; this.sortByPoints = function(a, b) { return parseFloat(b.points) - parseFloat(a.points); }; this.lineInRect = function(recX, recY, recX2, recY2, x1, y1, x2, y2) { let minX = x1; let maxX = x2; if (x1 > x2) { minX = x2; maxX = x1; } if (maxX > recX2) maxX = recX2; if (minX < recX) minX = recX; if (minX > maxX) return false; let minY = y1; let maxY = y2; let dx = x2 - x1; if (Math.abs(dx) > 0.0000001) { let a = (y2 - y1) / dx; let b = y1 - a * x1; minY = a * minX + b; maxY = a * maxX + b; } if (minY > maxY) { let tmp = maxY; maxY = minY; minY = tmp; } if (maxY > recY2) maxY = recY2; if (minY < recY) minY = recY; if (minY > maxY) return false; return true; }; this.containsPoint = function(element, x, y) { let bounds = element.getBoundingClientRect(); let left = bounds.left + window.scrollX; let top = bounds.top + window.scrollY; let width = bounds.width; let height = bounds.height; let insideHorizontal = x > left && x < left + width; let insideVertical = y > top && y < top + height; return insideHorizontal && insideVertical; }; this.mousifyTouchEvent = function(event) { let touch = event.changedTouches[0]; event.screenX = touch.screenX; event.screenY = touch.screenY; event.clientX = touch.clientX; event.clientY = touch.clientY; event.pageX = touch.pageX; event.pageY = touch.pageY; }; this.hookTouchEvents = function(element, skipPrevent) { let preventDefault = !skipPrevent; let isHovering = false; // let passive = window.Modernizr.passiveeventlisteners ? {passive: true} : false; let passive = false; element.addEventListener("touchstart", this.checkTrusted(touchStart), passive); element.addEventListener("touchmove", this.checkTrusted(touchMove), passive); element.addEventListener("touchend", this.checkTrusted(touchEnd), passive); element.addEventListener("touchcancel", this.checkTrusted(touchEnd), passive); element.addEventListener("touchleave", this.checkTrusted(touchEnd), passive); function touchStart(e) { _this.mousifyTouchEvent(e); window.setUsingTouch(true); if (preventDefault) { e.preventDefault(); e.stopPropagation(); } if (element.onmouseover) element.onmouseover(e); isHovering = true; } function touchMove(e) { _this.mousifyTouchEvent(e); window.setUsingTouch(true); if (preventDefault) { e.preventDefault(); e.stopPropagation(); } if (_this.containsPoint(element, e.pageX, e.pageY)) { if (!isHovering) { if (element.onmouseover) element.onmouseover(e); isHovering = true; } } else { if (isHovering) { if (element.onmouseout) element.onmouseout(e); isHovering = false; } } } function touchEnd(e) { _this.mousifyTouchEvent(e); window.setUsingTouch(true); if (preventDefault) { e.preventDefault(); e.stopPropagation(); } if (isHovering) { if (element.onclick) element.onclick(e); if (element.onmouseout) element.onmouseout(e); isHovering = false; } } }; this.removeAllChildren = function(element) { while (element.hasChildNodes()) { element.removeChild(element.lastChild); } }; this.generateElement = function(o) { let element = document.createElement(o.tag || "div"); function bind(oValue, elementValue) { if (o[oValue]) element[elementValue] = o[oValue]; } bind("text", "textContent"); bind("html", "innerHTML"); bind("class", "className"); for (let key in o) { switch (key) { case "tag": case "text": case "html": case "class": case "style": case "hookTouch": case "parent": case "children": continue; default: break; } element[key] = o[key]; } if (element.onclick) element.onclick = this.checkTrusted(element.onclick); if (element.onmouseover) element.onmouseover = this.checkTrusted(element.onmouseover); if (element.onmouseout) element.onmouseout = this.checkTrusted(element.onmouseout); if (o.style) { element.style.cssText = o.style; } if (o.hookTouch) { this.hookTouchEvents(element); } if (o.parent) { o.parent.appendChild(element); } if (o.children) { for (let i = 0; i < o.children.length; i++) { element.appendChild(o.children[i]); } } return element; }; this.checkTrusted = function(callback) { return function(ev) { if (ev && ev instanceof Event && (ev && typeof ev.isTrusted == "boolean" ? ev.isTrusted : true)) { callback(ev); } else { //console.error("Event is not trusted.", ev); } }; }; this.randomString = function(length) { let text = ""; let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (let i = 0; i < length; i++) { text += possible.charAt(Math.floor(Math.random() * possible.length)); } return text; }; this.countInArray = function(array, val) { let count = 0; for (let i = 0; i < array.length; i++) { if (array[i] === val) count++; } return count; }; this.hexToRgb = function(hex) { return hex.slice(1).match(/.{1,2}/g).map(g => parseInt(g, 16)); }; this.getRgb = function(r, g, b) { return [r / 255, g / 255, b / 255].join(", "); }; } }; class Animtext { // ANIMATED TEXT: constructor() { // INIT: this.init = function(x, y, scale, speed, life, text, color) { this.x = x; this.y = y; this.color = color; this.scale = scale; this.startScale = this.scale; this.maxScale = scale * 1.5; this.scaleSpeed = 0.7; this.speed = speed; this.life = life; this.text = text; this.acc = 1; this.alpha = 0; this.maxLife = life; this.ranX = UTILS.randFloat(-1, 1); }; // UPDATE: this.update = function(delta) { if (this.life) { this.life -= delta; if (o.anotherVisual) { this.y -= this.speed * delta * this.acc; this.acc -= delta / (this.maxLife / 2.5); if (this.life <= 200) { if (this.alpha > 0) { this.alpha = Math.max(0, this.alpha - (delta / 300)); } } else { if (this.alpha < 1) { this.alpha = Math.min(1, this.alpha + (delta / 100)); } } this.x += this.ranX; } else { this.y -= this.speed * delta; } this.scale += this.scaleSpeed * delta; if (this.scale >= this.maxScale) { this.scale = this.maxScale; this.scaleSpeed *= -1; } else if (this.scale <= this.startScale) { this.scale = this.startScale; this.scaleSpeed = 0; } if (this.life <= 0) { this.life = 0; } } }; // RENDER: this.render = function(ctxt, xOff, yOff) { ctxt.lineWidth = 10; ctxt.fillStyle = this.color; ctxt.font = this.scale + "px " + (o.anotherVisual ? "Ubuntu" : "Hammersmith One"); if (o.anotherVisual) { ctxt.globalAlpha = this.alpha; ctxt.strokeStyle = darkOutlineColor; ctxt.strokeText(this.text, this.x - xOff, this.y - yOff); } ctxt.fillText(this.text, this.x - xOff, this.y - yOff); ctxt.globalAlpha = 1; }; } }; class Textmanager { // TEXT MANAGER: constructor() { this.texts = []; this.stack = []; // UPDATE: this.update = function(delta, ctxt, xOff, yOff) { ctxt.textBaseline = "middle"; ctxt.textAlign = "center"; for (let i = 0; i < this.texts.length; ++i) { if (this.texts[i].life) { this.texts[i].update(delta); this.texts[i].render(ctxt, xOff, yOff); } } }; // SHOW TEXT: this.showText = function(x, y, scale, speed, life, text, color) { let tmpText; for (let i = 0; i < this.texts.length; ++i) { if (!this.texts[i].life) { tmpText = this.texts[i]; break; } } if (!tmpText) { tmpText = new Animtext(); this.texts.push(tmpText); } tmpText.init(x, y, scale, speed, life, text, color); }; } } class GameObject { constructor(sid) { this.sid = sid; // INIT: this.init = function(x, y, dir, scale, type, data, owner) { data = data || {}; if (type == 0) Trees.push({ x: x, y: y }); if (type == 1) Foodbush.push({ x: x, y: y }); if (type == 2) StoneOreok.push({ x: x, y: y }); if (type == 3) GoldMines.push({ x: x, y: y }); this.sentTo = {}; this.gridLocations = []; this.active = true; this.alive = true; this.doUpdate = data.doUpdate; this.x = x; this.y = y; if (o.anotherVisual) { this.dir = dir + Math.PI; } else { this.dir = dir; } this.lastDir = dir; this.xWiggle = 0; this.yWiggle = 0; this.visScale = scale; this.scale = scale; this.type = type; this.id = data.id; this.owner = owner; this.name = data.name; this.isItem = (this.id != undefined); this.group = data.group; this.maxHealth = data.health; this.health = this.maxHealth; this.layer = 2; if (this.group != undefined) { this.layer = this.group.layer; } else if (this.type == 0) { this.layer = 3; } else if (this.type == 2) { this.layer = 0; } else if (this.type == 4) { this.layer = -1; } this.colDiv = data.colDiv || 1; this.blocker = data.blocker; this.ignoreCollision = data.ignoreCollision; this.dontGather = data.dontGather; this.hideFromEnemy = data.hideFromEnemy; this.friction = data.friction; this.projDmg = data.projDmg; this.dmg = data.dmg; this.pDmg = data.pDmg; this.pps = data.pps; this.zIndex = data.zIndex || 0; this.turnSpeed = data.turnSpeed; this.req = data.req; this.trap = data.trap; this.healCol = data.healCol; this.teleport = data.teleport; this.boostSpeed = data.boostSpeed; this.projectile = data.projectile; this.shootRange = data.shootRange; this.shootRate = data.shootRate; this.shootCount = this.shootRate; this.spawnPoint = data.spawnPoint; this.onNear = 0; this.breakObj = false; this.alpha = data.alpha || 1; this.maxAlpha = data.alpha || 1; this.damaged = 0; }; // GET HIT: this.changeHealth = function(amount, doer) { this.health += amount; return (this.health <= 0); }; // GET SCALE: this.getScale = function(sM, ig) { sM = sM || 1; return this.scale * ((this.isItem || this.type == 2 || this.type == 3 || this.type == 4) ? 1 : (0.6 * sM)) * (ig ? 1 : this.colDiv); }; // VISIBLE TO PLAYER: this.visibleToPlayer = function(player) { return !(this.hideFromEnemy) || (this.owner && (this.owner == player || (this.owner.team && player.team == this.owner.team))); }; // UPDATE: this.update = function(delta) { if (this.active) { if (this.xWiggle) { this.xWiggle *= Math.pow(0.99, delta); } if (this.yWiggle) { this.yWiggle *= Math.pow(0.99, delta); } if (o.anotherVisual) { let d2 = UTILS.getAngleDist(this.lastDir, this.dir); if (d2 > 0.01) { this.dir += d2 / 5; } else { this.dir = this.lastDir; } } else { if (this.turnSpeed && this.dmg) { this.dir += this.turnSpeed * delta; } } } else { if (this.alive) { this.alpha -= delta / (200 / this.maxAlpha); this.visScale += delta / (this.scale / 2.5); if (this.alpha <= 0) { this.alpha = 0; this.alive = false; } } } }; // CHECK TEAM: this.isTeamObject = function(_) { return this.owner == null ? true : (this.owner && _.sid == this.owner.sid || _.findAllianceBySid(this.owner.sid)); }; } } class Items { constructor() { // ITEM GROUPS: this.groups = [{ id: 0, name: "food", layer: 0 }, { id: 1, name: "walls", place: true, limit: 30, layer: 0 }, { id: 2, name: "spikes", place: true, limit: 15, layer: 0 }, { id: 3, name: "mill", place: true, limit: 7, layer: 1 }, { id: 4, name: "mine", place: true, limit: 1, layer: 0 }, { id: 5, name: "trap", place: true, limit: 6, layer: -1 }, { id: 6, name: "booster", place: true, limit: 12, layer: -1 }, { id: 7, name: "turret", place: true, limit: 2, layer: 1 }, { id: 8, name: "watchtower", place: true, limit: 12, layer: 1 }, { id: 9, name: "buff", place: true, limit: 4, layer: -1 }, { id: 10, name: "spawn", place: true, limit: 1, layer: -1 }, { id: 11, name: "sapling", place: true, limit: 2, layer: 0 }, { id: 12, name: "blocker", place: true, limit: 3, layer: -1 }, { id: 13, name: "teleporter", place: true, limit: 2, layer: -1 }]; // PROJECTILES: this.projectiles = [{ indx: 0, layer: 0, src: "arrow_1", dmg: 25, speed: 1.6, scale: 103, range: 1000 }, { indx: 1, layer: 1, dmg: 25, scale: 20 }, { indx: 0, layer: 0, src: "arrow_1", dmg: 35, speed: 2.5, scale: 103, range: 1200 }, { indx: 0, layer: 0, src: "arrow_1", dmg: 30, speed: 2, scale: 103, range: 1200 }, { indx: 1, layer: 1, dmg: 16, scale: 20 }, { indx: 0, layer: 0, src: "bullet_1", dmg: 50, speed: 3.6, scale: 160, range: 1400 }]; // WEAPONS: this.weapons = [{ id: 0, type: 0, name: "tool hammer", desc: "tool for gathering all resources", src: "hammer_1", length: 140, width: 140, xOff: -3, yOff: 18, dmg: 25, range: 65, gather: 1, speed: 300 }, { id: 1, type: 0, age: 2, name: "hand axe", desc: "gathers resources at a higher rate", src: "axe_1", length: 140, width: 140, xOff: 3, yOff: 24, dmg: 30, spdMult: 1, range: 70, gather: 2, speed: 400 }, { id: 2, type: 0, age: 8, pre: 1, name: "great axe", desc: "deal more damage and gather more resources", src: "great_axe_1", length: 140, width: 140, xOff: -8, yOff: 25, dmg: 35, spdMult: 1, range: 75, gather: 4, speed: 400 }, { id: 3, type: 0, age: 2, name: "short sword", desc: "increased attack power but slower move speed", src: "sword_1", iPad: 1.3, length: 130, width: 210, xOff: -8, yOff: 46, dmg: 35, spdMult: 0.85, range: 110, gather: 1, speed: 300 }, { id: 4, type: 0, age: 8, pre: 3, name: "katana", desc: "greater range and damage", src: "samurai_1", iPad: 1.3, length: 130, width: 210, xOff: -8, yOff: 59, dmg: 40, spdMult: 0.8, range: 118, gather: 1, speed: 300 }, { id: 5, type: 0, age: 2, name: "polearm", desc: "long range melee weapon", src: "spear_1", iPad: 1.3, length: 130, width: 210, xOff: -8, yOff: 53, dmg: 45, knock: 0.2, spdMult: 0.82, range: 142, gather: 1, speed: 700 }, { id: 6, type: 0, age: 2, name: "bat", desc: "fast long range melee weapon", src: "bat_1", iPad: 1.3, length: 110, width: 180, xOff: -8, yOff: 53, dmg: 20, knock: 0.7, range: 110, gather: 1, speed: 300 }, { id: 7, type: 0, age: 2, name: "daggers", desc: "really fast short range weapon", src: "dagger_1", iPad: 0.8, length: 110, width: 110, xOff: 18, yOff: 0, dmg: 20, knock: 0.1, range: 65, gather: 1, hitSlow: 0.1, spdMult: 1.13, speed: 100 }, { id: 8, type: 0, age: 2, name: "stick", desc: "great for gathering but very weak", src: "stick_1", length: 140, width: 140, xOff: 3, yOff: 24, dmg: 1, spdMult: 1, range: 70, gather: 7, speed: 400 }, { id: 9, type: 1, age: 6, name: "hunting bow", desc: "bow used for ranged combat and hunting", src: "bow_1", req: ["wood", 4], length: 120, width: 120, xOff: -6, yOff: 0, Pdmg: 25, projectile: 0, spdMult: 0.75, speed: 600 }, { id: 10, type: 1, age: 6, name: "great hammer", desc: "hammer used for destroying structures", src: "great_hammer_1", length: 140, width: 140, xOff: -9, yOff: 25, dmg: 10, Pdmg: 10, spdMult: 0.88, range: 75, sDmg: 7.5, gather: 1, speed: 400 }, { id: 11, type: 1, age: 6, name: "wooden shield", desc: "blocks projectiles and reduces melee damage", src: "shield_1", length: 120, width: 120, shield: 0.2, xOff: 6, yOff: 0, Pdmg: 0, spdMult: 0.7 }, { id: 12, type: 1, age: 8, pre: 9, name: "crossbow", desc: "deals more damage and has greater range", src: "crossbow_1", req: ["wood", 5], aboveHand: true, armS: 0.75, length: 120, width: 120, xOff: -4, yOff: 0, Pdmg: 35, projectile: 2, spdMult: 0.7, speed: 700 }, { id: 13, type: 1, age: 9, pre: 12, name: "repeater crossbow", desc: "high firerate crossbow with reduced damage", src: "crossbow_2", req: ["wood", 10], aboveHand: true, armS: 0.75, length: 120, width: 120, xOff: -4, yOff: 0, Pdmg: 30, projectile: 3, spdMult: 0.7, speed: 230 }, { id: 14, type: 1, age: 6, name: "mc grabby", desc: "steals resources from enemies", src: "grab_1", length: 130, width: 210, xOff: -8, yOff: 53, dmg: 0, Pdmg: 0, steal: 250, knock: 0.2, spdMult: 1.05, range: 125, gather: 0, speed: 700 }, { id: 15, type: 1, age: 9, pre: 12, name: "musket", desc: "slow firerate but high damage and range", src: "musket_1", req: ["stone", 10], aboveHand: true, rec: 0.35, armS: 0.6, hndS: 0.3, hndD: 1.6, length: 205, width: 205, xOff: 25, yOff: 0, Pdmg: 50, projectile: 5, hideProjectile: true, spdMult: 0.6, speed: 1500 }]; // ITEMS: this.list = [{ group: this.groups[0], name: "apple", desc: "restores 20 health when consumed", req: ["food", 10], consume: function(doer) { return doer.changeHealth(20, doer); }, scale: 22, holdOffset: 15, healing: 20, itemID: 0, itemAID: 16, }, { age: 3, group: this.groups[0], name: "cookie", desc: "restores 40 health when consumed", req: ["food", 15], consume: function(doer) { return doer.changeHealth(40, doer); }, scale: 27, holdOffset: 15, healing: 40, itemID: 1, itemAID: 17, }, { age: 7, group: this.groups[0], name: "cheese", desc: "restores 30 health and another 50 over 5 seconds", req: ["food", 25], consume: function(doer) { if (doer.changeHealth(30, doer) || doer.health < 100) { doer.dmgOverTime.dmg = -10; doer.dmgOverTime.doer = doer; doer.dmgOverTime.time = 5; return true; } return false; }, scale: 27, holdOffset: 15, healing: 30, itemID: 2, itemAID: 18, }, { group: this.groups[1], name: "wood wall", desc: "provides protection for your village", req: ["wood", 10], projDmg: true, health: 380, scale: 50, holdOffset: 20, placeOffset: -5, itemID: 3, itemAID: 19, }, { age: 3, group: this.groups[1], name: "stone wall", desc: "provides improved protection for your village", req: ["stone", 25], health: 900, scale: 50, holdOffset: 20, placeOffset: -5, itemID: 4, itemAID: 20, }, { age: 7, group: this.groups[1], name: "castle wall", desc: "provides powerful protection for your village", req: ["stone", 35], health: 1500, scale: 52, holdOffset: 20, placeOffset: -5, itemID: 5, itemAID: 21, }, { group: this.groups[2], name: "spikes", desc: "damages enemies when they touch them", req: ["wood", 20, "stone", 5], health: 400, dmg: 20, scale: 49, spritePadding: -23, holdOffset: 8, placeOffset: -5, itemID: 6, itemAID: 22, shadow: { offsetX: 5, // Adjust the shadow's X offset as needed offsetY: 5, // Adjust the shadow's Y offset as needed blur: 20, // Adjust the shadow's blur as needed color: "rgba(0, 0, 0, 0.5)" // Adjust the shadow's color and transparency as needed } }, { age: 5, group: this.groups[2], name: "greater spikes", desc: "damages enemies when they touch them", req: ["wood", 30, "stone", 10], health: 500, dmg: 35, scale: 52, spritePadding: -23, holdOffset: 8, placeOffset: -5, itemID: 7, itemAID: 23, }, { age: 9, group: this.groups[2], name: "poison spikes", desc: "poisons enemies when they touch them", req: ["wood", 35, "stone", 15], health: 600, dmg: 30, pDmg: 5, scale: 52, spritePadding: -23, holdOffset: 8, placeOffset: -5, itemID: 8, itemAID: 24, }, { age: 9, group: this.groups[2], name: "spinning spikes", desc: "damages enemies when they touch them", req: ["wood", 30, "stone", 20], health: 500, dmg: 45, turnSpeed: 0.003, scale: 52, spritePadding: -23, holdOffset: 8, placeOffset: -5, itemID: 9, itemAID: 25, }, { group: this.groups[3], name: "windmill", desc: "generates gold over time", req: ["wood", 50, "stone", 10], health: 400, pps: 1, turnSpeed: 0.0016, spritePadding: 25, iconLineMult: 12, scale: 45, holdOffset: 20, placeOffset: 5, itemID: 10, itemAID: 26, }, { age: 5, group: this.groups[3], name: "faster windmill", desc: "generates more gold over time", req: ["wood", 60, "stone", 20], health: 500, pps: 1.5, turnSpeed: 0.0025, spritePadding: 25, iconLineMult: 12, scale: 47, holdOffset: 20, placeOffset: 5, itemID: 11, itemAID: 27, }, { age: 8, group: this.groups[3], name: "power mill", desc: "generates more gold over time", req: ["wood", 100, "stone", 50], health: 800, pps: 2, turnSpeed: 0.005, spritePadding: 25, iconLineMult: 12, scale: 47, holdOffset: 20, placeOffset: 5, itemID: 12, itemAID: 28, }, { age: 5, group: this.groups[4], type: 2, name: "mine", desc: "allows you to mine stone", req: ["wood", 20, "stone", 100], iconLineMult: 12, scale: 65, holdOffset: 20, placeOffset: 0, itemID: 13, itemAID: 29, }, { age: 5, group: this.groups[11], type: 0, name: "sapling", desc: "allows you to farm wood", req: ["wood", 150], iconLineMult: 12, colDiv: 0.5, scale: 110, holdOffset: 50, placeOffset: -15, itemID: 14, itemAID: 30, }, { age: 4, group: this.groups[5], name: "pit trap", desc: "pit that traps enemies if they walk over it", req: ["wood", 30, "stone", 30], trap: true, ignoreCollision: true, hideFromEnemy: true, health: 500, colDiv: 0.2, scale: 50, holdOffset: 20, placeOffset: -5, alpha: 0.6, itemID: 15, itemAID: 31, }, { age: 4, group: this.groups[6], name: "boost pad", desc: "provides boost when stepped on", req: ["stone", 20, "wood", 5], ignoreCollision: true, boostSpeed: 1.5, health: 150, colDiv: 0.7, scale: 45, holdOffset: 20, placeOffset: -5, itemID: 16, itemAID: 32, }, { age: 7, group: this.groups[7], doUpdate: true, name: "turret", desc: "defensive structure that shoots at enemies", req: ["wood", 200, "stone", 150], health: 800, projectile: 1, shootRange: 700, shootRate: 2200, scale: 43, holdOffset: 20, placeOffset: -5, itemID: 17, itemAID: 33, }, { age: 7, group: this.groups[8], name: "platform", desc: "platform to shoot over walls and cross over water", req: ["wood", 20], ignoreCollision: true, zIndex: 1, health: 300, scale: 43, holdOffset: 20, placeOffset: -5, itemID: 18, itemAID: 34, }, { age: 7, group: this.groups[9], name: "healing pad", desc: "standing on it will slowly heal you", req: ["wood", 30, "food", 10], ignoreCollision: true, healCol: 15, health: 400, colDiv: 0.7, scale: 45, holdOffset: 20, placeOffset: -5, itemID: 19, itemAID: 35, }, { age: 9, group: this.groups[10], name: "spawn pad", desc: "you will spawn here when you die but it will dissapear", req: ["wood", 100, "stone", 100], health: 400, ignoreCollision: true, spawnPoint: true, scale: 45, holdOffset: 20, placeOffset: -5, itemID: 20, itemAID: 36, }, { age: 7, group: this.groups[12], name: "blocker", desc: "blocks building in radius", req: ["wood", 30, "stone", 25], ignoreCollision: true, blocker: 300, health: 400, colDiv: 0.7, scale: 45, holdOffset: 20, placeOffset: -5, itemID: 21, itemAID: 37, }, { age: 7, group: this.groups[13], name: "teleporter", desc: "teleports you to a random point on the map", req: ["wood", 60, "stone", 60], ignoreCollision: true, teleport: true, health: 200, colDiv: 0.7, scale: 45, holdOffset: 20, placeOffset: -5, itemID: 22, itemAID: 38 }]; // CHECK ITEM ID: this.checkItem = { index: function(id, myItems) { return [0, 1, 2].includes(id) ? 0 : [3, 4, 5].includes(id) ? 1 : [6, 7, 8, 9].includes(id) ? 2 : [10, 11, 12].includes(id) ? 3 : [13, 14].includes(id) ? 5 : [15, 16].includes(id) ? 4 : [17, 18, 19, 21, 22].includes(id) ? [13, 14].includes(myItems) ? 6 : 5 : id == 20 ? [13, 14].includes(myItems) ? 7 : 6 : undefined; } } // ASSIGN IDS: for (let i = 0; i < this.list.length; ++i) { this.list[i].id = i; if (this.list[i].pre) this.list[i].pre = i - this.list[i].pre; } // TROLOLOLOL: if (typeof window !== "undefined") { function shuffle(a) { for (let i = a.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [a[i], a[j]] = [a[j], a[i]]; } return a; } //shuffle(this.list); } } } class Objectmanager { constructor(GameObject, gameObjects, UTILS, o, players, server) { let mathFloor = Math.floor, mathABS = Math.abs, mathCOS = Math.cos, mathSIN = Math.sin, mathPOW = Math.pow, mathSQRT = Math.sqrt; this.ignoreAdd = false; this.hitObj = []; // DISABLE OBJ: this.disableObj = function(obj) { //prePlacer if (enemy.length && near.dist2 <= 250 && preplaceOverride && Math.hypot(obj.y - player.y, obj.x - player.x) <= 300 && !getEl("weaponGrind").checked && getEl("preplacer").checked) { let mode = cst ? 2 : near.health < 73 ? 2 : 4 if (instaC.canSpikeTick == false && player.reloads[player.weapons[0]] != 0) { place(mode, Math.atan2(obj.y - player.y, obj.x - player.x)); } else if (instaC.canSpikeTick == false && player.reloads[player.weapons[0]] == 0 && !retrappable) { } else { place(mode, Math.atan2(obj.y - player.y, obj.x - player.x)); } preplaceOverride = false; } obj.active = false; if (o.anotherVisual) {} else { obj.alive = false; } }; // ADD NEW: let _; this.add = function(sid, x, y, dir, s, type, data, setSID, owner) { _ = findObjectBySid(sid); if (!_) { _ = gameObjects.find((tmp) => !tmp.active); if (!_) { _ = new GameObject(sid); gameObjects.push(_); } } if (setSID) { _.sid = sid; } _.init(x, y, dir, s, type, data, owner); }; // DISABLE BY SID: this.disableBySid = function(sid) { let find = findObjectBySid(sid); if (find) { this.disableObj(find); } }; // REMOVE ALL FROM PLAYER: this.removeAllItems = function(sid, server) { gameObjects.filter((tmp) => tmp.active && tmp.owner && tmp.owner.sid == sid).forEach((tmp) => this.disableObj(tmp)); }; // CHECK IF PLACABLE: this.checkItemLocation = function(x, y, s, sM, indx, ignoreWater, placer) { let cantPlace = gameObjects.find((tmp) => tmp.active && UTILS.getDistance(x, y, tmp.x, tmp.y) < s + (tmp.blocker ? tmp.blocker : tmp.getScale(sM, tmp.isItem))); if (cantPlace) return false; if (!ignoreWater && indx != 18 && y >= o.mapScale / 2 - o.riverWidth / 2 && y <= o.mapScale / 2 + o.riverWidth / 2) return false; return true; }; } } class Projectile { constructor(players, ais, objectManager, items, o, UTILS, server) { // INIT: this.init = function(indx, x, y, dir, spd, dmg, rng, scl, owner) { this.active = true; this.tickActive = true; this.indx = indx; this.x = x; this.y = y; this.x2 = x; this.y2 = y; this.dir = dir; this.skipMov = true; this.speed = spd; this.dmg = dmg; this.scale = scl; this.range = rng; this.r2 = rng; this.owner = owner; }; // UPDATE: this.update = function(delta) { if (this.active) { let tmpSpeed = this.speed * delta; if (!this.skipMov) { this.x += tmpSpeed * Math.cos(this.dir); this.y += tmpSpeed * Math.sin(this.dir); this.range -= tmpSpeed; if (this.range <= 0) { this.x += this.range * Math.cos(this.dir); this.y += this.range * Math.sin(this.dir); tmpSpeed = 1; this.range = 0; this.active = false; } } else { this.skipMov = false; } } }; this.tickUpdate = function(delta) { if (this.tickActive) { let tmpSpeed = this.speed * delta; if (!this.skipMov) { this.x2 += tmpSpeed * Math.cos(this.dir); this.y2 += tmpSpeed * Math.sin(this.dir); this.r2 -= tmpSpeed; if (this.r2 <= 0) { this.x2 += this.r2 * Math.cos(this.dir); this.y2 += this.r2 * Math.sin(this.dir); tmpSpeed = 1; this.r2 = 0; this.tickActive = false; } } else { this.skipMov = false; } } }; } }; class Store { constructor() { // STORE HATS: this.hats = [{ id: 45, name: "Shame!", dontSell: true, price: 0, scale: 120, desc: "hacks are for winners" }, { id: 51, name: "Moo Cap", price: 0, scale: 120, desc: "coolest mooer around" }, { id: 50, name: "Apple Cap", price: 0, scale: 120, desc: "apple farms remembers" }, { id: 28, name: "Moo Head", price: 0, scale: 120, desc: "no effect" }, { id: 29, name: "Pig Head", price: 0, scale: 120, desc: "no effect" }, { id: 30, name: "Fluff Head", price: 0, scale: 120, desc: "no effect" }, { id: 36, name: "Pandou Head", price: 0, scale: 120, desc: "no effect" }, { id: 37, name: "Bear Head", price: 0, scale: 120, desc: "no effect" }, { id: 38, name: "Monkey Head", price: 0, scale: 120, desc: "no effect" }, { id: 44, name: "Polar Head", price: 0, scale: 120, desc: "no effect" }, { id: 35, name: "Fez Hat", price: 0, scale: 120, desc: "no effect" }, { id: 42, name: "Enigma Hat", price: 0, scale: 120, desc: "join the enigma army" }, { id: 43, name: "Blitz Hat", price: 0, scale: 120, desc: "hey everybody i'm blitz" }, { id: 49, name: "Bob XIII Hat", price: 0, scale: 120, desc: "like and subscribe" }, { id: 57, name: "Pumpkin", price: 50, scale: 120, desc: "Spooooky" }, { id: 8, name: "Bummle Hat", price: 100, scale: 120, desc: "no effect" }, { id: 2, name: "Straw Hat", price: 500, scale: 120, desc: "no effect" }, { id: 15, name: "Winter Cap", price: 600, scale: 120, desc: "allows you to move at normal speed in snow", coldM: 1 }, { id: 5, name: "Cowboy Hat", price: 1000, scale: 120, desc: "no effect" }, { id: 4, name: "Ranger Hat", price: 2000, scale: 120, desc: "no effect" }, { id: 18, name: "Explorer Hat", price: 2000, scale: 120, desc: "no effect" }, { id: 31, name: "Flipper Hat", price: 2500, scale: 120, desc: "have more control while in water", watrImm: true }, { id: 1, name: "Marksman Cap", price: 3000, scale: 120, desc: "increases arrow speed and range", aMlt: 1.3 }, { id: 10, name: "Bush Gear", price: 3000, scale: 160, desc: "allows you to disguise yourself as a bush" }, { id: 48, name: "Halo", price: 3000, scale: 120, desc: "no effect" }, { id: 6, name: "Soldier Helmet", price: 4000, scale: 120, desc: "reduces damage taken but slows movement", spdMult: 0.94, dmgMult: 0.75 }, { id: 23, name: "Anti Venom Gear", price: 4000, scale: 120, desc: "makes you immune to poison", poisonRes: 1 }, { id: 13, name: "Medic Gear", price: 5000, scale: 110, desc: "slowly regenerates health over time", healthRegen: 3 }, { id: 9, name: "Miners Helmet", price: 5000, scale: 120, desc: "earn 1 extra gold per resource", extraGold: 1 }, { id: 32, name: "Musketeer Hat", price: 5000, scale: 120, desc: "reduces cost of projectiles", projCost: 0.5 }, { id: 7, name: "Bull Helmet", price: 6000, scale: 120, desc: "increases damage done but drains health", healthRegen: -5, dmgMultO: 1.5, spdMult: 0.96 }, { id: 22, name: "Emp Helmet", price: 6000, scale: 120, desc: "turrets won't attack but you move slower", antiTurret: 1, spdMult: 0.7 }, { id: 12, name: "Booster Hat", price: 6000, scale: 120, desc: "increases your movement speed", spdMult: 1.16 }, { id: 26, name: "Barbarian Armor", price: 8000, scale: 120, desc: "knocks back enemies that attack you", dmgK: 0.6 }, { id: 21, name: "Plague Mask", price: 10000, scale: 120, desc: "melee attacks deal poison damage", poisonDmg: 5, poisonTime: 6 }, { id: 46, name: "Bull Mask", price: 10000, scale: 120, desc: "bulls won't target you unless you attack them", bullRepel: 1 }, { id: 14, name: "Windmill Hat", topSprite: true, price: 10000, scale: 120, desc: "generates points while worn", pps: 1.5 }, { id: 11, name: "Spike Gear", topSprite: true, price: 10000, scale: 120, desc: "deal damage to players that damage you", dmg: 0.45 }, { id: 53, name: "Turret Gear", topSprite: true, price: 10000, scale: 120, desc: "you become a walking turret", turret: { proj: 1, range: 700, rate: 2500 }, spdMult: 0.7 }, { id: 20, name: "Samurai Armor", price: 12000, scale: 120, desc: "increased attack speed and fire rate", atkSpd: 0.78 }, { id: 58, name: "Dark Knight", price: 12000, scale: 120, desc: "restores health when you deal damage", healD: 0.4 }, { id: 27, name: "Scavenger Gear", price: 15000, scale: 120, desc: "earn double points for each kill", kScrM: 2 }, { id: 40, name: "Tank Gear", price: 15000, scale: 120, desc: "increased damage to buildings but slower movement", spdMult: 0.3, bDmg: 3.3 }, { id: 52, name: "Thief Gear", price: 15000, scale: 120, desc: "steal half of a players gold when you kill them", goldSteal: 0.5 }, { id: 55, name: "Bloodthirster", price: 20000, scale: 120, desc: "Restore Health when dealing damage. And increased damage", healD: 0.25, dmgMultO: 1.2, }, { id: 56, name: "Assassin Gear", price: 20000, scale: 120, desc: "Go invisible when not moving. Can't eat. Increased speed", noEat: true, spdMult: 1.1, invisTimer: 1000 }]; // STORE ACCESSORIES: this.accessories = [{ id: 12, name: "Snowball", price: 1000, scale: 105, xOff: 18, desc: "no effect" }, { id: 9, name: "Tree Cape", price: 1000, scale: 90, desc: "no effect" }, { id: 10, name: "Stone Cape", price: 1000, scale: 90, desc: "no effect" }, { id: 3, name: "Cookie Cape", price: 1500, scale: 90, desc: "no effect" }, { id: 8, name: "Cow Cape", price: 2000, scale: 90, desc: "no effect" }, { id: 11, name: "Monkey Tail", price: 2000, scale: 97, xOff: 25, desc: "Super speed but reduced damage", spdMult: 1.35, dmgMultO: 0.2 }, { id: 17, name: "Apple Basket", price: 3000, scale: 80, xOff: 12, desc: "slowly regenerates health over time", healthRegen: 1 }, { id: 6, name: "Winter Cape", price: 3000, scale: 90, desc: "no effect" }, { id: 4, name: "Skull Cape", price: 4000, scale: 90, desc: "no effect" }, { id: 5, name: "Dash Cape", price: 5000, scale: 90, desc: "no effect" }, { id: 2, name: "Dragon Cape", price: 6000, scale: 90, desc: "no effect" }, { id: 1, name: "Super Cape", price: 8000, scale: 90, desc: "no effect" }, { id: 7, name: "Troll Cape", price: 8000, scale: 90, desc: "no effect" }, { id: 14, name: "Thorns", price: 10000, scale: 115, xOff: 20, desc: "no effect" }, { id: 15, name: "Blockades", price: 10000, scale: 95, xOff: 15, desc: "no effect" }, { id: 20, name: "Devils Tail", price: 10000, scale: 95, xOff: 20, desc: "no effect" }, { id: 16, name: "Sawblade", price: 12000, scale: 90, spin: true, xOff: 0, desc: "deal damage to players that damage you", dmg: 0.15 }, { id: 13, name: "Angel Wings", price: 15000, scale: 138, xOff: 22, desc: "slowly regenerates health over time", healthRegen: 3 }, { id: 19, name: "Shadow Wings", price: 15000, scale: 138, xOff: 22, desc: "increased movement speed", spdMult: 1.1 }, { id: 18, name: "Blood Wings", price: 20000, scale: 178, xOff: 26, desc: "restores health when you deal damage", healD: 0.2 }, { id: 21, name: "Corrupt X Wings", price: 20000, scale: 178, xOff: 26, desc: "deal damage to players that damage you", dmg: 0.25 }]; } }; class ProjectileManager { constructor(Projectile, projectiles, players, ais, objectManager, items, o, UTILS, server) { this.addProjectile = function(x, y, dir, range, speed, indx, owner, ignoreObj, layer, inWindow) { let tmpData = items.projectiles[indx]; let tmpProj; for (let i = 0; i < projectiles.length; ++i) { if (!projectiles[i].active) { tmpProj = projectiles[i]; break; } } if (!tmpProj) { tmpProj = new Projectile(players, ais, objectManager, items, o, UTILS, server); tmpProj.sid = projectiles.length; projectiles.push(tmpProj); } tmpProj.init(indx, x, y, dir, speed, tmpData.dmg, range, tmpData.scale, owner); tmpProj.ignoreObj = ignoreObj; tmpProj.layer = layer || tmpData.layer; tmpProj.inWindow = inWindow; tmpProj.src = tmpData.src; return tmpProj; }; } }; class AiManager { // AI MANAGER: constructor(ais, AI, players, items, objectManager, o, UTILS, scoreCallback, server) { // AI TYPES: this.aiTypes = [{ id: 0, src: "cow_1", killScore: 150, health: 500, weightM: 0.8, speed: 0.00095, turnSpeed: 0.001, scale: 72, drop: ["food", 50] }, { id: 1, src: "pig_1", killScore: 200, health: 800, weightM: 0.6, speed: 0.00085, turnSpeed: 0.001, scale: 72, drop: ["food", 80] }, { id: 2, name: "Bull", src: "bull_2", hostile: true, dmg: 20, killScore: 1000, health: 1800, weightM: 0.5, speed: 0.00094, turnSpeed: 0.00074, scale: 78, viewRange: 800, chargePlayer: true, drop: ["food", 100] }, { id: 3, name: "Bully", src: "bull_1", hostile: true, dmg: 20, killScore: 2000, health: 2800, weightM: 0.45, speed: 0.001, turnSpeed: 0.0008, scale: 90, viewRange: 900, chargePlayer: true, drop: ["food", 400] }, { id: 4, name: "Wolf", src: "wolf_1", hostile: true, dmg: 8, killScore: 500, health: 300, weightM: 0.45, speed: 0.001, turnSpeed: 0.002, scale: 84, viewRange: 800, chargePlayer: true, drop: ["food", 200] }, { id: 5, name: "Quack", src: "chicken_1", dmg: 8, killScore: 2000, noTrap: true, health: 300, weightM: 0.2, speed: 0.0018, turnSpeed: 0.006, scale: 70, drop: ["food", 100] }, { id: 6, name: "MOOSTAFA", nameScale: 50, src: "enemy", hostile: true, dontRun: true, fixedSpawn: true, spawnDelay: 60000, noTrap: true, colDmg: 100, dmg: 40, killScore: 8000, health: 18000, weightM: 0.4, speed: 0.0007, turnSpeed: 0.01, scale: 80, spriteMlt: 1.8, leapForce: 0.9, viewRange: 1000, hitRange: 210, hitDelay: 1000, chargePlayer: true, drop: ["food", 100] }, { id: 7, name: "Treasure", hostile: true, nameScale: 35, src: "crate_1", fixedSpawn: true, spawnDelay: 120000, colDmg: 200, killScore: 5000, health: 20000, weightM: 0.1, speed: 0.0, turnSpeed: 0.0, scale: 70, spriteMlt: 1.0 }, { id: 8, name: "MOOFIE", src: "wolf_2", hostile: true, fixedSpawn: true, dontRun: true, hitScare: 4, spawnDelay: 30000, noTrap: true, nameScale: 35, dmg: 10, colDmg: 100, killScore: 3000, health: 7000, weightM: 0.45, speed: 0.0015, turnSpeed: 0.002, scale: 90, viewRange: 800, chargePlayer: true, drop: ["food", 1000] }, { id: 9, name: "MOOFIE", src: "wolf_2", hostile: !0, fixedSpawn: !0, dontRun: !0, hitScare: 50, spawnDelay: 6e4, noTrap: !0, nameScale: 35, dmg: 12, colDmg: 100, killScore: 3e3, health: 9e3, weightM: .45, speed: .0015, turnSpeed: .0025, scale: 94, viewRange: 1440, chargePlayer: !0, drop: ["food", 3e3], minSpawnRange: .85, maxSpawnRange: .9 }, { id: 10, name: "Wolf", src: "wolf_1", hostile: !0, fixedSpawn: !0, dontRun: !0, hitScare: 50, spawnDelay: 3e4, dmg: 10, killScore: 700, health: 500, weightM: .45, speed: .00115, turnSpeed: .0025, scale: 88, viewRange: 1440, chargePlayer: !0, drop: ["food", 400], minSpawnRange: .85, maxSpawnRange: .9 }, { id: 11, name: "Bully", src: "bull_1", hostile: !0, fixedSpawn: !0, dontRun: !0, hitScare: 50, dmg: 20, killScore: 5e3, health: 5e3, spawnDelay: 1e5, weightM: .45, speed: .00115, turnSpeed: .0025, scale: 94, viewRange: 1440, chargePlayer: !0, drop: ["food", 800], minSpawnRange: .85, maxSpawnRange: .9 }]; // SPAWN AI: this.spawn = function(x, y, dir, index) { let _ = ais.find((tmp) => !tmp.active); if (!_) { _ = new AI(ais.length, objectManager, players, items, UTILS, o, scoreCallback, server); ais.push(_); } _.init(x, y, dir, index, this.aiTypes[index]); return _; }; } }; class AI { constructor(sid, objectManager, players, items, UTILS, o, scoreCallback, server) { this.sid = sid; this.isAI = true; this.nameIndex = UTILS.randInt(0, o.cowNames.length - 1); // INIT: this.init = function(x, y, dir, index, data) { this.x = x; this.y = y; this.startX = data.fixedSpawn ? x : null; this.startY = data.fixedSpawn ? y : null; this.xVel = 0; this.yVel = 0; this.zIndex = 0; this.dir = dir; this.dirPlus = 0; this.index = index; this.src = data.src; if (data.name) this.name = data.name; this.weightM = data.weightM; this.speed = data.speed; this.killScore = data.killScore; this.turnSpeed = data.turnSpeed; this.scale = data.scale; this.maxHealth = data.health; this.leapForce = data.leapForce; this.health = this.maxHealth; this.chargePlayer = data.chargePlayer; this.viewRange = data.viewRange; this.drop = data.drop; this.dmg = data.dmg; this.hostile = data.hostile; this.dontRun = data.dontRun; this.hitRange = data.hitRange; this.hitDelay = data.hitDelay; this.hitScare = data.hitScare; this.spriteMlt = data.spriteMlt; this.nameScale = data.nameScale; this.colDmg = data.colDmg; this.noTrap = data.noTrap; this.spawnDelay = data.spawnDelay; this.hitWait = 0; this.waitCount = 1000; this.moveCount = 0; this.targetDir = 0; this.active = true; this.alive = true; this.runFrom = null; this.chargeTarget = null; this.dmgOverTime = {}; }; let tmpRatio = 0; let animIndex = 0; this.animate = function(delta) { if (this.animTime > 0) { this.animTime -= delta; if (this.animTime <= 0) { this.animTime = 0; this.dirPlus = 0; tmpRatio = 0; animIndex = 0; } else { if (animIndex == 0) { tmpRatio += delta / (this.animSpeed * o.hitReturnRatio); this.dirPlus = UTILS.lerp(0, this.targetAngle, Math.min(1, tmpRatio)); if (tmpRatio >= 1) { tmpRatio = 1; animIndex = 1; } } else { tmpRatio -= delta / (this.animSpeed * (1 - o.hitReturnRatio)); this.dirPlus = UTILS.lerp(0, this.targetAngle, Math.max(0, tmpRatio)); } } } }; // ANIMATION: this.startAnim = function() { this.animTime = this.animSpeed = 600; this.targetAngle = Math.PI * 0.8; tmpRatio = 0; animIndex = 0; }; }; }; class Petal { constructor(x, y) { this.x = x; this.y = y; this.damage = 10; this.health = 10; this.maxHealth = this.health; this.active = false; this.alive = false; this.timer = 1500; this.time = 0; this.damaged = 0; this.alpha = 1; this.scale = 9; this.visScale = this.scale; } }; class addCh { constructor(x, y, chat, _) { this.x = x; this.y = y; this.alpha = 0; this.active = true; this.alive = false; this.chat = chat; this.owner = _; }; }; class DeadPlayer { constructor(x, y, dir, buildIndex, weaponIndex, weaponVariant, skinColor, scale, name) { this.x = x; this.y = y; this.lastDir = dir; this.dir = dir + Math.PI; this.buildIndex = buildIndex; this.weaponIndex = weaponIndex; this.weaponVariant = weaponVariant; this.skinColor = skinColor; this.scale = scale; this.visScale = 0; this.name = name; this.alpha = 1; this.active = true; this.animate = function(delta) { let d2 = UTILS.getAngleDist(this.lastDir, this.dir); if (d2 > 0.01) { this.dir += d2 / 20; } else { this.dir = this.lastDir; } if (this.visScale < this.scale) { this.visScale += delta / (this.scale / 2); if (this.visScale >= this.scale) { this.visScale = this.scale; } } this.alpha -= delta / 30000; if (this.alpha <= 0) { this.alpha = 0; this.active = false; } } } }; class Player { constructor(id, sid, o, UTILS, projectileManager, objectManager, players, ais, items, hats, accessories, server, scoreCallback, iconCallback) { this.id = id; this.sid = sid; this.tmpScore = 0; this.team = null; this.latestSkin = 0; this.oldSkinIndex = 0; this.skinIndex = 0; this.latestTail = 0; this.oldTailIndex = 0; this.tailIndex = 0; this.hitTime = 0; this.lastHit = 0; this.tails = {}; for (let i = 0; i < accessories.length; ++i) { if (accessories[i].price <= 0) this.tails[accessories[i].id] = 1; } this.skins = {}; for (let i = 0; i < hats.length; ++i) { if (hats[i].price <= 0) this.skins[hats[i].id] = 1; } this.points = 0; this.dt = 0; this.hidden = false; this.itemCounts = {}; this.isPlayer = true; this.pps = 0; this.moveDir = undefined; this.skinRot = 0; this.lastPing = 0; this.iconIndex = 0; this.skinColor = 0; this.dist2 = 0; this.aim2 = 0; this.maxSpeed = 1; this.chat = { message: null, count: 0 }; this.backupNobull = true; // SPAWN: this.spawn = function(moofoll) { this.attacked = false; this.death = false; this.spinDir = 0; this.sync = false; this.antiBull = 0; this.bullTimer = 0; this.poisonTimer = 0; this.active = true; this.alive = true; this.lockMove = false; this.lockDir = false; this.minimapCounter = 0; this.chatCountdown = 0; this.shameCount = 0; this.shameTimer = 0; this.sentTo = {}; this.gathering = 0; this.gatherIndex = 0; this.shooting = {}; this.shootIndex = 9; this.autoGather = 0; this.animTime = 0; this.animSpeed = 0; this.mouseState = 0; this.buildIndex = -1; this.weaponIndex = 0; this.syncThreats = 0; this.weaponCode = 0; this.weaponVariant = 0; this.primaryIndex = undefined; this.secondaryIndex = undefined; this.dmgOverTime = {}; this.noMovTimer = 0; this.maxXP = 300; this.XP = 0; this.age = 1; this.kills = 0; this.upgrAge = 2; this.upgradePoints = 0; this.x = 0; this.y = 0; this.oldXY = { x: 0, y: 0 }; this.zIndex = 0; this.xVel = 0; this.yVel = 0; this.slowMult = 1; this.dir = 0; this.dirPlus = 0; this.targetDir = 0; this.targetAngle = 0; this.maxHealth = 100; this.health = this.maxHealth; this.oldHealth = this.maxHealth; this.damaged = 0; this.scale = o.playerScale; this.speed = o.playerSpeed; this.resetMoveDir(); this.resetResources(moofoll); this.items = [0, 3, 6, 10]; this.weapons = [0]; this.shootCount = 0; this.weaponXP = []; this.reloads = { 0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0, 14: 0, 15: 0, 53: 0, }; this.bowThreat = { 9: 0, 12: 0, 13: 0, 15: 0, }; this.damageThreat = 0; this.inTrap = false; this.canEmpAnti = false; this.empAnti = false; this.soldierAnti = false; this.poisonTick = 0; this.bullTick = 0; this.setPoisonTick = false; this.setBullTick = false; this.antiTimer = 2; }; // RESET MOVE DIR: this.resetMoveDir = function() { this.moveDir = undefined; }; // RESET RESOURCES: this.resetResources = function(moofoll) { for (let i = 0; i < o.resourceTypes.length; ++i) { this[o.resourceTypes[i]] = moofoll ? 100 : 0; } }; // ADD ITEM: this.getItemType = function(id) { let findindx = this.items.findIndex((ids) => ids == id); if (findindx != -1) { return findindx; } else { return items.checkItem.index(id, this.items); } }; // SET DATA: this.setData = function(data) { this.id = data[0]; this.sid = data[1]; this.name = data[2]; this.x = data[3]; this.y = data[4]; this.dir = data[5]; this.health = data[6]; this.maxHealth = data[7]; this.scale = data[8]; this.skinColor = data[9]; }; // UPDATE POISON TICK: this.updateTimer = function() { this.bullTimer -= 1; if (this.bullTimer <= 0) { this.setBullTick = false; this.bullTick = game.tick - 1; this.bullTimer = o.serverUpdateRate; } this.poisonTimer -= 1; if (this.poisonTimer <= 0) { this.setPoisonTick = false; this.poisonTick = game.tick - 1; this.poisonTimer = o.serverUpdateRate; } }; this.update = function(delta) { if (this.active) { // MOVE: let gear = { skin: findID(hats, this.skinIndex), tail: findID(accessories, this.tailIndex) } let spdMult = ((this.buildIndex >= 0) ? 0.5 : 1) * (items.weapons[this.weaponIndex].spdMult || 1) * (gear.skin ? (gear.skin.spdMult || 1) : 1) * (gear.tail ? (gear.tail.spdMult || 1) : 1) * (this.y <= o.snowBiomeTop ? ((gear.skin && gear.skin.coldM) ? 1 : o.snowSpeed) : 1) * this.slowMult; this.maxSpeed = spdMult; } }; let tmpRatio = 0; let animIndex = 0; this.animate = function(delta) { if (this.animTime > 0) { this.animTime -= delta; if (this.animTime <= 0) { this.animTime = 0; this.dirPlus = 0; tmpRatio = 0; animIndex = 0; } else { if (animIndex == 0) { tmpRatio += delta / (this.animSpeed * o.hitReturnRatio); this.dirPlus = UTILS.lerp(0, this.targetAngle, Math.min(1, tmpRatio)); if (tmpRatio >= 1) { tmpRatio = 1; animIndex = 1; } } else { tmpRatio -= delta / (this.animSpeed * (1 - o.hitReturnRatio)); this.dirPlus = UTILS.lerp(0, this.targetAngle, Math.max(0, tmpRatio)); } } } }; // GATHER ANIMATION: this.startAnim = function(didHit, index) { this.animTime = this.animSpeed = items.weapons[index].speed; this.targetAngle = (didHit ? -o.hitAngle : -Math.PI); tmpRatio = 0; animIndex = 0; }; // CAN SEE: this.canSee = function(other) { if (!other) return false; let dx = Math.abs(other.x - this.x) - other.scale; let dy = Math.abs(other.y - this.y) - other.scale; return dx <= (o.maxScreenWidth / 2) * 1.3 && dy <= (o.maxScreenHeight / 2) * 1.3; }; // SHAME SYSTEM: this.judgeShame = function() { if (this.oldHealth < this.health) { if (this.hitTime) { let timeSinceHit = game.tick - this.hitTime; this.lastHit = game.tick; this.hitTime = 0; if (timeSinceHit < 2) { this.shameCount++; } else { this.shameCount = Math.max(0, this.shameCount - 2); } } } else if (this.oldHealth > this.health) { this.hitTime = game.tick; } }; this.addShameTimer = function() { this.shameCount = 0; this.shameTimer = 30; let interval = setInterval(() => { this.shameTimer--; if (this.shameTimer <= 0) { clearInterval(interval); } }, 1000); }; // CHECK TEAM: this.isTeam = function(_) { return (this == _ || (this.team && this.team == _.team)); }; // FOR THE PLAYER: this.findAllianceBySid = function(sid) { return this.team ? alliancePlayers.find((THIS) => THIS === sid) : null; }; this.checkCanInsta = function(nobull) { let totally = 0; if (this.alive && inGame) { let primary = { weapon: this.weapons[0], variant: this.primaryVariant, dmg: this.weapons[0] == undefined ? 0 : items.weapons[this.weapons[0]].dmg, }; let secondary = { weapon: this.weapons[1], variant: this.secondaryVariant, dmg: this.weapons[1] == undefined ? 0 : items.weapons[this.weapons[1]].Pdmg, }; let bull = this.skins[7] && !nobull ? 1.5 : 1; let pV = primary.variant != undefined ? o.weaponVariants[primary.variant].val : 1; if (primary.weapon != undefined && this.reloads[primary.weapon] == 0) { totally += primary.dmg * pV * bull; } if (secondary.weapon != undefined && this.reloads[secondary.weapon] == 0) { totally += secondary.dmg; } if (this.skins[53] && this.reloads[53] <= (player.weapons[1] == 10 ? 0 : game.tickRate) && near.skinIndex != 22) { totally += 25; } totally *= near.skinIndex == 6 ? 0.75 : 1; return totally; } return 0; }; // UPDATE WEAPON RELOAD: this.manageReload = function() { if (this.shooting[53]) { this.shooting[53] = 0; this.reloads[53] = (2500 - game.tickRate); } else { if (this.reloads[53] > 0) { this.reloads[53] = Math.max(0, this.reloads[53] - game.tickRate); } } if (this.gathering || this.shooting[1]) { if (this.gathering) { this.gathering = 0; this.reloads[this.gatherIndex] = (items.weapons[this.gatherIndex].speed * (this.skinIndex == 20 ? 0.78 : 1)); this.attacked = true; if (this != player && player.team && this.team == player.team && player.weapons[1] == 15 && this.gatherIndex == 5) {//pri sync Synced.SyncShotPri++; // Sync = power } } if (this.shooting[1]) { this.shooting[1] = 0; this.reloads[this.shootIndex] = (items.weapons[this.shootIndex].speed * (this.skinIndex == 20 ? 0.78 : 1)); this.attacked = true; if (this != player && player.team && this.team == player.team && player.weapons[1] == 15 && this.shootIndex == 15) {//sec sync Synced.SyncShotSec++; // Sync = power } } } else { this.attacked = false; if (this.buildIndex < 0) { if (this.reloads[this.weaponIndex] > 0) { this.reloads[this.weaponIndex] = Math.max(0, this.reloads[this.weaponIndex] - game.tickRate); if (this == player) { if (getEl("weaponGrind").checked) { for (let i = 0; i < Math.PI * 2; i += Math.PI / 2) { checkPlace(player.getItemType(22), i); } } } if (this.reloads[this.primaryIndex] == 0 && this.reloads[this.weaponIndex] == 0) { this.antiBull++; game.tickBase(() => { this.antiBull = 0; }, 1); } } } } }; // FOR ANTI INSTA: this.addDamageThreat = function(_) { let primary = { weapon: this.primaryIndex, variant: this.primaryVariant }; primary.dmg = primary.weapon == undefined ? 45 : items.weapons[primary.weapon].dmg; let secondary = { weapon: this.secondaryIndex, variant: this.secondaryVariant }; secondary.dmg = secondary.weapon == undefined ? 50 : items.weapons[secondary.weapon].Pdmg; let bull = 1.5; let pV = primary.variant != undefined ? o.weaponVariants[primary.variant].val : 1.18; let sV = secondary.variant != undefined ? [9, 12, 13, 15].includes(secondary.weapon) ? 1 : o.weaponVariants[secondary.variant].val : 1.18; if (primary.weapon == undefined ? true : this.reloads[primary.weapon] == 0) { this.damageThreat += primary.dmg * pV * bull; } if (secondary.weapon == undefined ? true : this.reloads[secondary.weapon] == 0) { this.damageThreat += secondary.dmg * sV; } if (this.reloads[53] <= game.tickRate) { this.damageThreat += 25; } this.damageThreat *= _.skinIndex == 6 ? 0.75 : 1; if (!this.isTeam(_)) { if (this.dist2 <= 300) { _.damageThreat += this.damageThreat; } } }; } }; // SOME CODES: function sendUpgrade(index) { player.reloads[index] = 0; packet("H", index); } function storeEquip(id, index) { packet("c", 0, id, index); } function storeBuy(id, index) { packet("c", 1, id, index); } function buyEquip(id, index) { let nID = player.skins[6] ? 6 : 0; if (player.alive && inGame) { if (index == 0) { if (player.skins[id]) { if (player.latestSkin != id) { packet("c", 0, id, 0); } } else { if (os.autoBuyEquip) { let find = findID(hats, id); if (find) { if (player.points >= find.price) { packet("c", 1, id, 0); packet("c", 0, id, 0); } else { if (player.latestSkin != nID) { packet("c", 0, nID, 0); } } } else { if (player.latestSkin != nID) { packet("c", 0, nID, 0); } } } else { if (player.latestSkin != nID) { packet("c", 0, nID, 0); } } } } else if (index == 1) { if (useWasd && (id != 11 && id != 0)) { if (player.latestTail != 0) { packet("c", 0, 0, 1); } return; } if (player.tails[id]) { if (player.latestTail != id) { packet("c", 0, id, 1); } } else { if (os.autoBuyEquip) { let find = findID(accessories, id); if (find) { if (player.points >= find.price) { packet("c", 1, id, 1); packet("c", 0, id, 1); } else { if (player.latestTail != 0) { packet("c", 0, 0, 1); } } } else { if (player.latestTail != 0) { packet("c", 0, 0, 1); } } } else { if (player.latestTail != 0) { packet("c", 0, 0, 1); } } } } } } function selectToBuild(index, wpn) { packet("G", index, wpn); } function selectWeapon(index, isPlace) { if (!isPlace) { player.weaponCode = index; } packet("G", index, 1); } function sendAutoGather() { packet("K", 1, 1); } function sendAtck(id, angle) { packet("d", id, angle, 1); } // PLACER: // PLACER: function place(id, rad, rmd) { try { if (id == undefined) return; let item = items.list[player.items[id]]; let tmpS = player.scale + item.scale + (item.placeOffset || 0); let tmpX = player.x2 + tmpS * Math.cos(rad); let tmpY = player.y2 + tmpS * Math.sin(rad); if (testMode || (player.alive && inGame && player.itemCounts[item.group.id] == undefined ? true : player.itemCounts[item.group.id] < (o.isSandbox ? 299 : item.group.limit ? item.group.limit : 99))) { selectToBuild(player.items[id]); sendAtck(1, rad); selectWeapon(player.weaponCode, 1); if (rmd && getEl("placeVis").checked) { placeVisible.push({ x: tmpX, y: tmpY, name: item.name, scale: item.scale, dir: rad }); game.tickBase(() => { placeVisible.shift(); }, 1) } } } catch (e) {} } function checkPlace(id, rad) { try { if (id == undefined) return; let item = items.list[player.items[id]]; let tmpS = player.scale + item.scale + (item.placeOffset || 0); let tmpX = player.x2 + tmpS * Math.cos(rad); let tmpY = player.y2 + tmpS * Math.sin(rad); if (objectManager.checkItemLocation(tmpX, tmpY, item.scale, 0.6, item.id, false, player)) { place(id, rad, 1); } } catch (e) {} } // HEALING: function soldierMult() { return player.latestSkin == 6 ? 0.75 : 1; } function healthBased() { if (player.health == 80) return 0; if ((player.skinIndex != 70 && player.skinIndex != 86)) { return Math.ceil((100 - player.health) / items.list[player.items[0]].healing); } return 0; } function getAttacker(damaged) { let attackers = enemy.filter(tmp => { //let damages = new Damages(items); //let dmg = damages.weapons[tmp.weaponIndex]; //let by = tmp.weaponIndex < 9 ? [dmg[0], dmg[1], dmg[2], dmg[3]] : [dmg[0], dmg[1]]; let rule = { //one: tmp.dist2 <= 300, //two: by.includes(damaged), three: tmp.attacked } return /*rule.one && rule.two && */ rule.three; }); return attackers; } function healer() { for (let i = 0; i < healthBased(); i++) { place(0, getAttackDir()); } } function antiSyncHealing(timearg) { my.antiSync = true; let healAnti = setInterval(() => { if (player.shameCount < 5) { place(0, getAttackDir()); } }, 125); setTimeout(() => { clearInterval(healAnti); setTimeout(() => { my.antiSync = false; }, game.tickRate); }, game.tickRate * timearg); } function biomeGear(mover, returns) { if (player.y2 >= o.mapScale / 2 - o.riverWidth / 2 && player.y2 <= o.mapScale / 2 + o.riverWidth / 2) { if (returns) return 31; buyEquip(31, 0); } else { if (player.y2 <= o.snowBiomeTop) { if (returns) return mover && player.moveDir == undefined ? 22 : 15; buyEquip(mover && player.moveDir == undefined ? 22 : 15, 0); } else { if (returns) return mover && player.moveDir == undefined ? 22 : 12; buyEquip(mover && player.moveDir == undefined ? 22 : 12, 0); } } if (returns) return 0; } function woah(mover) { buyEquip(mover && player.moveDir == undefined ? 0 : 11, 1); } let advHeal = []; class Traps { constructor(UTILS, items) { this.dist = 0; this.aim = 0; this.inTrap = false; this.replaced = false; this.antiTrapped = false; this.info = {}; this.notFast = function() { return player.weapons[1] == 10 && ((this.info.health > items.weapons[player.weapons[0]].dmg) || player.weapons[0] == 5); } this.testCanPlace = function(id, first = -(Math.PI / 2), repeat = (Math.PI / 2), plus = (Math.PI / 18), radian, replacer, yaboi) { try { let item = items.list[player.items[id]]; let tmpS = player.scale + item.scale + (item.placeOffset || 0); let counts = { attempts: 0, placed: 0 }; let _ects = []; gameObjects.forEach((p) => { _ects.push({ x: p.x, y: p.y, active: p.active, blocker: p.blocker, scale: p.scale, isItem: p.isItem, type: p.type, colDiv: p.colDiv, getScale: function(sM, ig) { sM = sM || 1; return this.scale * ((this.isItem || this.type == 2 || this.type == 3 || this.type == 4) ? 1 : (0.6 * sM)) * (ig ? 1 : this.colDiv); }, }); }); for (let i = first; i < repeat; i += plus) { counts.attempts++; let relAim = radian + i; let tmpX = player.x2 + tmpS * Math.cos(relAim); let tmpY = player.y2 + tmpS * Math.sin(relAim); let cantPlace = _ects.find((tmp) => tmp.active && UTILS.getDistance(tmpX, tmpY, tmp.x, tmp.y) < item.scale + (tmp.blocker ? tmp.blocker : tmp.getScale(0.6, tmp.isItem))); if (cantPlace) continue; if (item.id != 18 && tmpY >= o.mapScale / 2 - o.riverWidth / 2 && tmpY <= o.mapScale / 2 + o.riverWidth / 2) continue; if ((!replacer && yaboi) || useWasd) { if (useWasd ? false : yaboi.inTrap) { if (UTILS.getAngleDist(near.aim2 + Math.PI, relAim + Math.PI) <= Math.PI) { place(2, relAim, 1); } else { player.items[4] == 15 && place(4, relAim, 1); } } else { if (UTILS.getAngleDist(near.aim2, relAim) <= o.gatherAngle / 1.5) { place(2, relAim, 1); } else { player.items[4] == 15 && place(4, relAim, 1); } } } else { place(id, relAim, 1); } _ects.push({ x: tmpX, y: tmpY, active: true, blocker: item.blocker, scale: item.scale, isItem: true, type: null, colDiv: item.colDiv, getScale: function() { return this.scale; }, }); if (UTILS.getAngleDist(near.aim2, relAim) <= 1) { counts.placed++; } } if (counts.placed > 0 && replacer && item.dmg) { if (near.dist2 <= items.weapons[player.weapons[0]].range + (player.scale * 1.8) && os.spikeTick) { instaC.canSpikeTick = true; } } } catch (err) { } }; this.checkSpikeTick = function() { try { if (![3, 4, 5].includes(near.primaryIndex)) return false; if ((getEl("safeAntiSpikeTick").checked || my.autoPush) ? false : near.primaryIndex == undefined ? true : (near.reloads[near.primaryIndex] > game.tickRate)) return false; // more range for safe. also testing near.primaryIndex || 5 if (near.dist2 <= items.weapons[near.primaryIndex || 5].range + (near.scale * 1.8)) { let item = items.list[9]; let tmpS = near.scale + item.scale + (item.placeOffset || 0); let danger = 0; let counts = { attempts: 0, block: `unblocked` }; for (let i = -1; i <= 1; i += 1 / 10) { counts.attempts++; let relAim = UTILS.getDirect(player, near, 2, 2) + i; let tmpX = near.x2 + tmpS * Math.cos(relAim); let tmpY = near.y2 + tmpS * Math.sin(relAim); let cantPlace = gameObjects.find((tmp) => tmp.active && UTILS.getDistance(tmpX, tmpY, tmp.x, tmp.y) < item.scale + (tmp.blocker ? tmp.blocker : tmp.getScale(0.6, tmp.isItem))); if (cantPlace) continue; if (tmpY >= o.mapScale / 2 - o.riverWidth / 2 && tmpY <= o.mapScale / 2 + o.riverWidth / 2) continue; danger++; counts.block = `blocked`; break; } if (danger) { my.anti0Tick = 1; player.chat.message = "Anti SpikeTick " + near.sid; player.chat.count = 2000; return true; } } } catch (err) { return null; } return false; } this.protect = function(aim) { if (!os.antiTrap) return; if (player.items[4]) { this.testCanPlace(4, -(Math.PI / 2), (Math.PI / 2), (Math.PI / 18), aim + Math.PI); this.antiTrapped = true; } }; this.autoPlace = function () { if (enemy.length && os.autoPlace && !instaC.ticking) { if (gameObjects.length) { let near2 = { inTrap: true, }; let nearTrap = gameObjects.filter(e => e.trap && e.active && e.isTeamObject(player) && UTILS.getDist(e, near, 0, 2) <= (near.scale + e.getScale() + 5)).sort(function (a, b) { return UTILS.getDist(a, near, 0, 2) - UTILS.getDist(b, near, 0, 2); })[0]; if (nearTrap) { near2.inTrap = true; } else { near2.inTrap = true; } if (testMode ? enemy.length : (near.dist2 <= 375)) { if (near.dist2 <= 200) { this.testCanPlace(4, 0, (Math.PI * 2), (Math.PI / 24), near.aim2, 0, {inTrap: near2.inTrap}); } else { player.items[4] == 15 && this.testCanPlace(4, 0, (Math.PI * 2), (Math.PI / 24), near.aim2); } } } else { if (testMode ? enemy.length : (near.dist2 <= 1000)) { player.items[4] == 15 && this.testCanPlace(4, 0, (Math.PI * 2), (Math.PI / 24), near.aim2); } } } }; this.getItemPlaceLocation = function(obj, dir) { let item = items.list[player.items[obj]]; let tmpS = player.scale + item.scale + (item.placeOffset || 0); let tmpX = player.x + tmpS * Math.cos(dir); let tmpY = player.y + tmpS * Math.sin(dir); return { x: tmpX, y: tmpY }; }; this.replacer = function(findObj) { if (!findObj || !os.autoReplace) return; if (!inGame) return; if (this.antiTrapped) return; let objAim = UTILS.getDirect(findObj, player, 0, 2); let objDst = UTILS.getDist(findObj, player, 0, 2); if (getEl("weaponGrind").checked) return; /* if (objDst <= 400 && near.dist2 <= 400) { if (near.dist2 <= 250) { for (let i = -1; i <= 1; i++) { checkPlace(2, objAim + i); } } else if (near.dist2 > 250 && near.dist2 < 500) { for (let i = 0; i < Math.PI * 5; i += Math.PI / 5) { if (player.items[4] == 15) { checkPlace(4, objAim + i); } } } } */ if (objDst <= 400 && near.dist2 <= 400) { let danger = this.checkSpikeTick(); let dizt = near.dist2; let oppoziteitempoz = this.getItemPlaceLocation(2, near.aim2 - Math.PI); for(let i = 0; i < Math.PI*2; i += Math.PI/2) { let itempoz = this.getItemPlaceLocation(2, i); if(getDist(player, itempoz) <= objDst && getDist(near, itempoz) <= getDist(near, oppoziteitempoz) - 10) { checkPlace(2, objAim + i); } else { checkPlace(4, objAim + i); } this.replaced = true; } } }; } }; function calculatePerfectAngle(x1, y1, x2, y2) { return Math.atan2(y2 - y1, x2 - x1); } function isObjectBroken(object) { const healthThreshold = 20; return object.health < healthThreshold; } class Instakill { constructor() { this.wait = false; this.can = false; this.isTrue = false; this.nobull = false; this.ticking = false; this.canSpikeTick = false; this.startTick = false; this.readyTick = false; this.canCounter = false; this.revTick = false; this.syncHit = false; this.changeType = function(type) { this.wait = false; this.isTrue = true; my.autoAim = true; let backupNobull = near.backupNobull; near.backupNobull = false; setTimeout(() => { setTimeout(() => { if (near.skinIndex == 22 && getEl("backupNobull").checked) { near.backupNobull = true; } }, 1); }, 1); if (type == "rev") { selectWeapon(player.weapons[1]); buyEquip(53, 0); buyEquip(21, 1); sendAutoGather(); setTimeout(()=> { selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(18, 1); setTimeout(()=> { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 225); }, 100); } else if (type == "nobull") { selectWeapon(player.weapons[0]); if (getEl("backupNobull").checked && backupNobull) { buyEquip(7, 0); buyEquip(18, 1); } else { buyEquip(6, 0); buyEquip(21, 1); } sendAutoGather(); setTimeout(() => { if (near.skinIndex == 22) { if (getEl("backupNobull").checked) { near.backupNobull = true; } buyEquip(6, 0); buyEquip(21, 1); } else { buyEquip(53, 0); } selectWeapon(player.weapons[1]); buyEquip(21, 1); setTimeout(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 255); }, 105); } else if (type == "normal") { selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(18, 1); sendAutoGather(); setTimeout(() => { buyEquip(player.reloads[53] == 0 ? 53 : 6, 0); selectWeapon(player.weapons[1]); buyEquip(21, 1); setTimeout(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 255); }, 100); } else { setTimeout(() => { this.isTrue = false; my.autoAim = false; }, 50); } }; this.spikeTickType = function() { this.isTrue = true; my.autoAim = true; selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(21, 1); sendAutoGather(); game.tickBase(() => { if (player.reloads[53] == 0 && getEl("turretCombat").checked) { selectWeapon(player.weapons[0]); buyEquip(53, 0); buyEquip(21, 1); game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 1); } else { sendAutoGather(); this.isTrue = false; my.autoAim = false; } }, 1); }; this.counterType = function() { this.isTrue = true; my.autoAim = true; selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(21, 1); sendAutoGather(); game.tickBase(() => { if (player.reloads[53] == 0 && getEl("turretCombat").checked) { selectWeapon(player.weapons[0]); buyEquip(53, 0); buyEquip(21, 1); game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 1); } else { sendAutoGather(); this.isTrue = false; my.autoAim = false; } }, 1); }; this.syncTry = function(syncType = "sec", time = 2) { setTimeout(() => { if (syncType == "sec") { if (player.weapons[1] == 15) { packet("D", near.aim2); this.isTrue = true; my.autoAim = true; selectWeapon(player.weapons[1]); //rangeBackup.push(near.dist2); if (player.reloads[53] == 0 && near.dist2 <= 700 && near.skinIndex != 22) { Hg(53, 21); } else { Hg(20, 21); }2 sendAutoGather(); game.tickBase(() => { this.isTrue = false; my.autoAim = false; sendAutoGather(); }, 2); } } }, time); }; this.rangeType = function(type) { this.isTrue = true; my.autoAim = true; if (type == "ageInsta") { my.ageInsta = false; if (player.items[5] == 18) { place(5, near.aim2); } packet("a", undefined, 1); buyEquip(22, 0); buyEquip(21, 1); game.tickBase(() => { selectWeapon(player.weapons[1]); buyEquip(53, 0); buyEquip(21, 1); sendAutoGather(); game.tickBase(() => { sendUpgrade(12); selectWeapon(player.weapons[1]); buyEquip(53, 0); buyEquip(21, 1); game.tickBase(() => { sendUpgrade(15); selectWeapon(player.weapons[1]); buyEquip(53, 0); buyEquip(21, 1); game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 1); }, 1); }, 1); }, 1); } else { selectWeapon(player.weapons[1]); if (player.reloads[53] == 0 && near.dist2 <= 700 && near.skinIndex != 22) { buyEquip(53, 0); } else { buyEquip(20, 0); } buyEquip(11, 1); sendAutoGather(); game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 1); } }; this.oneTickType = function() { this.isTrue = true; my.autoAim = true; selectWeapon(player.weapons[1]); buyEquip(53, 0); buyEquip(19, 1); packet("a", near.aim2, 1); if (player.weapons[1] == 15) { my.revAim = true; sendAutoGather(); } game.tickBase(() => { my.revAim = false; selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(18, 1); packet("a", near.aim2, 1); if (player.weapons[1] != 15) { sendAutoGather(); } game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; packet("a", undefined, 1); }, 1); }, 1); }; this.threeOneTickType = function() { this.isTrue = true; my.autoAim = true; selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); biomeGear(); buyEquip(11, 1); packet("a", near.aim2, 1); game.tickBase(() => { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); buyEquip(53, 0); buyEquip(19, 1); packet("a", near.aim2, 1); game.tickBase(() => { selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(18, 1); sendAutoGather(); packet("a", near.aim2, 1); game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; packet("a", undefined, 1); }, 1); }, 1); }, 1); }; this.kmTickType = function() { this.isTrue = true; my.autoAim = true; my.revAim = true; selectWeapon(player.weapons[1]); buyEquip(53, 0); buyEquip(19, 1); sendAutoGather(); packet("a", near.aim2, 1); game.tickBase(() => { my.revAim = false; selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(18, 1); packet("a", near.aim2, 1); game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; packet("a", undefined, 1); }, 1); }, 1); }; this.boostTickType = function() { /*this.isTrue = true; my.autoAim = true; selectWeapon(player.weapons[0]); buyEquip(53, 0); buyEquip(11, 1); packet("a", near.aim2); game.tickBase(() => { place(4, near.aim2); selectWeapon(player.weapons[1]); biomeGear(); buyEquip(11, 1); sendAutoGather(); packet("a", near.aim2); game.tickBase(() => { selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(19, 1); packet("a", near.aim2); game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; packet("a", undefined); }, 1); }, 1); }, 1);*/ this.isTrue = true; my.autoAim = true; biomeGear(); buyEquip(11, 1); packet("a", near.aim2, 1); game.tickBase(() => { if (player.weapons[1] == 15) { my.revAim = true; } selectWeapon(player.weapons[[9, 12, 13, 15].includes(player.weapons[1]) ? 1 : 0]); buyEquip(53, 0); buyEquip(19, 1); if ([9, 12, 13, 15].includes(player.weapons[1])) { sendAutoGather(); } packet("a", near.aim2, 1); place(4, near.aim2); game.tickBase(() => { my.revAim = false; selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(18, 1); if (![9, 12, 13, 15].includes(player.weapons[1])) { sendAutoGather(); } packet("a", near.aim2, 1); game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; packet("a", undefined, 1); }, 1); }, 1); }, 1); }; this.gotoGoal = function(goto, OT) { let slowDists = (weeeee) => weeeee * o.playerScale; let goal = { a: goto - OT, b: goto + OT, c: goto - slowDists(1), d: goto + slowDists(1), e: goto - slowDists(2), f: goto + slowDists(2), g: goto - slowDists(4), h: goto + slowDists(4) }; let bQ = function(wwww, awwww) { if (player.y2 >= o.mapScale / 2 - o.riverWidth / 2 && player.y2 <= o.mapScale / 2 + o.riverWidth / 2 && awwww == 0) { buyEquip(31, 0); } else { buyEquip(wwww, awwww); } } if (enemy.length) { let dst = near.dist2; this.ticking = true; if (dst >= goal.a && dst <= goal.b) { bQ(22, 0); bQ(19, 1); if (player.weaponIndex != player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0] || player.buildIndex > -1) { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); } return { dir: undefined, action: 1 }; } else { if (dst < goal.a) { if (dst >= goal.g) { if (dst >= goal.e) { if (dst >= goal.c) { bQ(40, 0); bQ(19, 1); if (os.slowOT) { player.buildIndex != player.items[1] && selectToBuild(player.items[1]); } else { if ((player.weaponIndex != player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]) || player.buildIndex > -1) { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); } } } else { bQ(22, 0); bQ(19, 1); if ((player.weaponIndex != player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]) || player.buildIndex > -1) { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); } } } else { bQ(6, 0); bQ(19, 1); if ((player.weaponIndex != player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]) || player.buildIndex > -1) { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); } } } else { biomeGear(); bQ(19, 1); if ((player.weaponIndex != player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]) || player.buildIndex > -1) { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); } } return { dir: near.aim2 + Math.PI, action: 0 }; } else if (dst > goal.b) { if (dst <= goal.h) { if (dst <= goal.f) { if (dst <= goal.d) { bQ(40, 0); bQ(19, 1); if (os.slowOT) { player.buildIndex != player.items[1] && selectToBuild(player.items[1]); } else { if ((player.weaponIndex != player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]) || player.buildIndex > -1) { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); } } } else { bQ(22, 0); bQ(19, 1); if ((player.weaponIndex != player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]) || player.buildIndex > -1) { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); } } } else { bQ(6, 0); bQ(19, 1); if ((player.weaponIndex != player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]) || player.buildIndex > -1) { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); } } } else { biomeGear(); bQ(19, 1); if ((player.weaponIndex != player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]) || player.buildIndex > -1) { selectWeapon(player.weapons[[10, 14].includes(player.weapons[1]) ? 1 : 0]); } } return { dir: near.aim2, action: 0 }; } return { dir: undefined, action: 0 }; } } else { this.ticking = false; return { dir: undefined, action: 0 }; } }; /** wait 1 tick for better quality */ this.bowMovement = function() { let moveMent = this.gotoGoal(685, 3); if (moveMent.action) { if (player.reloads[53] == 0 && !this.isTrue) { this.rangeType("ageInsta"); } else { packet("a", moveMent.dir, 1); } } else { packet("a", moveMent.dir, 1); } }, (this.tickMovement = function () { const trap1 = gameObjects .filter(e => e.trap && e.active) .sort((a, b) => UTILS.getDist(a, near, 0, 2) - UTILS.getDist(b, near, 0, 2)) .find(trap => { const trapDist = Math.hypot(trap.y - near.y2, trap.x - near.x2); return trap !== player && (player.sid === trap.owner.sid || player.findAllianceBySid(trap.owner.sid)) && trapDist <= 50; }); let moveMent = this.gotoGoal( [10, 14].includes(player.weapons[1]) && player.y2 > o.snowBiomeTop ? 240 : player.weapons[1] == 15 ? 250 : player.y2 <= o.snowBiomeTop ? [10, 14].includes(player.weapons[1]) ? 265 : 255 : 270, 3 ); if (moveMent.action) { if ((![6, 22].includes(near.skinIndex) || ([6, 22].includes(near.skinIndex) && trap1)) && player.reloads[53] == 0 && !this.isTrue) { ([10, 14].includes(player.weapons[1]) && player.y2 > o.snowBiomeTop) || player.weapons[1] == 15 ? this.threeOneTickType() : this.oneTickType(); } else { packet('a', moveMent.dir, 1); } } else { packet('a', moveMent.dir, 1); } }), this.kmTickMovement = function() { let moveMent = this.gotoGoal(240, 3); if (moveMent.action) { if (near.skinIndex != 22 && player.reloads[53] == 0 && !this.isTrue && ((game.tick - near.poisonTick) % o.serverUpdateRate == 8)) { this.kmTickType(); } else { packet("a", moveMent.dir, 1); } } else { packet("a", moveMent.dir, 1); } }, this.boostTickMovement = function() { let dist = player.weapons[1] == 9 ? 365 : player.weapons[1] == 12 ? 380 : player.weapons[1] == 13 ? 390 : player.weapons[1] == 15 ? 365 : 370; let actionDist = player.weapons[1] == 9 ? 2 : player.weapons[1] == 12 ? 1.5 : player.weapons[1] == 13 ? 1.5 : player.weapons[1] == 15 ? 2 : 3; let moveMent = this.gotoGoal(dist, actionDist); if (moveMent.action) { if (player.reloads[53] == 0 && !this.isTrue) { this.boostTickType(); } else { packet("a", moveMent.dir, 1); } } else { packet("a", moveMent.dir, 1); } } /** wait 1 tick for better quality */ this.perfCheck = function(pl, nr) { if (nr.weaponIndex == 11 && UTILS.getAngleDist(nr.aim2 + Math.PI, nr.d2) <= o.shieldAngle) return false; if (![9, 12, 13, 15].includes(player.weapons[1])) return true; let pjs = { x: nr.x2 + (70 * Math.cos(nr.aim2 + Math.PI)), y: nr.y2 + (70 * Math.sin(nr.aim2 + Math.PI)) }; if (UTILS.lineInRect(pl.x2 - pl.scale, pl.y2 - pl.scale, pl.x2 + pl.scale, pl.y2 + pl.scale, pjs.x, pjs.y, pjs.x, pjs.y)) { return true; } let finds = ais.filter(tmp => tmp.visible).find((tmp) => { if (UTILS.lineInRect(tmp.x2 - tmp.scale, tmp.y2 - tmp.scale, tmp.x2 + tmp.scale, tmp.y2 + tmp.scale, pjs.x, pjs.y, pjs.x, pjs.y)) { return true; } }); if (finds) return false; finds = gameObjects.filter(tmp => tmp.active).find((tmp) => { let tmpScale = tmp.getScale(); if (!tmp.ignoreCollision && UTILS.lineInRect(tmp.x - tmpScale, tmp.y - tmpScale, tmp.x + tmpScale, tmp.y + tmpScale, pjs.x, pjs.y, pjs.x, pjs.y)) { return true; } }); if (finds) return false; return true; } } }; class Autobuy { constructor(buyHat, buyAcc) { this.hat = function() { buyHat.forEach((id) => { let find = findID(hats, id); if (find && !player.skins[id] && player.points >= find.price) packet("c", 1, id, 0); }); }; this.acc = function() { buyAcc.forEach((id) => { let find = findID(accessories, id); if (find && !player.tails[id] && player.points >= find.price) packet("c", 1, id, 1); }); }; } }; class Damages { constructor(items) { // 0.75 1 1.125 1.5 this.calcDmg = function(dmg, val) { return dmg * val; }; this.getAllDamage = function(dmg) { return [this.calcDmg(dmg, 0.75), dmg, this.calcDmg(dmg, 1.125), this.calcDmg(dmg, 1.5)]; }; this.weapons = []; for (let i = 0; i < items.weapons.length; i++) { let wp = items.weapons[i]; let name = wp.name.split(" ").length <= 1 ? wp.name : (wp.name.split(" ")[0] + "_" + wp.name.split(" ")[1]); this.weapons.push(this.getAllDamage(i > 8 ? wp.Pdmg : wp.dmg)); this[name] = this.weapons[i]; } } } /** CLASS CODES */ // jumpscare code warn let tmpList = []; // LOADING: let UTILS = new Utils(); let items = new Items(); let objectManager = new Objectmanager(GameObject, gameObjects, UTILS, o); let store = new Store(); let hats = store.hats; let accessories = store.accessories; let projectileManager = new ProjectileManager(Projectile, projectiles, players, ais, objectManager, items, o, UTILS); let aiManager = new AiManager(ais, AI, players, items, null, o, UTILS); let textManager = new Textmanager(); let traps = new Traps(UTILS, items); let instaC = new Instakill(); let autoBuy = new Autobuy([15, 31, 6, 7, 22, 12, 53, 20, 40], [11, 13, 19, 18, 21]); let lastDeath; let minimapData; let mapMarker = {}; let mapPings = []; let tmpPing; let breakTrackers = []; let pathFindTest = 0; let grid = []; let pathFind = { active: false, grid: 40, scale: 1440, x: 14400, y: 14400, chaseNear: false, array: [], lastX: this.grid / 2, lastY: this.grid / 2 }; function sendChat(message) { packet("6", message.slice(0, 30)); } let runAtNextTick = []; function checkProjectileHolder(x, y, dir, range, speed, indx, layer, sid) { let weaponIndx = indx == 0 ? 9 : indx == 2 ? 12 : indx == 3 ? 13 : indx == 5 && 15; let projOffset = o.playerScale * 2; let projXY = { x: indx == 1 ? x : x - projOffset * Math.cos(dir), y: indx == 1 ? y : y - projOffset * Math.sin(dir), }; let nearPlayer = players.filter((e) => e.visible && UTILS.getDist(projXY, e, 0, 2) <= e.scale).sort(function(a, b) { return UTILS.getDist(projXY, a, 0, 2) - UTILS.getDist(projXY, b, 0, 2); })[0]; if (nearPlayer) { if (indx == 1) { nearPlayer.shooting[53] = 1; } else { nearPlayer.shootIndex = weaponIndx; nearPlayer.shooting[1] = 1; antiProj(nearPlayer, dir, range, speed, indx, weaponIndx); } } } let projectileCount = 0; function antiProj(_, dir, range, speed, index, weaponIndex) { if (!_.isTeam(player)) { tmpDir = UTILS.getDirect(player, _, 2, 2); if (UTILS.getAngleDist(tmpDir, dir) <= 0.2) { _.bowThreat[weaponIndex]++; if (index == 5) { projectileCount++; } setTimeout(() => { _.bowThreat[weaponIndex]--; if (index == 5) { projectileCount--; } }, range / speed); if (_.bowThreat[9] >= 1 && (_.bowThreat[12] >= 1 || _.bowThreat[15] >= 1)) { place(1, _.aim2); my.anti0Tick = 4; if (!my.antiSync) { ch("ranged insta homo"); antiSyncHealing(4); } } else { if (projectileCount >= 2) { place(1, _.aim2); my.anti0Tick = 4; if (!my.antiSync) { ch("ranged sync homo"); antiSyncHealing(4); } } } } } } // SHOW ITEM INFO: function showItemInfo(item, isWeapon, isStoreItem) { if (player && item) { UTILS.removeAllChildren(itemInfoHolder); itemInfoHolder.classList.add("visible"); UTILS.generateElement({ id: "itemInfoName", text: UTILS.capitalizeFirst(item.name), parent: itemInfoHolder }); UTILS.generateElement({ id: "itemInfoDesc", text: item.desc, parent: itemInfoHolder }); if (isStoreItem) { } else if (isWeapon) { UTILS.generateElement({ class: "itemInfoReq", text: !item.type ? "primary" : "secondary", parent: itemInfoHolder }); } else { for (let i = 0; i < item.req.length; i += 2) { UTILS.generateElement({ class: "itemInfoReq", html: item.req[i] + " x" + item.req[i + 1] + "", parent: itemInfoHolder }); } if (item.group.limit) { UTILS.generateElement({ class: "itemInfoLmt", text: (player.itemCounts[item.group.id] || 0) + "/" + (o.isSandbox ? 99 : item.group.limit), parent: itemInfoHolder }); } } } else { itemInfoHolder.classList.remove("visible"); } } // RESIZE: window.addEventListener("resize", UTILS.checkTrusted(resize)); function resize() { screenWidth = window.innerWidth; screenHeight = window.innerHeight; let scaleFillNative = Math.max(screenWidth / maxScreenWidth, screenHeight / maxScreenHeight) * pixelDensity; gameCanvas.width = screenWidth * pixelDensity; gameCanvas.height = screenHeight * pixelDensity; gameCanvas.style.width = screenWidth + "px"; gameCanvas.style.height = screenHeight + "px"; be.setTransform( scaleFillNative, 0, 0, scaleFillNative, (screenWidth * pixelDensity - (maxScreenWidth * scaleFillNative)) / 2, (screenHeight * pixelDensity - (maxScreenHeight * scaleFillNative)) / 2 ); } resize(); // MOUSE INPUT: const mals = document.getElementById('touch-controls-fullscreen'); mals.style.display = 'block'; mals.addEventListener("mousemove", gameInput, false); function gameInput(e) { mouseX = e.clientX; mouseY = e.clientY; } let clicks = { left: false, middle: false, right: false, }; mals.addEventListener("mousedown", mouseDown, false); function mouseDown(e) { if (attackState != 1) { attackState = 1; if (e.button == 0) { clicks.left = true; } else if (e.button == 1) { clicks.middle = true; } else if (e.button == 2) { clicks.right = true; } } } mals.addEventListener("mouseup", UTILS.checkTrusted(mouseUp)); function mouseUp(e) { if (attackState != 0) { attackState = 0; if (e.button == 0) { clicks.left = false; } else if (e.button == 1) { clicks.middle = false; } else if (e.button == 2) { clicks.right = false; } } } mals.addEventListener("wheel", wheel, false); function wheel(e) { if (e.deltaY < 0) { my.reSync = true; } else { my.reSync = false; } } // INPUT UTILS: function getMoveDir() { let dx = 0; let dy = 0; for (let key in moveKeys) { let tmpDir = moveKeys[key]; dx += !!keys[key] * tmpDir[0]; dy += !!keys[key] * tmpDir[1]; } return dx == 0 && dy == 0 ? undefined : Math.atan2(dy, dx); } function getSafeDir() { if (!player) return 0; if (!player.lockDir) { lastDir = Math.atan2(mouseY - (screenHeight / 2), mouseX - (screenWidth / 2)); } return lastDir || 0; } let spinDir = 0; function getAttackDir(debug) { if (debug) { if (!player) return "0"; if (my.autoAim || ((clicks.left || (useWasd && near.dist2 <= items.weapons[player.weapons[0]].range + near.scale * 1.8 && !traps.inTrap)) && player.reloads[player.weapons[0]] == 0)) lastDir = getEl("weaponGrind").checked ? "getSafeDir()" : enemy.length ? my.revAim ? "(near.aim2 + Math.PI)" : "near.aim2" : "getSafeDir()"; else if (clicks.right && player.reloads[player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]] == 0) lastDir = "getSafeDir()"; else if (traps.inTrap && player.reloads[traps.notFast() ? player.weapons[1] : player.weapons[0]] == 0) lastDir = "traps.aim"; else if (!player.lockDir) { if (os.noDir) return "undefined"; lastDir = "getSafeDir()"; } return lastDir; } else { if (!player) return 0; if (my.autoAim || ((clicks.left || (useWasd && near.dist2 <= items.weapons[player.weapons[0]].range + near.scale * 1.8 && !traps.inTrap)) && player.reloads[player.weapons[0]] == 0)) lastDir = getEl("weaponGrind").checked ? getSafeDir() : enemy.length ? my.revAim ? (near.aim2 + Math.PI) : near.aim2 : getSafeDir(); else if (clicks.right && player.reloads[player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]] == 0) lastDir = getSafeDir(); else if (traps.inTrap && player.reloads[traps.notFast() ? player.weapons[1] : player.weapons[0]] == 0) lastDir = traps.aim; else if (spinner == true) { spinDir += (Math.PI * 2) / (9 / 4); return spinDir; } else { if (!player.lockDir) { if(useWasd) { lastDir = lastDir; } else { lastDir = getSafeDir(); } } } return lastDir || 0; } } function getVisualDir() { if (!player) return 0; if (my.autoAim || ((clicks.left || (useWasd && near.dist2 <= items.weapons[player.weapons[0]].range + near.scale * 1.8 && !traps.inTrap)) && player.reloads[player.weapons[0]] == 0)) lastDir = getEl("weaponGrind").checked ? getSafeDir() : enemy.length ? my.revAim ? (near.aim2 + Math.PI) : near.aim2 : getSafeDir(); else if (clicks.right && player.reloads[player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]] == 0) lastDir = getSafeDir(); else if (traps.inTrap && player.reloads[traps.notFast() ? player.weapons[1] : player.weapons[0]] == 0) lastDir = traps.aim; else if (!player.lockDir) { lastDir = getSafeDir(); } return lastDir || 0; } // KEYS: function keysActive() { return (allianceMenu.style.display != "block" && chatHolder.style.display != "block" && canmove); } function cKey(keyCode, key) { if (getEl(key + "k").checked) { if (keyCode == getEl(key).value) { return true; } } return false; } let toggled = false; function keyDown(event) { let keyNum = event.which || event.keyCode || 0; if (player && player.alive && keysActive()) { if (!keys[keyNum]) { keys[keyNum] = 1; macro[event.key] = 1; if (keyNum == 27) { $("#modMenus").toggle(); $("#test").toggle(); toggled = !toggled; if (toggled) { mStatus.style.display = "block"; leaderboard.style.display = "block"; if (true) { allianceButton.style.left = "330px"; allianceButton.style.width = "40px"; storeButton.style.left = "270px"; storeButton.style.width = "40px"; } else { allianceButton.style.right = "270px"; allianceButton.style.width = "40px"; storeButton.style.right = "330px"; storeButton.style.width = "40px"; } } else { mStatus.style.display = true ? "block" : "none"; leaderboard.style.display = true ? "none" : "block"; if (true) { allianceButton.style.left = "520px"; allianceButton.style.width = "40px"; storeButton.style.left = "460px"; storeButton.style.width = "40px"; } else { allianceButton.style.right = "270px"; allianceButton.style.width = "40px"; storeButton.style.right = "330px"; storeButton.style.width = "40px"; } } } else if (keyNum == 69) { sendAutoGather(); } else if (keyNum == 67) { updateMapMarker(); } else if (player.weapons[keyNum - 49] != undefined) { player.weaponCode = player.weapons[keyNum - 49]; } else if (moveKeys[keyNum]) { sendMoveDir(); } else if (event.key == "r") {// Make Insta? instaC.wait = !instaC.wait; } else if (event.key == "y") {// Make boostspike? boostspike = !boostspike; } else if (getEl("useautoInstaong").checked && event.key == "g") { AutoOneTicked = !AutoOneTicked; } else if (event.key == "z") { mills.place = !mills.place; } else if (event.key == "Z") { typeof window.debug == "function" && window.debug(); } else if (keyNum == 32) { packet("d", 1, getSafeDir(), 1); packet("d", 0, getSafeDir(), 1); } else if (event.key == ",") { player.sync = true; } } } } addEventListener("keydown", UTILS.checkTrusted(keyDown)); function keyUp(event) { if (player && player.alive) { let keyNum = event.which || event.keyCode || 0; if (keyNum == 13) { } else if (keysActive()) { if (keys[keyNum]) { keys[keyNum] = 0; macro[event.key] = 0; if (moveKeys[keyNum]) { sendMoveDir(); } else if (event.key == ",") { player.sync = false; } } } } } window.addEventListener("keyup", UTILS.checkTrusted(keyUp)); function sendMoveDir() { let newMoveDir = getMoveDir(); if (lastMoveDir == undefined || newMoveDir == undefined || Math.abs(newMoveDir - lastMoveDir) > 0.3) { if (!my.autoPush) { packet("a", newMoveDir, 1); } lastMoveDir = newMoveDir; } } // ITEM COUNT DISPLAY: let isItemSetted = []; function updateItemCountDisplay(index = undefined) { for (let i = 3; i < items.list.length; ++i) { let id = items.list[i].group.id; let tmpI = items.weapons.length + i; if (!isItemSetted[tmpI]) { isItemSetted[tmpI] = document.createElement("div"); isItemSetted[tmpI].id = "itemCount" + tmpI; getEl("actionBarItem" + tmpI).appendChild(isItemSetted[tmpI]); isItemSetted[tmpI].style = ` display: block; position: absolute; padding-left: 5px; font-size: 2em; color: #fff; `; isItemSetted[tmpI].innerHTML = player.itemCounts[id] || 0; } else { if (index == id) isItemSetted[tmpI].innerHTML = player.itemCounts[index] || 0; } } } // AUTOPUSH: var retrappable = false; function autoPush() { retrappable = true; let nearTrap = gameObjects.filter(tmp => tmp.trap && tmp.active && tmp.isTeamObject(player) && UTILS.getDist(tmp, near, 0, 2) <= (near.scale + tmp.getScale() + 5)).sort(function(a, b) { return UTILS.getDist(a, near, 0, 2) - UTILS.getDist(b, near, 0, 2); })[0]; if (nearTrap) { let spike = gameObjects.filter(tmp => tmp.dmg && tmp.active && tmp.isTeamObject(player) && UTILS.getDist(tmp, nearTrap, 0, 0) <= (near.scale + nearTrap.scale + tmp.scale)).sort(function(a, b) { return UTILS.getDist(a, near, 0, 2) - UTILS.getDist(b, near, 0, 2); })[0]; if (spike) { let pos = { x: spike.x + (250 * Math.cos(UTILS.getDirect(near, spike, 2, 0))), y: spike.y + (250 * Math.sin(UTILS.getDirect(near, spike, 2, 0))), x2: spike.x + ((UTILS.getDist(near, spike, 2, 0) + player.scale) * Math.cos(UTILS.getDirect(near, spike, 2, 0))), y2: spike.y + ((UTILS.getDist(near, spike, 2, 0) + player.scale) * Math.sin(UTILS.getDirect(near, spike, 2, 0))) }; let finds = gameObjects.filter(tmp => tmp.active).find((tmp) => { let tmpScale = tmp.getScale(); if (!tmp.ignoreCollision && UTILS.lineInRect(tmp.x - tmpScale, tmp.y - tmpScale, tmp.x + tmpScale, tmp.y + tmpScale, player.x2, player.y2, pos.x2, pos.y2)) { return true; } }); if (finds) { if (my.autoPush) { my.autoPush = false; packet("a", lastMoveDir || undefined, 1); } } else { my.autoPush = true; my.pushData = { x: spike.x, y: spike.y, x2: pos.x2, y2: pos.y2 }; let scale = (player.scale / 10); if (UTILS.lineInRect(player.x2 - scale, player.y2 - scale, player.x2 + scale, player.y2 + scale, near.x2, near.y2, pos.x, pos.y)) { packet("a", near.aim2, 1); } else { packet("a", UTILS.getDirect(pos, player, 2, 2), 1); } } } else { if (my.autoPush) { my.autoPush = false; packet("a", lastMoveDir || undefined, 1); } } } else { if (my.autoPush) { my.autoPush = false; packet("a", lastMoveDir || undefined, 1); } } } // ADD DEAD PLAYER: function addDeadPlayer(_) { deadPlayers.push(new DeadPlayer(_.x, _.y, _.dir, _.buildIndex, _.weaponIndex, _.weaponVariant, _.skinColor, _.scale, _.name)); } /** APPLY SOCKET CODES */ // SET INIT DATA: function setInitData(data) { alliances = data.teams; } // SETUP GAME: function setupGame(yourSID) { keys = {}; macro = {}; playerSID = yourSID; attackState = 0; inGame = true; packet("d", 0, getAttackDir(), 1); my.ageInsta = true; if (firstSetup) { firstSetup = false; gameObjects.length = 0; } } // ADD NEW PLAYER: function addPlayer(data, isYou) { let tmpPlayer = findPlayerByID(data[0]); if (!tmpPlayer) { tmpPlayer = new Player(data[0], data[1], o, UTILS, projectileManager, objectManager, players, ais, items, hats, accessories); players.push(tmpPlayer); if (data[1] != playerSID) { //addMenuChText("Game", `Found ${data[2]} {${data[1]}}`, "yellow"); } } else { if (data[1] != playerSID) { // addMenuChText("Game", `Encount ${data[2]} {${data[1]}}`, "yellow"); } } tmpPlayer.spawn(isYou ? true : null); tmpPlayer.visible = false; tmpPlayer.oldPos = { x2: undefined, y2: undefined }; tmpPlayer.x2 = undefined; tmpPlayer.y2 = undefined; tmpPlayer.x3 = undefined; tmpPlayer.y3 = undefined; tmpPlayer.setData(data); if (isYou) { if (!player) { window.prepareUI(tmpPlayer); } player = tmpPlayer; camX = player.x; camY = player.y; my.lastDir = 0; updateItems(); updateAge(); updateItemCountDisplay(); for (let i = 0; i < 5; i++) { petals.push(new Petal(player.x, player.y)); } if (player.skins[7]) { my.reSync = true; } } } // REMOVE PLAYER: function removePlayer(id) { for (let i = 0; i < players.length; i++) { if (players[i].id == id) { // addMenuChText("Game", players[i].name + " left the game", "yellow"); players.splice(i, 1); break; } } } // UPDATE HEALTH: function updateHealth(sid, value) { _ = findPlayerBySID(sid); if (_) { _.oldHealth = _.health; _.health = value; _.judgeShame(); if (_.oldHealth > _.health) { _.damaged = _.oldHealth - _.health; advHeal.push([sid, value, _.damaged]); } else {} if (_.health <= 0) { /*bots.forEach((hmm) => { hmm.whyDie = _.name; });*/ } } } let backupAnti = []; let hittedTime = Date.now(); function getMaxPot() { let dmg = 0; enemy.forEach(tmp => { if (getDist(player, tmp) - 63 <= items.weapons[tmp.weapons[0]].range) { dmg += player.checkCanInsta(false); } }); return dmg; } // Heling: function healingTrap() { let maxPotential = getMaxPot(); let pingHeal = function() { return Math.max(0, maxPotential - window.pingTime); }; if (true) { setTimeout(() => { for (let i = 0; i < healthBased(); i++) { place(0, getAttackDir()); } }, 2); } else { setTimeout(() => { for (let i = 0; i < healthBased(); i++) { place(0, getAttackDir()); } }, 2); } } function instaheal(e, t) { let foodType = (player.items[0] == 0 ? 20 : player.items[0] == 1 ? 40 : 30) let times = (e == "max" ? (100-player.health)/foodType : e == (null || undefined) ? 1 : e); for(let i = 0; i < times; i++) { place(0, getAttackDir()); } } //instaheal(100, 100); function fastHealing(speed) { let value = player.health; let attackers = getAttacker(damaged); let gearDmgs = [0.25, 0.45].map((val) => val * items.weapons[player.weapons[0]].dmg * soldierMult()); let includeSpikeDmgs = !my.reSync && gearDmgs.includes(damaged); let maxPotential = getMaxPot(); let pingHeal = function() { return Math.max(0, maxPotential - window.pingTime); }; let autoHeal; let doMaxHeal = function () { clearInterval(autoHeal); for (let i = 0; i < Math.ceil(Math.min(100 - value, 50) / items.list[player.items[0]].consume); i++) { place(player.items[0]); } }; if (speed >= 100000) { canAntiHeal = true; } else { canAntiHeal = false; } // Heal: setTimeout(()=>{ if (traps.inTrap) { healingTrap(); } else { setTimeout(()=>{ for (let i = 0; i < healthBased(); i++) { if (canAntiHeal == true && value <= 50 && near.checkCanInsta(true) >= 100) { setTimeout(()=>{ place(0, getAttackDir()); setTimeout(()=>{ place(0, getAttackDir()); setTimeout(()=>{ place(0, getAttackDir()); }, speed*5); }, speed*4); }, speed*3); } else { place(0, getAttackDir()); } healer(); } }, speed*2); } }, speed);//pingHeal(); } // KILL PLAYER: function killPlayer() { petals = []; inGame = false; lastDeath = { x: player.x, y: player.y, }; /*menuCardHolder.style.display = "block"; mainMenu.style.display = "block"; diedText.style.display = "none";*/ if (os.autoRespawn) { packet("M", { name: lastsp[0], moofoll: lastsp[1], skin: lastsp[2] }); } } // UPDATE PLAYER ITEM VALUES: function updateItemCounts(index, value) { if (player) { player.itemCounts[index] = value; updateItemCountDisplay(index); } } // UPDATE AGE: function updateAge(xp, mxp, age) { if (xp != undefined) player.XP = xp; if (mxp != undefined) player.maxXP = mxp; if (age != undefined) player.age = age; } // UPDATE UPGRADES: function updateUpgrades(points, age) { player.upgradePoints = points; player.upgrAge = age; if (points > 0) { tmpList.length = 0; UTILS.removeAllChildren(upgradeHolder); for (let i = 0; i < items.weapons.length; ++i) { if (items.weapons[i].age == age && (testMode || items.weapons[i].pre == undefined || player.weapons.indexOf(items.weapons[i].pre) >= 0)) { let e = UTILS.generateElement({ id: "upgradeItem" + i, class: "actionBarItem", onmouseout: function() { showItemInfo(); }, parent: upgradeHolder }); e.style.backgroundImage = getEl("actionBarItem" + i).style.backgroundImage; tmpList.push(i); } } for (let i = 0; i < items.list.length; ++i) { if (items.list[i].age == age && (testMode || items.list[i].pre == undefined || player.items.indexOf(items.list[i].pre) >= 0)) { let tmpI = (items.weapons.length + i); let e = UTILS.generateElement({ id: "upgradeItem" + tmpI, class: "actionBarItem", onmouseout: function() { showItemInfo(); }, parent: upgradeHolder }); e.style.backgroundImage = getEl("actionBarItem" + tmpI).style.backgroundImage; tmpList.push(tmpI); } } for (let i = 0; i < tmpList.length; i++) { (function(i) { let tmpItem = getEl('upgradeItem' + i); tmpItem.onmouseover = function() { if (items.weapons[i]) { showItemInfo(items.weapons[i], true); } else { showItemInfo(items.list[i - items.weapons.length]); } }; tmpItem.onclick = UTILS.checkTrusted(function() { packet("H", i); }); UTILS.hookTouchEvents(tmpItem); })(tmpList[i]); } if (tmpList.length) { upgradeHolder.style.display = "block"; upgradeCounter.style.display = "block"; upgradeCounter.innerHTML = "SELECT ITEMS (" + points + ")"; } else { upgradeHolder.style.display = "none"; upgradeCounter.style.display = "none"; showItemInfo(); } } else { upgradeHolder.style.display = "none"; upgradeCounter.style.display = "none"; showItemInfo(); } try { if (getEl("aaauaua").checked) { let value = getEl("autoupgrade").value; let upgradinggggggggggg = 0; function anusUpdate(e1, e2, e3, e4, e5, e7, e8, omgogmom = true) { if(upgradinggggggggggg == 0) { sendUpgrade(e1); } else if(upgradinggggggggggg == 1) { sendUpgrade(e2) } else if (upgradinggggggggggg == 2) { sendUpgrade(e3) } else if (upgradinggggggggggg == 3) { sendUpgrade(e4) } else if (upgradinggggggggggg == 4) { sendUpgrade(e5); } else if(upgradinggggggggggg == 5) { sendUpgrade(getEl("7slot").value); } else if (upgradinggggggggggg == 5 && omgogmom == true) { sendUpgrade(e7); } else if (upgradinggggggggggg == 7 && omgogmom == true) { sendUpgrade(e8); } upgradinggggggggggg++; } setInterval(()=>{ if(value == "kh"){ anusUpdate(7, 17, 31, 23, 10, 4, 25); } else if(value == "pm") { anusUpdate(5, 17, 31, 23, 9, 12, 15); } else if(value == "km") {//old anusUpdate(7, 17, 31, 23, 9, 4, 15); } else if(value == "dh") { anusUpdate(7, 17, 31, 23, 10, 28, 25); } else if(value == "ph") { anusUpdate(5, 17, 31, 27, 10, 28, 25); } else if(value == "sm") { anusUpdate(3, 17, 31, 23, 9, 0, 0, false); } else if(value == "dm") { anusUpdate(7, 17, 31, 23, 9, 0, 0, false); } }, 500); } } catch (e) { console.log(e); } } function getDist(e, t) { try { return Math.hypot((t.y2 || t.y) - (e.y2 || e.y), (t.x2 || t.x) - (e.x2 || e.x)); } catch (e) { return Infinity; } } function cdf(e, t) { try { return Math.hypot((t.y2 || t.y) - (e.y2 || e.y), (t.x2 || t.x) - (e.x2 || e.x)); } catch (e) { return Infinity; } } function caf(e, t) { try { return Math.atan2((t.y2 || t.y) - (e.y2 || e.y), (t.x2 || t.x) - (e.x2 || e.x)); } catch (e) { return 0; } } // KILL OBJECT: let breakTracks = [], breakTracksTracers = []; function killObject(sid) { let findObj = findObjectBySid(sid); objectManager.disableBySid(sid); let objAim = UTILS.getDirect(findObj, player, 0, 2); let objDst = UTILS.getDist(findObj, player, 0, 2); if (enemy.length) { // Spike Tick: if (objDst <= 200 && near.dist2 <= 180 && _ != player && player.reloads[player.weapons[0]] == 0) { bianosSpTick(); } // Auto Replace: traps.replacer(findObj); } // Break Traceks: if (objDst > 1200) { if (breakTracks.length >= 7) { breakTracks = []; } breakTracks.push({ x: findObj.x, y: findObj.y }); breakTracksTracers.push({ x: findObj.x, y: findObj.y }); } } // KILL ALL OBJECTS BY A PLAYER: function killObjects(sid) { if (player) objectManager.removeAllItems(sid); } function fgdo(a, b) { return Math.sqrt(Math.pow((b.y - a.y), 2) + Math.pow((b.x - a.x), 2)); } function setTickout(doo, timeout) { if (!ticks.manage[game.tick + timeout]) { ticks.manage[game.tick + timeout] = [doo]; } else { ticks.manage[game.tick + timeout].push(doo); } } function doNextTick(doo) { waitTicks.push(doo); } let waitTicks = []; let autoQ = false; function bianosSpTick(){ preplaceSpam = [true, near.skinIndex == 6 ? 4 : 2]; buyEquip(7, 0); buyEquip(18, 1); selectWeapon(player.weapons[0]); io.send("d", 1, near.aim2); place(2, near.aim2); setTickout(()=>{ buyEquip(53, 0); buyEquip(21, 1); setTickout(()=>{ io.send("d", 0, near.aim2); buyEquip(6, 0); }, 3); }, 1); } // Send Chat: function ch(e) { io.send("6", e.slice(0, 30)); } function ch2(text, waitCount = 3000) { player.chat.message = text; player.chat.count = waitCount; } function ch3(text, time = 500, color = "#fff") { textManager.showText(player.x2, player.y2, 30, 0.15, time, text, color, 2); } // Hat / Acc: function Hg(hat, acc){ buyEquip(hat, 0); buyEquip(acc, 1); } // Dir: function toDeg(a) { return a / (Math.PI / 180) } // Angel: function angleDist(angle1, angle2) { if(angle1 < 0) angle1 += Math.PI*2; if(angle2 < 0) angle2 += Math.PI*2; return Math.abs(angle1 - angle2); } function fixAngle(a) { return (360 + (a % 360)) % 360; } function calcAngle(xs, ys, xe, ye) { return Math.atan2(ye - ys, xe - xs); } // Dist: function getDistance(x1, y1, x2, y2) { return Math.sqrt((x2 - x1)**2 + (y2 - y1)**2) } // More: function isAlly(sid){ _ = findPlayerBySID(sid) if(!_){ return } if(player.sid == sid){ return true }else if(_.team){ return _.team === player.team ? true : false } else { return false } } // Random Spin: function spin() {// PPL code let random = [2, 3, 4, 5, 7, 3, 23, -1]; setTickout(() => { spinner = true; setTickout(() => { spinner = false; }, random[Math.floor(Math.random() * (random.length + 1))]); }, 1); } // n ti: let turretEmp = 0, turrets = 0; let cst = false, preplaceOverride = false; // Synced: let Synced = { SyncShotPri: 0, SyncShotSec: 0, bultect: false, } function canSyncHit() { let N = gameObjects; let _ = findPlayerByID(near); if(player.reloads[player.weapons[0]] != 1) return false; if(near.dist2/1.56 > items.weapons[player.weapons[0]].range) return false; let x = (_.velX || _.x2), y = (_.velY || _.y2); let isEnemyTraped = false; for(let i = 0; i < N.length; i++) { if(N[i] && N[i].name == "pit trap" && N[i].active && (N[i].owner.sid == player.sid || isAlly(N[i].owner.sid)) && Math.hypot(N[i].y - _.y2, N[i].x - _.x2) < 70) { isEnemyTraped = true; } if(N[i] && N[i].dmg && N[i].active && isEnemyTraped == false && (N[i].owner.sid == player.sid || isAlly(N[i].owner.sid))) { if(Math.hypot(N[i].y - y, N[i].x - x) <= 35 + N[i].scale) { return true; } } } if(_.health - (Math.round(items.weapons[player.weapons[0]].dmg * 1.5 * window.variantMulti(items.weapons[player.weapons[0]].variant) * (_.skinIndex == 6 ? .75 : 1))) <= 0) { return true; } return false; } // Replace let preplaceSpam = false; function perfectReplace() { if (!getEl("preplacer").checked) return; if (enemy.length) { if (UTILS.getDist(near, player, 0, 2) < 300) { let nea = Math.atan2(near.y - player.y, near.x - player.x); if (player.items[4] == 15) { if (preplaceSpam[0] || instaC.canSpikeTick) { place(preplaceSpam[1], nea, 1); } else if (retrappable) { place(4, nea); } else { for (let e = nea - 2 * Math.PI; e < nea + 2 * Math.PI * 1.5; e += Math.PI * 1.5 / 2) place(4, e); } retrappable = false; } } } } // Get XP: let Ab = null , Ac = null , Ad = {wood: 0,stone: 0, food:0, score: 0} , priXP = 0 , secXP = 0 , maxPriXP = 0 , maxSecXP = 0 , addXP = (d) => { if(player.weaponIndex == player.weapons[0]) priXP += d; else secXP += d } setInterval(() => { try { Ab == player.weapons[0] && Ac == player.weapons[1] || (player.weapons[0] != Ab && (priXP = 0), player.weapons[1] != Ac && (secXP = 0)), Ab = player.weapons[0], Ac = player.weapons[1]; let e = Number(document.getElementById("stoneDisplay").innerHTML) , t = Number(document.getElementById("foodDisplay").innerHTML) , n = Number(document.getElementById("woodDisplay").innerHTML) //, i = Number(document.getElementById("scoreDisplay").innerHTML) e > Ad.stone && (addXP(e - Ad.stone), Ad.stone = e), t > Ad.food && (addXP(t - Ad.food), Ad.food = t), n > Ad.wood && (addXP(n - Ad.wood), Ad.wood = n)//, i > Ad.score && (addXP(i - Ad.score), Ad.score = i) } catch (e) {}; }, 112.5); // Dmg Predictive: let inFlight = []; let canDmg = 0; let SafeDefense = 0; //ProjectileSafety(player.health, player.health) function ProjectileSafety(e, t) { e = 0; t = e; SafeDefense = e + t; if (inFlight.length < 1) return; for (let a of inFlight) { if (a.active) { if (a.estimate <= 2) { e += a.dmg; } else { t += a.dmg; } } } SafeDefense = e + t; } function dmgPotential(t) { t = 0; let temp = 0 + (player.reloads[player.primaryIndex] == 0 ? (1.5 * items.weapons[player.weapons[0]].dmg) : 0) + (player.reloads[player.secondaryIndex] == 1 && player.weapons[1] ? (items.weapons[player.weapons[1]].dmg || items.projectiles[items.weapons[player.weapons[1]].projectile].dmg || 0) : 0) + (player.reloads[53] && near.skinIndex != 22 ? 25 : 0); near.skinIndex == 6 && (temp *= 0.75); canDmg = SafeDefense; window.threatLevels = (SafeDefense) / 20; if (canDmg >= 2000 && canDmg <= 3250) { ch("sync detect test"); } return temp; } let predictDamage = 0; function guessDamagePrediction() { predictDamage = 0; if (enemy.length) { if (near.dist2 <= 300) { if (near.antiBull > 0 && near.skinIndex == 11) { predictDamage += items.weapons[player.weapons[0]].dmg * 0.45; } if (near.antiBull > 0 && near.tailIndex == 21) { predictDamage += items.weapons[player.weapons[0]].dmg * 0.25; } predictDamage *= player.skinIndex == 6 ? 0.75 : 1; if ((game.tick - player.bullTick) % o.serverUpdateRate === 0 && player.shameCount > 0) { predictDamage += 5; if (player.tailIndex == 13) { predictDamage -= 3; } } } } } let Trees = [], Foodbush = [], StoneOreok = [], GoldMines = []; let showingExtraMap = false; function isElementVisible(e) { return (e.offsetParent !== null); } // StatusMenus var mStatus = document.createElement("div"); mStatus.id = "status"; mStatus.style.position = "absolute"; mStatus.style.color = "#e6e6fa"; mStatus.style.font = "15px Hammersmith One"; mStatus.style.top = "40px"; mStatus.style.left = "40px"; mStatus.style.display = "none"; mStatus.textAlign = "right"; document.body.appendChild(mStatus); function LoadRevivalVisual() { mStatus.innerHTML = `
Auto-Insta:
0

Damage Prediction:
0

Turrets that can hit you:
0

`; /* [
0
]
AutoQ:
false
(if this is on, you will clown)
Clan IDs: [
0
]
*/ // MooMoo Guis if (true) { mapDisplay.style.backgroundImage = "url(https://ksw2-center.glitch.me/users/fzb/map.png)"; mapDisplay.style.backgroundColor = "rgba(0, 0, 0, 0.25)"; foodDisplay.style.display = "block"; woodDisplay.style.display = "block"; stoneDisplay.style.display = "block"; scoreDisplay.style.bottom = "160px"; scoreDisplay.style.right = "inherit"; scoreDisplay.style.left = "20px"; scoreDisplay.style.backgroundPosition = "left 6px center"; scoreDisplay.style.paddingLeft = "40px"; scoreDisplay.style.paddingRight = "10px"; // Fz if (true) { mStatus.style.color = "#fff"; mStatus.style.top = "20px"; mStatus.style.left = null; mStatus.style.right = "20px"; mStatus.style.display = "block"; leaderboard.style.position = "fixed"; leaderboard.style.left = "20px"; leaderboard.style.right = null; leaderboard.style.display = "none"; allianceButton.style.left = "520px"; allianceButton.style.right = null; allianceButton.style.width = "40px"; storeButton.style.left = "460px" storeButton.style.right = null; storeButton.style.width = "40px"; chatButton.style.display = "none"; resourceDisplay.appendChild(killCounter); killCounter.style.bottom = "185px"; killCounter.style.right = "20px"; scoreDisplay.style.bottom = "240px"; scoreDisplay.style.right = "20px"; scoreDisplay.style.left = "inherit"; scoreDisplay.style.backgroundPosition = "right 6px center"; scoreDisplay.style.paddingLeft = "10px"; scoreDisplay.style.paddingRight = "40px"; } } } LoadRevivalVisual(); let cursorDisplay = document.createElement("div"); cursorDisplay.id = "test" document.body.prepend(cursorDisplay); document.getElementById('test').style.display = 'block'; document.getElementById('test').style.opacity = '1'; document.getElementById('test').innerHTML = `
Ping: Null
Pri XP: 0 / not found
Sec XP: 0 / not found
Healer: none
PvP Mode: None
Ping: [Null, Null]
ATOS: false