您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Testing this laggy af mod how to fix
// ==UserScript== // @name MoonJoy Lisa? unpatched // @namespace We Shall rise once again // @version 1 // @license MIT // @description Testing this laggy af mod how to fix // @author Sigma // @match *://*.moomoo.io/* // @grant none // ==/UserScript== /* -- I DO NOT OWN THIS MOD - SaVeGe */ let backgroundDiv = document.createElement("div"); backgroundDiv.style.position = "fixed"; backgroundDiv.style.top = "0"; backgroundDiv.style.left = "0"; backgroundDiv.style.width = "100%"; backgroundDiv.style.height = "100%"; backgroundDiv.style.background = "#212121"; backgroundDiv.style.backgroundSize = "cover"; backgroundDiv.style.backgroundRepeat = "no-repeat"; backgroundDiv.style.backgroundPosition = "center"; backgroundDiv.style.display = "flex"; backgroundDiv.style.justifyContent = "center"; backgroundDiv.style.alignItems = "center"; backgroundDiv.style.color = "white"; backgroundDiv.style.fontSize = "35px"; backgroundDiv.style.zIndex = "99999999"; backgroundDiv.style.transition = "0.5s"; backgroundDiv.innerHTML = "\n<style>\nh1 {\nfont-size: 50px;\n}\n</style>\n\n<h1 id=\"loading\">Loading...</h1>\n"; document.body.appendChild(backgroundDiv); setTimeout(() => { backgroundDiv.innerHTML = "\n <style>\n h1 {\n font-size: 50px;\n }\n </style>\n <h1 id=\"loaded\">Game Loaded!</h1>\n "; setTimeout(() => { backgroundDiv.style.opacity = "0"; setTimeout(() => { backgroundDiv.style.display = "none"; }, 500); }, 2000); }, 2500); const removeSnowflakes = () => { const ao = document.querySelectorAll(".snowflake"); ao.forEach(ap => { ap.parentNode.removeChild(ap); }); }; const createSnowflake = function() { const au = document.createElement("div"); au.className = "snowflake"; au.style.position = "absolute"; au.style.width = "10px"; au.style.height = "10px"; au.style.background = "#fff"; au.style.borderRadius = "50%"; au.style.zIndex = "9998"; au.style.opacity = Math.random(); au.style.left = Math.random() * 100 + "vw"; au.style.animation = "fall " + (Math.random() * 2 + 1) + "s linear infinite"; au.addEventListener("animationiteration", function() { au.style.left = Math.random() * 100 + "vw"; au.style.opacity = Math.random(); }); return au; }; const styleSnowflakes = document.createElement("style"); styleSnowflakes.textContent = " @keyframes fall { 0% { transform: translateY(-10vh); opacity: 1; } 100% { transform: translateY(110vh); opacity: 0; } } .fast-fall { animation-duration: " + (Math.random() * 1 + 1) + "s; } "; document.head.appendChild(styleSnowflakes); const snowflakeContainer = document.createElement("div"); snowflakeContainer.style.position = "absolute"; snowflakeContainer.style.top = "0"; snowflakeContainer.style.left = "0"; snowflakeContainer.style.width = "100%"; snowflakeContainer.style.height = "100%"; snowflakeContainer.style.pointerEvents = "none"; snowflakeContainer.style.zIndex = "9998"; snowflakeContainer.style.display = "none"; document.body.appendChild(snowflakeContainer); const maxSnowflakes = 40; for (let i = 0; i < maxSnowflakes; i++) { const snowflake = createSnowflake(); if (Math.random() > 0.7) { snowflake.classList.add("fast-fall"); } snowflakeContainer.appendChild(snowflake); } (function() { "use strict"; let ax = document.createElement("script"); ax.src = "https://www.youtube.com/iframe_api"; document.head.appendChild(ax); let ay = document.createElement("div"); ay.id = "modSidebar"; ay.style = "\n position: fixed; top: 10px; left: 10px; width: 200px;\n background-color: #2c2f33; color: #fff; padding: 10px;\n border-radius: 10px; z-index: 1000; font-family: Arial, sans-serif;\n box-shadow: 0 0 15px rgba(0, 0, 0, 0.5); transition: opacity 0.5s ease,\n visibility 0.5s ease, transform 0.5s ease; opacity: 0; visibility: hidden;\n transform: translateX(-220px);\n "; let az = document.createElement("div"); az.id = "modRightPanel"; az.style = "\n position: fixed; top: 10px; left: 220px; width: 350px;\n background-color: #2c2f33; color: #fff; padding: 10px;\n border-radius: 10px; z-index: 1000; font-family: Arial, sans-serif;\n box-shadow: 0 0 15px rgba(0, 0, 0, 0.5); transition: opacity 0.5s ease,\n visibility 0.5s ease, transform 0.5s ease; opacity: 0; visibility: hidden;\n transform: translateX(0);\n "; ay.innerHTML = "\n <h3 style=\"\n margin-top: 0;\n text-align: center;\n text-shadow: 0 0 5px rgba(255, 192, 203, 0.8),\n 0 0 10px rgba(255, 192, 203, 0.6),\n 0 0 15px rgba(255, 192, 203, 0.4);\n color: #fff;\n \">\n Mod for Joykid<3<3\n <br>\n <span class=\"subText\"> Mod Fucked by Moonrocks </span>\n </h3>\n <div id=\"tabs\">\n <button id=\"visualTab\" class=\"tab active\">\n <img src=\"https://i.ibb.co/z5v8XYc/eyebrow-removebg-preview.png\" class=\"tabIcon\"> Visuals\n </button>\n <button id=\"combatTab\" class=\"tab\">\n <img src=\"https://i.ibb.co/85pZqGk/sword-removebg-preview.png\" class=\"tabIcon\"> Combat\n </button>\n <button id=\"miscTab\" class=\"tab\">\n <img src=\"https://i.ibb.co/gytFzqL/more-1-removebg-preview.png\" class=\"tabIcon\"> Misc\n </button>\n <button id=\"devTab\" class=\"tab\">\n <img src=\"https://i.ibb.co/s6nGQS7/web-development-removebg-preview.png\" class=\"tabIcon\"> Gui Customize\n </button>\n</div>\n\n"; az.innerHTML = "\n <div class=\"right-panel\" onmousedown=\"startDrag(event)\">\n <div id=\"visualContent\" class=\"content active\">\n <h4>Visual</h4>\n <label><input type=\"checkbox\" id=\"healAnim\" checked> Heal/Damage Animations</label><br>\n <label><input type=\"checkbox\" id=\"notifs\" checked> Notifications</label><br>\n <label><input type=\"checkbox\" id=\"dmgtext\" checked> Damage Text</label><br>\n <label><input type=\"checkbox\" id=\"fakePing\" checked> FakePing</label><br>\n <label><input type=\"checkbox\" id=\"font\" checked> Font</label><br>\n <label><input type=\"checkbox\" id=\"placeVis\"> Render Placers</label><br>\n <label><input type=\"checkbox\" id=\"daytime\"> Joykid_Visuals</label><br>\n <label><input type=\"checkbox\" id=\"spinner\"> Spin</label><br>\n <label><input type=\"checkbox\" id=\"cleanmode\" checked> Cleanmode</label><br>\n <label><input type=\"checkbox\" id=\"showgrid\"> showGrid?</label><br>\n <label for=\"BuildHealth\">BuildHealth Style:</label>\n <select id=\"BuildHealth\" class=\"styledSelect\">\n <option value=\"bh1\">Rectangle</option>\n <option value=\"bh2\">Filled Circle</option>\n <option value=\"bh3\" selected>Outlined Circle</option>\n </select><br>\n <label for=\"Camera\">CameraType:</label>\n <select id=\"cameramodes\" class=\"styledSelect\">\n <option value=\"camera1\">still</option>\n <option value=\"camera2\">smooth</option>\n <option value=\"camera3\" selected>Smooth + mouse</option>\n </select><br>\n <label><input type=\"checkbox\" id=\"combatZoom\" checked> Combat Zoom</label><br>\n <br>\n </div>\n </div>\n\n <div id=\"combatContent\" class=\"content\">\n <h4>Combat</h4>\n <label><input type=\"checkbox\" id=\"healingBeta\" checked> Heal </label><br>\n <label><input type=\"checkbox\" id=\"autoPush\" checked> Auto Push</label><br>\n <label><input type=\"checkbox\" id=\"smartInsta\" checked> AutoInsta</label><br>\n <label><input type=\"checkbox\" id=\"antispike\" checked> Anti Spike</label><br>\n <label><input type=\"checkbox\" id=\"slowOT\"> SlowOneTick</label><br>\n <label><input type=\"checkbox\" id=\"safeWalk\" checked> safewalk</label><br>\n <label><input type=\"checkbox\" id=\"killChat\" checked> Kill Chat</label><br>\n <input type=\"text\" id=\"killChatInput\" value=\"Signature strike incoming!\" placeholder=\"custom killchat\" oninput=\"document.getElementById('killChat').textContent = this.value\"> <br>\n <label><input type=\"checkbox\" id=\"autoBuy\" checked> Auto Buy</label><br>\n <label><input type=\"checkbox\" id=\"autoBuyEquip\" chcked> Auto Buy Equip</label><br>\n <label><input type=\"checkbox\" id=\"preTick\" checked> PreTick</label><br>\n <label><input type=\"checkbox\" id=\"revTick\" checked> RevTick</label><br>\n <label><input type=\"checkbox\" id=\"autoPlace\" checked> Auto Place</label><br>\n <label><input type=\"checkbox\" id=\"autoReplace\" checked> Auto Replace</label><br>\n <label><input type=\"checkbox\" id=\"spikeTick\" checked> Spike Tick</label><br>\n <label><input type=\"checkbox\" id=\"antiTrap\" checked> AntiTrap</label><br>\n <label><input type=\"checkbox\" id=\"attackDir\" > attackDir</label><br>\n <label><input type=\"checkbox\" id=\"noDir\" checked> noDir</label><br>\n <label><input type=\"checkbox\" id=\"showDir\" checked> ShowDir</label><br>\n <label><input type=\"checkbox\" id=\"autoRespawn\"> AutoRespawn</label><br>\n <label for=\"AntiBullType\">AntiBullMode:</label>\n <select id=\"antiBullType\" class=\"styledSelect\">\n <option value=\"noab\" selected>None</option>\n <option value=\"abreload\">When Reloaded</option>\n <option value=\"abalway\" >Primary Reloaded</option>\n </select><br>\n </label>\n </div>\n <div id=\"miscContent\" class=\"content\">\n <h4>Misc</h4>\n <label><input type=\"checkbox\" id=\"weaponGrind\" onclick=\"window.startGrind()\"> Weapon Grinder</label><br>\n <label><input type=\"checkbox\" id=\"safeAntiSpikeTick\" checked> Safe AntiSpikeTick</label><br>\n <label><input type=\"checkbox\" id=\"turretCombat\" checked> Turret Gear Combat Assistance</label><br>\n <label><input type=\"checkbox\" id=\"backupNobull\" checked> Backup Nobull Insta</label><br>\n <label><input type=\"checkbox\" id=\"autoUpgrade\" checked> Smart Upgrade</label><br>\n <label><input type=\"checkbox\" id=\"autorespond\" > AutoRespond</label><br>\n <label><input type=\"checkbox\" id=\"autoSync\" checked> AutoSync (press \"0\")</label><br>\n <label for=\"AutoInsta\">AutoInsta Mode:</label>\n <select id=\"AutoInsta\" class=\"styledSelect\">\n <option value=\"always\">Always Insta</option>\n <option value=\"smart\" selected>Insta on 5 Shame</option>\n </select><br>\n </label>\n <label for=\"syncMode\">SyncMode:</label>\n <select id=\"synctype\" class=\"styledSelect\">\n <option value=\"rangesync\">Ranged</option>\n <option value=\"meleesync\">Melee</option>\n <option value=\"instasync\">Insta-sync</option>\n </select><br>\n </div>\n\n <div id=\"devContent\" class=\"content\">\n <h4>Developer</h4>\n <label><input type=\"checkbox\" id=\"devMode\" checked> DevMode</label><br>\n <label>Menu Color: <input type=\"color\" id=\"menuColor\" value=\"#2c2f33\"></label><br>\n <label>Tab Color: <input type=\"color\" id=\"tabColor\" value=\"#7289da\"></label><br>\n </div>\n "; document.body.appendChild(ay); document.body.appendChild(az); const ba = document.createElement("style"); ba.textContent = "\n .tab {\n display: flex; align-items: center; width: 100%; padding: 10px;\n margin-bottom: 5px; background-color: #23272a; color: white;\n border: none; border-radius: 5px; text-align: left; cursor: pointer;\n transition: background-color 0.3s ease, transform 0.3s ease;\n }\n .tab.active { background-color: #7289da; transform: scale(1.05); }\n .tab:hover { background-color: #414755; transform: scale(1.05); }\n .tabIcon {\n width: 20px; height: 20px; margin-right: 10px;\n transition: transform 0.3s ease; /* Smooth transition for movement */\n }\n .tab:hover .tabIcon {\n transform: translateX(10px); /* Move icon to the right on hover */\n }\n .content { display: none; }\n .content.active { display: block; }\n input[type=\"checkbox\"] {\n background: #999999; position: relative; appearance: none; width: 25px;\n height: 12px; border-radius: 50px; box-shadow: inset 0 0 5px rgba(41, 41, 41, 0.2);\n cursor: pointer; top: 7.5px; left: 0; transition: 0.4s;\n }\n input[type=\"checkbox\"]:checked {\n background: #7289da; box-shadow: inset 0 0 5px rgba(41, 41, 41, 0.2);\n }\n input[type=\"checkbox\"]::before {\n content: \"\"; position: absolute; border-radius: 50%; background: white;\n width: 16px; height: 16px; top: -2px; left: -2px; transition: 0.4s;\n }\n input:checked[type=\"checkbox\"]::before { left: 12px; }\n .customText { padding: 5px; border-radius: 5px; border: 1px solid #555; background: #333; color: #fff; }\n .styledSelect { background: #333; color: #fff; border: 1px solid #555; border-radius: 5px; padding: 5px; }\n .menuB {\n background: linear-gradient(145deg, #4b7bec, #2e86de);\n color: #fff;\n border: none;\n padding: 5px 10px;\n border-radius: 6px;\n cursor: pointer;\n margin-right: 5px;\n font-size: 12px;\n font-weight: normal;\n text-transform: none;\n transition: all 0.2s ease;\n box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2);\n }\n .menuB:hover {\n background: linear-gradient(145deg, #2e86de, #4b7bec);\n box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);\n }\n .menuB:active {\n background: linear-gradient(145deg, #1f4f8b, #2a5d9f);\n box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.3);\n }\n"; document.head.appendChild(ba); function bb(bc) { document.querySelectorAll(".tab").forEach(bf => bf.classList.remove("active")); document.querySelectorAll(".content").forEach(bg => bg.classList.remove("active")); document.getElementById(bc + "Tab").classList.add("active"); document.getElementById(bc + "Content").classList.add("active"); } document.getElementById("visualTab").addEventListener("click", () => bb("visual")); document.getElementById("combatTab").addEventListener("click", () => bb("combat")); document.getElementById("miscTab").addEventListener("click", () => bb("misc")); document.getElementById("devTab").addEventListener("click", () => bb("dev")); function bh() { let bj = ay.style.opacity === "1"; ay.style.opacity = bj ? "0" : "1"; ay.style.visibility = bj ? "hidden" : "visible"; ay.style.transform = bj ? "translateX(-220px)" : "translateX(0)"; az.style.opacity = bj ? "0" : "1"; az.style.visibility = bj ? "hidden" : "visible"; az.style.transform = bj ? "translateX(220px)" : "translateX(0)"; } document.addEventListener("keydown", bk => { if (bk.key === "Escape") { bh(); } }); document.getElementById("menuColor").addEventListener("input", bm => { const bo = bm.target.value; ay.style.backgroundColor = bo; az.style.backgroundColor = bo; }); document.getElementById("tabColor").addEventListener("input", bp => { const bs = bp.target.value; document.querySelectorAll(".tab, .menuB").forEach(bt => { bt.style.backgroundColor = bs; }); }); })(); const cursorStyles = [{ name: "Crosshair", cursor: "crosshair" }]; document.body.style.cursor = cursorStyles[0].cursor; let testMode = window.location.hostname == "127.0.0.1"; let css = document.createElement("style"); css.type = "text/css"; css.appendChild(document.createTextNode("\n\n.actionBarItem {\n width: 66px;\n height: 66px;\n margin-right: 6px;\n background-color: #00000050;\n -webkit-border-radius: 0px;\n -moz-border-radius: 0px;\n border-radius: 5px;\n display: inline-block;\n cursor: pointer;\n pointer-events: all;\n background-size: cover;\n backdrop-filter: blur(1px);\n box-shadow: 0px 0px 6px #00000050;\n}\n#ageBarContainer {\n width: 100%;\n bottom: 120px;\n text-align: center;\n}\n#ageBar {\n background-color: #00000050;\n -webkit-border-radius: 8px;\n -moz-border-radius: 8px;\n border-radius: 8px;\n padding: 5px;\n width: 314px;\n height: 10px;\n display: inline-block;\n margin-bottom: 8px;\n backdrop-filter: blur(1px);\n box-shadow: 0px 0px 6px #00000050;\n}\n\n.gameButton, #leaderboard, .resourceDisplay,\n#mapDisplay, #allianceHolder, #allianceInput,\n.allianceButtonM, #storeHolder, .storeTab, #chatBox {\n color: #FFF;\n text-shadow:\n 0 0 5px rgba(173, 216, 230, 0.8),\n 0 0 10px rgba(173, 216, 230, 0.6),\n 0 0 20px rgba(173, 216, 230, 0.4),\n 0 0 30px rgba(173, 216, 230, 0.3);\n transition: text-shadow 0.3s ease-in-out;\n}\n\n.gameButton:hover, #leaderboard:hover,\n.resourceDisplay:hover, #mapDisplay:hover,\n#allianceHolder:hover, #allianceInput:hover,\n.allianceButtonM:hover, #storeHolder:hover,\n.storeTab:hover, #chatBox:hover {\n text-shadow:\n 0 0 10px rgba(173, 216, 230, 0.8),\n 0 0 20px rgba(173, 216, 230, 0.6),\n 0 0 30px rgba(173, 216, 230, 0.5),\n 0 0 40px rgba(173, 216, 230, 0.4);\n}\n\n\n")); document.head.appendChild(css); document.addEventListener("keydown", function(bv) { if (bv.key === "Tab") { bv.preventDefault(); } if (bv.key === "F5") { bv.preventDefault(); } }); function onBoxMouseOver() { this.style.transform = "scale(1.05)"; this.style.transition = "all 0.7s ease-in-out"; } function onBoxMouseLeave() { this.style.transition = "all 0.7s ease-in-out"; this.style.transform = "scale(1)"; } function onEnterGameMouseOver() { const cb = document.getElementById("enterGame"); cb.style.backgroundColor = "rgba(255, 255, 0, 0.2)"; cb.style.borderRadius = "20px"; cb.style.transition = "all 0.7s ease-in-out"; } function onEnterGameMouseLeave() { const cd = document.getElementById("enterGame"); cd.style.backgroundColor = "rgba(153, 50, 204, 0.3)"; cd.style.borderRadius = "15px"; cd.style.transition = "all 0.7s ease-in-out"; } const boxes = document.querySelectorAll(".menuCard"); boxes.forEach(ce => { ce.style.transition = "transform 1s ease"; ce.addEventListener("mouseenter", onBoxMouseOver); ce.addEventListener("mouseleave", onBoxMouseLeave); }); const enterGameBox = document.getElementById("enterGame"); enterGameBox.addEventListener("mouseenter", onEnterGameMouseOver); enterGameBox.addEventListener("mouseleave", onEnterGameMouseLeave); const guideCardDiv = document.getElementById("guideCard"); if (guideCardDiv) { guideCardDiv.style.position = "absolute"; guideCardDiv.style.width = "300px"; guideCardDiv.style.height = "200px"; guideCardDiv.style.top = "100%"; guideCardDiv.style.left = "41%"; guideCardDiv.style.zIndex = "9999"; } let Leuchtturm = false; function getEl(ci) { return document.getElementById(ci); } var EasyStar = function(ck) { var cm = {}; function cn(cp) { if (cm[cp]) { return cm[cp].exports; } var cr = cm[cp] = { i: cp, l: false, exports: {} }; ck[cp].call(cr.exports, cr, cr.exports, cn); cr.l = true; return cr.exports; } cn.m = ck; cn.c = cm; cn.d = function(cs, ct, cu) { if (!cn.o(cs, ct)) { Object.defineProperty(cs, ct, { enumerable: true, get: cu }); } }; cn.r = function(cv) { if (typeof Symbol != "undefined" && Symbol.toStringTag) { Object.defineProperty(cv, Symbol.toStringTag, { value: "Module" }); } Object.defineProperty(cv, "__esModule", { value: true }); }; cn.t = function(cx, cy) { if (cy & 1) { cx = cn(cx); } if (cy & 8) { return cx; } if (cy & 4 && typeof cx == "object" && cx && cx.__esModule) { return cx; } var dd = Object.create(null); cn.r(dd); Object.defineProperty(dd, "default", { enumerable: true, value: cx }); if (cy & 2 && typeof cx != "string") { for (var de in cx) { cn.d(dd, de, function(df) { return cx[df]; }.bind(null, de)); } } return dd; }; cn.n = function(dg) { var di = dg && dg.__esModule ? function() { return dg.default; } : function() { return dg; }; cn.d(di, "f", di); return di; }; cn.o = function(dk, dl) { return Object.prototype.hasOwnProperty.call(dk, dl); }; cn.p = "/bin/"; return cn(cn.s = 0); }([function(dp, dq, ds) { var dv = {}; var dw = ds(1); var dx = ds(2); var dy = ds(3); dp.exports = dv; var dz = 1; dv.js = function() { var eb; var ec; var ed; var ee = 1.4; var ef = false; var eg = {}; var eh = {}; var ei = {}; var ej = {}; var ek = true; var el = {}; var em = []; var en = Number.MAX_VALUE; var eo = false; this.setAcceptableTiles = function(ep) { if (ep instanceof Array) { ed = ep; } else if (!isNaN(parseFloat(ep)) && isFinite(ep)) { ed = [ep]; } }; this.enableSync = function() { ef = true; }; this.disableSync = function() { ef = false; }; this.enableDiagonals = function() { eo = true; }; this.disableDiagonals = function() { eo = false; }; this.setGrid = function(eq) { eb = eq; for (var es = 0; es < eb.length; es++) { for (var et = 0; et < eb[0].length; et++) { eh[eb[es][et]] ||= 1; } } }; this.setTileCost = function(eu, ev) { eh[eu] = ev; }; this.setAdditionalPointCost = function(ew, ex, ey) { if (ei[ex] === undefined) { ei[ex] = {}; } ei[ex][ew] = ey; }; this.removeAdditionalPointCost = function(fa, fb) { if (ei[fb] !== undefined) { delete ei[fb][fa]; } }; this.removeAllAdditionalPointCosts = function() { ei = {}; }; this.setDirectionalCondition = function(fc, fd, fe) { if (ej[fd] === undefined) { ej[fd] = {}; } ej[fd][fc] = fe; }; this.removeAllDirectionalConditions = function() { ej = {}; }; this.setIterationsPerCalculation = function(ff) { en = ff; }; this.avoidAdditionalPoint = function(fg, fh) { if (eg[fh] === undefined) { eg[fh] = {}; } eg[fh][fg] = 1; }; this.stopAvoidingAdditionalPoint = function(fi, fj) { if (eg[fj] !== undefined) { delete eg[fj][fi]; } }; this.enableCornerCutting = function() { ek = true; }; this.disableCornerCutting = function() { ek = false; }; this.stopAvoidingAllAdditionalPoints = function() { eg = {}; }; this.findPath = function(fk, fl, fm, fn, fo) { function fq(fr) { if (ef) { fo(fr); } else { setTimeout(function() { fo(fr); }); } } if (ed === undefined) { throw new Error("You can't set a path without first calling setAcceptableTiles() on EasyStar."); } if (eb === undefined) { throw new Error("You can't set a path without first calling setGrid() on EasyStar."); } if (fk < 0 || fl < 0 || fm < 0 || fn < 0 || fk > eb[0].length - 1 || fl > eb.length - 1 || fm > eb[0].length - 1 || fn > eb.length - 1) { throw new Error("Your start or end point is outside the scope of your grid."); } if (fk !== fm || fl !== fn) { var fs = eb[fn][fm]; var ft = false; for (var fu = 0; fu < ed.length; fu++) { if (fs === ed[fu]) { ft = true; break; } } if (ft !== false) { var fw = new dw(); fw.openList = new dy(function(fx, fy) { return fx.bestGuessDistance() - fy.bestGuessDistance(); }); fw.isDoneCalculating = false; fw.nodeHash = {}; fw.startX = fk; fw.startY = fl; fw.endX = fm; fw.endY = fn; fw.callback = fq; fw.openList.push(ga(fw, fw.startX, fw.startY, null, 1)); fn = dz++; el[fn] = fw; em.push(fn); return fn; } fq(null); } else { fq([]); } }; this.cancelPath = function(gb) { return gb in el && (delete el[gb], true); }; this.calculate = function() { if (em.length !== 0 && eb !== undefined && ed !== undefined) { for (ec = 0; ec < en; ec++) { if (em.length === 0) { return; } if (ef) { ec = 0; } var ge = em[0]; var gf = el[ge]; if (gf !== undefined) { if (gf.openList.size() !== 0) { var gg = gf.openList.pop(); if (gf.endX !== gg.x || gf.endY !== gg.y) { if ((gg.list = 0) < gg.y) { gh(gf, gg, 0, -1, +(ei[gg.y - 1] && ei[gg.y - 1][gg.x] || eh[eb[gg.y - 1][gg.x]])); } if (gg.x < eb[0].length - 1) { gh(gf, gg, 1, 0, +(ei[gg.y] && ei[gg.y][gg.x + 1] || eh[eb[gg.y][gg.x + 1]])); } if (gg.y < eb.length - 1) { gh(gf, gg, 0, 1, +(ei[gg.y + 1] && ei[gg.y + 1][gg.x] || eh[eb[gg.y + 1][gg.x]])); } if (gg.x > 0) { gh(gf, gg, -1, 0, +(ei[gg.y] && ei[gg.y][gg.x - 1] || eh[eb[gg.y][gg.x - 1]])); } if (eo) { if (gg.x > 0 && gg.y > 0 && (ek || gi(eb, ed, gg.x, gg.y - 1, gg) && gi(eb, ed, gg.x - 1, gg.y, gg))) { gh(gf, gg, -1, -1, ee * (ei[gg.y - 1] && ei[gg.y - 1][gg.x - 1] || eh[eb[gg.y - 1][gg.x - 1]])); } if (gg.x < eb[0].length - 1 && gg.y < eb.length - 1 && (ek || gi(eb, ed, gg.x, gg.y + 1, gg) && gi(eb, ed, gg.x + 1, gg.y, gg))) { gh(gf, gg, 1, 1, ee * (ei[gg.y + 1] && ei[gg.y + 1][gg.x + 1] || eh[eb[gg.y + 1][gg.x + 1]])); } if (gg.x < eb[0].length - 1 && gg.y > 0 && (ek || gi(eb, ed, gg.x, gg.y - 1, gg) && gi(eb, ed, gg.x + 1, gg.y, gg))) { gh(gf, gg, 1, -1, ee * (ei[gg.y - 1] && ei[gg.y - 1][gg.x + 1] || eh[eb[gg.y - 1][gg.x + 1]])); } if (gg.x > 0 && gg.y < eb.length - 1 && (ek || gi(eb, ed, gg.x, gg.y + 1, gg) && gi(eb, ed, gg.x - 1, gg.y, gg))) { gh(gf, gg, -1, 1, ee * (ei[gg.y + 1] && ei[gg.y + 1][gg.x - 1] || eh[eb[gg.y + 1][gg.x - 1]])); } } } else { var gj = []; gj.push({ x: gg.x, y: gg.y }); for (var gk = gg.parent; gk != null;) { gj.push({ x: gk.x, y: gk.y }); gk = gk.parent; } gj.reverse(); gf.callback(gj); delete el[ge]; em.shift(); } } else { gf.callback(null); delete el[ge]; em.shift(); } } else { em.shift(); } } } }; function gh(gl, gm, gn, gp, gq) { gn = gm.x + gn; gp = gm.y + gp; if ((eg[gp] === undefined || eg[gp][gn] === undefined) && !!gi(eb, ed, gn, gp, gm)) { if ((gp = ga(gl, gn, gp, gm, gq)).list === undefined) { gp.list = 1; gl.openList.push(gp); } else if (gm.costSoFar + gq < gp.costSoFar) { gp.costSoFar = gm.costSoFar + gq; gp.parent = gm; gl.openList.updateItem(gp); } } } function gi(gs, gt, gu, gv, gw) { var gy = ej[gv] && ej[gv][gu]; if (gy) { var gz = ha(gw.x - gu, gw.y - gv); if (! function() { for (var hc = 0; hc < gy.length; hc++) { if (gy[hc] === gz) { return true; } } return false; }()) { return false; } } for (var hd = 0; hd < gt.length; hd++) { if (gs[gv][gu] === gt[hd]) { return true; } } return false; } function ha(he, hf) { if (he === 0 && hf === -1) { return dv.TOP; } if (he === 1 && hf === -1) { return dv.TOP_RIGHT; } if (he === 1 && hf === 0) { return dv.RIGHT; } if (he === 1 && hf === 1) { return dv.BOTTOM_RIGHT; } if (he === 0 && hf === 1) { return dv.BOTTOM; } if (he === -1 && hf === 1) { return dv.BOTTOM_LEFT; } if (he === -1 && hf === 0) { return dv.LEFT; } if (he === -1 && hf === -1) { return dv.TOP_LEFT; } throw new Error("These differences are not valid: " + he + ", " + hf); } function ga(hh, hi, hj, hk, hl) { if (hh.nodeHash[hj] !== undefined) { if (hh.nodeHash[hj][hi] !== undefined) { return hh.nodeHash[hj][hi]; } } else { hh.nodeHash[hj] = {}; } var hn = ho(hi, hj, hh.endX, hh.endY); var hl = hk !== null ? hk.costSoFar + hl : 0; var hn = new dx(hk, hi, hj, hl, hn); return hh.nodeHash[hj][hi] = hn; } function ho(hp, hq, hr, hs) { var hu; var hv; if (eo) { if ((hu = Math.abs(hp - hr)) < (hv = Math.abs(hq - hs))) { return ee * hu + hv; } else { return ee * hv + hu; } } else { return (hu = Math.abs(hp - hr)) + (hv = Math.abs(hq - hs)); } } }; dv.TOP = "TOP"; dv.TOP_RIGHT = "TOP_RIGHT"; dv.RIGHT = "RIGHT"; dv.BOTTOM_RIGHT = "BOTTOM_RIGHT"; dv.BOTTOM = "BOTTOM"; dv.BOTTOM_LEFT = "BOTTOM_LEFT"; dv.LEFT = "LEFT"; dv.TOP_LEFT = "TOP_LEFT"; }, function(hw, hx) { hw.exports = function() { this.pointsToAvoid = {}; this.startX; this.callback; this.startY; this.endX; this.endY; this.nodeHash = {}; this.openList; }; }, function(hz, ia) { hz.exports = function(ic, ie, ig, ih, ii) { this.parent = ic; this.x = ie; this.y = ig; this.costSoFar = ih; this.simpleDistanceToTarget = ii; this.bestGuessDistance = function() { return this.costSoFar + this.simpleDistanceToTarget; }; }; }, function(il, im, ip) { il.exports = ip(4); }, function(ir, iu, iv) { var ix; var iy; (function() { var ja; var jb; var jc; var jd; var je; var jf; var jg; var jh; var ji; var jj; var jk; var jl; var jm; var jn; var jo; function jp(jq) { this.cmp = jq ?? jb; this.nodes = []; } jc = Math.floor; jj = Math.min; jb = function(jt, ju) { if (jt < ju) { return -1; } else if (ju < jt) { return 1; } else { return 0; } }; ji = function(jv, jw, jx, jy, jz) { var kb; if (jx == null) { jx = 0; } if (jz == null) { jz = jb; } if (jx < 0) { throw new Error("lo must be non-negative"); } for (jy == null && (jy = jv.length); jx < jy;) { if (jz(jw, jv[kb = jc((jx + jy) / 2)]) < 0) { jy = kb; } else { jx = kb + 1; } } [].splice.apply(jv, [jx, jx - jx].concat(jw)); return jw; }; jf = function(kc, kd, ke) { if (ke == null) { ke = jb; } kc.push(kd); return jn(kc, 0, kc.length - 1, ke); }; je = function(kg, ki) { var kk; var kl; if (ki == null) { ki = jb; } kk = kg.pop(); if (kg.length) { kl = kg[0]; kg[0] = kk; jo(kg, 0, ki); } else { kl = kk; } return kl; }; jh = function(kn, ko, kp) { var kq; if (kp == null) { kp = jb; } kq = kn[0]; kn[0] = ko; jo(kn, 0, kp); return kq; }; jg = function(kr, ks, kt) { var kv; if (kt == null) { kt = jb; } if (kr.length && kt(kr[0], ks) < 0) { ks = (kv = [kr[0], ks])[0]; kr[0] = kv[1]; jo(kr, 0, kt); } return ks; }; jd = function(kw, kx) { var kz; var la; var lb; var lc; var ld; var le; if (kx == null) { kx = jb; } ld = []; la = 0; lb = (lc = function() { le = []; for (var lg = 0, lh = jc(kw.length / 2); lh >= 0 ? lg < lh : lh < lg; lh >= 0 ? lg++ : lg--) { le.push(lg); } return le; }.apply(this).reverse()).length; for (; la < lb; la++) { kz = lc[la]; ld.push(jo(kw, kz, kx)); } return ld; }; jm = function(li, lj, lk) { if (lk == null) { lk = jb; } if ((lj = li.indexOf(lj)) !== -1) { jn(li, 0, lj, lk); return jo(li, lj, lk); } }; jk = function(lm, ln, lp) { var lr; var ls; var lt; var lu; var lv; if (lp == null) { lp = jb; } if (!(ls = lm.slice(0, ln)).length) { return ls; } jd(ls, lp); lt = 0; lu = (lv = lm.slice(ln)).length; for (; lt < lu; lt++) { lr = lv[lt]; jg(ls, lr, lp); } return ls.sort(lp).reverse(); }; jl = function(lw, lx, ly) { var ma; var mb; var md; var mf; var mg; var mh; var mi; var mj; var mk; if (ly == null) { ly = jb; } if (lx * 10 <= lw.length) { if (!(md = lw.slice(0, lx).sort(ly)).length) { return md; } mb = md[md.length - 1]; mf = 0; mh = (mi = lw.slice(lx)).length; for (; mf < mh; mf++) { if (ly(ma = mi[mf], mb) < 0) { ji(md, ma, 0, null, ly); md.pop(); mb = md[md.length - 1]; } } return md; } jd(lw, ly); mk = []; mg = 0; mj = jj(lx, lw.length); for (; mj >= 0 ? mg < mj : mj < mg; mj >= 0 ? ++mg : --mg) { mk.push(je(lw, ly)); } return mk; }; jn = function(ml, mm, mn, mo) { var mp; var mq; var mr; if (mo == null) { mo = jb; } mp = ml[mn]; while (mm < mn && mo(mp, mq = ml[mr = mn - 1 >> 1]) < 0) { ml[mn] = mq; mn = mr; } return ml[mn] = mp; }; jo = function(mt, mu, mv) { var mx; var mz; var na; var nb; var nc; if (mv == null) { mv = jb; } mz = mt.length; na = mt[nc = mu]; mx = mu * 2 + 1; while (mx < mz) { if ((nb = mx + 1) < mz && !(mv(mt[mx], mt[nb]) < 0)) { mx = nb; } mt[mu] = mt[mx]; mx = (mu = mx) * 2 + 1; } mt[mu] = na; return jn(mt, nc, mu, mv); }; jp.push = jf; jp.pop = je; jp.replace = jh; jp.pushpop = jg; jp.heapify = jd; jp.updateItem = jm; jp.nlargest = jk; jp.nsmallest = jl; jp.prototype.push = function(nd) { return jf(this.nodes, nd, this.cmp); }; jp.prototype.pop = function() { return je(this.nodes, this.cmp); }; jp.prototype.peek = function() { return this.nodes[0]; }; jp.prototype.contains = function(nf) { return this.nodes.indexOf(nf) !== -1; }; jp.prototype.replace = function(nh) { return jh(this.nodes, nh, this.cmp); }; jp.prototype.pushpop = function(nj) { return jg(this.nodes, nj, this.cmp); }; jp.prototype.heapify = function() { return jd(this.nodes, this.cmp); }; jp.prototype.updateItem = function(nl) { return jm(this.nodes, nl, this.cmp); }; jp.prototype.clear = function() { return this.nodes = []; }; jp.prototype.empty = function() { return this.nodes.length === 0; }; jp.prototype.size = function() { return this.nodes.length; }; jp.prototype.clone = function() { var ns = new jp(); ns.nodes = this.nodes.slice(0); return ns; }; jp.prototype.toArray = function() { return this.nodes.slice(0); }; jp.prototype.insert = jp.prototype.push; jp.prototype.top = jp.prototype.peek; jp.prototype.front = jp.prototype.peek; jp.prototype.has = jp.prototype.contains; jp.prototype.copy = jp.prototype.clone; ja = jp; ix = []; if ((iy = typeof(iy = function() { return ja; }) == "function" ? iy.apply(iu, ix) : iy) !== undefined) { ir.exports = iy; } }).call(this); }]); let easystar = new EasyStar.js(); document.getElementById("gameName").innerHTML = ""; $("#gameName").css({ display: "none" }); let coolFont = document.createElement("link"); coolFont.rel = "stylesheet"; coolFont.href = "https://fonts.googleapis.com/css2?family=Lilita+One&display=swap"; coolFont.type = "text/css"; document.body.append(coolFont); let min = document.createElement("script"); min.src = "https://rawgit.com/kawanet/msgpack-lite/master/dist/msgpack.min.js"; document.body.append(min); window.oncontextmenu = function() { return false; }; let config = window.config; config.clientSendRate = 9; config.serverUpdateRate = 9; config.deathFadeout = 0; config.playerCapacity = 50; config.isSandbox = window.location.hostname == "sandbox.moomoo.io"; config.skinColors = ["#bf8f54", "#cbb091", "#896c4b", "#fadadc", "#ececec", "#c37373", "#4c4c4c", "#ecaff7", "#738cc3", "#8bc373", "#91b2db"]; config.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 }]; config.anotherVisual = true; config.useWebGl = false; config.resetRender = true; function waitTime(nu) { return new Promise(nv => { setTimeout(() => { nv(); }, nu); }); } let botSkts = []; let canStore; if (typeof Storage !== "undefined") { canStore = true; } function saveVal(nw, nx) { if (canStore) { localStorage.setItem(nw, nx); } } function deleteVal(nz) { if (canStore) { localStorage.removeItem(nz); } } function getSavedVal(ob) { if (canStore) { return localStorage.getItem(ob); } return null; } let gC = function(oc, od) { try { let og = JSON.parse(getSavedVal(oc)); if (typeof og === "object") { return od; } else { return og; } } catch (oh) { return od; } }; function setCommands() {} function setConfigs() { return {}; } let commands = setCommands(); let configs = setConfigs(); window.removeConfigs = function() { for (let oi in configs) { deleteVal(oi, configs[oi]); } }; for (let cF in configs) { configs[cF] = gC(cF, configs[cF]); } window.changeMenu = function() {}; window.debug = function() {}; window.wasdMode = function() {}; window.startGrind = function() {}; window.connectFillBots = function() {}; window.destroyFillBots = function() {}; window.tryConnectBots = function() {}; window.destroyBots = function() {}; window.resBuild = function() {}; window.toggleBotsCircle = function() {}; window.toggleVisual = function() {}; window.prepareUI = function() {}; window.leave = function() {}; window.ping = 0; class HtmlAction { constructor(oj) { this.element = oj; } add(ol) { if (!this.element) { return undefined; } this.element.innerHTML += ol; } newLine(oo) { let oq = "<br>"; if (oo > 0) { oq = ""; for (let os = 0; os < oo; os++) { oq += "<br>"; } } this.add(oq); } checkBox(ot) { let ov = "<input type = \"checkbox\""; if (ot.id) { ov += " id = " + ot.id; } if (ot.style) { ov += " style = " + ot.style.replaceAll(" ", ""); } if (ot.class) { ov += " class = " + ot.class; } if (ot.checked) { ov += " checked"; } if (ot.onclick) { ov += " onclick = " + ot.onclick; } ov += ">"; this.add(ov); } text(ow) { let oy = "<input type = \"text\""; if (ow.id) { oy += " id = " + ow.id; } if (ow.style) { oy += " style = " + ow.style.replaceAll(" ", ""); } if (ow.class) { oy += " class = " + ow.class; } if (ow.size) { oy += " size = " + ow.size; } if (ow.maxLength) { oy += " maxLength = " + ow.maxLength; } if (ow.value) { oy += " value = " + ow.value; } if (ow.placeHolder) { oy += " placeHolder = " + ow.placeHolder.replaceAll(" ", " "); } oy += ">"; this.add(oy); } select(oz) { let pc = "<select"; if (oz.id) { pc += " id = " + oz.id; } if (oz.style) { pc += " style = " + oz.style.replaceAll(" ", ""); } if (oz.class) { pc += " class = " + oz.class; } pc += ">"; for (let pd in oz.option) { pc += "<option value = " + oz.option[pd].id; if (oz.option[pd].selected) { pc += " selected"; } pc += ">" + pd + "</option>"; } pc += "</select>"; this.add(pc); } button(pe) { let pg = "<button"; if (pe.id) { pg += " id = " + pe.id; } if (pe.style) { pg += " style = " + pe.style.replaceAll(" ", ""); } if (pe.class) { pg += " class = " + pe.class; } if (pe.onclick) { pg += " onclick = " + pe.onclick; } pg += ">"; if (pe.innerHTML) { pg += pe.innerHTML; } pg += "</button>"; this.add(pg); } selectMenu(pj) { let pl = "<select"; if (!pj.id) { alert("please put id skid"); return; } window[pj.id + "Func"] = function() {}; if (pj.id) { pl += " id = " + pj.id; } if (pj.style) { pl += " style = " + pj.style.replaceAll(" ", ""); } if (pj.class) { pl += " class = " + pj.class; } pl += " onchange = window." + (pj.id + "Func") + "()"; pl += ">"; let pm; let pn = 0; for (let po in pj.menu) { pl += "<option value = " + ("option_" + po) + " id = " + ("O_" + po); if (pj.menu[po]) { pl += " checked"; } pl += " style = \"color: " + (pj.menu[po] ? "#000" : "") + "; background: " + (pj.menu[po] ? "" : "") + ";\">" + po + "</option>"; pn++; } pl += "</select>"; this.add(pl); pn = 0; for (let pp in pj.menu) { window[pp + "Func"] = function() { pj.menu[pp] = getEl("check_" + pp).checked ? true : false; saveVal(pp, pj.menu[pp]); getEl("O_" + pp).style.color = pj.menu[pp] ? "#000" : "#fff"; getEl("O_" + pp).style.background = pj.menu[pp] ? "#8ecc51" : "#cc5151"; }; this.checkBox({ id: "check_" + pp, style: "display: " + (pn == 0 ? "inline-block" : "none") + ";", class: "checkB", onclick: "window." + (pp + "Func") + "()", checked: pj.menu[pp] }); pn++; } pm = "check_" + getEl(pj.id).value.split("_")[1]; window[pj.id + "Func"] = function() { getEl(pm).style.display = "none"; pm = "check_" + getEl(pj.id).value.split("_")[1]; getEl(pm).style.display = "inline-block"; }; } }; class Html { constructor() { this.element = null; this.action = null; this.divElement = null; this.startDiv = function(pt, pu) { let pw = document.createElement("div"); if (pt.id) { pw.id = pt.id; } if (pt.style) { pw.style = pt.style; } if (pt.class) { pw.className = pt.class; } this.element.appendChild(pw); this.divElement = pw; let py = new HtmlAction(pw); if (typeof pu == "function") { pu(py); } }; this.addDiv = function(pz, qa) { let qc = document.createElement("div"); if (pz.id) { qc.id = pz.id; } if (pz.style) { qc.style = pz.style; } if (pz.class) { qc.className = pz.class; } if (pz.appendID) { getEl(pz.appendID).appendChild(qc); } this.divElement = qc; let qd = new HtmlAction(qc); if (typeof qa == "function") { qa(qd); } }; } set(qe) { this.element = getEl(qe); this.action = new HtmlAction(this.element); } resetHTML(qg) { if (qg) { this.element.innerHTML = ""; } else { this.element.innerHTML = ""; } } setStyle(qi) { this.element.style = qi; } setCSS(qk) { this.action.add("<style>" + qk + "</style>"); } }; let HTML = new Html(); let menuChatDiv = document.createElement("div"); menuChatDiv.id = "menuChatDiv"; document.body.appendChild(menuChatDiv); HTML.set("menuChatDiv"); HTML.setStyle(""); HTML.resetHTML(); HTML.setCSS(" "); HTML.startDiv({ id: "mChDiv", class: "chDiv" }, qn => { HTML.addDiv({ id: "mChMain", class: "chMainDiv", appendID: "mChDiv" }, qp => {}); qn.text({ id: "mChBox", class: "chMainBox" }); }); let menuChats = getEl("mChMain"); let menuChatBox = getEl("mChBox"); let menuCBFocus = false; let menuChCounts = 0; menuChatBox.value = ""; menuChatBox.addEventListener("focus", () => { menuCBFocus = true; }); menuChatBox.addEventListener("blur", () => { menuCBFocus = false; }); let menuIndex = 0; let menus = ["menuMain", "menuConfig", "menuOther"]; window.changeMenu = function() { getEl(menus[menuIndex % menus.length]).style.display = "none"; menuIndex++; getEl(menus[menuIndex % menus.length]).style.display = "block"; }; let mStatus = document.createElement("div"); mStatus.id = "status"; getEl("gameUI").appendChild(mStatus); HTML.set("status"); HTML.setStyle("\n display: block;\n position: absolute;\n color: #ddd;\n font: 15px Hammersmith One;\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n "); HTML.resetHTML(); HTML.setCSS("\n .sizing {\n font-size: 13px;\n }\n .mod {\n font-size: 13px;\n display: inline-block;\n }\n "); HTML.startDiv({ id: "uehmod", class: "sizing" }, qr => { qr.add("Ping: "); HTML.addDiv({ id: "pingFps", class: "mod", appendID: "uehmod" }, qt => { qt.add("None"); }); }); let openMenu = false; let WS = undefined; let socketID = undefined; let useWasd = false; let secPacket = 0; let secMax = 120; let secTime = 1000; let firstSend = { sec: false }; let game = { tick: 0, tickQueue: [], tickBase: function(qv, qw) { if (this.tickQueue[this.tick + qw]) { this.tickQueue[this.tick + qw].push(qv); } else { this.tickQueue[this.tick + qw] = [qv]; } }, tickRate: 950 / config.serverUpdateRate, tickSpeed: 0, lastTick: performance.now() }; let modConsole = []; let dontSend = false; let fpsTimer = { last: 0, time: 0, ltime: 0 }; let lastMoveDir = undefined; let lastsp = ["unknown1l", 1, "__proto__"]; WebSocket.prototype.nsend = WebSocket.prototype.send; WebSocket.prototype.send = function(qy) { if (!WS) { WS = this; WS.addEventListener("message", function(ra) { getMessage(ra); }); WS.addEventListener("close", rb => { if (rb.code == 4001) { window.location.reload(); } }); } if (WS == this) { dontSend = false; let rd = new Uint8Array(qy); let rf = window.msgpack.decode(rd); let rg = rf[0]; rd = rf[1]; if (rg == "6") { if (rd[0]) { let rh = ["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 ri; rh.forEach(rj => { if (rd[0].indexOf(rj) > -1) { ri = ""; for (let rl = 0; rl < rj.length; ++rl) { if (rl == 1) { ri += String.fromCharCode(0); } ri += rj[rl]; } let rm = new RegExp(rj, "g"); rd[0] = rd[0].replace(rm, ri); } }); rd[0] = rd[0].slice(0, 30); } } else if (rg == "L") { rd[0] = rd[0] + String.fromCharCode(0).repeat(7); rd[0] = rd[0].slice(0, 7); } else if (rg == "M") { rd[0].name = rd[0].name == "" ? "unknown" : rd[0].name; rd[0].moofoll = true; rd[0].skin = rd[0].skin == 10 ? "__proto__" : rd[0].skin; lastsp = [rd[0].name, rd[0].moofoll, rd[0].skin]; } else if (rg == "D") { if (my.lastDir == rd[0] || [null, undefined].includes(rd[0])) { dontSend = true; } else { my.lastDir = rd[0]; } } else if (rg == "d") { if (!rd[2]) { dontSend = true; } else if (![null, undefined].includes(rd[1])) { my.lastDir = rd[1]; } } else if (rg == "K") { if (!rd[1]) { dontSend = true; } } else if (rg == "S") { instaC.wait = !instaC.wait; dontSend = true; } else if (rg == "f") { if (rd[1]) { if (player.moveDir == rd[0]) { dontSend = true; } player.moveDir = rd[0]; } else { dontSend = true; } } if (!dontSend) { let rn = window.msgpack.encode([rg, rd]); this.nsend(rn); if (!firstSend.sec) { firstSend.sec = true; setTimeout(() => { firstSend.sec = false; secPacket = 0; }, secTime); } secPacket++; } } else { this.nsend(qy); } }; function packet(ro) { let rq = Array.prototype.slice.call(arguments, 1); let rr = window.msgpack.encode([ro, rq]); WS.send(rr); } function origPacket(rs) { let ru = Array.prototype.slice.call(arguments, 1); let rv = window.msgpack.encode([rs, ru]); WS.nsend(rv); } window.leave = function() { origPacket("kys", { "frvr is so bad": true, "sidney is too good": true, "dev are too weak": true }); }; let io = { send: packet }; function getMessage(rx) { let rz = new Uint8Array(rx.data); let sa = window.msgpack.decode(rz); let sc = sa[0]; rz = sa[1]; let sd = { A: setInitData, C: setupGame, D: addPlayer, E: removePlayer, a: updatePlayers, G: updateLeaderboard, H: loadGameObject, I: loadAI, J: animateAI, K: gatherAnimation, L: wiggleGameObject, M: shootTurret, N: updatePlayerValue, O: updateHealth, P: killPlayer, Q: killObject, R: killObjects, S: updateItemCounts, T: updateAge, U: updateUpgrades, V: updateItems, X: addProjectile, 2: allianceNotification, 3: setPlayerTeam, 4: setAlliancePlayers, 5: updateStoreItems, 6: receiveChat, 7: updateMinimap, 8: showText, 9: pingMap, 0: pingSocketResponse }; if (sc == "io-init") { socketID = rz[0]; } else if (sd[sc]) { sd[sc].apply(undefined, rz); } } Math.lerpAngle = function(se, sf, sg) { let sh = Math.abs(sf - se); if (sh > Math.PI) { if (se > sf) { sf += Math.PI * 2; } else { se += Math.PI * 2; } } let si = sf + (se - sf) * sg; if (si >= 0 && si <= Math.PI * 2) { return si; } return si % (Math.PI * 2); }; CanvasRenderingContext2D.prototype.roundRect = function(sj, sk, sl, sm, sn) { if (sl < sn * 2) { sn = sl / 2; } if (sm < sn * 2) { sn = sm / 2; } if (sn < 0) { sn = 0; } this.beginPath(); this.moveTo(sj + sn, sk); this.arcTo(sj + sl, sk, sj + sl, sk + sm, sn); this.arcTo(sj + sl, sk + sm, sj, sk + sm, sn); this.arcTo(sj, sk + sm, sj, sk, sn); this.arcTo(sj, sk, sj + sl, sk, sn); this.closePath(); return this; }; function resetMoveDir() { keys = {}; io.send("e"); } let allChats = []; let ticks = { tick: 0, delay: 0, time: [], manage: [] }; let ais = []; let players = []; let alliances = []; let alliancePlayers = []; let allianceNotifications = []; let gameObjects = []; let liztobj = []; let projectiles = []; let deadPlayers = []; let breakObjects = []; let player; let playerSID; let tmpObj; 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(sq) { return [0, 8].includes(sq.primaryIndex); }, safeSecondary: function(ss) { return [10, 11, 14].includes(ss.secondaryIndex); }, lastDir: 0, autoPush: false, pushData: {} }; function findID(st, su) { return st.find(sw => sw.id == su); } let adCard = getEl("adCard"); adCard.remove(); let promoImageHolder = getEl("promoImgHolder"); promoImageHolder.remove(); let chatButton = getEl("chatButton"); chatButton.remove(); let gameCanvas = getEl("gameCanvas"); let mainContext = gameCanvas.getContext("2d"); $("#mapDisplay").css("background", "url('https://wormax.org/chrome3kafa/moomooio-background.png')"); 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"); let diedText = getEl("diedText"); let screenWidth; let screenHeight; let maxScreenWidth = config.maxScreenWidth; let maxScreenHeight = config.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 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 pads = { placeSpawnPads: 0 }; let lastDir; let lastLeaderboardData = []; let inWindow = true; window.onblur = function() { inWindow = false; }; window.onfocus = function() { inWindow = true; if (player && player.alive) {} }; let ms = { avg: 0, max: 0, min: 0, delay: 0 }; function pingSocketResponse() { let sz = Math.ceil(window.pingTime * 2.6); let ta = window.pingTime; const tb = document.getElementById("pingDisplay"); tb.innerText = ""; if (ta > ms.max || isNaN(ms.max)) { ms.max = ta; } if (ta < ms.min || isNaN(ms.min)) { ms.min = ta; } } let placeVisible = []; let preplaceVisible = []; class Utils { constructor() { let td = Math.abs; let te = Math.cos; let tf = Math.sin; let tg = Math.pow; let th = Math.sqrt; let ti = Math.atan2; let tj = Math.PI; let tk = this; this.round = function(tl, tm) { return Math.round(tl * tm) / tm; }; this.toRad = function(tp) { return tp * (tj / 180); }; this.toAng = function(tq) { return tq / (tj / 180); }; this.randInt = function(tr, ts) { return Math.floor(Math.random() * (ts - tr + 1)) + tr; }; this.randFloat = function(tu, tv) { return Math.random() * (tv - tu + 1) + tu; }; this.lerp = function(tx, ty, tz) { return tx + (ty - tx) * tz; }; this.decel = function(ua, ub) { if (ua > 0) { ua = Math.max(0, ua - ub); } else if (ua < 0) { ua = Math.min(0, ua + ub); } return ua; }; this.getDistance = function(ud, ue, uf, ug) { return th((uf -= ud) * uf + (ug -= ue) * ug); }; this.getDist = function(uh, ui, uj, uk) { let ul = { x: uj == 0 ? uh.x : uj == 1 ? uh.x1 : uj == 2 ? uh.x2 : uj == 3 && uh.x3, y: uj == 0 ? uh.y : uj == 1 ? uh.y1 : uj == 2 ? uh.y2 : uj == 3 && uh.y3 }; let um = { x: uk == 0 ? ui.x : uk == 1 ? ui.x1 : uk == 2 ? ui.x2 : uk == 3 && ui.x3, y: uk == 0 ? ui.y : uk == 1 ? ui.y1 : uk == 2 ? ui.y2 : uk == 3 && ui.y3 }; return th((um.x -= ul.x) * um.x + (um.y -= ul.y) * um.y); }; this.getDirection = function(un, uo, up, uq) { return ti(uo - uq, un - up); }; this.getDirect = function(ur, us, ut, uu) { let uv = { x: ut == 0 ? ur.x : ut == 1 ? ur.x1 : ut == 2 ? ur.x2 : ut == 3 && ur.x3, y: ut == 0 ? ur.y : ut == 1 ? ur.y1 : ut == 2 ? ur.y2 : ut == 3 && ur.y3 }; let uw = { x: uu == 0 ? us.x : uu == 1 ? us.x1 : uu == 2 ? us.x2 : uu == 3 && us.x3, y: uu == 0 ? us.y : uu == 1 ? us.y1 : uu == 2 ? us.y2 : uu == 3 && us.y3 }; return ti(uv.y - uw.y, uv.x - uw.x); }; this.getAngleDist = function(ux, uy) { let uz = td(uy - ux) % (tj * 2); if (uz > tj) { return tj * 2 - uz; } else { return uz; } }; this.isNumber = function(va) { return typeof va == "number" && !isNaN(va) && isFinite(va); }; this.isString = function(vc) { return vc && typeof vc == "string"; }; this.kFormat = function(vf) { if (vf > 999) { return (vf / 1000).toFixed(1) + "k"; } else { return vf; } }; this.sFormat = function(vh) { let vj = [{ num: 1000, string: "k" }, { num: 1000000, string: "m" }, { num: 1000000000, string: "b" }, { num: 1000000000000, string: "q" }].reverse(); let vk = vj.find(vl => vh >= vl.num); if (!vk) { return vh; } return (vh / vk.num).toFixed(1) + vk.string; }; this.capitalizeFirst = function(vm) { return vm.charAt(0).toUpperCase() + vm.slice(1); }; this.fixTo = function(vo, vp) { return parseFloat(vo.toFixed(vp)); }; this.sortByPoints = function(vr, vs) { return parseFloat(vs.points) - parseFloat(vr.points); }; this.lineInRect = function(vu, vv, vx, vy, vz, wa, wb, wc) { let wf = vz; let wg = wb; if (vz > wb) { wf = wb; wg = vz; } if (wg > vx) { wg = vx; } if (wf < vu) { wf = vu; } if (wf > wg) { return false; } let wh = wa; let wi = wc; let wj = wb - vz; if (Math.abs(wj) > 1e-7) { let wk = (wc - wa) / wj; let wl = wa - wk * vz; wh = wk * wf + wl; wi = wk * wg + wl; } if (wh > wi) { let wm = wi; wi = wh; wh = wm; } if (wi > vy) { wi = vy; } if (wh < vv) { wh = vv; } if (wh > wi) { return false; } return true; }; this.containsPoint = function(wn, wo, wp) { let wr = wn.getBoundingClientRect(); let wt = wr.left + window.scrollX; let wu = wr.top + window.scrollY; let wv = wr.width; let ww = wr.height; let wx = wo > wt && wo < wt + wv; let wy = wp > wu && wp < wu + ww; return wx && wy; }; this.mousifyTouchEvent = function(wz) { let xb = wz.changedTouches[0]; wz.screenX = xb.screenX; wz.screenY = xb.screenY; wz.clientX = xb.clientX; wz.clientY = xb.clientY; wz.pageX = xb.pageX; wz.pageY = xb.pageY; }; this.hookTouchEvents = function(xc, xd) { let xf = !xd; let xg = false; let xh = false; xc.addEventListener("touchstart", this.checkTrusted(xi), xh); xc.addEventListener("touchmove", this.checkTrusted(xj), xh); xc.addEventListener("touchend", this.checkTrusted(xk), xh); xc.addEventListener("touchcancel", this.checkTrusted(xk), xh); xc.addEventListener("touchleave", this.checkTrusted(xk), xh); function xi(xl) { tk.mousifyTouchEvent(xl); window.setUsingTouch(true); if (xf) { xl.preventDefault(); xl.stopPropagation(); } if (xc.onmouseover) { xc.onmouseover(xl); } xg = true; } function xj(xn) { tk.mousifyTouchEvent(xn); window.setUsingTouch(true); if (xf) { xn.preventDefault(); xn.stopPropagation(); } if (tk.containsPoint(xc, xn.pageX, xn.pageY)) { if (!xg) { if (xc.onmouseover) { xc.onmouseover(xn); } xg = true; } } else if (xg) { if (xc.onmouseout) { xc.onmouseout(xn); } xg = false; } } function xk(xq) { tk.mousifyTouchEvent(xq); window.setUsingTouch(true); if (xf) { xq.preventDefault(); xq.stopPropagation(); } if (xg) { if (xc.onclick) { xc.onclick(xq); } if (xc.onmouseout) { xc.onmouseout(xq); } xg = false; } } }; this.removeAllChildren = function(xs) { while (xs.hasChildNodes()) { xs.removeChild(xs.lastChild); } }; this.generateElement = function(xu) { let xw = document.createElement(xu.tag || "div"); function xx(xy, xz) { if (xu[xy]) { xw[xz] = xu[xy]; } } xx("text", "textContent"); xx("html", "innerHTML"); xx("class", "className"); for (let ya in xu) { switch (ya) { case "tag": case "text": case "html": case "class": case "style": case "hookTouch": case "parent": case "children": continue; default: break; } xw[ya] = xu[ya]; } if (xw.onclick) { xw.onclick = this.checkTrusted(xw.onclick); } if (xw.onmouseover) { xw.onmouseover = this.checkTrusted(xw.onmouseover); } if (xw.onmouseout) { xw.onmouseout = this.checkTrusted(xw.onmouseout); } if (xu.style) { xw.style.cssText = xu.style; } if (xu.hookTouch) { this.hookTouchEvents(xw); } if (xu.parent) { xu.parent.appendChild(xw); } if (xu.children) { for (let yb = 0; yb < xu.children.length; yb++) { xw.appendChild(xu.children[yb]); } } return xw; }; this.checkTrusted = function(yc) { return function(yd) { if (yd && yd instanceof Event && (yd && typeof yd.isTrusted == "boolean" ? yd.isTrusted : true)) { yc(yd); } else {} }; }; this.randomString = function(yf) { let yh = ""; let yi = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (let yj = 0; yj < yf; yj++) { yh += yi.charAt(Math.floor(Math.random() * yi.length)); } return yh; }; this.countInArray = function(yk, yl) { let yn = 0; for (let yo = 0; yo < yk.length; yo++) { if (yk[yo] === yl) { yn++; } } return yn; }; this.hexToRgb = function(yp) { return yp.slice(1).match(/.{1,2}/g).map(yr => parseInt(yr, 16)); }; this.getRgb = function(ys, yt, yu) { return [ys / 255, yt / 255, yu / 255].join(", "); }; } }; class Animtext { constructor() { this.init = function(yx, yy, yz, za, zb, zc, ze) { this.x = yx; this.y = yy; this.color = ze; this.scale = yz; this.startScale = this.scale; this.maxScale = yz * 1.5; this.scaleSpeed = 0.7; this.speed = za; this.life = zb; this.text = zc; }; this.update = function(zg) { if (this.life) { this.life -= zg; this.y -= this.speed * zg; this.scale += this.scaleSpeed * zg; 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; } } }; this.render = function(zi, zj, zk) { zi.fillStyle = this.color; if (getEl("font").checked) { zi.font = this.scale + "px Lilita One"; } else { zi.font = this.scale + "px Hammersmith One"; } zi.fillText(this.text, this.x - zj, this.y - zk); }; } }; class Textmanager { constructor() { this.texts = []; this.stack = []; this.update = function(zn, zo, zp, zq) { zo.textBaseline = "middle"; zo.textAlign = "center"; for (let zs = 0; zs < this.texts.length; ++zs) { if (this.texts[zs].life) { this.texts[zs].update(zn); this.texts[zs].render(zo, zp, zq); } } }; this.showText = function(zt, zu, zv, zw, zx, zy, zz) { let aac; for (let aad = 0; aad < this.texts.length; ++aad) { if (!this.texts[aad].life) { aac = this.texts[aad]; break; } } if (!aac) { aac = new Animtext(); this.texts.push(aac); } aac.init(zt, zu, zv, zw, zx, zy, zz); }; } } class GameObject { constructor(aae) { this.sid = aae; this.init = function(aag, aah, aai, aaj, aak, aal, aam) { aal = aal || {}; this.sentTo = {}; this.gridLocations = []; this.active = true; this.render = true; this.doUpdate = aal.doUpdate; this.x = aag; this.y = aah; this.dir = aai + Math.PI; this.lastDir = aai; this.xWiggle = 0; this.yWiggle = 0; this.visScale = aaj; this.scale = aaj; this.type = aak; this.id = aal.id; this.owner = aam; this.name = aal.name; this.isItem = this.id != undefined; this.group = aal.group; this.maxHealth = aal.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 = aal.colDiv || 1; this.blocker = aal.blocker; this.ignoreCollision = aal.ignoreCollision; this.dontGather = aal.dontGather; this.hideFromEnemy = aal.hideFromEnemy; this.friction = aal.friction; this.projDmg = aal.projDmg; this.dmg = aal.dmg; this.pDmg = aal.pDmg; this.pps = aal.pps; this.zIndex = aal.zIndex || 0; this.turnSpeed = aal.turnSpeed; this.req = aal.req; this.trap = aal.trap; this.healCol = aal.healCol; this.teleport = aal.teleport; this.boostSpeed = aal.boostSpeed; this.projectile = aal.projectile; this.shootRange = aal.shootRange; this.shootRate = aal.shootRate; this.shootCount = this.shootRate; this.spawnPoint = aal.spawnPoint; this.onNear = 0; this.breakObj = false; this.alpha = aal.alpha || 1; this.maxAlpha = aal.alpha || 1; this.damaged = 0; }; this.changeHealth = function(aao, aap) { this.health += aao; return this.health <= 0; }; this.getScale = function(aaq, aar) { aaq = aaq || 1; return this.scale * (this.isItem || this.type == 2 || this.type == 3 || this.type == 4 ? 1 : aaq * 0.6) * (aar ? 1 : this.colDiv); }; this.visibleToPlayer = function(aat) { return !this.hideFromEnemy || this.owner && (this.owner == aat || this.owner.team && aat.team == this.owner.team); }; this.update = function(aav) { if (this.health != this.healthMov) { if (this.health < this.healthMov) { this.healthMov -= 1.9; } else { this.healthMov += 1.9; } if (Math.abs(this.health - this.healthMov) < 1.9) { this.healthMov = this.health; } }; if (this.active) { if (this.xWiggle) { this.xWiggle *= Math.pow(0.99, aav); } if (this.yWiggle) { this.yWiggle *= Math.pow(0.99, aav); } if (config.anotherVisualTurn) { let aax = UTILS.getAngleDist(this.lastDir, this.dir); if (aax > 0.01) { this.dir += aax / 5; } else { this.dir = this.lastDir; } } else if (this.turnSpeed) { this.dir += this.turnSpeed * aav; } } else if (this.alive) { this.alpha -= aav / (200 / this.maxAlpha); this.visScale += aav / (this.scale / 2.5); if (this.alpha <= 0) { this.alpha = 0; this.alive = false; } } }; this.isTeamObject = function(aay) { if (this.owner == null) { return true; } else { return this.owner && aay.sid == this.owner.sid || aay.findAllianceBySid(this.owner.sid); } }; } } class Items { constructor() { 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 }]; 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 }]; 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 }]; this.list = [{ group: this.groups[0], name: "apple", desc: "restores 20 health when consumed", req: ["food", 10], consume: function(abb) { return abb.changeHealth(20, abb); }, 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(abd) { return abd.changeHealth(40, abd); }, 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(abf) { if (abf.changeHealth(30, abf) || abf.health < 100) { abf.dmgOverTime.dmg = -10; abf.dmgOverTime.doer = abf; abf.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 }, { 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.001, 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, 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, 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, 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 }]; this.checkItem = { index: function(abh, abi) { if ([0, 1, 2].includes(abh)) { return 0; } else if ([3, 4, 5].includes(abh)) { return 1; } else if ([6, 7, 8, 9].includes(abh)) { return 2; } else if ([10, 11, 12].includes(abh)) { return 3; } else if ([13, 14].includes(abh)) { return 5; } else if ([15, 16].includes(abh)) { return 4; } else if ([17, 18, 19, 21, 22].includes(abh)) { if ([13, 14].includes(abi)) { return 6; } else { return 5; } } else if (abh == 20) { if ([13, 14].includes(abi)) { return 7; } else { return 6; } } else { return undefined; } } }; for (let abk = 0; abk < this.list.length; ++abk) { this.list[abk].id = abk; if (this.list[abk].pre) { this.list[abk].pre = abk - this.list[abk].pre; } } if (typeof window !== "undefined") { function abl(abm) { for (let abo = abm.length - 1; abo > 0; abo--) { const abp = Math.floor(Math.random() * (abo + 1)); [abm[abo], abm[abp]] = [abm[abp], abm[abo]]; } return abm; } } } } class Objectmanager { constructor(abq, abr, abt, abu, abv, abw) { let aby = Math.floor; let abz = Math.abs; let aca = Math.cos; let acb = Math.sin; let acd = Math.pow; let ace = Math.sqrt; this.ignoreAdd = false; this.hitObj = []; this.disableObj = function(acf) { acf.active = false; }; let ach; this.add = function(aci, acj, ack, acl, acm, acn, aco, acp, acq) { ach = gameObjects.find(acs => acs.sid == aci); if (!ach) { ach = gameObjects.find(act => !act.active); if (!ach) { ach = new abq(aci); gameObjects.push(ach); } } if (acp) { ach.sid = aci; } ach.init(acj, ack, acl, acm, acn, aco, acq); }; this.disableBySid = function(acu) { let acw = gameObjects.find(acs => acs.sid == acu); if (acw) { this.disableObj(acw); } }; this.removeAllItems = function(acx, acy) { gameObjects.filter(ada => ada.active && ada.owner && ada.owner.sid == acx).forEach(adb => this.disableObj(adb)); }; this.checkItemLocation = function(adc, ade, adf, adg, adh, adi, adj) { let adl = abr.find(adm => adm.active && abt.getDistance(adc, ade, adm.x, adm.y) < adf + (adm.blocker ? adm.blocker : adm.getScale(adg, adm.isItem))); if (adl) { return false; } if (!adi && adh != 18 && ade >= abu.mapScale / 2 - abu.riverWidth / 2 && ade <= abu.mapScale / 2 + abu.riverWidth / 2) { return false; } return true; }; this.customCheckItemLocation = (adn, ado, adp, adq, adr, ads, adt, adu, adv, adw, adx) => { let adz = adv.find(aea => aea.active && aea.x !== adu.x && aea.y !== adu.y && aea.id !== adu.id && adw.getDistance(adn, ado, aea.x, aea.y) < adp + (aea.blocker ? aea.blocker : aea.getScale(adq, aea.isItem))); if (adz) { return false; } if (!ads && adr != 18 && ado >= adx.mapScale / 2 - adx.riverWidth / 2 && ado <= adx.mapScale / 2 + adx.riverWidth / 2) { return false; } return true; }; } } class Projectile { constructor(aeb, aec, aed, aee, aef, aeg, aeh) { this.init = function(aei, aej, aek, ael, aem, aen, aeo, aep, aeq) { this.active = true; this.tickActive = true; this.indx = aei; this.x = aej; this.y = aek; this.x2 = aej; this.y2 = aek; this.dir = ael; this.skipMov = true; this.speed = aem; this.dmg = aen; this.scale = aep; this.range = aeo; this.r2 = aeo; this.owner = aeq; }; this.update = function(aes) { if (this.active) { let aeu = this.speed * aes; if (!this.skipMov) { this.x += aeu * Math.cos(this.dir); this.y += aeu * Math.sin(this.dir); this.range -= aeu; if (this.range <= 0) { this.x += this.range * Math.cos(this.dir); this.y += this.range * Math.sin(this.dir); aeu = 1; this.range = 0; this.active = false; } } else { this.skipMov = false; } } }; this.tickUpdate = function(aev) { if (this.tickActive) { let aex = this.speed * aev; if (!this.skipMov) { this.x2 += aex * Math.cos(this.dir); this.y2 += aex * Math.sin(this.dir); this.r2 -= aex; if (this.r2 <= 0) { this.x2 += this.r2 * Math.cos(this.dir); this.y2 += this.r2 * Math.sin(this.dir); aex = 1; this.r2 = 0; this.tickActive = false; } } else { this.skipMov = false; } } }; } }; class Store { constructor() { 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: "Anti Insta", 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 }]; 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(aez, afa, afb, afc, afd, afe, aff, afg, afh) { this.addProjectile = function(afj, afk, afl, afm, afn, afo, afp, afq, afr, afs) { let afu = afe.projectiles[afo]; let afv; for (let afw = 0; afw < afa.length; ++afw) { if (!afa[afw].active) { afv = afa[afw]; break; } } if (!afv) { afv = new aez(afb, afc, afd, afe, aff, afg, afh); afv.sid = afa.length; afa.push(afv); } afv.init(afo, afj, afk, afl, afn, afu.dmg, afm, afu.scale, afp); afv.ignoreObj = afq; afv.layer = afr || afu.layer; afv.inWindow = afs; afv.src = afu.src; return afv; }; } }; class AiManager { constructor(afx, afy, afz, aga, agb, agc, agd, agf, agg) { 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, turnSpeed: 0, scale: 70, spriteMlt: 1 }, { 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] }]; this.spawn = function(agi, agj, agk, agl) { let agn = afx.find(ago => !ago.active); if (!agn) { agn = new afy(afx.length, agb, afz, aga, agd, agc, agf, agg); afx.push(agn); } agn.init(agi, agj, agk, agl, this.aiTypes[agl]); return agn; }; } }; class AI { constructor(agp, agq, agr, ags, agt, agu, agv, agw) { this.sid = agp; this.isAI = true; this.nameIndex = agt.randInt(0, agu.cowNames.length - 1); this.init = function(agy, agz, aha, ahb, ahc) { this.x = agy; this.y = agz; this.startX = ahc.fixedSpawn ? agy : null; this.startY = ahc.fixedSpawn ? agz : null; this.xVel = 0; this.yVel = 0; this.zIndex = 0; this.dir = aha; this.dirPlus = 0; this.showName = "aaa"; this.index = ahb; this.src = ahc.src; if (ahc.name) { this.name = ahc.name; } this.weightM = ahc.weightM; this.speed = ahc.speed; this.killScore = ahc.killScore; this.turnSpeed = ahc.turnSpeed; this.scale = ahc.scale; this.maxHealth = ahc.health; this.leapForce = ahc.leapForce; this.health = this.maxHealth; this.chargePlayer = ahc.chargePlayer; this.viewRange = ahc.viewRange; this.drop = ahc.drop; this.dmg = ahc.dmg; this.hostile = ahc.hostile; this.dontRun = ahc.dontRun; this.hitRange = ahc.hitRange; this.hitDelay = ahc.hitDelay; this.hitScare = ahc.hitScare; this.spriteMlt = ahc.spriteMlt; this.nameScale = ahc.nameScale; this.colDmg = ahc.colDmg; this.noTrap = ahc.noTrap; this.spawnDelay = ahc.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 ahe = 0; let ahf = 0; this.animate = function(ahg) { if (this.animTime > 0) { this.animTime -= ahg; if (this.animTime <= 0) { this.animTime = 0; this.dirPlus = 0; ahe = 0; ahf = 0; } else if (ahf == 0) { ahe += ahg / (this.animSpeed * agu.hitReturnRatio); this.dirPlus = agt.lerp(0, this.targetAngle, Math.min(1, ahe)); if (ahe >= 1) { ahe = 1; ahf = 1; } } else { ahe -= ahg / (this.animSpeed * (1 - agu.hitReturnRatio)); this.dirPlus = agt.lerp(0, this.targetAngle, Math.max(0, ahe)); } } }; this.startAnim = function() { this.animTime = this.animSpeed = 600; this.targetAngle = Math.PI * 0.8; ahe = 0; ahf = 0; }; } }; class addCh { constructor(ahj, ahk, ahl, ahm) { this.x = ahj; this.y = ahk; this.alpha = 0; this.active = true; this.alive = false; this.chat = ahl; this.owner = ahm; } }; class DeadPlayer { constructor(aho, ahp, ahq, ahr, ahs, aht, ahu, ahv, ahw) { this.x = aho; this.y = ahp; this.lastDir = ahq; this.dir = ahq + Math.PI; this.buildIndex = ahr; this.weaponIndex = ahs; this.weaponVariant = aht; this.skinColor = ahu; this.scale = ahv; this.visScale = 0; this.name = ahw; this.alpha = 1; this.active = true; this.animate = function(ahy) { let aia = UTILS.getAngleDist(this.lastDir, this.dir); if (aia > 0.01) { this.dir += aia / 20; } else { this.dir = this.lastDir; } if (this.visScale < this.scale) { this.visScale += ahy / (this.scale / 2); if (this.visScale >= this.scale) { this.visScale = this.scale; } } this.alpha -= ahy / 30000; if (this.alpha <= 0) { this.alpha = 0; this.active = false; } }; } }; class Player { constructor(aib, aic, aid, aie, aif, aig, aih, aii, aij, aik, ail, ain, aio, aip) { this.id = aib; this.sid = aic; 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.showName = "NOOO"; this.tails = {}; for (let air = 0; air < ail.length; ++air) { if (ail[air].price <= 0) { this.tails[ail[air].id] = 1; } } this.skins = {}; for (let ait = 0; ait < aik.length; ++ait) { if (aik[ait].price <= 0) { this.skins[aik[ait].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; this.circle = false; this.circleRad = 200; this.circleRadSpd = 0.1; this.cAngle = 0; this.spawn = function(aiu) { this.attacked = false; this.timeDamaged = 0; this.timeHealed = 0; this.pinge = 0; this.millPlace = "NOOO"; this.lastshamecount = 0; 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.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 = aid.playerScale; this.speed = aid.playerSpeed; this.resetMoveDir(); this.resetResources(aiu); 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; }; this.resetMoveDir = function() { this.moveDir = undefined; }; this.resetResources = function(aix) { for (let aiz = 0; aiz < aid.resourceTypes.length; ++aiz) { this[aid.resourceTypes[aiz]] = aix ? 100 : 0; } }; this.getItemType = function(aja) { let ajc = this.items.findIndex(ajd => ajd == aja); if (ajc != -1) { return ajc; } else { return aij.checkItem.index(aja, this.items); } }; this.setData = function(aje) { this.id = aje[0]; this.sid = aje[1]; this.name = aje[2]; this.x = aje[3]; this.y = aje[4]; this.dir = aje[5]; this.health = aje[6]; this.maxHealth = aje[7]; this.scale = aje[8]; this.skinColor = aje[9]; }; this.updateTimer = function() { this.bullTimer -= 1; if (this.bullTimer <= 0) { this.setBullTick = false; this.bullTick = game.tick - 1; this.bullTimer = aid.serverUpdateRate; } this.poisonTimer -= 1; if (this.poisonTimer <= 0) { this.setPoisonTick = false; this.poisonTick = game.tick - 1; this.poisonTimer = aid.serverUpdateRate; } }; this.update = function(ajh) { if (this.sid == playerSID) {} if (this.active) { let ajj = { skin: findID(aik, this.skinIndex), tail: findID(ail, this.tailIndex) }; let ajk = (this.buildIndex >= 0 ? 0.5 : 1) * (aij.weapons[this.weaponIndex].spdMult || 1) * (ajj.skin ? ajj.skin.spdMult || 1 : 1) * (ajj.tail ? ajj.tail.spdMult || 1 : 1) * (this.y <= aid.snowBiomeTop ? ajj.skin && ajj.skin.coldM ? 1 : aid.snowSpeed : 1) * this.slowMult; this.maxSpeed = ajk; } }; let ajl = 0; let ajm = 0; this.animate = function(ajn) { if (this.animTime > 0) { this.animTime -= ajn; if (this.animTime <= 0) { this.animTime = 0; this.dirPlus = 0; ajl = 0; ajm = 0; } else if (ajm == 0) { ajl += ajn / (this.animSpeed * aid.hitReturnRatio); this.dirPlus = aie.lerp(0, this.targetAngle, Math.min(1, ajl)); if (ajl >= 1) { ajl = 1; ajm = 1; } } else { ajl -= ajn / (this.animSpeed * (1 - aid.hitReturnRatio)); this.dirPlus = aie.lerp(0, this.targetAngle, Math.max(0, ajl)); } } }; this.startAnim = function(ajp, ajq) { this.animTime = this.animSpeed = aij.weapons[ajq].speed; this.targetAngle = ajp ? -aid.hitAngle : -Math.PI; ajl = 0; ajm = 0; }; this.canSee = function(ajs) { if (!ajs) { return false; } let aju = Math.abs(ajs.x - this.x) - ajs.scale; let ajv = Math.abs(ajs.y - this.y) - ajs.scale; return aju <= aid.maxScreenWidth / 2 * 1.3 && ajv <= aid.maxScreenHeight / 2 * 1.3; }; this.judgeShame = function() { this.lastshamecount = this.shameCount; if (this.oldHealth < this.health) { if (this.hitTime) { let ajx = game.tick - this.hitTime; this.lastHit = game.tick; this.hitTime = 0; if (ajx < 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 ajz = setInterval(() => { this.shameTimer--; if (this.shameTimer <= 0) { clearInterval(ajz); } }, 1000); }; this.isTeam = function(akb) { return this == akb || this.team && this.team == akb.team; }; this.findAllianceBySid = function(akd) { if (this.team) { return alliancePlayers.find(akf => akf === akd); } else { return null; } }; this.checkCanInsta = function(akg) { let akj = 0; if (this.alive && inGame) { let akk = { weapon: this.weapons[0], variant: this.primaryVariant, dmg: this.weapons[0] == undefined ? 0 : aij.weapons[this.weapons[0]].dmg }; let akl = { weapon: this.weapons[1], variant: this.secondaryVariant, dmg: this.weapons[1] == undefined ? 0 : aij.weapons[this.weapons[1]].Pdmg }; let akm = this.skins[7] && !akg ? 1.5 : 1; let akn = akk.variant != undefined ? aid.weaponVariants[akk.variant].val : 1; if (akk.weapon != undefined && this.reloads[akk.weapon] == 0) { akj += akk.dmg * akn * akm; } if (akl.weapon != undefined && this.reloads[akl.weapon] == 0) { akj += akl.dmg; } if (this.skins[53] && this.reloads[53] <= (player.weapons[1] == 10 ? 0 : game.tickRate) && near.skinIndex != 22) { akj += 25; } akj *= near.skinIndex == 6 ? 0.75 : 1; return akj; } return 0; }; 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.reloads[this.weaponIndex] <= 111.11111111111111) { let akp = this.weaponIndex; let akq = liztobj.filter(akr => (akr.active || akr.alive) && akr.health < akr.maxHealth && akr.group !== undefined && aie.getDist(akr, player, 0, 2) <= aij.weapons[player.weaponIndex].range + akr.scale); for (let aks = 0; aks < akq.length; aks++) { let akt = akq[aks]; let aku = aij.weapons[akp].dmg * aid.weaponVariants[tmpObj[(akp < 9 ? "prima" : "seconda") + "ryVariant"]].val * (aij.weapons[akp].sDmg || 1) * 3.3; let akv = aij.weapons[akp].dmg * aid.weaponVariants[tmpObj[(akp < 9 ? "prima" : "seconda") + "ryVariant"]].val * (aij.weapons[akp].sDmg || 1); if (akt.health - akv <= 0 && near.length) { place(near.dist2 < near.scale * 1.8 + 50 ? 4 : 2, caf(akt, player) + Math.PI); } } } if (this.gathering || this.shooting[1]) { if (this.gathering) { this.gathering = 0; this.reloads[this.gatherIndex] = aij.weapons[this.gatherIndex].speed * (this.skinIndex == 20 ? 0.78 : 1); this.attacked = true; } if (this.shooting[1]) { this.shooting[1] = 0; this.reloads[this.shootIndex] = aij.weapons[this.shootIndex].speed * (this.skinIndex == 20 ? 0.78 : 1); this.attacked = true; } } 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] - 110); if (this == player) { if (getEl("weaponGrind").checked) { for (let akw = 0; akw < Math.PI * 2; akw += Math.PI / 2) { checkPlace(player.getItemType(22), akw); } } } if (this.reloads[this.primaryIndex] == 0 && this.reloads[this.weaponIndex] == 0) { this.antiBull++; game.tickBase(() => { this.antiBull = 0; }, 1); } } } } }; this.addDamageThreat = function(aky) { let ala = { weapon: this.primaryIndex, variant: this.primaryVariant }; ala.dmg = ala.weapon == undefined ? 45 : aij.weapons[ala.weapon].dmg; let alb = { weapon: this.secondaryIndex, variant: this.secondaryVariant }; alb.dmg = alb.weapon == undefined ? 35 : aij.weapons[alb.weapon].Pdmg; let alc = 1.5; let ald = ala.variant != undefined ? aid.weaponVariants[ala.variant].val : 1.18; let ale = alb.variant != undefined ? [9, 12, 17, 15].includes(alb.weapon) ? 1 : aid.weaponVariants[alb.variant].val : 1.18; if (ala.weapon == undefined ? true : this.reloads[ala.weapon] == 0) { this.damageThreat += ala.dmg * ald * alc; } if (alb.weapon == undefined ? true : this.reloads[alb.weapon] == 0) { this.damageThreat += alb.dmg * ale; } if (this.reloads[53] <= game.tickRate) { this.damageThreat += 25; } this.damageThreat *= aky.skinIndex == 6 ? 0.75 : 1; if (!this.isTeam(aky)) { if (this.dist2 <= 300) { aky.damageThreat += this.damageThreat; } } }; this.addDamageProbability = function(alf) { let alh = { weapon: this.primaryIndex, variant: this.primaryVariant }; alh.dmg = alh.weapon == undefined ? 45 : aij.weapons[alh.weapon].dmg; let ali = { weapon: this.secondaryIndex, variant: this.secondaryVariant }; ali.dmg = ali.weapon == undefined ? 50 : aij.weapons[ali.weapon].Pdmg; let alj = 1.5; let alk = alh.variant != undefined ? aid.weaponVariants[alh.variant].val : 1.18; let alm = ali.variant != undefined ? [9, 12, 17, 15].includes(ali.weapon) ? 1 : aid.weaponVariants[ali.variant].val : 1.18; if (alh.weapon == undefined ? true : this.reloads[alh.weapon] == 0) { this.damageProbably += alh.dmg * alk * alj * 0.75; } if (ali.weapon == undefined ? true : this.reloads[ali.weapon] == 0) { this.damageProbably += ali.dmg * alm; } this.damageProbably *= 0.75; if (!this.isTeam(alf)) { if (this.dist2 <= 300) { alf.damageProbably += this.damageProbably; } } }; } }; function sendUpgrade(aln) { player.reloads[aln] = 0; packet("H", aln); } function storeEquip(alp, alq) { packet("c", 0, alp, alq); } function storeBuy(alr, als) { packet("c", 1, alr, als); } function getVelocity(alt) { let alv = caf({ x: alt.olderX, y: alt.olderY }, alt); let alw = cdf({ x: alt.olderX, y: alt.olderY }, alt); let alx = alt.x + Math.cos(alv) * 4 * window.pingTime / 111.1111; let aly = alt.y + Math.sin(alv) * 4 * window.pingTime / 111.1111; return [alw, alx, aly, alv]; } function buyEquip(alz, ama) { let amc = player.skins[6] ? 6 : 0; if (player.alive && inGame) { if (ama == 0) { if (player.skins[alz]) { if (player.latestSkin != alz) { packet("c", 0, alz, 0); } } else if (getEl("autoBuyEquip").checked) { let amd = findID(hats, alz); if (amd) { if (player.points >= amd.price) { packet("c", 1, alz, 0); packet("c", 0, alz, 0); } else if (player.latestSkin != amc) { packet("c", 0, amc, 0); } } else if (player.latestSkin != amc) { packet("c", 0, amc, 0); } } else if (player.latestSkin != amc) { packet("c", 0, amc, 0); } } else if (ama == 1) { if (useWasd && alz != 11 && alz != 0) { if (player.latestTail != 0) { packet("c", 0, 0, 1); } return; } if (player.tails[alz]) { if (player.latestTail != alz) { packet("c", 0, alz, 1); } } else if (getEl("autoBuyEquip").checked) { let ame = findID(accessories, alz); if (ame) { if (player.points >= ame.price) { packet("c", 1, alz, 1); packet("c", 0, alz, 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(amf, amg) { packet("z", amf, amg); } function selectWeapon(amh, ami) { if (!ami) { player.weaponCode = amh; } packet("z", amh, 1); } function sendAutoGather() { packet("K", 1, 1); } function sendAtck(amj, amk) { packet("F", amj, amk, 1); } let placePacketLimiter = false; let placementsPerTick = 0; let phantom = []; function place(aml, amm, amn) { try { if (aml == undefined) { return; } let amp = items.list[player.items[aml]]; let amq = player.scale + amp.scale + (amp.placeOffset || 0); let amr = player.x2 + amq * Math.cos(amm); let ams = player.y2 + amq * Math.sin(amm); if (player.alive && inGame && player.itemCounts[amp.group.id] == undefined ? true : player.itemCounts[amp.group.id] < (config.isSandbox ? 299 : amp.group.limit ? amp.group.limit : 99)) { selectToBuild(player.items[aml]); sendAtck(1, amm); selectWeapon(player.weaponCode, 1); if (amn && getEl("placeVis").checked) { placeVisible.push({ x: amr, y: ams, name: amp.name, scale: amp.scale, dir: amm }); game.tickBase(() => { placeVisible.shift(); }, 1); } } } catch (amt) {} } function checkPlace(amu, amv) { try { if (amu == undefined) { return; } let amx = items.list[player.items[amu]]; let amy = player.scale + amx.scale + (amx.placeOffset || 0); let amz = player.x2 + amy * Math.cos(amv); let ana = player.y2 + amy * Math.sin(amv); if (objectManager.checkItemLocation(amz, ana, amx.scale, 0.6, amx.id, false, player)) { place(amu, amv, 1); } } catch (anb) {} } function soldierMult() { if (player.latestSkin == 6) { return 0.75; } else { return 1; } } function healthBased() { if (player.health == 100) { return 0; } if (player.skinIndex != 45 && player.skinIndex != 56) { return Math.ceil((100 - player.health) / items.list[player.items[0]].healing); } return 0; } function insat1() { my.autoAim = true; selectWeapon(player.weapons[0]); buyEquip(7, 0); buyEquip(0, 1); sendAutoGather(); setTimeout(() => { selectWeapon(player.weapons[1]); buyEquip(53, 0); setTimeout(() => { sendAutoGather(); my.autoAim = false; }, 180); }, 100); } function getAttacker(ani) { let anj = enemy.filter(ank => { let anl = { three: ank.attacked }; return anl.three; }); return anj; } function healer() { for (let anm = 0; anm < healthBased(); anm++) { place(0, getAttackDir()); } } function healer33() { for (let ann = 0; ann < healthBased(); ann++) { place(0, getAttackDir()); } } function healer1() { place(0, getAttackDir()); return Math.ceil((100 - player.health) / items.list[player.items[0]].healing); } function noshameheal() { place(0, getAttackDir()); if (player.shameCount >= 5) { place(0, getAttackDir()); healer33(); } else if (player.shameCount <= 4 && player.skinIndex != 6 && player.skinIndex != 22) { healer33(); buyEquip(6, 0); } else if (player.shameCount >= 5 && player.skinIndex != 6 && player.skinIndex != 22) { return Math.ceil((100 - player.health) / items.list[player.items[0]].healing); healer33(); } } const placedSpikePositions = new Set(); const placedTrapPositions = new Set(); function isPositionValid(anq) { const ans = player.x2; const ant = player.y2; const anu = Math.hypot(anq[0] - ans, anq[1] - ant); return anu > 35; } function findAllianceBySid(anv) { if (player.team) { return alliancePlayers.find(anx => anx === anv); } else { return null; } } function calculatePossibleTrapPositions(any, anz, aoa) { const aoc = []; const aod = 16; for (let aoe = 0; aoe < aod; aoe++) { const aof = Math.PI * 2 * aoe / aod; const aog = any + aoa * Math.cos(aof); const aoh = anz + aoa * Math.sin(aof); const aoi = [aog, aoh]; if (!aoc.some(aoj => isPositionTooClose(aoi, aoj))) { aoc.push(aoi); } } return aoc; } function isPositionTooClose(aok, aol, aom = 50) { const aoo = Math.hypot(aok[0] - aol[0], aok[1] - aol[1]); return aoo < aom; } function applCxC(aop) { if (player.health == 100) { return 0; } if (player.skinIndex != 45 && player.skinIndex != 56) { return Math.ceil(aop / items.list[player.items[0]].healing); } return 0; } function healthBased() { if (player.health == 100) { return 0; } if (player.skinIndex != 45 && player.skinIndex != 56) { return Math.ceil((100 - player.health) / items.list[player.items[0]].healing); } return 0; } function calcDmg(aos) { if (aos * player.skinIndex == 6) { return 0.75; } else { return 1; } } function antirev() { if (tmpObj.isPlayer) { for (let aou = 0; aou < healthBased(); aou++) { place(0, getAttackDir()); if (player.health == 100 && player.shameCount < 6 && player.skinIndex == 6) { place(0, getAttackDir()); console.log("AAAAAAAAAAAAA"); } else if (player.health == 100 && player.shameCount < 6 && player.skinIndex != 6) { place(0, getAttackDir()); console.log("AAAAAAAAAAAAA"); } else if (player.health == 96 && player.shameCount < 5 && player.skinIndex == 6) { place(0, getAttackDir()); setTimeout(() => { place(0, getAttackDir()); }, 5); } else if (player.health == 25 && player.shameCount < 5 && player.skinIndex == 6) { place(0, getAttackDir()); setTimeout(() => { place(0, getAttackDir()); }, 5); } else if (player.health == 10 && player.shameCount < 6 && player.skinIndex == 6) { place(0, getAttackDir()); setTimeout(() => { place(0, getAttackDir()); }, 5); } else if (player.health == 50 && player.shameCount < 7 && player.skinIndex != 6) { place(0, getAttackDir()); setTimeout(() => { place(0, getAttackDir()); }, 5); } if (player.shameCount < 6) { setTimeout(() => { place(0, getAttackDir()); }, 30); } } } } let slowHeal = function(aov) { setTimeout(() => { healer(); }, 25); }; let isHealing = false; let delay = 20; function uziheal() { if (!isHealing && player.health < 100) { isHealing = true; if (player.health < 70) { place(0, getAttackDir()); healer(); isHealing = false; } else { const aox = 5; const aoy = Math.ceil((100 - player.health) / 25); let aoz = 0; function apa() { if (aoz < aoy) { setTimeout(() => { place(0, getAttackDir()); aoz++; apa(); }, aox); } else { isHealing = false; } } apa(); } } } function predictHeal() {} function antiSyncHealing(apb) { my.antiSync = true; let apd = setInterval(() => { if (player.shameCount < 6) { place(0, getAttackDir()); } }, 75); setTimeout(() => { clearInterval(apd); setTimeout(() => { my.antiSync = false; }, game.tickRate); }, game.tickRate); } function biomeGear(apg, aph) { if (player.moveDir == undefined && near.dist2 > 300) { buyEquip(22, 0); } if (player.y2 >= config.mapScale / 2 - config.riverWidth / 2 && player.y2 <= config.mapScale / 2 + config.riverWidth / 2) { if (aph) { return 31; } buyEquip(31, 0); } else if (player.y2 <= config.snowBiomeTop) { if (aph) { if (enemy && near.dist2 <= 300) { return 6; } else { return 15; } } buyEquip(15, 0); } else { if (aph) { if (enemy && near.dist2 <= 300) { return 6; } else { return 12; } } buyEquip(enemy ? 6 : 12, 0); } if (aph) { return 0; } } function getPossibleObjDmg(apj) { return items.weapons[apj.weapons[apj.weapons[1] ? Number(apj.weapons[1] == 10) : 0]].dmg / 4 * (player.skins[40] ? 3.3 : 1) * (items.weapons[apj.weapons[Number(apj.weapons[1] == 10)]].sDmg || 1); } let doStuffPingSet = []; function smartTick(apl) { doStuffPingSet.push(apl); } class Combat { constructor(apn, apo) { this.findSpikeHit = { x: 0, y: 0, spikePosX: 0, spikePosY: 0, canHit: false, spikes: [] }; this.spikesNearEnemy = []; this.doSpikeHit = function() { if (enemy.length) { let apr = gameObjects.find(aps => aps.active && aps.name == "pit trap" && aps.isTeamObject(player) && apn.getDistance(aps.x, aps.y, near.x2, near.y2) <= 50); let apt = 0.3 + (apo.weapons[player.weapons[0]].knock || 0); let apu = Math.atan2(near.y2 - player.y2, near.x2 - player.x2); let apv = { x: near.x2 + apt * Math.cos(apu) * 224, y: near.y2 + apt * Math.sin(apu) * 224 }; if (near.dist2 < apo.weapons[player.weapons[0]].range + 70 && !apr && near) { this.findSpikeHit.x = apv.x; this.findSpikeHit.y = apv.y; } this.findSpikeHit.spikes = gameObjects.filter(apw => apw.active && apw.dmg && apw.owner.sid == player.sid && apn.getDistance(apw.x, apw.y, apv.x, apv.y) <= 35 + apw.scale); for (let apx = 0; apx < this.findSpikeHit.spikes.length; apx++) { let apy = this.findSpikeHit.spikes[apx]; const apz = apn.getDist(player, apy, 0, 0); const aqa = apn.getDist(near, apy, 0, 0); const aqb = apn.getDist(apy, near, 0, 0); if (apz > aqa && aqb < 35 + apy.scale + player.scale && (player.primaryDmg >= 35 && player.skinIndex != 6 || player.primaryDmg >= 51)) { if (apy && !apr && near && near.dist2 <= apo.weapons[player.weapons[0]].range + player.scale * 1.8 && player.reloads[player.weapons[0]] == 0) { this.findSpikeHit.canHit = true; this.findSpikeHit.spikePosX = apy.x; this.findSpikeHit.spikePosY = apy.y; if (this.findSpikeHit.canHit) { instaC.canSpikeTick = true; instaC.syncHit = true; if (getEl("revTick").checked && player.weapons[1] == 15 && player.reloads[53] == 0 && instaC.perfCheck(player, near)) { instaC.revTick = true; } } smartTick(() => { smartTick(() => { this.findSpikeHit.spikePosX = 0; this.findSpikeHit.spikePosY = 0; this.findSpikeHit.canHit = false; }); }); } } else { this.findSpikeHit.spikePosX = 0; this.findSpikeHit.spikePosY = 0; this.findSpikeHit.canHit = false; } } } }; } } let advHeal = []; let enemyKbSpike = { x: null, y: null }; let enemyKbSpike2 = { x: null, y: null }; let PrePlaceCount = 0; class Traps { constructor(aqd, aqe) { 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 > aqe.weapons[player.weapons[0]].dmg || player.weapons[0] == 5); }; this.testCanPlace = function(aqh, aqi = -(Math.PI / 2), aqj = Math.PI / 2, aqk = Math.PI / 18, aql, aqm, aqn) { try { let aqp = aqe.list[player.items[aqh]]; let aqq = player.scale + aqp.scale + (aqp.placeOffset || 0); let aqr = { attempts: 0, placed: 0 }; let aqs = []; gameObjects.forEach(aqt => { aqs.push({ x: aqt.x, y: aqt.y, active: aqt.active, blocker: aqt.blocker, scale: aqt.scale, isItem: aqt.isItem, type: aqt.type, colDiv: aqt.colDiv, getScale: function(aqv, aqw) { aqv = aqv || 1; return this.scale * (this.isItem || this.type == 2 || this.type == 3 || this.type == 4 ? 1 : aqv * 0.6) * (aqw ? 1 : this.colDiv); } }); }); for (let aqy = aqi; aqy < aqj; aqy += aqk) { aqr.attempts++; let aqz = aql + aqy; let ara = player.x2 + aqq * Math.cos(aqz); let arb = player.y2 + aqq * Math.sin(aqz); let ard = aqs.find(arf => arf.active && aqd.getDistance(ara, arb, arf.x, arf.y) < aqp.scale + (arf.blocker ? arf.blocker : arf.getScale(0.6, arf.isItem))); if (ard) { continue; } if (aqp.id != 19 && arb >= config.mapScale / 2 - config.riverWidth / 2 && arb <= config.mapScale / 2 + config.riverWidth / 2) { continue; } if (!aqm && aqn || useWasd) { if (useWasd ? false : aqn.inTrap) { if (aqd.getAngleDist(near.aim2 + Math.PI, aqz + Math.PI) <= Math.PI) { place(2, aqz, 1); } else if (player.items[4] == 15) { place(4, aqz, 1); } } else if (aqd.getAngleDist(near.aim2, aqz) <= config.gatherAngle / 1.5) { place(2, aqz, 1); } else if (player.items[4] == 15) { place(4, aqz, 1); } } else { place(aqh, aqz, 1); } aqs.push({ x: ara, y: arb, active: true, blocker: aqp.blocker, scale: aqp.scale, isItem: true, type: null, colDiv: aqp.colDiv, getScale: function() { return this.scale; } }); if (aqd.getAngleDist(near.aim2, aqz) <= 1) { aqr.placed++; } } if (aqr.placed > 0 && aqm && aqp.dmg) { if (near.dist2 <= aqe.weapons[player.weapons[0]].range + player.scale * 1.8 && configs.spikeTick) { instaC.canSpikeTick = true; } } } catch (arh) {} }; 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; } if (near.dist2 <= aqe.weapons[near.primaryIndex || 5 || 7 || 4 || 0].range + near.scale * 1.8) { buyEquip(26, 0); let arj = aqe.list[9]; let ark = near.scale + arj.scale + (arj.placeOffset || 0); let arl = 0; let arm = { attempts: 0, block: "unblocked" }; for (let arn = -1; arn <= 1; arn += 0.1) { arm.attempts++; let aro = aqd.getDirect(player, near, 2, 2) + arn; let arp = near.x2 + ark * Math.cos(aro); let arq = near.y2 + ark * Math.sin(aro); let arr = gameObjects.find(ars => ars.active && aqd.getDistance(arp, arq, ars.x, ars.y) < arj.scale + (ars.blocker ? ars.blocker : ars.getScale(0.6, ars.isItem))); if (arr) { continue; } if (arq >= config.mapScale / 2 - config.riverWidth / 2 && arq <= config.mapScale / 2 + config.riverWidth / 2) { continue; } arl++; arm.block = "blocked"; break; } if (arl) { my.anti0Tick = 1; healer(); buyEquip(6, 0); return true; } } } catch (art) { return null; } return false; }; this.protect = function(aru) { if (!configs.antiTrap) { return; } if (player.items[4]) { this.testCanPlace(2, -(Math.PI / 2), Math.PI / 2, Math.PI / 18, aru + Math.PI); this.antiTrapped = true; } }; this.ReTrap = function() { let arx = aqe.weapons[player.weaponIndex].range + 70; gameObjects.forEach(ary => { if (enemy.length) { let asa = aqd.getDist(ary, player, 0, 2); let asb = aqd.getDirect(ary, player, 0, 2); game.tickBase(() => { if (near.dist2 <= arx && ary.health <= 272.58 && PrePlaceCount < 15 && asd(ary, player) <= arx || near.length && near.reloads[near.weaponIndex] <= config.tickRate * (window.pingTime >= 200 ? 2 : 1) || player.reloads[player.weaponIndex] * 1000 <= config.tickRate * (window.pingTime >= 200 ? 2 : 1)) { place(2, asb); } else if (near.dist2 > arx && ary.health <= 272.58 && PrePlaceCount >= 0 && asd(ary, player) <= arx || near.length && near.reloads[near.weaponIndex] <= config.tickRate * (window.pingTime >= 200 ? 2 : 1) || player.reloads[player.weaponIndex] * 1000 <= config.tickRate * (window.pingTime >= 200 ? 2 : 1)) {} }, 1); } }); }; function ase(asf, asg) { try { return Math.hypot((asg.y2 || asg.y) - (asf.y2 || asf.y), (asg.x2 || asg.x) - (asf.x2 || asf.x)); } catch (ash) { return Infinity; } } function asi(asj) { return Math.sqrt(asj.xVel * asj.xVel + asj.yVel * asj.yVel); } function asl(asm) { return Math.atan2(asm.yVel, asm.xVel); } function aso() { let asq = []; for (let asr = 0; asr < 360; asr += 250) { asq.push(Math.PI / 180 * asr); } return asq; } this.protect = function(ass) { if (!getEl("antiTrap").checked) { return; } if (player.items[4] && near.dist2 <= 600) { this.testCanPlace(2, -(Math.PI / 2), Math.PI / 2, Math.PI / 18, ass + Math.PI); this.antiTrapped = true; } }; aqd.deg2rad = function(asu) { return asu * (Math.PI / 180); }; this.autoPlace = function() { if (secPacket >= 90) { return; } let asw; asw = 250; const asx = 45; const asy = Math.PI / 24; if (enemy.length && game.tick % (Math.max(1, parseInt) || 1) === 0) { let asz = { inTrap: false }; let ata = gameObjects.find(atb => atb.trap && atb.active && atb.isTeamObject(player) && aqd.getDist(atb, near, 0, 2) <= near.scale + atb.getScale() + 5); asz.inTrap = !!ata; if (near.dist2 < 500 && near.dist2 > 350) { this.testCanPlace(4, 0, Math.PI * 2, Math.PI / 24, near.aim2); } if (near.dist2 <= 300 && (near.dist2 > asw && !asz.inTrap || autoQ)) { if (asz.inTrap && near.dist2 <= 250) { checkPlace(2, near.aim2 + Math.PI); } else if (player.items[4] == 15) { checkPlace(4, near.aim2); } } else if (!asz.inTrap && (testMode ? enemy.length : near.dist2 <= asw)) { let atc = aqd.getDirect(near, player, 0, 2); let atd = 70; const ate = asi(near); const atf = asl(near); if (near.dist2 <= asw) { if (player.items[4] == 15) { this.testCanPlace(4, aqd.deg2rad(-90), aqd.deg2rad(90), Math.PI / 24, atc, atd, { inTrap: true, enemyVelocity: ate, enemyDirection: atf }); } } } else if (asz.inTrap) { let atg = aqd.getDirect(ata, player, 0, 2); let ath = 70; const ati = asi(ata); const atj = asl(ata); if (near.dist2 <= 100) { let atk = Math.random() * Math.PI * 2; this.testCanPlace(2, atk, atk + Math.PI * 2, asy, atg, asx, { inTrap: false, enemyVelocity: ati, enemyDirection: atj }); } } } }; function atl(atm, atn, ato, atp) { return Math.atan2(atp - atn, ato - atm); } function atr(ats) { const att = 20; return ats.health < att; } function atu() { this.info.health <= aqe.weapons[player.weaponIndex].dmg * config.weaponVariants[tmpObj[(player.weaponIndex < 9 ? "prima" : "seconda") + "ryVariant"]].val * (aqe.weapons[player.weaponIndex].sDmg || 1) * 3.3; autoQ = true; } function asd(atw, atx) { return Math.sqrt(Math.pow(atx.y - atw.y, 2) + Math.pow(atx.x - atw.x, 2)); } let atz = false; let aua = false; var aub = { draw3: { active: false, x: 0, y: 0, scale: 0 }, moveDir: undefined, lastPos: { x: 0, y: 0 } }; function auc(aud, aue) { return { x: aue.x - aud.x, y: aue.y - aud.y }; } function auf(aug, auh) { let auj = auc(aug, auh); let auk = { x: Math.cos(player.dir), y: Math.sin(player.dir) }; let aul = auk.x * auj.x + auk.y * auj.y; let aum = Math.sqrt(auk.x * auk.x + auk.y * auk.y) * Math.sqrt(auj.x * auj.x + auj.y * auj.y); let aun = aul / aum; let auo = Math.acos(aun); auo *= 180 / Math.PI; if (auo < 0) { auo += 360; } return auo; } let aup = false; function auq(aur, aus, aut) { const auv = Math.abs(aur - aus * Math.cos(Math.atan2(near.yVel, near.xVel))); const auw = 1 - auv / aut; return Math.max(0, Math.min(1, auw)); } this.replacer = function(aux) { if (!aux || !getEl("autoReplace").checked) { return; } if (!inGame) { return; } if (this.antiTrapped) { return; } this.angles = this.angles || []; game.tickBase(() => { let ava = aqd.getDirect(aux, player, 0, 2); let avb = aqd.getDist(aux, player, 0, 2); let avc = Math.PI / 6; if (getEl("weaponGrind").checked && avb <= aqe.weapons[player.weaponIndex].range + player.scale) { return; } if (avb <= 300 && near.dist2 <= 300) { let avd = this.checkSpikeTick(); let ave = aqe.weapons[near.primaryIndex || 5].range; if (!avd && (near.dist2 <= ave || traps.inTrap && avb <= 150)) { let avf = Math.atan2(player.y - aux.y, player.x - aux.x); let avh = aqd.getDist(aux, player, 0, 2); let avi = 80; let avj = Math.sqrt(near.xVel * near.xVel + near.yVel * near.yVel); let avk = Math.atan2(near.yVel, near.xVel); let avl = avf + avj * Math.cos(avk); let avm = avh + avj * Math.sin(avk); this.angles.push(avl); if (this.angles.length > 5) { this.angles.shift(); } let avn = this.angles.reduce((avo, avp) => avo + avp, 0) / this.angles.length; avn += avc; let avq = Math.PI / 24 * Math.sin(Date.now() / 1000); let avr = avn + avq; this.testCanPlace(2, avr, avr + Math.PI * 2, Math.PI / 24, ava, avi); } else if (player.items[4] === 15 || near.dist2 <= 100) { let avs = Math.atan2(player.y - aux.y, player.x - aux.x); let avt = aqd.getDist(aux, player, 0, 2); let avu = 70; let avv = Math.sqrt(near.xVel * near.xVel + near.yVel * near.yVel); let avw = Math.atan2(near.yVel, near.xVel); let avx = avs + avv * Math.cos(avw); let avy = avt + avv * Math.sin(avw); this.angles.push(avx); if (this.angles.length > 5) { this.angles.shift(); } let avz = this.angles.reduce((awa, awb) => awa + awb, 0) / this.angles.length; avz += avc; let awc = avz + Math.PI; if (player.items[4] == 15) { this.testCanPlace(4, awc, awc + Math.PI * 2, Math.PI / 24, ava, avu); } } } let awd = []; gameObjects.forEach(awe => { if (awe.dmg === true && awe.isTeamObj(player)) { awd.push(awe); } }); if (aua) { if (player.items[4] == 15) { this.testCanPlace(4, 0, Math.PI * 2, Math.PI / 24, ava, 1); } aua = false; } let awg = false; awd.forEach(awh => { if (aqd.getDist(awh, player, 0, 2) <= 200) { let awj = Math.atan2(awh.y2 - player.y2, awh.x2 - player.x2); let awk = Math.atan2(near.y2 - awh.y2, near.x2 - awh.x2); let awl = aqd.nearestAngle(awj, awk); let awm = 87; let awn = player.x2 + awm * Math.cos(awl); let awo = player.y2 + awm * Math.sin(awl); let awp = aqd.getDist(near, { x2: awn, y2: awo }, 0, 2); if (aqd.getDist(aux, near, 0, 2) <= 87 && awp > 1 + awm) { place(2, awl); awg = true; } } }); if (!awg) { if (near.dist2 <= 250 && !atz) { for (let awq = 0; awq < 24; awq += 2) { let awr = Math.PI * 2 * awq / 24; this.testCanPlace(2, awr, awr + Math.PI / 24, Math.PI / 24, ava, 1); aua = true; break; } } if (avb <= 250 && near.dist2 <= 250) { let aws = this.checkSpikeTick(); if (!aws && near.dist3 <= aqe.weapons[near.primaryIndex || 5 || 7 || 4 || 0].range + near.scale * 1.8) { for (let awt = 0; awt < 24; awt += 2) { let awu = Math.PI * 2 * awt / 24; this.testCanPlace(2, awu, awu + Math.PI / 24, Math.PI / 24, ava, 1); this.testCanPlace(2, Math.PI / 2, Math.PI / 2, Math.PI / 2, near, ava, 1); atz = true; break; } } else if (player.items[4] == 15) { this.testCanPlace(4, 0, Math.PI * 2, Math.PI / 24, ava, 1); } this.replaced = true; } } }, 1); }; this.replacer = function(awv) { const awx = gameObjects.filter(awy => awy.trap && awy.active).sort((awz, axa) => aqd.getDist(awz, near, 0, 2) - aqd.getDist(axa, near, 0, 2)).find(axb => { const axd = Math.hypot(axb.y - near.y2, axb.x - near.x2); return axb !== player && (player.sid === axb.owner.sid || findAllianceBySid(axb.owner.sid)) && axd <= 50; }); if (!awv || !configs.autoReplace) { return; } if (!inGame) { return; } if (this.antiTrapped) { return; } if (axf <= aqe.weapons[player.weaponIndex].range + player.scale) { return; } let axf = aqd.getDist(awv, player, 0, 2); let axg = aqd.getDirect(awv, player, 0, 2); if (axf <= 400 && near.dist2 <= 400) { if (near.dist2 < 250) { for (let axh = 0; axh < Math.PI * 2; axh += Math.PI / 9) { checkPlace(2, near.aim2 + axh); } } else { for (let axi = 0; axi < Math.PI * 2; axi += Math.PI / 9) { checkPlace(4, near.aim2 + axi); } } this.replaced = true; } }; } }; class Instakill { constructor() { this.wait = false; this.can = false; this.isTrue = false; this.nobull = false; this.ticking = false; this.canSpikeTick = false; this.canSpikeSync = false; this.startTick = false; this.readyTick = false; this.canCounter = false; this.revTick = false; this.syncHit = false; this.changeType = function(axk) { this.wait = false; this.isTrue = true; my.autoAim = true; let axm = [axk]; let axn = near.backupNobull; near.backupNobull = false; if (axk == "rev") { healer1(); selectWeapon(player.weapons[1]); buyEquip(53, 0); sendAutoGather(); setTimeout(() => { selectWeapon(player.weapons[0]); buyEquip(7, 0); setTimeout(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 225); }, 100); } else if (axk == "nobull") { selectWeapon(player.weapons[0]); healer1(); buyEquip(7, 0); sendAutoGather(); setTimeout(() => { selectWeapon(player.weapons[1]); buyEquip(player.reloads[53] == 0 ? 53 : 6, 0); setTimeout(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 255); }, 105); } else if (axk == "normal") { selectWeapon(player.weapons[0]); healer1(); buyEquip(7, 0); sendAutoGather(); game.tickBase(() => { selectWeapon(player.weapons[1]); buyEquip(player.reloads[53] == 0 ? 53 : 6, 0); setTimeout(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; }, 100); }, 1); } else { setTimeout(() => { this.isTrue = false; my.autoAim = false; }, 50); } }; this.syncTry = function() { if (getEl("synctype").value == "rangesync") { buyEquip(53, 0); game.tickBase(() => { this.isTrue = true; my.autoAim = true; selectWeapon(player.weapons[1]); sendAutoGather(); game.tickBase(() => { my.autoAim = false; this.isTrue = false; sendAutoGather(); }, 1); }, 2); } else if (getEl("synctype").value == "instasync") { return "insta them"; } else { 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.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.oneTickType = function() { this.isTrue = true; my.autoAim = true; selectWeapon(player.weapons[1]); buyEquip(53, 0); packet("9", 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(19, 1); packet("9", near.aim2, 1); if (player.weapons[1] != 15) { sendAutoGather(); } game.tickBase(() => { sendAutoGather(); this.isTrue = false; my.autoAim = false; packet("9", undefined, 1); }, 1); }, 1); }; this.gotoGoal = function(ayj, ayk) { let aym = ayn => ayn * config.playerScale; let ayo = { a: ayj - ayk, b: ayj + ayk, c: ayj - aym(1), d: ayj + aym(1), e: ayj - aym(2), f: ayj + aym(2), g: ayj - aym(4), h: ayj + aym(4) }; let ayp = function(ayq, ayr) { if (player.y2 >= config.mapScale / 2 - config.riverWidth / 2 && player.y2 <= config.mapScale / 2 + config.riverWidth / 2 && ayr == 0) { buyEquip(31, 0); } else { buyEquip(ayq, ayr); } }; if (enemy.length) { let ayt = near.dist2; this.ticking = true; if (ayt >= ayo.a && ayt <= ayo.b) { ayp(22, 0); ayp(11, 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 (ayt < ayo.a) { if (ayt >= ayo.g) { if (ayt >= ayo.e) { if (ayt >= ayo.c) { ayp(40, 0); ayp(21, 1); if (getEl("slowOT").checked) { if (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 { ayp(26, 0); ayp(21, 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 { ayp(26, 0); ayp(12, 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(); ayp(11, 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 (ayt > ayo.b) { if (ayt <= ayo.h) { if (ayt <= ayo.f) { if (ayt <= ayo.d) { ayp(40, 0); ayp(9, 1); if (getEl("slowOT").checked) { if (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 { ayp(22, 0); ayp(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 { ayp(6, 0); ayp(12, 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(); ayp(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 }; } }; this.bowMovement = function() { let ayv = this.gotoGoal(685, 3); if (ayv.action) { if (player.reloads[53] == 0 && !this.isTrue) { this.rangeType("ageInsta"); } else { packet("9", ayv.dir, 1); } } else { packet("9", ayv.dir, 1); } }; this.tickMovement = function() { let ayx = this.gotoGoal([10, 14].includes(player.weapons[1]) && player.y2 > config.snowBiomeTop ? 240 : player.weapons[1] == 15 ? 250 : player.y2 <= config.snowBiomeTop ? [10, 14].includes(player.weapons[1]) ? 270 : 265 : 275, 3); if (ayx.action) { if (![6, 22].includes(near.skinIndex) && player.reloads[53] == 0 && !this.isTrue) { if ([10, 14].includes(player.weapons[1]) && player.y2 > config.snowBiomeTop || player.weapons[1] == 15) { this.oneTickType(); } else { this.threeOneTickType(); } } else { packet("9", ayx.dir, 1); } } else { packet("9", ayx.dir, 1); } }; this.kmTickMovement = function() { let ayz = this.gotoGoal(240, 3); if (ayz.action) { if (near.skinIndex != 22 && player.reloads[53] == 0 && !this.isTrue && (game.tick - near.poisonTick) % config.serverUpdateRate == 8) { this.kmTickType(); } else { packet("9", ayz.dir, 1); } } else { packet("9", ayz.dir, 1); } }; this.boostTickMovement = function() { let azb = player.weapons[1] == 9 ? 365 : player.weapons[1] == 12 ? 380 : player.weapons[1] == 13 ? 390 : player.weapons[1] == 15 ? 365 : 370; let azc = player.weapons[1] == 9 ? 2 : player.weapons[1] == 12 ? 1.5 : player.weapons[1] == 13 ? 1.5 : player.weapons[1] == 15 ? 2 : 3; let azd = this.gotoGoal(azb, azc); if (azd.action) { if (player.reloads[53] == 0 && !this.isTrue) { this.boostTickType(); } else { packet("9", azd.dir, 1); } } else { packet("9", azd.dir, 1); } }; this.perfCheck = function(aze, azf) { if (azf.weaponIndex == 11 && UTILS.getAngleDist(azf.aim2 + Math.PI, azf.d2) <= config.shieldAngle) { return false; } if (![9, 12, 13, 15].includes(player.weapons[1])) { return true; } let azh = { x: azf.x2 + Math.cos(azf.aim2 + Math.PI) * 70, y: azf.y2 + Math.sin(azf.aim2 + Math.PI) * 70 }; if (UTILS.lineInRect(aze.x2 - aze.scale, aze.y2 - aze.scale, aze.x2 + aze.scale, aze.y2 + aze.scale, azh.x, azh.y, azh.x, azh.y)) { return true; } let azi = ais.filter(azj => azj.visible).find(azk => { if (UTILS.lineInRect(azk.x2 - azk.scale, azk.y2 - azk.scale, azk.x2 + azk.scale, azk.y2 + azk.scale, azh.x, azh.y, azh.x, azh.y)) { return true; } }); if (azi) { return false; } azi = gameObjects.filter(azm => azm.active).find(azn => { let azp = azn.getScale(); if (!azn.ignoreCollision && UTILS.lineInRect(azn.x - azp, azn.y - azp, azn.x + azp, azn.y + azp, azh.x, azh.y, azh.x, azh.y)) { return true; } }); if (azi) { return false; } return true; }; } }; class Autobuy { constructor(azq, azr) { this.hat = function() { azq.forEach(azu => { let azw = findID(hats, azu); if (azw && !player.skins[azu] && player.points >= azw.price) { packet("c", 1, azu, 0); } }); }; this.acc = function() { azr.forEach(azy => { let baa = findID(accessories, azy); if (baa && !player.tails[azy] && player.points >= baa.price) { packet("c", 1, azy, 1); } }); }; } }; class Autoupgrade { constructor() { this.sb = function(bab) { bab(3); bab(17); bab(31); bab(23); bab(9); bab(38); }; this.kh = function(bac) { bac(3); bac(17); bac(31); bac(23); bac(10); bac(38); bac(4); bac(25); }; this.pb = function(bae) { bae(5); bae(17); bae(32); bae(23); bae(9); bae(38); }; this.ph = function(baf) { baf(5); baf(17); baf(32); baf(23); baf(10); baf(38); baf(28); baf(25); }; this.db = function(bag) { bag(7); bag(17); bag(31); bag(23); bag(9); bag(34); }; this.km = function(bah) { bah(7); bah(17); bah(31); bah(23); bah(10); bah(38); bah(4); bah(15); }; } }; class Damages { constructor(bai) { this.calcDmg = function(bak, bal) { return bak * bal; }; this.getAllDamage = function(bam) { return [this.calcDmg(bam, 0.75), bam, this.calcDmg(bam, 1.125), this.calcDmg(bam, 1.5)]; }; this.weapons = []; for (let bao = 0; bao < bai.weapons.length; bao++) { let bap = bai.weapons[bao]; let baq = bap.name.split(" ").length <= 1 ? bap.name : bap.name.split(" ")[0] + "_" + bap.name.split(" ")[1]; this.weapons.push(this.getAllDamage(bao > 8 ? bap.Pdmg : bap.dmg)); this[baq] = this.weapons[bao]; } } } let tmpList = []; let UTILS = new Utils(); let items = new Items(); let objectManager = new Objectmanager(GameObject, gameObjects, UTILS, config); let store = new Store(); let hats = store.hats; let accessories = store.accessories; let projectileManager = new ProjectileManager(Projectile, projectiles, players, ais, objectManager, items, config, UTILS); let aiManager = new AiManager(ais, AI, players, items, null, config, UTILS); let textManager = new Textmanager(); let traps = new Traps(UTILS, items); let instaC = new Instakill(); let sCombat = new Combat(UTILS, items); let autoBuy = new Autobuy([40, 6, 7, 22, 53, 15, 31], [11, 19, 21, 13]); let autoUpgrade = new Autoupgrade(); 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(bar) { packet("6", bar.slice(0, 30)); } let runAtNextTick = []; function checkProjectileHolder(bas, bau, bav, baw, bax, bay, baz, bba) { let bbc = bay == 0 ? 9 : bay == 2 ? 12 : bay == 3 ? 13 : bay == 5 && 15; let bbd = config.playerScale * 2; let bbe = { x: bay == 1 ? bas : bas - bbd * Math.cos(bav), y: bay == 1 ? bau : bau - bbd * Math.sin(bav) }; let bbf = players.filter(bbg => bbg.visible && UTILS.getDist(bbe, bbg, 0, 2) <= bbg.scale).sort(function(bbh, bbi) { return UTILS.getDist(bbe, bbh, 0, 2) - UTILS.getDist(bbe, bbi, 0, 2); })[0]; if (bbf) { if (bay == 1) { bbf.shooting[53] = 1; } else { bbf.shootIndex = bbc; bbf.shooting[1] = 1; antiProj(bbf, bav, baw, bax, bay, bbc); } } } let projectileCount = 0; function antiProj(bbk, bbl, bbm, bbn, bbo, bbp) { if (!bbk.isTeam(player)) { tmpDir = UTILS.getDirect(player, bbk, 2, 2); if (UTILS.getAngleDist(tmpDir, bbl) <= 0.2) { bbk.bowThreat[bbp]++; if (bbo == 5) { projectileCount++; } setTimeout(() => { bbk.bowThreat[bbp]--; if (bbo == 5) { projectileCount--; } }, bbm / bbn); if (bbk.bowThreat[9] >= 1 && (bbk.bowThreat[12] >= 1 || bbk.bowThreat[15] >= 1)) { place(1, bbk.aim2); my.anti0Tick = 4; if (!my.antiSync) { antiSyncHealing(4); } } else if (projectileCount >= 2) { place(1, bbk.aim2); healer(); buyEquip(22, 0); buyEquip(13, 1); my.anti0Tick = 4; if (!my.antiSync) { autoQ = true; antiSyncHealing(4); } } else if (projectileCount === 1) { buyEquip(6, 0); buyEquip(26, 0); healer(); game.tickBase(() => {}, 2); } } } } function showItemInfo(bbr, bbs, bbt) { if (player && bbr) { UTILS.removeAllChildren(itemInfoHolder); itemInfoHolder.classList.add("visible"); UTILS.generateElement({ id: "itemInfoName", text: UTILS.capitalizeFirst(bbr.name), parent: itemInfoHolder }); UTILS.generateElement({ id: "itemInfoDesc", text: bbr.desc, parent: itemInfoHolder }); if (bbt) {} else if (bbs) { UTILS.generateElement({ class: "itemInfoReq", text: !bbr.type ? "primary" : "secondary", parent: itemInfoHolder }); } else { for (let bbv = 0; bbv < bbr.req.length; bbv += 2) { UTILS.generateElement({ class: "itemInfoReq", html: bbr.req[bbv] + "<span class='itemInfoReqVal'> x" + bbr.req[bbv + 1] + "</span>", parent: itemInfoHolder }); } if (bbr.group.limit) { UTILS.generateElement({ class: "itemInfoLmt", text: (player.itemCounts[bbr.group.id] || 0) + "/" + (config.isSandbox ? 99 : bbr.group.limit), parent: itemInfoHolder }); } } } else { itemInfoHolder.classList.remove("visible"); } } window.addEventListener("resize", UTILS.checkTrusted(resize)); function resize() { screenWidth = window.innerWidth; screenHeight = window.innerHeight; let bbx = 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"; mainContext.setTransform(bbx, 0, 0, bbx, (screenWidth * pixelDensity - maxScreenWidth * bbx) / 2, (screenHeight * pixelDensity - maxScreenHeight * bbx) / 2); } resize(); var usingTouch; const mals = document.getElementById("touch-controls-fullscreen"); mals.style.display = "block"; mals.addEventListener("mousemove", gameInput, false); function gameInput(bby) { mouseX = bby.clientX; mouseY = bby.clientY; } let clicks = { left: false, middle: false, right: false }; mals.addEventListener("mousedown", mouseDown, false); function mouseDown(bca) { if (attackState != 1) { attackState = 1; if (bca.button == 0) { my.autoAim = true; clicks.left = true; } else if (bca.button == 1) { clicks.middle = true; } else if (bca.button == 2) { clicks.right = true; } } } mals.addEventListener("mouseup", UTILS.checkTrusted(mouseUp)); function mouseUp(bcc) { if (attackState != 0) { attackState = 0; if (bcc.button == 0) { my.autoAim = false; clicks.left = false; } else if (bcc.button == 1) { clicks.middle = false; } else if (bcc.button == 2) { clicks.right = false; } } } mals.addEventListener("wheel", wheel, false); function wheel(bce) { if (player.shameCount > 1 && !near) { buyEquip(7, 0); } else { buyEquip(6, 0); } } function getMoveDir() { let bch = 0; let bci = 0; for (let bcj in moveKeys) { let bck = moveKeys[bcj]; bch += !!keys[bcj] * bck[0]; bci += !!keys[bcj] * bck[1]; } if (bch == 0 && bci == 0) { return undefined; } else { return Math.atan2(bci, bch); } } function getSafeDir() { if (!player) { return 0; } if (!player.lockDir) { lastDir = Math.atan2(mouseY - screenHeight / 2, mouseX - screenWidth / 2); } return lastDir || 0; } function getAttackDir(bcl) { if (bcl) { 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 (getEl("noDir").checked) { 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 (!player.lockDir) { if (getEl("noDir").checked) { return undefined; } 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; } function keysActive() { return allianceMenu.style.display != "block" && chatHolder.style.display != "block" && !menuCBFocus; } function toggleMenuChat() { if (menuChatDiv.style.display != "none") { let bcq = function(bcr) { return { found: bcr.startsWith("/") && commands[bcr.slice(1).split(" ")[0]] }; }; let bct = bcq(menuChatBox.value); if (bct.found) { if (typeof bct.fv.action === "function") { bct.fv.action(menuChatBox.value); } } else { sendChat(menuChatBox.value); } menuChatBox.value = ""; menuChatBox.blur(); } else if (menuCBFocus) { menuChatBox.blur(); } else { menuChatBox.focus(); } } function keyDown(bcu) { let bcw = bcu.which || bcu.keyCode || 0; if (player && player.alive && keysActive()) { if (!keys[bcw]) { keys[bcw] = 1; macro[bcu.key] = 1; if (bcw == 27) { openMenu = !openMenu; $("#menuDiv").toggle(); $("#menuChatDiv").toggle(); } else if (bcw == 69) { sendAutoGather(); } else if (bcw == 67) { updateMapMarker(); } else if (player.weapons[bcw - 49] != undefined) { player.weaponCode = player.weapons[bcw - 49]; } else if (moveKeys[bcw]) { sendMoveDir(); } else if (bcu.key == "m") { pads.placeSpawnPads = !pads.placeSpawnPads; } else if (bcu.key == "z") { mills.place = !mills.place; } else if (bcu.key == "Z") { if (typeof window.debug == "function") { window.debug(); } } else if (bcw == 32) { packet("9", 1, getSafeDir(), 1); packet("9", 0, getSafeDir(), 1); } else if (bcu.key == ",") { project.send(JSON.stringify(["tezt", "ratio"])); for (let bcx = 0; bcx < botz.length; bcx++) { if (botz[bcx][0]) { botz[bcx][0].zync(near); console.log(botz[bcx][0]); } project.send("tezt"); botSkts.forEach(bcy => { bcy.zync(); }); io.send("S", 1); } } } } } let intervalId; document.addEventListener("keydown", function(bda) { if (["allianceinput", "chatbox", "nameinput", "storeHolder"].includes(document.activeElement.id.toLowerCase())) { return null; } if (bda.key === "p") { songChat = !songChat; if (songChat) { playSongLyrics(); } } }); function oneTick() { my.autoAim = true; buyEquip(53, 0); selectWeapon(player.weapons[0]); game.tickBase(() => { buyEquip(7, 0); sendAutoGather(); game.tickBase(() => { sendAutoGather(); my.autoAim = false; }, 1); }, 1); } let songChat = false; const lyrics = [{ line: "I have fallen down from space", delay: 0 }, { line: "Moon is having Fun tonight!", delay: 3000 }, { line: "I'm just a Gen Z", delay: 2000 }, { line: "i just want some vacation", delay: 3000 }, { line: "Bro I aint quitting trying", delay: 2000 }, { line: "By your side", delay: 2000 }, { line: "Moon's dick got sucked", delay: 2000 }, { line: "I wonder how did it happen", delay: 1000 }, { line: "Wait what the fuck", delay: 6000 }, { line: "Did I just...", delay: 2000 }, { line: "Yea Fuck this its even", delay: 2000 }, { line: "My darling, cmon", delay: 1500 }, { line: "lettme kill", delay: 2000 }, { line: "That Chick just ate all semen", delay: 3000 }, { line: "Holy Moon is such a Demon", delay: 2000 }, { line: "Anyways heres som free ramen", delay: 2000 }, { line: "That's semen u dum dum", delay: 2500 }, { line: "I came", delay: 2000 }, { line: "But do u like it tho?", delay: 7000 }, { line: "The knife twists", delay: 2500 }, { line: "at the thought", delay: 2000 }, { line: "That I should fall short", delay: 2500 }, { line: "of the mark", delay: 2000 }, { line: "Frightened by the bite", delay: 3000 }, { line: "Though it's no harsher", delay: 2500 }, { line: "How did it taste?", delay: 2000 }, { line: "A middle of adventure", delay: 4000 }, { line: "Such a perfect place", delay: 4000 }, { line: "Salty?", delay: 2000 }, { line: "I have fallen down from space", delay: 7000 }, { line: "We will rise again!!!!!", delay: 3000 }, { line: "I'm just a Gen Z", delay: 2000 }, { line: "i just want some vacation", delay: 3000 }, { line: "Wait what spicy?", delay: 2000 }, { line: "By your side", delay: 2000 }, { line: "With your hands", delay: 2000 }, { line: "How did it happen?", delay: 1000 }, { line: "But I crumble completely", delay: 12000 }, { line: "Oh I just ate som burrito", delay: 2500 }, { line: "She is a good fuck fr", delay: 4000 }, { line: "You've had to greet me", delay: 2000 }, { line: "with goodbye", delay: 2000 }, { line: "I'm always just about to", delay: 3000 }, { line: "Go and spoil a surprise", delay: 2000 }, { line: "Take my hands off", delay: 3000 }, { line: "My bad xDxD", delay: 2000 }, { line: "So I fuck GenZs", delay: 2000 }, { line: "I'll eat some pineapple ;)", delay: 7000 }, { line: "We will rise again!!!!!", delay: 3000 }, { line: "I'm just a Gen Z", delay: 2000 }, { line: "i just want some vacation", delay: 3000 }, { line: "To be continued...", delay: 2000 }, { line: "By your side", delay: 2000 }, { line: "With your hands", delay: 2000 }, { line: "I bet she had a nice ass", delay: 1000 }]; function playSongLyrics() { let bdg = 0; for (let bdh = 0; bdh < lyrics.length; bdh++) { const { line: bdi, delay: bdj } = lyrics[bdh]; bdg += bdj; setTimeout(() => { if (songChat) { sendChat(bdi); } }, bdg); } } addEventListener("keydown", UTILS.checkTrusted(keyDown)); function keyUp(bdk) { if (player && player.alive) { let bdm = bdk.which || bdk.keyCode || 0; if (bdm == 13) { toggleMenuChat(); } else if (keysActive()) { if (keys[bdm]) { keys[bdm] = 0; macro[bdk.key] = 0; if (moveKeys[bdm]) { sendMoveDir(); } else if (bdk.key == ",") { player.sync = false; } } } } } window.addEventListener("keyup", UTILS.checkTrusted(keyUp)); function sendMoveDir() { if (found) { packet("9", undefined, 1); } else { let bdo = getMoveDir(); if (lastMoveDir == undefined || bdo == undefined || Math.abs(bdo - lastMoveDir) > 0.3) { if (!my.autoPush && !found) { packet("9", bdo, 1); } lastMoveDir = bdo; } } } function bindEvents() {} bindEvents(); function chechPathColl(bdp) { return (player.scale + bdp.getScale()) / (player.maxSpeed * items.weapons[player.weaponIndex].spdMult) + (bdp.dmg && !bdp.isTeamObject(player) ? 35 : 0); if (bdp.colDiv == 0.5) { return bdp.scale * bdp.colDiv; } else if (!bdp.isTeamObject(player) && bdp.dmg) { return bdp.scale + player.scale; } else if (bdp.isTeamObject(player) && bdp.trap) { return 0; } else { return bdp.scale; } } function checkObject() { let bds = gameObjects.filter(bdt => player.canSee(bdt) && bdt.active); for (let bdu = 0; bdu < pathFind.grid; bdu++) { grid[bdu] = []; for (let bdv = 0; bdv < pathFind.grid; bdv++) { let bdw = { x: player.x2 - pathFind.scale / 2 + pathFind.scale / pathFind.grid * bdv, y: player.y2 - pathFind.scale / 2 + pathFind.scale / pathFind.grid * bdu }; if (UTILS.getDist(pathFind.chaseNear ? near : pathFind, bdw, pathFind.chaseNear ? 2 : 0, 0) <= (pathFind.chaseNear ? 35 : 60)) { pathFind.lastX = bdv; pathFind.lastY = bdu; grid[bdu][bdv] = 0; continue; } let bdx = bds.find(bdy => UTILS.getDist(bdy, bdw, 0, 0) <= chechPathColl(bdy)); if (bdx) { if (bdx.trap) { grid[bdu][bdv] = 0; continue; } grid[bdu][bdv] = 1; } else { grid[bdu][bdv] = 0; } } } } function createPath() { grid = []; checkObject(); } function Pathfinder() { pathFind.scale = config.maxScreenWidth / 2 * 1.3; if (!traps.inTrap && (pathFind.chaseNear ? enemy.length : true)) { if (near.dist2 <= items.weapons[player.weapons[0]].range) { packet("9", undefined, 1); } else { createPath(); easystar.setGrid(grid); easystar.setAcceptableTiles([0]); easystar.enableDiagonals(); easystar.findPath(grid[0].length / 2, grid.length / 2, pathFind.lastX, pathFind.lastY, function(beg) { if (beg === null) { pathFind.array = []; if (near.dist2 <= items.weapons[player.weapons[0]].range) { packet("9", undefined, 1); } else { packet("9", near.aim2, 1); } } else { pathFind.array = beg; if (pathFind.array.length > 1) { let bei = { x: player.x2 - pathFind.scale / 2 + pathFind.scale / pathFind.grid * beg[1].x, y: player.y2 - pathFind.scale / 2 + pathFind.scale / pathFind.grid * beg[1].y }; packet("9", UTILS.getDirect(bei, player, 0, 2), 1); } } }); easystar.calculate(); } } } let isItemSetted = []; function updateItemCountDisplay(bej = undefined) { for (let bel = 3; bel < items.list.length; ++bel) { let bem = items.list[bel].group.id; let ben = items.weapons.length + bel; if (!isItemSetted[ben]) { isItemSetted[ben] = document.createElement("div"); isItemSetted[ben].id = "itemCount" + ben; getEl("actionBarItem" + ben).appendChild(isItemSetted[ben]); isItemSetted[ben].style = "\n display: block;\n position: absolute;\n padding-left: 5px;\n font-size: 20px;\n font-family: 'Hammersmith One', cursive;\n color: #fff;\n "; isItemSetted[ben].innerHTML = player.itemCounts[bem] || 0; } else if (bej == bem) { isItemSetted[ben].innerHTML = player.itemCounts[bej] || 0; } } } function fgdo(beo, bep) { return Math.sqrt(Math.pow(bep.y - beo.y, 2) + Math.pow(bep.x - beo.x, 2)); } function autoPush() { let bes = liztobj.filter(bet => bet.trap && bet.active && bet.isTeamObject(player) && UTILS.getDist(bet, near, 0, 2) <= near.scale + bet.getScale() + 5).sort(function(beu, bev) { return UTILS.getDist(beu, near, 0, 2) - UTILS.getDist(bev, near, 0, 2); })[0]; if (bes) { let bex = liztobj.filter(bey => bey.dmg && bey.active && bey.isTeamObject(player) && UTILS.getDist(bey, bes, 0, 0) <= near.scale + bes.scale + bey.scale).sort(function(bez, bfa) { return UTILS.getDist(bez, near, 0, 2) - UTILS.getDist(bfa, near, 0, 2); })[0]; if (bex) { let bfc = Math.atan2(near.y2 - bex.y, near.x2 - bex.x); let bfd = { x: bex.x + Math.cos(UTILS.getDirect(near, bex, 2, 0)) * 250, y: bex.y + Math.sin(UTILS.getDirect(near, bex, 2, 0)) * 250, x2: bex.x + (UTILS.getDist(near, bex, 2, 0) + player.scale) * Math.cos(UTILS.getDirect(near, bex, 2, 0)) + Math.cos(25), y2: bex.y + (UTILS.getDist(near, bex, 2, 0) + player.scale) * Math.sin(UTILS.getDirect(near, bex, 2, 0)) + Math.sin(25) }; let bfe = liztobj.filter(bff => bff.active).find(bfg => { let bfi = bfg.getScale(); if (!bfg.ignoreCollision && UTILS.lineInRect(bfg.x - bfi, bfg.y - bfi, bfg.x + bfi, bfg.y + bfi, player.x2, player.y2, bfd.x2, bfd.y2)) { return true; } }); if (bfe) { if (my.autoPush) { my.autoPush = false; packet("9", lastMoveDir || undefined, 1); } } else { my.autoPush = true; my.pushData = { x: bex.x + Math.cos(bfc), y: bex.y + Math.sin(bfc), x2: player.x2 + 30, y2: player.y2 + 30 }; let bfj = { x: near.x2 + Math.cos(bfc) * 30, y: near.y2 + Math.sin(bfc) * 60 }; let bfk = Math.atan2(bfj.y - player.y2, bfj.x - player.x2); packet("9", bfk, 1); let bfl = player.scale / 10; if (UTILS.lineInRect(player.x2 - bfl, player.y2 - bfl, player.x2 + bfl, player.y2 + bfl, near.x2, near.y2, bfd.x, bfd.y)) { packet("9", near.aim2, 1); } else { packet("9", UTILS.getDirect(bfd, player, 2, 2), 1); } } } else if (my.autoPush) { my.autoPush = false; packet("9", lastMoveDir || undefined, 1); } } else if (my.autoPush) { my.autoPush = false; packet("9", lastMoveDir || undefined, 1); } } function knockBackPredict() { let bfn = { x0: 0, y0: 0, x1: 0, y1: 0, instax: 0, instay: 0, turretx: 0, turrety: 0 }; let bfo = Math.atan2(near.y2 - player.y2, near.x2 - player.x2); let bfp = Infinity; let bfq = gameObjects.filter(bfr => bfr.name == "pit trap" && bfr.active && bfr.isTeamObject(player) && UTILS.getDist(bfr, near, 0, 2) <= bfr.getScale() + player.scale + 5).sort((bfs, bft) => { return UTILS.getDist(bfs, near, 0, 2) - UTILS.UTILS.getDist(bft, near, 0, 2); })[0]; if (near.dist2 - player.scale * 1.8 <= items.weapons[player.weapons[0]].range && !bfq) { for (let bfv of gameObjects) { let bfw = bfn; if (bfv.dmg && bfv.active && bfv.isTeamObject(player)) { let bfx = (items.weapons[player.weapons[0]].knock || 0) * items.weapons[player.weapons[0]].range + player.scale * 2; let bfy = ![undefined, 9, 12, 13, 15].includes(player.weapons[1]) ? (items.weapons[player.weapons[1]].knock || 0) * items.weapons[player.weapons[1]].range + player.scale * 2 - 10 : player.weapons[1] != undefined ? 60 : 0; let bfz = bfx + bfy; let bga = player.reloads[53] == 0 ? bfx + bfy + 75 : bfz; let bgb = near.x2 + bfx * Math.cos(bfo); let bgc = near.y2 + bfx * Math.sin(bfo); let bgd = near.x2 + bfy * Math.cos(bfo); let bge = near.y2 + bfy * Math.sin(bfo); let bgf = near.x2 + bfz * Math.cos(bfo); let bgg = near.y2 + bfz * Math.sin(bfo); let bgh = near.x2 + bga * Math.cos(bfo); let bgi = near.y2 + bga * Math.sin(bfo); bfw.x0 = bgb; bfw.y0 = bgc; bfw.x1 = bgd; bfw.y1 = bge; bfw.instax = bgf; bfw.instay = bgg; bfw.turretx = bgh; bfw.turrety = bgi; if (UTILS.getDist({ x: bgb, y: bgc }, bfv, 0, 0) <= bfv.scale + player.scale && player.reloads[player.weapons[0]] == 0) { return "insta them"; } if (UTILS.getDist({ x: bgf, y: bgg }, bfv, 0, 0) <= bfv.scale + player.scale && player.reloads[player.weapons[0]] == 0 && player.reloads[player.weapons[1]] == 0) { return "insta them"; } } } } else { bfn = { x0: 0, y0: 0, x1: 0, y1: 0, instax: 0, instay: 0, turretx: 0, turrety: 0 }; } return false; } function addDeadPlayer(bgj) { deadPlayers.push(new DeadPlayer(bgj.x, bgj.y, bgj.dir, bgj.buildIndex, bgj.weaponIndex, bgj.weaponVariant, bgj.skinColor, bgj.scale, bgj.name)); } function setInitData(bgl) { alliances = bgl.teams; } function setupGame(bgm) { keys = {}; macro = {}; playerSID = bgm; attackState = 0; inGame = true; packet("9", 0, getAttackDir(), 1); my.ageInsta = true; if (firstSetup) { firstSetup = false; gameObjects.length = 0; liztobj.length = 0; } } function addPlayer(bgo, bgp) { let bgr = findID(players, bgo[0]); if (!bgr) { bgr = new Player(bgo[0], bgo[1], config, UTILS, projectileManager, objectManager, players, ais, items, hats, accessories); players.push(bgr); if (bgo[1] != playerSID) { notif2("Encountered", bgo[2]); } } else if (bgo[1] != playerSID) { notif2("Encountered", bgo[2]); } bgr.spawn(bgp ? true : null); bgr.visible = false; bgr.oldPos = { x2: undefined, y2: undefined }; bgr.x2 = undefined; bgr.y2 = undefined; bgr.x3 = undefined; bgr.y3 = undefined; bgr.setData(bgo); if (bgp) { if (!player) { window.prepareUI(bgr); } player = bgr; camX = player.x; camY = player.y; my.lastDir = 0; updateItems(); updateAge(); updateItemCountDisplay(); if (player.skins[7]) { my.reSync = true; } } } function removePlayer(bgs) { for (let bgu = 0; bgu < players.length; bgu++) { if (players[bgu].id == bgs) { players.splice(bgu, 1); break; } } } Math.getDist = function(bgv, bgw) { try { let bgy = bgw.x2 || bgw.x; let bgz = bgw.y2 || bgw.y; let bha = bgv.x2 || bgv.x; let bhb = bgv.y2 || bgv.y; return Math.sqrt((bha -= bgy) * bha + (bhb -= bgz) * bhb); } catch (bhc) { return Infinity; } }; Math.getDir = function(bhd, bhe) { try { return Math.atan2((bhe.y2 || bhe.y) - (bhd.y2 || bhd.y), (bhe.x2 || bhe.x) - (bhd.x2 || bhd.x)); } catch (bhg) { return 0; } }; let potSpikeReplace = 0; function dmgPot() { let bhi = 0; if (nears.length && player) { nears.forEach(bhj => { if (Math.getDist(player, bhj) <= 300) { if (bhj.primaryIndex && Math.getDist(player, bhj) <= items.weapons[bhj.primaryIndex].range + player.scale * 2) { if (bhj.reloads[bhj.primaryIndex] <= 0.2) { bhi += items.weapons[bhj.primaryIndex].dmg * config.weaponVariants[bhj.primaryVariant].val * 1.5; if (config.weaponVariants[bhj.primaryVariant].src === "_r") { bhi += 5; } } else if (!bhj.primaryIndex) { bhi += 60; } } if (bhj.secondaryIndex && bhj.reloads[bhj.secondaryIndex] <= 0.2) { const bhl = bhj.secondaryIndex === 10 ? items.weapons[bhj.secondaryIndex].dmg : items.weapons[bhj.secondaryIndex].Pdmg; bhi += bhl; } else if (!bhj.secondaryIndex) { bhi += 50; } if (bhj.reloads[53] <= 0.2 || bhj.reloads[53] >= 0.8 && Math.getDist(player, bhj) >= 160) { bhi += 25; } else if (!bhj.reloads[53]) { bhi += 25; } } }); liztobj.forEach(bhm => { if (bhm.dmg && bhm.active && bhm.ownerSID != player.sid && !bhm.isTeamObject(player)) { if (Math.getDist(bhm, player) <= bhm.scale + player.scale + 20) { bhi += bhm.dmg; } } }); if (player.skinIndex === 7) { bhi += 5; } else if (player.skinIndex === 6) { bhi = bhi * 0.75; } else if (player.skinIndex === 13) { bhi = bhi - 3; } else if (player.skinIndex === 55) { if (player.currentReloads.primary === 1) { bhi = bhi - items.weapons[player.weapons[0]].dmg * 0.25; } } else if (player.skinIndex === 58) { if (player.currentReloads.primary === 1) { bhi = bhi - items.weapons[player.weapons[0]].dmg * 0.4; } } if (player.tailIndex === 13) { bhi = bhi - 3; } else if (player.tailIndex === 18) { if (player.currentReloads.primary === 1) { bhi = bhi - items.weapons[player.weapons[0]].dmg * 0.2; } } } return bhi; } let prevTrap = false; let prevEnemyBullTick = 0; let enemyBullTick = 0; let lastTickDamage = 0; let skippedTicks = 0; let countBTicks = 0; let prevBullTick = 0; let lastBullTick = 0; function updateHealth(bho, bhp) { let bhr = players.find(acs => acs.sid == bho); let bhs = { weapon: this.secondaryIndex, variant: this.secondaryVariant }; if (!bhr) { return; } if (bhr) { bhr.oldHealth = bhr.health; bhr.health = bhp; bhr.judgeShame(); if (bhr.oldHealth > bhr.health) { bhr.timeDamaged = Date.now(); bhr.damaged = bhr.oldHealth - bhr.health; let bht = bhr.damaged; bhr = players.find(acs => acs.sid == bho); let bhu = false; if (bhr.health <= 0) { if (!bhr.death) { bhr.death = true; addDeadPlayer(bhr); } } if (bhr == player) { if (bhr.skinIndex == 7 && (bht == 5 || bhr.latestTail == 13 && bht == 2)) { if (my.reSync) { my.reSync = false; bhr.setBullTick = true; } bhu = true; } let bhv = true; let bhw = false; let bhx = player.empAnti; let bhy = true; let bhz = false; let bia = true; let bib = 85; let bic = getAttacker(bht); let bid = [0.25, 0.45].map(bie => bie * items.weapons[player.weapons[0]].dmg); let bif = near.length ? !bhu && bid.includes(bht) && near[0].skinIndex == 11 && near[0].tailIndex == 21 : false; function big(bih) { if (bhx) { setTimeout(() => { healer(); }, bih); }; }; if (bic.length) { let bii = bic.filter(bij => { if (bij.dist2 <= (bij.weaponIndex < 9 ? 300 : 700)) { tmpDir = UTILS.getDirect(player, bij, 2, 2); if (UTILS.getAngleDist(tmpDir, bij.d2) <= Math.PI) { return bij; } } }); if (bib && player.dmg) { if (bib) { bib = 65 || 80; if (bii.length) { let bil = bif ? 10 : 10; if (bht > bil && game.tick - bhr.antiTimer > 1) { bhr.canEmpAnti = true; bhr.antiTimer = game.tick; let bim = 4; if (bhr.shameCount < bim) { healer(); } else { big(bib); } } else { big(bib); } } else { big(bib); } }; }; }; if (inGame) { let bio = bhr.weapons[0] == 4 ? 2 : 5; let bip = bht >= (bif ? 8 : 20) && bhr.damageThreat >= 20; if (bip && bia && game.tick - bhr.antiTimer > 1) {} if (bip && bhz) { setTimeout(() => { healer(); }, 120); } if (bip && bhv && bhr.primaryIndex !== "4" && game.tick - bhr.antiTimer > 1); if (bht >= 20 && player.skinIndex == 11 && player.shameCount <= 3) { instaC.canCounter = true; } if (bht >= 0 && bht <= 66 && player.shameCount === 4 && bhr.primaryIndex !== "4") { bhz = true; bhv = false; bhw = false; bia = false; } else if (player.shameCount !== 4) { bhz = false; bhv = true; bia = true; } if (bht <= 66 && player.shameCount === 3 && bhr.primaryIndex !== "4") { bhv = false; } else if (player.shameCount !== 3) { bhv = true; } if (bht <= 66 && player.shameCount === 4 && bhr.primaryIndex !== "4") { bhw = true; } else if (player.shameCount !== 4) { bhw = false; } if (bht <= 66 && player.skinIndex != 6 && enemy.weaponIndex === 4) { game.tickBase(() => { healer1(); }, 2); } }; let biq = 100 - player.health; if (bht >= (bif ? 8 : 20) && bhr.damageThreat >= 20 && bia && game.tick - bhr.antiTimer > 1) { if (bhr.reloads[53] == 0 && bhr.reloads[bhr.weapons[1]] == 0) { bhr.canEmpAnti = true; } else { player.soldierAnti = true; } bhr.antiTimer = game.tick; let bir = bhr.weapons[0] == 4 ? 2 : 5; if (bhr.shameCount < bir) { healer(); } else { game.tickBase(() => { healer(); }, 2); } if (bht >= (bif ? 8 : 20) && bhr.damageThreat >= 20 && bhz) { setTimeout(() => { healer(); }, 120); } let bis = 100 - player.health; if (bht >= (bif ? 8 : 20) && bhr.damageThreat >= 20 && bhv && bhr.primaryIndex !== "4" && game.tick - bhr.antiTimer > 1) { if (bhr.reloads[53] == 0 && bhr.reloads[bhr.weapons[1]] == 0) { bhr.canEmpAnti = true; } else { player.soldierAnti = true; } bhr.antiTimer = game.tick; let bit = bhr.weapons[0] == 4 ? 2 : 5; if (bhr.shameCount < bit) { healer(); } else { game.tickBase(() => { healer(); }, 2); } } if (bht >= 20 && player.skinIndex == 11 && player.shameCount <= 3) { instaC.canCounter = true; } } else { game.tickBase(() => { healer(); }, 2); } } else { bhr.maxShameCount = Math.max(bhr.maxShameCount, bhr.shameCount); } } else if (!bhr.setPoisonTick && (bhr.damaged == 5 || bhr.latestTail == 13 && bhr.damaged == 2)) { bhr.setPoisonTick = true; } } if (nears.length && bhr.shameCount <= 5 && nears.some(biu => [9, 12, 17, 15].includes(bhs.weapon))) { if (near.reloads[near.secondaryIndex] == 0) { my.empAnti = true; my.soldierAnti = false; } else { my.soldierAnti = true; my.empAnti = false; } } } function killPlayer() { inGame = false; lastDeath = { x: player.x, y: player.y }; } function updateItemCounts(biv, biw) { if (player) { player.itemCounts[biv] = biw; updateItemCountDisplay(biv); } } function updateAge(bix, biy, biz) { var bjb = document.getElementById("ageText"); var bjc = document.getElementById("ageBarBody"); var bjd = document.getElementById("ageBarContainer"); document.getElementById("woodDisplay").style.display = "none"; document.getElementById("stoneDisplay").style.display = "none"; document.getElementById("foodDisplay").style.display = "none"; if (bix !== undefined) { player.XP = bix; } if (biy !== undefined) { player.maxXP = biy; } if (biz !== undefined) { player.age = biz; } if (player.age >= 9) { bjb.style.display = "none"; bjc.style.display = "block"; bjd.style.display = "block"; } else { bjb.style.display = "none"; bjc.style.display = "block"; bjd.style.display = "block"; bjb.innerHTML = "AGE " + player.age; bjc.style.width = player.XP / player.maxXP * 100 + "%"; } } function updateUpgrades(bje, bjf) { player.upgradePoints = bje; player.upgrAge = bjf; if (bje > 0) { tmpList.length = 0; UTILS.removeAllChildren(upgradeHolder); for (let bjh = 0; bjh < items.weapons.length; ++bjh) { if (items.weapons[bjh].age == bjf && (items.weapons[bjh].pre == undefined || player.weapons.indexOf(items.weapons[bjh].pre) >= 0)) { let bji = UTILS.generateElement({ id: "upgradeItem" + bjh, class: "actionBarItem", onmouseout: function() { showItemInfo(); }, parent: upgradeHolder }); bji.style.backgroundImage = getEl("actionBarItem" + bjh).style.backgroundImage; tmpList.push(bjh); } } for (let bjj = 0; bjj < items.list.length; ++bjj) { if (items.list[bjj].age == bjf && (items.list[bjj].pre == undefined || player.items.indexOf(items.list[bjj].pre) >= 0)) { let bjk = items.weapons.length + bjj; let bjl = UTILS.generateElement({ id: "upgradeItem" + bjk, class: "actionBarItem", onmouseout: function() { showItemInfo(); }, parent: upgradeHolder }); bjl.style.backgroundImage = getEl("actionBarItem" + bjk).style.backgroundImage; tmpList.push(bjk); } } for (let bjm = 0; bjm < tmpList.length; bjm++) { (function(bjn) { let bjp = getEl("upgradeItem" + bjn); bjp.onclick = UTILS.checkTrusted(function() { packet("H", bjn); }); UTILS.hookTouchEvents(bjp); if (getEl("autoUpgrade").checked) { let bjq = parseInt(getEl("autoUpgrade").checked); if (tmpList.length == 1) { packet("H", bjn); } else if (["17", "31", "23", bjq].find(bjr => bjp.id.includes(bjr))) { packet("H", bjn); } } })(tmpList[bjm]); } if (tmpList.length) { upgradeHolder.style.display = "block"; upgradeCounter.style.display = "block"; upgradeCounter.innerHTML = "SELECT ITEMS (" + bje + ")"; } else { upgradeHolder.style.display = "none"; upgradeCounter.style.display = "none"; showItemInfo(); } } else { upgradeHolder.style.display = "none"; upgradeCounter.style.display = "none"; showItemInfo(); } } function killObject(bjs) { let bju = gameObjects.find(acs => acs.sid == bjs); objectManager.disableBySid(bjs); if (player) { for (let bjv = 0; bjv < breakObjects.length; bjv++) { if (breakObjects[bjv].sid == bjs) { breakObjects.splice(bjv, 1); break; } } if (!player.canSee(bju)) { breakTrackers.push({ x: bju.x, y: bju.y }); } if (breakTrackers.length > 8) { breakTrackers.shift(); } traps.replacer(bju); } } function magnitude(bjw) { return Math.sqrt(bjw.x * bjw.x + bjw.y * bjw.y); } function vectorDifference(bjy, bjz) { return { x: bjz.x - bjy.x, y: bjz.y - bjy.y }; } function calculateAngleUsingDotProduct(bka, bkb) { let bkd = vectorDifference(bka, bkb); let bke = { x: Math.cos(player.dir), y: Math.sin(player.dir) }; let bkf = bke.x * bkd.x + bke.y * bkd.y; let bkg = magnitude(bke) * magnitude(bkd); let bkh = bkf / bkg; let bki = Math.acos(bkh); bki *= 180 / Math.PI; if (bki < 0) { bki += 360; } return bki; } function calculatePerfectAngle(bkj, bkk, bkl, bkm) { return Math.atan2(bkm - bkk, bkl - bkj); } function killObjects(bko) { if (player) { objectManager.removeAllItems(bko); } } function setTickout(bkp, bkq) { if (!ticks.manage[ticks.tick + bkq]) { ticks.manage[ticks.tick + bkq] = [bkp]; } else { ticks.manage[ticks.tick + bkq].push(bkp); } } function isAlly(bks, bkt) { tmpObj = players.find(acs => acs.sid == bks); if (!tmpObj) { return; } if (bkt) { let bkv = players.find(acs => acs.sid == bkt); if (!bkv) { return; } if (bkv.sid == bks) { return true; } else if (tmpObj.team) { if (tmpObj.team === bkv.team) { return true; } else { return false; } } else { return false; } } if (!tmpObj) { return; } if (player.sid == bks) { return true; } else if (tmpObj.team) { if (tmpObj.team === player.team) { return true; } else { return false; } } else { return false; } } function caf(bkw, bkx) { try { return Math.atan2((bkx.y2 || bkx.y) - (bkw.y2 || bkw.y), (bkx.x2 || bkx.x) - (bkw.x2 || bkw.x)); } catch (bkz) { return 0; } } let found = false; let autoQ = false; let autos = { insta: { todo: false, wait: false, count: 4, shame: 5 }, bull: false, antibull: 0, reloaded: false, stopspin: true }; let placeableSpikes = []; let placeableTraps = []; let placeableSpikesPREDICTS = []; function getDir(bla, blb) { try { return Math.atan2((blb.y2 || blb.y) - (bla.y2 || bla.y), (blb.x2 || blb.x) - (bla.x2 || bla.x)); } catch (blc) { return 0; } } const getDistance = (bld, ble, blf, blg) => { let bli = blf - bld; let blj = blg - ble; return Math.sqrt(bli * bli + blj * blj); }; const getPotentialDamage = (blk, bll) => { const bln = bll.weapons[1] === 10 && !player.reloads[bll.weapons[1]] ? 1 : 0; const blo = bll.weapons[bln]; if (player.reloads[blo]) { return 0; } const blp = items.weapons[blo]; const blq = getDistance(blk.x, blk.y, bll.x2, bll.y2) <= blk.getScale() + blp.range; if (bll.visible && blq) { return blp.dmg * (blp.sDmg || 1) * 3.3; } else { return 0; } }; const findPlacementAngle = (blr, bls, blt) => { if (!blt) { return null; } const blv = Math.PI * 2; const blw = Math.PI / 360; const blx = items.list[blr.items[bls]]; let bly = Math.atan2(blt.y - blr.y, blt.x - blr.x); let blz = blr.scale + (blx.scale || 1) + (blx.placeOffset || 0); for (let bma = 0; bma < blv; bma += blw) { let bmb = [(bly + bma) % blv, (bly - bma + blv) % blv]; for (let bmc of bmb) { let bmd = blr.x + blz * Math.cos(bmc); let bme = blr.y + blz * Math.sin(bmc); if (objectManager.customCheckItemLocation(bmd, bme, blx.scale, 0.6, blx.id, false, blr, blt, gameObjects, UTILS, config)) { return bmc; } } } return null; }; const AutoReplace = () => { const bmg = []; const bmh = player.x; const bmi = player.y; const bmj = gameObjects.length; for (let bmk = 0; bmk < bmj; bmk++) { const bml = gameObjects[bmk]; if (bml.isItem && bml.active && bml.health > 0) { let bmm = players.reduce((bmn, bmo) => bmn + getPotentialDamage(bml, bmo), 0); if (bml.health <= bmm) { bmg.push(bml); } } } const bmp = () => { let bmr = gameObjects.filter(bms => bms.trap && bms.active && bms.isTeamObject(player) && getDistance(bms.x, bms.y, bmh, bmi) <= bms.getScale() + 5); let bmt = gameObjects.find(bmu => bmu.dmg && bmu.active && bmu.isTeamObject(player) && getDistance(bmu.x, bmu.y, bmh, bmi) < 87 && !bmr.length); const bmv = bmt ? 4 : 2; bmg.forEach(bmw => { let bmx = findPlacementAngle(player, bmv, bmw); if (bmx !== null) { place(bmv, bmx); } }); }; const bmy = game.tickSpeed - (window.pingTime || 0) + (game.tickSpeed < 110 ? 15 : 15); if (near && near.dist2 <= 280) { let bmz = window.pingTime; if (bmz + 40 < window.pingTime) { bmz += 40; } else if (bmz + 25 < window.pingTime) { bmy += 25; } setTimeout(bmp, bmy); } }; let lastPos = { x: 0, y: 0 }; let mills = { x: undefined, y: undefined, size: function(bna) { return bna * 1.45; }, dist: function(bnb) { return bnb * 1.8; }, active: config.isSandbox ? false : false, count: 0 }; let laztPoz = {}; let oldXY = { x: undefined, y: undefined }; function notif2(bnc, bnd) { let bnf = document.getElementById("notification-container"); if (!bnf) { bnf = document.createElement("div"); bnf.id = "notification-container"; bnf.style.position = "fixed"; bnf.style.top = "10%"; bnf.style.left = "50%"; bnf.style.transform = "translateX(-50%)"; bnf.style.zIndex = "9999"; document.body.appendChild(bnf); } const bng = document.createElement("div"); bng.innerHTML = bnc + ": " + bnd; bng.style.fontSize = "1.5rem"; bng.style.color = "white"; bng.style.opacity = "0"; bng.style.transition = "opacity 0.5s ease-in-out"; bng.style.padding = "10px"; bng.style.backgroundColor = "rgba(0, 0, 0, 0.2)"; bng.style.borderRadius = "5px"; bng.style.boxShadow = "0 4px 6px rgba(0, 0, 0, 0.1)"; bng.style.marginBottom = "10px"; bnf.appendChild(bng); const bnh = new Audio("https://cdn.glitch.global/4c998580-5aaf-4a1a-8da3-e0c6b9f241a7/Audio_-_notification3_-_Creator_Store%20(1).mp3?v=1709582087126"); bnh.volume = 0.4; bnh.play(); setTimeout(function() { bng.style.opacity = "1"; }, 100); setTimeout(function() { bng.style.opacity = "0"; setTimeout(function() { bng.remove(); }, 500); }, 3000); } function notif(bnl, bnm) { let bno = player; let bnp = textManager; if (typeof bnl !== "undefined") { bnp.showText(bno.x, bno.y, 40, 0.18, 1000, bnl, "white"); } if (typeof bnm !== "undefined") { bnp.showText(bno.x, bno.y + 40, 30, 0.18, 1000, bnm, "white"); } } const safeWalk = () => { let bnr = false; let bns = null; let bnt = false; my.autoPush = false; pathFind.active = false; pathFind.chaseNear = false; const bnu = liztobj.sort((bnv, bnw) => Math.hypot(player.y2 - bnv.y, player.x2 - bnv.x) - Math.hypot(player.y2 - bnw.y, player.x2 - bnw.x)); const bnx = bnu.filter(bny => { return (bny.name === "spikes" || bny.name === "greater spikes" || bny.name === "spinning spikes" || bny.name === "poison spikes") && !isAlly(bny.owner.sid) && bny.owner.sid !== player.sid && fgdo(player, bny) < 250 && bny.active; }); const boa = { x: player.x2 + (player.x2 - lastPos.x) * 1.2 + Math.cos(player.moveDir) * 50, y: player.y2 + (player.y2 - lastPos.y) * 1.2 + Math.sin(player.moveDir) * 50 }; for (let boc = 0; boc < bnx.length; boc++) { if (fgdo(bnx[boc], boa) < bnx[boc].scale + player.scale + 3) { bnr = true; bns = bnx[boc]; break; } } const bod = () => { packet("D", Math.atan2(bns.y - player.y2, bns.x - player.x2)); }; const bof = () => { my.autoPush = false; pathFind.active = false; pathFind.chaseNear = false; selectWeapon(player.weapons[player.weapons[1] === 10 ? 1 : 0]); sendAutoGather(); buyEquip(40, 0); bod(); my.waitHit = 1; game.tickBase(() => { sendAutoGather(); my.waitHit = 0; }, 1); }; if (bnr && !traps.inTrap && !phantom.find(boi => boi.sid === bns.sid)) { if (player.reloads[player.weapons[0]] === 0 && !instaC.isTrue && !clicks.left && !clicks.right && player.reloads[player.weapons[1]] === 0) { bof(); }; packet("e"); my.autoPush = false; pathFind.active = false; pathFind.chaseNear = false; bnt = true; tracker.draw3.active = true; tracker.draw3.x = bns.x; tracker.draw3.y = bns.y; tracker.draw3.scale = bns.scale; if (getEl("notifs").checked) { notif("Stop!"); } } else { bnt = false; tracker.draw3.active = false; packet("9", lastMoveDir, 1); } lastPos.x = player.x2; lastPos.y = player.y2; }; function updatePlayers(boj) { safeWalk(); if (player.shameCount > 0) { my.reSync = true; } else { my.reSync = false; } if (player.shameCount > 4) { player.chat.message = "danger"; player.chat.count = 1000; } if (near.shameCount > 4) { near.chat.message = "killable"; near.chat.count = 1000; } if (tmpObj == player) { if (!mills.x || !oldXY.x) { mills.x = oldXY.x = tmpObj.x2; } if (!mills.y || !oldXY.y) { mills.y = oldXY.y = tmpObj.y2; } } if (textManager.stack.length) { let bol = []; let bom = []; let bon = 0; let boo = 0; let bop = { x: null, y: null }; let boq = { x: null, y: null }; textManager.stack.forEach(bor => { if (bor.value >= 0) { if (bon == 0) { bop = { x: bor.x, y: bor.y }; } bon += Math.abs(bor.value); } else { if (boo == 0) { boq = { x: bor.x, y: bor.y }; } boo += Math.abs(bor.value); } }); if (boo > 0) { textManager.showText(boq.x, boq.y, Math.max(45, Math.min(50, boo)), 0.18, 500, boo, "#8ecc51"); } if (bon > 0) { textManager.showText(bop.x, bop.y, Math.max(45, Math.min(50, bon)), 0.18, 500, bon, "#fff"); } textManager.stack = []; } if (runAtNextTick.length) { runAtNextTick.forEach(bou => { checkProjectileHolder(...bou); }); runAtNextTick = []; } function bov(boy) { let bpa = liztobj.sort((bpb, bpc) => Math.hypot(boy.y - bpb.y, boy.x - bpb.x) - Math.hypot(boy.y - bpc.y, boy.x - bpc.x)); let bpd = bpa.filter(bpe => bpe.dmg && cdf(player, bpe) < 200 && !bpe.isTeamObject(player) && bpe.active); let bpf = { x: boy.x + (player.oldPos.x2 - boy.x) * -2, y: boy.y + (player.oldPos.y2 - boy.y) * -2, x: player.x2 + (player.oldPos.x2 - player.x2) * -1, y: player.y2 + (player.oldPos.y2 - player.y2) * -1 }; let bpg = false; for (let bph = 0; bph < bpd.length; bph++) { if (cdf(bpf, bpd[bph]) < player.scale + bpd[bph].scale) { bpg = true; } } player.oldPos.x2 = boy.x2; player.oldPos.y2 = boy.y2; } game.tick++; enemy = []; nears = []; near = []; game.tickSpeed = performance.now() - game.lastTick; game.lastTick = performance.now(); players.forEach(bpi => { bpi.forcePos = !bpi.visible; bpi.visible = false; if (bpi.timeHealed - bpi.timeDamaged > 0 && bpi.lastshamecount < bpi.shameCount) { bpi.pinge = bpi.timeHealed - bpi.timeDamaged; } }); for (let bpk = 0; bpk < boj.length;) { tmpObj = players.find(acs => acs.sid == boj[bpk]); if (tmpObj) { tmpObj.t1 = tmpObj.t2 === undefined ? game.lastTick : tmpObj.t2; tmpObj.t2 = game.lastTick; tmpObj.oldPos.x2 = tmpObj.x2; tmpObj.oldPos.y2 = tmpObj.y2; tmpObj.x1 = tmpObj.x; tmpObj.y1 = tmpObj.y; tmpObj.x2 = boj[bpk + 1]; tmpObj.y2 = boj[bpk + 2]; tmpObj.x3 = tmpObj.x2 + (tmpObj.x2 - tmpObj.oldPos.x2); tmpObj.y3 = tmpObj.y2 + (tmpObj.y2 - tmpObj.oldPos.y2); tmpObj.d1 = tmpObj.d2 === undefined ? boj[bpk + 3] : tmpObj.d2; tmpObj.d2 = boj[bpk + 3]; tmpObj.dt = 0; tmpObj.buildIndex = boj[bpk + 4]; tmpObj.weaponIndex = boj[bpk + 5]; tmpObj.weaponVariant = boj[bpk + 6]; tmpObj.team = boj[bpk + 7]; tmpObj.isLeader = boj[bpk + 8]; tmpObj.oldSkinIndex = tmpObj.skinIndex; tmpObj.oldTailIndex = tmpObj.tailIndex; tmpObj.skinIndex = boj[bpk + 9]; tmpObj.tailIndex = boj[bpk + 10]; tmpObj.iconIndex = boj[bpk + 11]; tmpObj.zIndex = boj[bpk + 12]; tmpObj.visible = true; tmpObj.update(game.tickSpeed); tmpObj.dist2 = UTILS.getDist(tmpObj, player, 2, 2); tmpObj.aim2 = UTILS.getDirect(tmpObj, player, 2, 2); tmpObj.dist3 = UTILS.getDist(tmpObj, player, 3, 3); tmpObj.aim3 = UTILS.getDirect(tmpObj, player, 3, 3); tmpObj.damageThreat = 0; if (tmpObj.skinIndex == 45 && tmpObj.shameTimer <= 0) { tmpObj.addShameTimer(); } if (tmpObj.oldSkinIndex == 45 && tmpObj.skinIndex != 45) { tmpObj.shameTimer = 0; tmpObj.shameCount = 0; if (tmpObj == player) { healer(); } } botSkts.forEach(bpl => { bpl.showName = "YEAHHH"; }); for (let bpn = 0; bpn < players.length; bpn++) { for (let bpo = 0; bpo < botSkts.length; bpo++) { if (player.id === bpo.id) { bpo.showName = "YEAHHHHHH"; } } } if (player.shameCount < 3 && near.dist3 <= 300 && near.reloads[near.primaryIndex] <= game.tickRate * (window.pingTime >= 150 ? 2 : 1)) { autoQ = true; healer(); } else { if (autoQ) { healer(); } autoQ = false; } if (phantom.length > 0) { for (let bpp of phantom) { objectManager.disableBySid(bpp.sid); } phantom = []; } if (tmpObj == player) { if (liztobj.length) { liztobj.forEach(bpq => { bpq.onNear = false; if (bpq.active) { if (!bpq.onNear && UTILS.getDist(bpq, tmpObj, 0, 2) <= bpq.scale + items.weapons[tmpObj.weapons[0]].range) { bpq.onNear = true; } if (bpq.isItem && bpq.owner) { bpq.breakObj = true; breakObjects.push({ x: bpq.x, y: bpq.y, sid: bpq.sid }); } } }); let bps = liztobj.filter(bpt => bpt.trap && bpt.active && UTILS.getDist(bpt, tmpObj, 0, 2) <= tmpObj.scale + bpt.getScale() + 25 && !bpt.isTeamObject(tmpObj)).sort(function(bpu, bpv) { return UTILS.getDist(bpu, tmpObj, 0, 2) - UTILS.getDist(bpv, tmpObj, 0, 2); })[0]; if (bps) { let bpx = liztobj.filter(bpy => bpy.dmg && cdf(tmpObj, bpy) <= tmpObj.scale + bps.scale / 2 && !bpy.isTeamObject(tmpObj) && bpy.active)[0]; traps.dist = UTILS.getDist(bps, tmpObj, 0, 2); traps.aim = UTILS.getDirect(bpx ? bpx : bps, tmpObj, 0, 2); tracker.draw3.active = true; traps.protect(caf(bps, tmpObj) - Math.PI); traps.inTrap = true; traps.info = bps; } else { if (traps.inTrap) { Leuchtturm = true; setTimeout(() => { Leuchtturm = false; }, 240); } else { Leuchtturm = false; } traps.inTrap = false; traps.info = {}; } } else { tracker.draw3.active = false; traps.inTrap = false; } } if (tmpObj.weaponIndex < 9) { tmpObj.primaryIndex = tmpObj.weaponIndex; tmpObj.primaryVariant = tmpObj.weaponVariant; } else if (tmpObj.weaponIndex > 8) { tmpObj.secondaryIndex = tmpObj.weaponIndex; tmpObj.secondaryVariant = tmpObj.weaponVariant; } } bpk += 13; } if (runAtNextTick.length) { runAtNextTick.forEach(bpz => { checkProjectileHolder(...bpz); }); runAtNextTick = []; } for (let bqa = 0; bqa < boj.length;) { tmpObj = players.find(acs => acs.sid == boj[bqa]); if (tmpObj) { if (!tmpObj.isTeam(player)) { enemy.push(tmpObj); if (tmpObj.dist2 <= items.weapons[tmpObj.primaryIndex == undefined ? 5 : tmpObj.primaryIndex].range + player.scale * 2) { nears.push(tmpObj); } } tmpObj.manageReload(); if (tmpObj != player) { tmpObj.addDamageThreat(player); } } bqa += 13; } if (player && player.alive) { if (enemy.length) { near = enemy.sort(function(bqb, bqc) { return bqb.dist2 - bqc.dist2; })[0]; } else {} if (game.tickQueue[game.tick]) { game.tickQueue[game.tick].forEach(bqe => { bqe(); }); game.tickQueue[game.tick] = null; } if (advHeal.length) { advHeal.forEach(bqf => { if (window.pingTime < 150) { let bqh = bqf[0]; let bqi = bqf[1]; let bqj = 100 - bqi; let bqk = bqf[2]; tmpObj = players.find(acs => acs.sid == bqh); let bql = false; if (tmpObj && tmpObj.health <= 0) { if (!tmpObj.death) { tmpObj.death = true; if (tmpObj != player) { notif2("KILLED : ", tmpObj.name); } addDeadPlayer(tmpObj); } } if (tmpObj == player) { if (tmpObj.skinIndex == 7 && (bqk == 5 || tmpObj.latestTail == 13 && bqk == 2)) { if (my.reSync) { my.reSync = false; tmpObj.setBullTick = true; } bql = true; } if (inGame) { let bqm = getAttacker(bqk); let bqn = [0.25, 0.45].map(bqo => bqo * items.weapons[player.weapons[0]].dmg * soldierMult()); let bqp = enemy.length ? !bql && bqn.includes(bqk) && near.skinIndex == 11 : false; let bqq = 140 - window.pingTime; let bqr = 100 - player.health; let bqs = function(bqt, bqu) { if (!bqu) { setTimeout(() => { healer(); }, bqt); } else { game.tickBase(() => { healer(); }, 2); } }; if (getEl("healingBeta").checked) { if (enemy.length) { if ([0, 7, 8].includes(near.primaryIndex)) { if (bqk < 75) { bqs(bqq); } else { healer(); } } if (!Leuchtturm && bqk >= 20 && player.skinIndex == 6 && player.shameCount <= 4 && getEl("antiBullType").value == "abalway" && near.dist2 <= 150 && (player.weapons[0] == 4 || player.weapons[0] == 3) && near.primaryIndex != 5) { instaC.canCounter = true; } if (player.weapons[1] == 11) { if ([15, 9, 12, 13].includes(near.secondaryIndex) && near.reloads[near.secondaryIndex] == 1) { if (bqk < 75) { my.autoAim = true; selectWeapon(player.weapons[1]); bqs(bqq); setTimeout(() => { selectWeapon(player.weapons[0]); my.autoAim = false; }, 250); } } } else if (player.weapons[1] == 11) { if (near.skinIndex == 53) { my.autoAim = true; selectWeapon(player.weapons[1]); bqs(bqq); setTimeout(() => { selectWeapon(player.weapons[0]); my.autoAim = false; }, 250); } } if ([1, 2, 6].includes(near.primaryIndex)) { if (bqk >= 25 && player.damageThreat + bqr >= 95 && tmpObj.shameCount < 5) { healer(); } else { bqs(bqq); } } if (near.primaryIndex == 5 && near.secondaryIndex == 10 && traps.inTrap && bqr >= 10 && near.reloads[near.primaryIndex] == 0) { healer(); } if (near.primaryIndex == 3) { if (near.secondaryIndex == 15) { if (near.primaryVariant < 2) { if (bqk >= 35 && player.damageThreat + bqr >= 95 && tmpObj.shameCount < 6) { tmpObj.canEmpAnti = true; healer(); } else { bqs(bqq); } } else if (bqk > 35 && player.damageThreat + bqr >= 95 && tmpObj.shameCount < 6 && game.tick - player.antiTimer > 1) { tmpObj.canEmpAnti = true; tmpObj.antiTimer = game.tick; healer(); } else { bqs(bqq); } } else if (bqk >= 25 && player.damageThreat + bqr >= 95 && tmpObj.shameCount < 4) { healer(); } else { bqs(bqq); } } if (near.primaryIndex == 4) { if (near.primaryVariant >= 1) { if (bqk >= 10 && player.damageThreat + bqr >= 95 && tmpObj.shameCount < 4) { healer(); } else { bqs(bqq); } } else if (bqk >= 35 && player.damageThreat + bqr >= 95 && tmpObj.shameCount < 3) { healer(); } else { bqs(bqq); } } if ([undefined, 5].includes(near.primaryIndex)) { if (near.secondaryIndex == 10) { if (bqr >= (bqp ? 10 : 20) && tmpObj.damageThreat + bqr >= 80 && tmpObj.shameCount < 6) { healer(); } else { bqs(bqq); } } else if (near.primaryVariant >= 2 || near.primaryVariant == undefined) { if (bqr >= (bqp ? 15 : 20) && tmpObj.damageThreat + bqr >= 50 && tmpObj.shameCount < 6) { healer(); } else { bqs(bqq); } } else if ([undefined || 15].includes(near.secondaryIndex)) { if (bqk > (bqp ? 8 : 20) && player.damageThreat >= 25 && game.tick - player.antiTimer > 1) { if (tmpObj.shameCount < 5) { healer(); } else { bqs(bqq); } } else { bqs(bqq); } } else if ([9, 12, 13].includes(near.secondaryIndex)) { if (bqr >= 25 && player.damageThreat + bqr >= 70 && tmpObj.shameCount < 6) { healer(); } else { bqs(bqq); } } else if (bqk > 25 && player.damageThreat + bqr >= 95) { healer(); } else { bqs(bqq); } } if (near.primaryIndex == 6) { if (near.secondaryIndex == 15) { if (bqk >= 25 && tmpObj.damageThreat + bqr >= 95 && tmpObj.shameCount < 4) { healer(); } else { bqs(bqq); } } else if (bqk >= 70 && tmpObj.shameCount < 4) { healer(); } else { bqs(bqq); } } if (bqk >= 30 && near.reloads[near.secondaryIndex] == 0 && near.dist2 <= 150 && player.skinIndex == 11 && player.tailIndex == 21) { instaC.canCounter = true; } } else if (bqk >= 70) { healer(); } else { bqs(bqq); } } else { if (bqk >= (bqp ? 8 : 25) && bqr + player.damageThreat >= 80 && game.tick - player.antiTimer > 1) { if (tmpObj.reloads[53] == 0 && tmpObj.reloads[tmpObj.weapons[1]] == 0) { tmpObj.canEmpAnti = true; } else { player.soldierAnti = true; } tmpObj.antiTimer = game.tick; let bqx = [0, 4, 6, 7, 8].includes(near.primaryIndex) ? 2 : 5; if (tmpObj.shameCount < bqx) { healer(); } else if (near.primaryIndex == 7 || player.weapons[0] == 7 && (near.skinIndex == 11 || near.tailIndex == 21)) { bqs(bqq); } else { bqs(bqq, 1); } } else if (near.primaryIndex == 7 || player.weapons[0] == 7 && (near.skinIndex == 11 || near.tailIndex == 21)) { bqs(bqq); } else { bqs(bqq, 1); } if (bqk >= 25 && near.dist2 <= 140 && player.skinIndex == 11 && player.tailIndex == 21) { instaC.canCounter = true; } } } else if (!tmpObj.setPoisonTick && (tmpObj.damaged == 5 || tmpObj.latestTail == 13 && tmpObj.damaged == 2)) { tmpObj.setPoisonTick = true; } } } else { let [bqy, bqz, bra] = bqf; let brb = 100 - bqz; let brc = players.find(acs => acs.sid == bqy); let brd = false; if (brc == player) { if (brc.skinIndex == 7 && (bra == 5 || brc.latestTail == 13 && bra == 2)) { if (my.reSync) { my.reSync = false; brc.setBullTick = true; brd = true; } } if (inGame) { let bre = getAttacker(bra); let brf = [0.25, 0.45].map(brg => brg * items.weapons[player.weapons[0]].dmg * soldierMult()); let brh = enemy.length ? !brd && brf.includes(bra) && near.skinIndex == 11 : false; let bri = 60; let brj = 100 - player.health; let brk = [2, 5][ [0, 4, 6, 7, 8].includes(near.primaryIndex) ? 0 : 1 ]; let brl = function(brm, brn) { if (!brn) { setTimeout(() => healer(), brm); } else { game.tickBase(() => healer(), 2); } }; if (getEl("healingBeta").checked) { let brp = [0, 7, 8].includes(near.primaryIndex) ? bra < 75 : [1, 2, 6].includes(near.primaryIndex) ? bra >= 25 && player.damageThreat + brj >= 95 && brc.shameCount < 5 : [undefined, 5].includes(near.primaryIndex) ? brj >= (brh ? 15 : 20) && brc.damageThreat + brj >= 50 && brc.shameCount < 6 : near.primaryIndex == 3 && near.secondaryIndex == 15 ? bra >= 35 && player.damageThreat + brj >= 95 && brc.shameCount < 5 && game.tick - player.antiTimer > 1 : near.primaryIndex == 4 ? near.primaryVariant >= 1 ? bra >= 10 && player.damageThreat + brj >= 95 && brc.shameCount < 4 : bra >= 35 && player.damageThreat + brj >= 95 && brc.shameCount < 3 : near.primaryIndex == 6 && near.secondaryIndex == 15 ? bra >= 25 && brc.damageThreat + brj >= 95 && brc.shameCount < 4 : bra >= 25 && player.damageThreat + brj >= 95; if (brp) { healer(); } else { brl(bri); } } else { let brq = bra >= (brh ? 8 : 25) && brj + player.damageThreat >= 80 && game.tick - player.antiTimer > 1; if (brq) { if (brc.reloads[53] == 0 && brc.reloads[brc.weapons[1]] == 0) { brc.canEmpAnti = true; } else { player.soldierAnti = true; } brc.antiTimer = game.tick; if (brc.shameCount < brk) { healer(); } else { brl(bri, near.primaryIndex == 7 || player.weapons[0] == 7 && (near.skinIndex == 11 || near.tailIndex == 21) ? 0 : 1); } } else { brl(bri, near.primaryIndex == 7 || player.weapons[0] == 7 && (near.skinIndex == 11 || near.tailIndex == 21) ? 0 : 1); } } } else if (!brc.setPoisonTick && (brc.damaged == 5 || brc.latestTail == 13 && brc.damaged == 2)) { brc.setPoisonTick = true; } } } }); advHeal = []; } players.forEach(brr => { if (!brr.visible && player != brr) { brr.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 }; } if (brr.setBullTick) { brr.bullTimer = 0; } if (brr.setPoisonTick) { brr.poisonTimer = 0; } brr.updateTimer(); }); if (inGame) { if (enemy.length) { if (!instaC.isTrue && getEl("preTick").checked && my.anti0Tick <= 0) { let brt = knockBackPredict(); if (brt == "insta them" && (![9, 12, 13, 15].includes(player.weapons[1]) || near.dist2 <= items.weapons[player.weapons[1]].range + player.scale * 1.8)) { instaC.changeType(configs.revTick || player.weapons[1] == 10 ? "rev" : "normal"); if (getEl("notifs").checked) { notif("KBSpikeTick"); } } if (brt == "primary sync") { instaC.spikeTickType("rev"); } } let bru = gameObjects.filter(brv => brv.dmg && brv.active && brv.isTeamObject(player) && UTILS.getDist(brv, near, 0, 3) <= brv.scale + near.scale).sort(function(brw, brx) { return UTILS.getDist(brw, near, 0, 2) - UTILS.getDist(brx, near, 0, 2); })[0]; if (bru) { if (near.dist2 <= items.weapons[player.weapons[0]].range + player.scale * 1.8 && getEl("preTick").checked) { instaC.canSpikeTick = true; instaC.syncHit = true; if (getEl("notifs").checked) { notif("AKH"); } if (getEl("revTick").checked && player.weapons[1] == 15 && player.reloads[53] == 0 && instaC.perfCheck(player, near)) { instaC.revTick = true; if (getEl("notifs").checked) { notif("revTick"); } } } } let brz = undefined; let bsa = tmpObj.damaged; let bsb = gameObjects.filter(bsc => bsc.dmg && bsc.active && !bsc.isTeamObject(player) && UTILS.getDist(bsc, player, 0, 3) < bsc.scale + 40 + player.scale).sort(function(bsd, bse) { return UTILS.getDist(bsd, player, 0, 5) - UTILS.getDist(bse, player, 0, 5); })[0]; let bsg = bsb && brz <= 45 && near.primaryIndex == [5, 4, 3, 7]; let bsh = near.skinIndex == 7 && brz <= 60; let bsi = near.dist2 <= items.weapons[near.primaryIndex || 5].range + near.scale * 1.2; let bsj = near.skinIndex == 7; let bsk = near.primaryIndex == 5 && brz >= 45 && bsl(); let bsm = near.secondaryIndex == 0 && brz >= 10 && bsn(); let bso = near.primaryIndex == 3 && brz >= 30 && bsp(); let bsq = near.secondaryIndex == 15 && brz >= 30 && bsr(); let bss = near.secondaryIndex == 13 && brz && bst(); let bsu = near.primaryIndex == 5 && brz && bsv(); let bsw = near.secondaryIndex == 15 && brz && bsx(); let bsy = near.primaryIndex == 5 && brz >= 45 && bsz(); let bta = near.primaryIndex == 4 && brz >= 33 && btb(); let btc = near.secondaryIndex == 9 && brz >= 25 && btd(); let bte = [5, 7, 4, 3].includes(near.primaryIndex) && player.damageThreat && brz >= 20; let btf = btg; let bth = bsl; async function btg() { while (traps.inTrap) { await new Promise(btj => setTimeout(btj, 1)); if (bsb && brz >= 70 || bsb && bsa >= 70) { while (bsb && brz >= 70 || bsb && bsa >= 70) { await new Promise(btk => setTimeout(btk, 1)); if (brz <= 70 && !bsa) { return; } } } } } async function bst() { while (near.secondaryIndex == 13) { await new Promise(btm => setTimeout(btm, 1)); if (near.primaryIndex == 5 && near.secondaryIndex != 13 && brz >= 37) { return; } } } async function btd() { while (near.secondaryIndex == 9) { await new Promise(bto => setTimeout(bto, 1)); if (near.primaryIndex == 4 && near.secondaryIndex != 9 && brz >= 30) { return; } } } async function btb() { while (near.primaryIndex == 4) { await new Promise(btq => setTimeout(btq, 1)); if (near.secondaryIndex == 9 && near.primaryIndex != 4 && brz >= 18) { return; } } } async function bsl() { while (near.primaryIndex == 5) { await new Promise(bts => setTimeout(bts, 1)); if (near.secondaryIndex == 0 && near.primaryIndex != 5 && brz >= 5) { return; } } } async function bsn() { while (near.secondaryIndex == 0) { await new Promise(btu => setTimeout(btu, 1)); if (near.primaryIndex == 5 && near.secondaryIndex != 0 && brz >= 40) { return; } } } async function bsz() { while (near.primaryIndex == 5) { await new Promise(btw => setTimeout(btw, 1)); if (near.secondaryIndex == 15 && near.primaryIndex != 5 && brz >= 30) { return; } } } async function bsr() { while (near.secondaryIndex == 15) { await new Promise(bty => setTimeout(bty, 1)); if (near.primaryIndex == 3 && near.secondaryIndex != 15 && brz >= 20) { return; } } } async function bsp() { while (near.primaryIndex == 3) { await new Promise(bua => setTimeout(bua, 1)); if (near.secondaryIndex == 15 && near.primaryIndex != 3 && brz >= 37) { return; } } } async function bsv() { while (near.primaryIndex == 5) { await new Promise(buc => setTimeout(buc, 1)); if (near.secondaryIndex == 13 && near.primaryIndex != 5 && brz >= 30) { return; } } } async function bsx() { while (near.secondaryIndex == 15) { await new Promise(bue => setTimeout(bue, 1)); if (near.primaryIndex == 5 && near.secondaryIndex != 15 && brz >= 35) { return; } } } async function buf() { while (near.secondaryIndex == 0) { await new Promise(buh => setTimeout(buh, 1)); if (near.primaryIndex == 4 && near.secondaryIndex != 0 && brz >= 30) { return; } } } if (instaC.can && !traps.inTrap || traps.inTrap && player.skinIndex == 40) { if ([0].includes(near.secondaryIndex) && near.secondaryIndex == 0 && player.damageThreat && buf && brz >= 10 || bsj && [9].includes(near.secondaryIndex) && near.primaryIndex == 4 && player.damageThreat && btc && brz >= 10 || bsj && [4].includes(near.primaryIndex) && near.primaryIndex == 4 && player.damageThreat && bta && brz >= 33 || bsj && [4].includes(near.primaryIndex) && near.primaryIndex == 4 && player.damageThreat && bsl && brz >= 45 || [15].includes(near.secondaryIndex) && near.secondaryIndex == 15 && player.damageThreat && bsq && brz >= 30 || bsj && [3].includes(near.primaryIndex) && near.primaryIndex == 3 && player.damageThreat && bso && brz >= 30 || [0].includes(near.secondaryIndex) && near.secondaryIndex == 0 && player.damageThreat && bsm && brz >= 10 || bsj && [5].includes(near.primaryIndex) && near.primaryIndex == 5 && player.damageThreat && bsk && brz >= 45 || bsj && [5].includes(near.primaryIndex) && near.primaryIndex == 5 && player.damageThreat && bsu && brz >= 45 || [5].includes(near.primaryIndex) && near.primaryIndex == 5 && player.damageThreat && bsy && brz >= 45 || [15].includes(near.secondaryIndex) && near.secondaryIndex == 15 && player.damageThreat && bsw && brz >= 30 || [0].includes(near.secondaryIndex) && near.secondaryIndex == 13 && player.damageThreat && bst && brz >= 10) { autoQ = true; buyEquip(6, 0); } } let bui = gameObjects.filter(buj => buj.dmg && buj.active && !buj.isTeamObject(player) && UTILS.getDist(buj, player, 0, 3) < buj.scale + player.scale).sort(function(buk, bul) { return UTILS.getDist(buk, player, 0, 2) - UTILS.getDist(bul, player, 0, 2); })[0]; if (bui && !traps.inTrap) { if (near.dist2 <= items.weapons[5].range + near.scale * 1.8) { my.anti0Tick = 1; buyEquip(6, 0); } if (bui && traps.inTrap) { if (near.dist3 <= items.weapons[5].range + near.scale * 1.8) { my.anti0Tick = 4; buyEquip(6, 0); } } } } if ((useWasd ? true : (player.checkCanInsta(true) >= 100 ? player.checkCanInsta(true) : player.checkCanInsta(false)) >= (player.weapons[1] == 10 ? 95 : 100)) && near.dist2 <= items.weapons[player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]].range + near.scale * 1.8 && (instaC.wait || useWasd && Math.floor(Math.random() * 5) == 0) && !instaC.isTrue && !my.waitHit && player.reloads[player.weapons[0]] == 0 && player.reloads[player.weapons[1]] == 0 && (useWasd ? true(player.reloads[53] <= (player.weapons[1] == 10 ? 0 : game.tickRate)) : true) && instaC.perfCheck(player, near)) { if (player.checkCanInsta(true) >= 100) { instaC.nobull = useWasd ? false : instaC.canSpikeTick ? false : true; } else { instaC.nobull = false; } instaC.can = true; } else { instaC.can = false; } if (macro.q) { place(0, getAttackDir()); } if (macro.f) { place(4, getSafeDir()); } if (macro.v) { place(2, getSafeDir()); } if (macro.y) { place(5, getSafeDir()); } if (macro.h) { place(player.getItemType(22), getSafeDir()); } if (macro.n) { place(3, getSafeDir()); } laztPoz.x = player.x; laztPoz.y = player.y; let bun = mills.size(items.list[player.items[3]].scale); let buo = mills.dist(items.list[player.items[3]].scale); if (UTILS.getDist(mills, player, 0, 2) > buo + items.list[player.items[3]].placeOffset && game.tick % 2 == 0) { if (mills.place) { let bup = { x: mills.x, y: mills.y }; let buq = UTILS.getDirect(bup, player, 0, 2); checkPlace(3, buq + UTILS.toRad(bun)); checkPlace(3, buq - UTILS.toRad(bun)); checkPlace(3, buq); mills.count = Math.max(0, mills.count - 1); } mills.x = player.x2; mills.y = player.y2; } if (pads.placeSpawnPads) { for (let bur = 0; bur < Math.PI * 2; bur += Math.PI / 2) { checkPlace(player.getItemType(20), UTILS.getDirect(player.oldPos, player, 2, 2) + bur); } } if (instaC.can) { instaC.changeType(player.weapons[1] == 10 ? "rev" : "normal"); } if (getEl("smartInsta").checked) { if (player.weapons[1] == 15 || player.weapons[1] == 9 || player.weapons[1] == 12 || player.weapons[1] == 13) { if (getEl("AutoInsta").value == "smart") { if (near.shameCount >= 5 && player.reloads[player.weapons[0]] === 0 && !instaC.isTrue && !clicks.right && player.reloads[player.weapons[1]] === 0 && near.dist2 <= items.weapons[player.weapons[0]].range + player.scale * 1.8 && player.weapons[1] !== 10) { instaC.changeType(player.weapons[1] == 9 || player.weapons[1] == 12 || player.weapons[1] == 13 ? "rev" : "normal"); if (getEl("notifs").checked) { notif("AutoInsta:5 Shame"); } } } } if (getEl("AutoInsta").value == "always" && player.reloads[player.weapons[0]] === 0 && !instaC.isTrue && !clicks.right && player.reloads[player.weapons[1]] === 0 && near.dist2 <= items.weapons[player.weapons[0]].range + player.scale * 1.8 && player.weapons[1] !== 10) { instaC.changeType(player.weapons[1] == 9 || player.weapons[1] == 12 || player.weapons[1] == 13 ? "rev" : "normal"); } } if (instaC.canCounter && !Leuchtturm) { instaC.canCounter = false; if (player.reloads[player.weapons[0]] == 0 && !instaC.isTrue) { instaC.counterType(); } } if (instaC.canSpikeTick) { instaC.canSpikeTick = false; if (instaC.revTick) { instaC.revTick = false; if ([1, 2, 3, 4, 5, 6].includes(player.weapons[0]) && player.reloads[player.weapons[1]] == 0 && !instaC.isTrue) { instaC.changeType("rev"); } } else if ([1, 2, 3, 4, 5, 6].includes(player.weapons[0]) && player.reloads[player.weapons[0]] == 0 && !instaC.isTrue) { instaC.spikeTickType(); if (instaC.syncHit) {} } } if (!clicks.middle && (clicks.left || clicks.right) && !instaC.isTrue) { if (player.weaponIndex != (clicks.right && player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]) || player.buildIndex > -1) { selectWeapon(clicks.right && player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]); } if (player.reloads[clicks.right && player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]] == 0 && !my.waitHit) { sendAutoGather(); my.waitHit = 1; game.tickBase(() => { sendAutoGather(); my.waitHit = 0; }, 1); } } if (useWasd && !clicks.left && !clicks.right && !instaC.isTrue && near.dist2 <= items.weapons[player.weapons[0]].range + near.scale * 1.8 && !traps.inTrap) { if (player.weaponIndex != player.weapons[0] || player.buildIndex > -1) { selectWeapon(player.weapons[0]); } if (player.reloads[player.weapons[0]] == 0 && !my.waitHit) { sendAutoGather(); my.waitHit = 1; game.tickBase(() => { sendAutoGather(); my.waitHit = 0; }, 1); } new ver(); } if (traps.inTrap) { let buv = liztobj.sort((buw, bux) => fgdo(player, buw) - fgdo(player, bux)); let buz = buv.filter(bva => (bva.name == "spikes" || bva.name == "greater spikes" || bva.name == "spinning spikes" || bva.name == "poison spikes") && fgdo(player, bva) < player.scale + bva.scale + 20 && !isAlly(bva.owner.sid) && bva.active)[0]; if (!clicks.left && !clicks.right && !instaC.isTrue) { if (buz && player.weapons[1] === 10) { tracker.draw3.active = true; traps.aim = Math.atan2(buz.y - player.y, buz.x - player.x); } if (player.weaponIndex != (traps.notFast() ? player.weapons[1] : player.weapons[0]) || player.buildIndex > -1) { tracker.draw3.active = true; selectWeapon(traps.notFast() ? player.weapons[1] : player.weapons[0]); } if (player.reloads[traps.notFast() ? player.weapons[1] : player.weapons[0]] == 0 && !my.waitHit) { sendAutoGather(); my.waitHit = 1; game.tickBase(() => { sendAutoGather(); my.waitHit = 0; }, 1); } } } if (clicks.middle && !traps.inTrap) { if (!instaC.isTrue && player.reloads[player.weapons[1]] == 0) { if (my.ageInsta && player.weapons[0] != 4 && player.weapons[1] == 9 && player.age >= 9 && enemy.length) { instaC.bowMovement(); } else { instaC.rangeType(); } } } if (player.weapons[1] && !clicks.left && !clicks.right && !traps.inTrap && !instaC.isTrue && (!useWasd || !(near.dist2 <= items.weapons[player.weapons[0]].range + near.scale * 1.8))) { if (player.reloads[player.weapons[0]] == 0 && player.reloads[player.weapons[1]] == 0) { if (!my.reloaded) { my.reloaded = true; let bvc = items.weapons[player.weapons[0]].spdMult < items.weapons[player.weapons[1]].spdMult ? 1 : 0; if (player.weaponIndex != player.weapons[bvc] || player.buildIndex > -1) { selectWeapon(player.weapons[bvc]); } } } else { my.reloaded = false; if (useWasd) { autos.stopspin = false; } if (player.reloads[player.weapons[0]] > 0) { if (player.weaponIndex != player.weapons[0] || player.buildIndex > -1) { selectWeapon(player.weapons[0]); } } else if (player.reloads[player.weapons[0]] == 0 && player.reloads[player.weapons[1]] > 0) { if (player.weaponIndex != player.weapons[1] || player.buildIndex > -1) { selectWeapon(player.weapons[1]); } if (useWasd) { if (!autos.stopspin) { setTimeout(() => { autos.stopspin = true; }, 750); } } } } } if (!instaC.isTrue && !traps.inTrap && !traps.replaced) { traps.autoPlace(); } if (!macro.q && !macro.f && !macro.v && !macro.h && !macro.n) { packet("D", getAttackDir()); } let bve = function() { if (my.anti0Tick > 0 || Leuchtturm) { buyEquip(6, 0); } else if (clicks.left || clicks.right) { if ((player.shameCount > 0 && (game.tick - player.bullTick) % config.serverUpdateRate === 0 && player.skinIndex != 45 || my.reSync) && (near && near.dist2 > 140 || !near)) { buyEquip(7, 0); } else if (clicks.left) { buyEquip(player.reloads[player.weapons[0]] == 0 ? getEl("weaponGrind").checked ? 40 : 7 : player.empAnti ? 22 : player.soldierAnti ? 6 : getEl("antiBullType").value == "abreload" && near.antiBull > 0 ? 6 : near.dist2 <= 275 ? getEl("antiBullType").value == "abalway" && near.reloads[near.primaryIndex] == 0 && (player.weapons[0] == 4 || player.weapons[0] == 3) && near.primaryIndex != 5 ? 6 : 6 : 6, 0); } else if (clicks.right) { buyEquip(player.reloads[clicks.right && player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]] == 0 ? 40 : player.empAnti ? 22 : player.soldierAnti ? 6 : getEl("antiBullType").value == "abreload" && near.antiBull > 0 ? 6 : near.dist2 <= 275 ? getEl("antiBullType").value == "abalway" && near.reloads[near.primaryIndex] == 0 && (player.weapons[0] == 4 || player.weapons[0] == 3) && near.primaryIndex != 5 ? 6 : 6 : biomeGear(1, 1), 0); } } else if (traps.inTrap) { if (traps.info.health <= items.weapons[player.weaponIndex].dmg ? false : player.reloads[player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]] == 0) { buyEquip(40, 0); } else if ((player.shameCount > 0 && (game.tick - player.bullTick) % config.serverUpdateRate === 7 || 0 && player.skinIndex != 45 || my.reSync) && (near && near.dist2 > 140 || !near)) { buyEquip(6, 0); setTimeout(() => { buyEquip(7, 0); }, 120); } else { buyEquip(player.empAnti || near.dist2 > 300 || !enemy.length ? 22 : 6, 0); } } else if (player.empAnti || player.soldierAnti) { buyEquip(player.empAnti ? 22 : 6, 0); } else if ((player.shameCount > 0 && (game.tick - player.bullTick) % config.serverUpdateRate === 0 && player.skinIndex != 45 || my.reSync) && (near && near.dist2 > 140 || !near)) { buyEquip(7, 0); setTimeout(() => { buyEquip(7, 0); }, 120); } else if (near.dist2 <= 275) { buyEquip(getEl("antiBullType").value == "abreload" && near.antiBull > 0 ? 6 : getEl("antiBullType").value == "abalway" && near.reloads[near.primaryIndex] == 0 ? 6 : 6, 0); } else { biomeGear(1); } }; let bvg = function() { if (instaC.can && player.checkCanInsta(true) >= 100) { buyEquip(21, 1); } else if (clicks.left) { setTimeout(() => { buyEquip(21, 1); }, 100); } else if (clicks.right) { setTimeout(() => { buyEquip(21, 1); }, 50); } else if (near.dist2 <= 350 && !traps.inTrap) { buyEquip(19, 1); } else if (traps.inTrap) { buyEquip(21, 1); } else { buyEquip(11, 1); } }; let bvi = function() { if (my.anti0Tick > 0) { buyEquip(6, 0); } else if (clicks.left || clicks.right) { if (player.shameCount > 4320 && (game.tick - player.bullTick) % config.serverUpdateRate === 0 && player.skinIndex != 45 || my.reSync) { buyEquip(7, 0); } else if (clicks.left) { buyEquip(player.reloads[player.weapons[0]] == 0 ? getEl("weaponGrind").checked ? 40 : 7 : 11); } else if (clicks.right) { buyEquip(player.reloads[clicks.right && player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]] == 0 ? 40 : player.empAnti ? 22 : 6, 0); } } else if (near.dist2 <= items.weapons[player.weapons[0]].range + near.scale * 1.8 && !traps.inTrap) { if (player.shameCount > 4320 && (game.tick - player.bullTick) % config.serverUpdateRate === 0 && player.skinIndex != 45 || my.reSync) { buyEquip(7, 0); } else { buyEquip(player.reloads[player.weapons[0]] == 0 ? 7 : player.empAnti ? 22 : 6, 0); } } else if (traps.inTrap) { if (traps.info.health <= items.weapons[player.weaponIndex].dmg ? false : player.reloads[player.weapons[1] == 10 ? player.weapons[1] : player.weapons[0]] == 0) { buyEquip(40, 0); } else if (player.shameCount > 4320 && (game.tick - player.bullTick) % config.serverUpdateRate === 0 && player.skinIndex != 45 || my.reSync) { buyEquip(7, 0); } else { buyEquip(player.empAnti ? 22 : 6, 0); } } else if (player.empAnti) { buyEquip(22, 0); } else if (player.shameCount > 4320 && (game.tick - player.bullTick) % config.serverUpdateRate === 0 && player.skinIndex != 45 || my.reSync) { buyEquip(7, 0); } else { buyEquip(6, 0); } if (clicks.left || clicks.right) { if (clicks.left) { setTimeout(() => { buyEquip(0, 1); }, 50); } else if (clicks.right) { buyEquip(11, 1); } } else if (near.dist2 <= items.weapons[player.weapons[0]].range + near.scale * 1.8 && !traps.inTrap) { buyEquip(0, 1); } else if (traps.inTrap) { buyEquip(0, 1); } else { buyEquip(11, 1); } }; if (near.weaponIndex > 1 && near.dist2 <= 150) { buyEquip(6, 0); } if (storeMenu.style.display != "block" && !instaC.isTrue && !instaC.ticking) { if (useWasd) { bvi(); } else { bve(); bvg(); } } if (player.alive && inGame && getEl("safeWalk").checked) { safeWalk(); } if (getEl("autoPush").checked && enemy.length && !traps.inTrap && !instaC.ticking) { autoPush(); } else if (my.autoPush) { my.autoPush = false; packet("9", lastMoveDir || undefined, 1); } if (!my.autoPush && pathFind.active) { Pathfinder(); } instaC.ticking &&= false; instaC.syncHit &&= false; player.empAnti &&= false; player.soldierAnti &&= false; if (my.anti0Tick > 0) { my.anti0Tick--; } traps.replaced &&= false; traps.antiTrapped &&= false; } } if (botSkts.length) { botSkts.forEach(bvk => { if (true) { bvk[0].showName = "YEAHHH"; } }); } AutoReplace(); } for (var i1 = 0; i1 < liztobj.length; i1++) { if (liztobj[i1].active && liztobj[i1].health > 0 && UTILS.getDist(liztobj[i1], player, 0, 2) < 150 && getEl("antipush").checked) { tracker.draw3.active = true; if (liztobj[i1].name.includes("spike") && liztobj[i1]) { tracker.draw3.active = true; if (liztobj[i1].owner.sid != player.sid && clicks.left == false && tmpObj.reloads[tmpObj.secondaryIndex] == 0) { tracker.draw3.active = true; selectWeapon(player.weapons[1]); buyEquip(40, 0); packet("D", UTILS.getDirect(liztobj[i1], player, 0, 2)); setTickout(() => { buyEquip(6, 0); }, 1); } } }; } function ez(bvm, bvn, bvo) { bvm.fillStyle = "rgba(0, 255, 255, 0.2)"; bvm.beginPath(); bvm.arc(bvn, bvo, 55, 0, Math.PI * 2); bvm.fill(); bvm.closePath(); bvm.globalAlpha = 1; } var leaderboard = getEl("leaderboard"); function updateLeaderboard(bvq) { lastLeaderboardData = bvq; UTILS.removeAllChildren(leaderboardData); let bvs = 1; for (let bvt = 0; bvt < bvq.length; bvt += 3) { (function(bvu) { UTILS.generateElement({ class: "leaderHolder", parent: leaderboardData, children: [UTILS.generateElement({ class: "leaderboardItem", style: "font-family: 'Hammersmith One', cursive; color:" + (bvq[bvu] == playerSID ? "#fff" : "rgba(255,255,255,0.6)") + "; font-size: 16px;", text: bvq[bvu + 1] != "" ? bvq[bvu + 1] + " " : "unknown" }), UTILS.generateElement({ class: "leaderScore", style: "font-family: 'Hammersmith One', cursive; font-size: 16px; color: #fff;", text: UTILS.sFormat(bvq[bvu + 2]) || "0" })] }); })(bvt); bvs++; } } $("#leaderboard").css({ "-webkit-border-radius": "0px", "-moz-border-radius": "0px", "border-radius": "15px", "background-color": "transparent", "box-shadow": "0 0 5px 2px rgba(255,255,255,0.6)", "text-align": "center" }); var leaderboardElement = document.getElementById("leaderboard"); leaderboardElement.style.position = "fixed"; leaderboardElement.style.top = "10px"; leaderboardElement.style.right = "10px"; var killCounterElement = document.getElementById("killCounter"); killCounterElement.style.position = "fixed"; killCounterElement.style.bottom = "220px"; killCounterElement.style.left = "20px"; killCounterElement.style.width = "25px"; var allianceButton = getEl("allianceButton"); var storeButton = getEl("storeButton"); allianceButton.style.right = "330px"; allianceButton.style.width = "40px"; storeButton.style.right = "270px"; storeButton.style.width = "40px"; function loadGameObject(bvw) { for (let bvy = 0; bvy < bvw.length;) { objectManager.add(bvw[bvy], bvw[bvy + 1], bvw[bvy + 2], bvw[bvy + 3], bvw[bvy + 4], bvw[bvy + 5], items.list[bvw[bvy + 6]], true, bvw[bvy + 7] >= 0 ? { sid: bvw[bvy + 7] } : null); bvy += 8; } } function loadAI(bvz) { for (let bwb = 0; bwb < ais.length; ++bwb) { ais[bwb].forcePos = !ais[bwb].visible; ais[bwb].visible = false; } if (bvz) { let bwc = performance.now(); for (let bwd = 0; bwd < bvz.length;) { tmpObj = ais.find(acs => acs.sid == bvz[bwd]); if (tmpObj) { tmpObj.index = bvz[bwd + 1]; tmpObj.t1 = tmpObj.t2 === undefined ? bwc : tmpObj.t2; tmpObj.t2 = bwc; tmpObj.x1 = tmpObj.x; tmpObj.y1 = tmpObj.y; tmpObj.x2 = bvz[bwd + 2]; tmpObj.y2 = bvz[bwd + 3]; tmpObj.d1 = tmpObj.d2 === undefined ? bvz[bwd + 4] : tmpObj.d2; tmpObj.d2 = bvz[bwd + 4]; tmpObj.health = bvz[bwd + 5]; tmpObj.dt = 0; tmpObj.visible = true; } else { tmpObj = aiManager.spawn(bvz[bwd + 2], bvz[bwd + 3], bvz[bwd + 4], bvz[bwd + 1]); tmpObj.x2 = tmpObj.x; tmpObj.y2 = tmpObj.y; tmpObj.d2 = tmpObj.dir; tmpObj.health = bvz[bwd + 5]; if (!aiManager.aiTypes[bvz[bwd + 1]].name) { tmpObj.name = config.cowNames[bvz[bwd + 6]]; } tmpObj.forcePos = true; tmpObj.sid = bvz[bwd]; tmpObj.visible = true; } bwd += 7; } } } function animateAI(bwe) { tmpObj = ais.find(acs => acs.sid == bwe); if (tmpObj) { tmpObj.startAnim(); } } function gatherAnimation(bwf, bwg, bwh) { tmpObj = players.find(acs => acs.sid == bwf); if (tmpObj) { tmpObj.startAnim(bwg, bwh); tmpObj.gatherIndex = bwh; tmpObj.gathering = 1; if (near.dist2 >= 150 && near.dist2 <= 300 && !tmpObj.isTeam(player) && tmpObj.weaponIndex === 5 && tmpObj.primaryVariant >= 1 && !tmpObj.secondaryIndex !== undefined && tmpObj.skinIndex === 53 && (player.canEmpAnti = true)) { buyEquip(6, 0); healer(); } if (bwg) { let bwj = objectManager.hitObj; objectManager.hitObj = []; game.tickBase(() => { tmpObj = players.find(acs => acs.sid == bwf); let bwl = items.weapons[bwh].dmg * config.weaponVariants[tmpObj[(bwh < 9 ? "prima" : "seconda") + "ryVariant"]].val * (items.weapons[bwh].sDmg || 1) * (tmpObj.skinIndex == 40 ? 3.3 : 1); bwj.forEach(bwm => { bwm.health -= bwl; if (getEl("dmgtext").checked) { const bwo = Math.floor(Math.random() * 128) + 128; const bwp = Math.floor(Math.random() * 128) + 128; const bwq = Math.floor(Math.random() * 128) + 128; const bwr = "rgb(" + bwo + ", " + bwp + ", " + bwq + ")"; textManager.showText(bwm.x, bwm.y, 30, 0.1, 400, Math.round(bwl), bwr); } }); }, 1); } } } if (nears.filter(bws => bws.gathering).length > 1) { healer(); } function wiggleGameObject(bwt, bwu) { tmpObj = gameObjects.find(acs => acs.sid == bwu); if (tmpObj) { tmpObj.xWiggle += config.gatherWiggle * Math.cos(bwt); tmpObj.yWiggle += config.gatherWiggle * Math.sin(bwt); if (tmpObj.health) { tmpObj.damaged = Math.min(255, tmpObj.damaged + 60); objectManager.hitObj.push(tmpObj); } } } function shootTurret(bww, bwx) { tmpObj = gameObjects.find(acs => acs.sid == bww); if (tmpObj) { if (config.anotherVisual) { tmpObj.lastDir = bwx; } else { tmpObj.dir = bwx; } tmpObj.xWiggle += config.gatherWiggle * Math.cos(bwx + Math.PI); tmpObj.yWiggle += config.gatherWiggle * Math.sin(bwx + Math.PI); } } function updatePlayerValue(bwz, bxa, bxb) { if (player) { player[bwz] = bxa; if (bwz == "points") { if (getEl("autoBuy").checked) { autoBuy.hat(); autoBuy.acc(); } } else if (bwz == "kills") {} } } function updateItems(bxf, bxg) { if (bxf) { if (bxg) { player.weapons = bxf; player.primaryIndex = player.weapons[0]; player.secondaryIndex = player.weapons[1]; if (!instaC.isTrue) { selectWeapon(player.weapons[0]); } } else { player.items = bxf; } } for (let bxi = 0; bxi < items.list.length; bxi++) { let bxj = items.weapons.length + bxi; let bxk = getEl("actionBarItem" + bxj); bxk.style.display = player.items.indexOf(items.list[bxi].id) >= 0 ? "inline-block" : "none"; } for (let bxl = 0; bxl < items.weapons.length; bxl++) { let bxm = getEl("actionBarItem" + bxl); bxm.style.display = player.weapons[items.weapons[bxl].type] == items.weapons[bxl].id ? "inline-block" : "none"; } let bxn = player.weapons[0] == 3 && player.weapons[1] == 15; if (bxn) { getEl("actionBarItem3").style.display = "none"; getEl("actionBarItem4").style.display = "inline-block"; } } function addProjectile(bxo, bxp, bxq, bxr, bxs, bxt, bxu, bxv) { projectileManager.addProjectile(bxo, bxp, bxq, bxr, bxs, bxt, null, null, bxu, inWindow).sid = bxv; runAtNextTick.push(Array.prototype.slice.call(arguments)); } function remProjectile(bxx, bxy) { for (let bya = 0; bya < projectiles.length; ++bya) { if (projectiles[bya].sid == bxx) { projectiles[bya].range = bxy; let byb = objectManager.hitObj; objectManager.hitObj = []; game.tickBase(() => { let byd = projectiles[bya].dmg; byb.forEach(bye => { if (bye.projDmg) { bye.health -= byd; } }); }, 1); } } } let noob = false; let serverReady = true; var isProd = location.hostname !== "127.0.0.1" && !location.hostname.startsWith("192.168."); let wssws = isProd ? "wss" : "ws"; let project = new WebSocket(wssws + "://beautiful-sapphire-toad.glitch.me"); let withSync = true; project.binaryType = "arraybuffer"; project.onmessage = function(byg) { let byi = byg.data; if (byi == "isready") { serverReady = true; } if (byi == "fine") { noob = false; } if (byi == "tezt") {} if (byi == "yeswearesyncer") { let byj = Date.now() - wsDelay; withSync = true; if (player) {} } }; function allianceNotification(byk, byl) { let bym = bots.find(acs => acs.sid == byk); if (bym) {} } function setPlayerTeam(byn, byo) { if (player) { player.team = byn; player.isOwner = byo; if (byn == null) { alliancePlayers = []; } } } function setAlliancePlayers(byq) { alliancePlayers = byq; } function updateStoreItems(byr, bys, byt) { if (byt) { if (!byr) { player.tails[bys] = 1; } else { player.latestTail = bys; } } else if (!byr) { player.skins[bys] = 1; if (bys == 7) { my.reSync = true; } } else { player.latestSkin = bys; } } function isTeam(byv) { return byv == player || byv.team && byv.team == player.team; } function receiveChat(byx, byy, byz) { let bzb = players.find(acs => acs.sid == byx); let bzc = ["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"]; if (player == bzb) { if (byy.includes(".dc")) { setTimeout(() => { window.leave(); }, 50); } else if (byy.startsWith(".create")) { let bze = byy.split(" ")[1]; if (!bze) { bze = "1l1l1l1l1l1l1l"; } packet("L", bze); } else if (byy.includes(".leave")) { packet("N"); } } if (getEl("autoSync").checked) { if (isTeam(bzb) || player == bzb) { if (byy.includes(".sync") && !instaC.isTrue && player.reloads[player.weapons[1]] == 0 && player.reloads[player.weapons[0]] == 0) { instaC.syncTry(); } } } if (byy.includes("dc moonrocks")) { window.leave(); } if (getEl("autorespond").checked) { if (byy.includes("mod")) {} } if (bzb) { if (!config.anotherVisual) { allChats.push(new addCh(bzb.x, bzb.y, byy, bzb)); } else { bzb.chatMessage = (bzf => { let bzh; bzc.forEach(bzi => { if (bzf.indexOf(bzi) > -1) { bzh = ""; for (var bzk = 0; bzk < bzi.length; ++bzk) { bzh += bzh.length ? "o" : "M"; } var bzl = new RegExp(bzi, "g"); bzf = bzf.replace(bzl, bzh); } }); return bzf; })(byy); bzb.chatCountdown = config.chatCountdown; } } else {} } function updateMinimap(bzm) { minimapData = bzm; } function showText(bzn, bzo, bzp, bzq, bzr) { if (getEl("healAnim").checked) { textManager.stack.push({ x: bzn, y: bzo, value: bzp }); } } let bots = []; let ranLocation = { x: UTILS.randInt(35, 14365), y: UTILS.randInt(35, 14365) }; setInterval(() => { ranLocation = { x: UTILS.randInt(35, 14365), y: UTILS.randInt(35, 14365) }; }, 60000); class Bot { constructor(bzu, bzv, bzw, bzx) { this.millPlace = true; this.id = bzu; this.sid = bzv; this.team = null; this.skinIndex = 0; this.tailIndex = 0; this.hitTime = 0; this.iconIndex = 0; this.enemy = []; this.near = []; this.dist2 = 0; this.aim2 = 0; this.tick = 0; this.itemCounts = {}; this.latestSkin = 0; this.latestTail = 0; this.points = 0; this.tails = {}; for (let bzz = 0; bzz < bzx.length; ++bzz) { if (bzx[bzz].price <= 0) { this.tails[bzx[bzz].id] = 1; } } this.skins = {}; for (let caa = 0; caa < bzw.length; ++caa) { if (bzw[caa].price <= 0) { this.skins[bzw[caa].id] = 1; } } this.spawn = function(cab) { this.upgraded = 0; this.enemy = []; this.near = []; 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.autoGather = 0; this.animTime = 0; this.animSpeed = 0; this.mouseState = 0; this.buildIndex = -1; this.weaponIndex = 0; 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.zIndex = 0; this.xVel = 0; this.yVel = 0; this.slowMult = 1; this.dir = 0; this.nDir = 0; this.dirPlus = 0; this.targetDir = 0; this.targetAngle = 0; this.maxHealth = 100; this.health = this.maxHealth; this.oldHealth = this.maxHealth; this.scale = config.playerScale; this.speed = config.playerSpeed; this.resetMoveDir(); this.resetResources(cab); this.items = [0, 3, 6, 10]; this.weapons = [0]; this.shootCount = 0; this.weaponXP = []; this.isBot = false; 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.timeZinceZpawn = 0; this.whyDie = ""; this.clearRadius = false; this.circlee = 0; }; this.resetMoveDir = function() { this.moveDir = undefined; }; this.resetResources = function(cae) { for (let cah = 0; cah < config.resourceTypes.length; ++cah) { this[config.resourceTypes[cah]] = cae ? 100 : 0; } }; this.setData = function(cai) { this.id = cai[0]; this.sid = cai[1]; this.name = cai[2]; this.x = cai[3]; this.y = cai[4]; this.dir = cai[5]; this.health = cai[6]; this.maxHealth = cai[7]; this.scale = cai[8]; this.skinColor = cai[9]; }; this.judgeShame = function() { if (this.oldHealth < this.health) { if (this.hitTime) { let cal = this.tick - this.hitTime; this.hitTime = 0; if (cal < 2) { this.lastshamecount = this.shameCount; this.shameCount++; } else { this.lastshamecount = this.shameCount; this.shameCount = Math.max(0, this.shameCount - 2); } } } else if (this.oldHealth > this.health) { this.hitTime = this.tick; } }; this.manageReloadaa = function() { if (this.shooting[53]) { this.shooting[53] = 0; this.reloads[53] = 2388.8888888888887; } else if (this.reloads[53] > 0) { this.reloads[53] = Math.max(0, this.reloads[53] - 111.11111111111111); } 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.shooting[1]) { this.shooting[1] = 0; this.reloads[this.shootIndex] = items.weapons[this.shootIndex].speed * (this.skinIndex == 20 ? 0.78 : 1); this.attacked = true; } } 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); } } } }; this.closeSockets = function(cao) { cao.close(); }; this.whyDieChat = function(caq, car) {}; } }; class BotObject { constructor(cat) { this.sid = cat; this.init = function(cav, caw, cax, cay, caz, cba, cbb) { cba = cba || {}; this.active = true; this.x = cav; this.y = caw; this.scale = cay; this.owner = cbb; this.id = cba.id; this.dmg = cba.dmg; this.trap = cba.trap; this.teleport = cba.teleport; this.isItem = this.id != undefined; }; } }; class BotObjManager { constructor(cbd, cbe) { this.disableObj = function(cbg) { cbg.active = false; if (config.anotherVisual) {} else { cbg.alive = false; } }; let cbi; this.add = function(cbj, cbk, cbl, cbm, cbn, cbo, cbp, cbq, cbr) { cbi = cbe(cbj); if (!cbi) { cbi = cbd.find(cbt => !cbt.active); if (!cbi) { cbi = new BotObject(cbj); cbd.push(cbi); } } if (cbq) { cbi.sid = cbj; } cbi.init(cbk, cbl, cbm, cbn, cbo, cbp, cbr); }; this.disableBySid = function(cbu) { let cbw = cbe(cbu); if (cbw) { this.disableObj(cbw); } }; this.removeAllItems = function(cbx, cby) { cbd.filter(cca => cca.active && cca.owner && cca.owner.sid == cbx).forEach(ccb => this.disableObj(ccb)); }; } }; let botz = []; function botSpawn(ccd) { let ccf; console.log(WS); let ccg = WS.url.split("wss://")[1].split("?")[0]; ccf = ccd && new WebSocket("wss://" + ccg + "?token=re:" + encodeURIComponent(ccd)); let cch = new Map(); botSkts.push([cch]); botz.push([ccf]); let cci; let ccj = []; let cck = []; let ccl = { x: 0, y: 0, inGame: false, closeSocket: false, whyDie: "" }; let ccm = { x: 0, y: 0 }; let ccn = 0; let cco = new BotObjManager(ccj, function(ccp) { return ccj.find(acs => acs.sid == ccp); }); ccf.binaryType = "arraybuffer"; ccf.first = true; ccf.sendWS = function(ccq) { let ccs = Array.prototype.slice.call(arguments, 1); let cct = window.msgpack.encode([ccq, ccs]); ccf.send(cct); }; ccf.spawn = function() { ccf.sendWS("M", { name: "unknown1l", moofoll: 1, skin: "__proto__" }); }; ccf.sendUpgrade = function(ccv) { ccf.sendWS("H", ccv); }; ccf.place = function(ccw, ccx) { try { let ccz = items.list[cch.items[ccw]]; if (cch.itemCounts[ccz.group.id] == undefined ? true : cch.itemCounts[ccz.group.id] < (config.isSandbox ? 296 : ccz.group.limit ? ccz.group.limit : 296)) { ccf.sendWS("Z", cch.items[ccw]); ccf.sendWS("F", 1, ccx); ccf.sendWS("Z", cch.weaponIndex, true); } } catch (cda) {} }; ccf.buye = function(cdb, cdc) { let cde = 0; if (cch.alive && cch.inGame) { if (cdc == 0) { if (cch.skins[cdb]) { if (cch.latestSkin != cdb) { ccf.sendWS("c", 0, cdb, 0); } } else { let cdg = findID(hats, cdb); if (cdg) { if (cch.points >= cdg.price) { ccf.sendWS("c", 1, cdb, 0); ccf.sendWS("c", 0, cdb, 0); } else if (cch.latestSkin != cde) { ccf.sendWS("c", 0, cde, 0); } } else if (cch.latestSkin != cde) { ccf.sendWS("c", 0, cde, 0); } } } else if (cdc == 1) { if (cch.tails[cdb]) { if (cch.latestTail != cdb) { ccf.sendWS("c", 0, cdb, 1); } } else { let cdh = findID(accessories, cdb); if (cdh) { if (cch.points >= cdh.price) { ccf.sendWS("c", 1, cdb, 1); ccf.sendWS("c", 0, cdb, 1); } else if (cch.latestTail != 0) { ccf.sendWS("c", 0, 0, 1); } } else if (cch.latestTail != 0) { ccf.sendWS("c", 0, 0, 1); } } } } }; ccf.fastGear = function() { if (cch.y2 >= config.mapScale / 2 - config.riverWidth / 2 && cch.y2 <= config.mapScale / 2 + config.riverWidth / 2) { ccf.buye(31, 0); } else if (cch.moveDir == undefined) { ccf.buye(22, 0); } else if (cch.y2 <= config.snowBiomeTop) { ccf.buye(15, 0); } else { ccf.buye(12, 0); } }; ccf.selectWeapon = function(cdj) { packet("z", cdj, 1); }; function cdk(cdl, cdm) { try { return Math.atan2((cdm.y2 || cdm.y) - (cdl.y2 || cdl.y), (cdm.x2 || cdm.x) - (cdl.x2 || cdl.x)); } catch (cdp) { return 0; } } ccf.heal = function() { if (cch.health < 100) { ccf.place(0, 0); } }; function cdr(cds, cdt) { try { return Math.hypot((cdt.y2 || cdt.y) - (cds.y2 || cds.y), (cdt.x2 || cdt.x) - (cds.x2 || cds.x)); } catch (cdv) { return Infinity; } } let cdw = "no"; ccf.zync = function(cdx) { if (!cch.millPlace) { cdw = "yeah"; ccf.place(5, cdk(cch, cdx)); let cdz = { x: cch.x + Math.cos(cdk(cdx, cch) - Math.PI) * 80, y: cch.y + Math.sin(cdk(cdx, cch) - Math.PI) * 80, x2: cch.x + Math.cos(cdk(cdx, cch) - Math.PI) * 80, y2: cch.y + Math.sin(cdk(cdx, cch) - Math.PI) * 80 }; function cea(ceb, cec, ced, cee) { let ceg = Math.sqrt(Math.pow(ced - ceb, 2) + Math.pow(cee - cec, 2)); return ceg; } function ceh() { ccf.sendWS("D", cdk(cdx, cch) - Math.PI); } let cej = setInterval(() => { ccf.sendWS("z", cch.weapons[1], true); if (ccn == 0) { ccf.sendWS("K", 1); ccn = 1; } setTimeout(() => { ccf.sendWS("z", cch.weapons[0], true); }, 2000); ccf.buye(53, 0); if (cea(cdz.x, cdz.y, cch.x, cch.y) > 5) { ccf.sendWS("f", cdk(cch, cdz)); } else { cdw = "no"; ccf.sendWS("f", undefined); ceh(); clearInterval(cej); } }, 150); setTimeout(() => { cdw = "no"; clearInterval(cej); }, 500); } }; ccf.onmessage = function(cem) { let ceo = new Uint8Array(cem.data); let cep = window.msgpack.decode(ceo); let ceq = cep[0]; ceo = cep[1]; if (ceq == "io-init") { ccf.spawn(); } if (ceq == "1") { cci = ceo[0]; console.log(cci); } if (ceq == "D") { if (ceo[1]) { cch = new Bot(ceo[0][0], ceo[0][1], hats, accessories); cch.setData(ceo[0]); cch.inGame = true; cch.alive = true; cch.x2 = undefined; cch.y2 = undefined; cch.spawn(1); cch.oldHealth = 100; cch.health = 100; cch.showName = "YEAHHH"; ccm = { x: ceo[0][3], y: ceo[0][4] }; ccl.inGame = true; if (ccf.first) { ccf.first = false; bots.push(ccl); } } } if (ceq == "P") { ccf.spawn(); cch.inGame = false; ccl.inGame = false; } if (ceq == "f") { let cer = ceo[0]; cch.tick++; cch.enemy = []; cch.near = []; ccf.showName = "YEAHHH"; cck = []; for (let ces = 0; ces < cer.length;) { if (cer[ces] == cch.sid) { cch.x2 = cer[ces + 1]; cch.y2 = cer[ces + 2]; cch.d2 = cer[ces + 3]; cch.buildIndex = cer[ces + 4]; cch.weaponIndex = cer[ces + 5]; cch.weaponVariant = cer[ces + 6]; cch.team = cer[ces + 7]; cch.isLeader = cer[ces + 8]; cch.skinIndex = cer[ces + 9]; cch.tailIndex = cer[ces + 10]; cch.iconIndex = cer[ces + 11]; cch.zIndex = cer[ces + 12]; cch.visible = true; ccl.x2 = cch.x2; ccl.y2 = cch.y2; } ces += 13; } for (let cet = 0; cet < cer.length;) { tmpObj = players.find(acs => acs.sid == cer[cet]); if (tmpObj) { if (!tmpObj.isTeam(cch)) { enemy.push(tmpObj); if (tmpObj.dist2 <= items.weapons[tmpObj.primaryIndex == undefined ? 5 : tmpObj.primaryIndex].range + cch.scale * 2) { nears.push(tmpObj); } } } cet += 13; } if (enemy.length) { cch.near = enemy.sort(function(ceu, cev) { return ceu.dist2 - cev.dist2; })[0]; } if (ccn == 1) { ccf.sendWS("K", 1); ccn = 0; } if (ccl.closeSocket) { cch.closeSockets(ccf); } if (ccl.whyDie != "") { cch.whyDieChat(ccf, ccl.whyDie); ccl.whyDie = ""; } if (cch.alive) { if (player.team) { if (cch.team != player.team && cch.tick % 9 === 0) { if (cch.team) { ccf.sendWS("N"); } ccf.sendWS("b", player.team); } } let cex = items.list[cch.items[3]]; let cey = cch.itemCounts[cex.group.id]; if ((cey != undefined ? cey : 0) < 201 && cch.millPlace) { if (cch.inGame) { ccf.sendWS("D", cch.moveDir); if (ccn == 0) { ccf.sendWS("K", 1); ccn = 1; } if (UTILS.getDist(ccm, cch, 0, 2) > 90) { let cez = UTILS.getDirect(ccm, cch, 0, 2); ccf.place(3, cez + 7.7); ccf.place(3, cez - 7.7); ccf.place(3, cez); ccm = { x: cch.x2, y: cch.y2 }; } if (cch.tick % 90 === 0) { let cfa = Math.random() * Math.PI * 2; cch.moveDir = cfa; ccf.sendWS("f", cch.moveDir); } } ccf.fastGear(); } else if ((cey != undefined ? cey : 0) > 296 && cch.millPlace) { cch.millPlace = false; ccf.fastGear(); } else if (cch.inGame) { if (ccj.length > 0) { let cfb = ccj.filter(cfc => cfc.active && cfc.isItem && UTILS.getDist(cfc, player, 0, 2) <= 600); if (getEl("mode").value == "fuckemup") { ccf.selectWeapon(cch.weapons[1]); let cfd = UTILS.getDist(cfb[0], cch, 0, 2); let cfe = UTILS.getDirect(cfb[0], cch, 0, 2); cck = ccj.filter(cff => cff.active && (cfb.find(acs => acs.sid == cff.sid) ? true : !cff.trap || player.sid != cff.owner.sid && !player.findAllianceBySid(cff.owner.sid)) && cff.isItem && UTILS.getDist(cff, cch, 0, 2) <= items.weapons[cch.weaponIndex].range + cff.scale + 10).sort(function(cfg, cfh) { return UTILS.getDist(cfg, cch, 0, 2) - UTILS.getDist(cfh, cch, 0, 2); })[0]; if (cck) { let cfj = UTILS.getDist(cfb[0], cck, 0, 0); if (cfd - cfj > 0) { if (cfb.find(acs => acs.sid == cck.sid) ? true : cck.dmg || cck.trap) { if (cch.moveDir != undefined) { cch.moveDir = undefined; ccf.sendWS("f", cch.moveDir); ccf.sendWS("D", cch.nDir); } } else { cch.moveDir = cfe; ccf.sendWS("f", cch.moveDir); ccf.sendWS("D", cch.nDir); } if (cch.nDir != UTILS.getDirect(cck, cch, 0, 2)) { cch.nDir = UTILS.getDirect(cck, cch, 0, 2); ccf.sendWS("D", cch.nDir); } if (ccn == 0) { ccf.sendWS("K", 1); ccn = 1; } ccf.buye(40, 0); } else { cch.moveDir = cfe; ccf.sendWS("f", cch.moveDir); ccf.sendWS("D", cch.nDir); ccf.fastGear(); } } else { cch.moveDir = cfe; ccf.sendWS("f", cch.moveDir); ccf.sendWS("D", cch.nDir); ccf.fastGear(); } } } if (ccj.length > 0) { if (getEl("mode").value == "flex") { const cfk = cch.sid * (Math.PI * 2 / cch.sid); const cfl = Math.cos(Date.now() * 0.01) * 300 + player.x; const cfm = Math.sin(Date.now() * 0.01) * 300 + player.x; ccf.sendWS("f", Math.atan2(cfm - cch.y, cfl - cch.x)); const cfn = Math.hypot(cfl - cch.x, cfm - cch.y); if (cfn > 22) { return; } } } if (ccj.length > 0) { cck = ccj.filter(cfo => cfo.active && cfo.isItem && UTILS.getDist(cfo, cch, 0, 2) <= items.weapons[cch.weaponIndex].range).sort(function(cfp, cfq) { return UTILS.getDist(cfp, cch, 0, 2) - UTILS.getDist(cfq, cch, 0, 2); })[0]; if (cck) { if (ccn == 0) { ccf.sendWS("K", 1); ccn = 1; } if (cch.nDir != UTILS.getDirect(cck, cch, 0, 2)) { cch.nDir = UTILS.getDirect(cck, cch, 0, 2); ccf.sendWS("D", cch.nDir); } ccf.buye(40, 0); ccf.buye(11, 1); } else { ccf.fastGear(); ccf.buye(11, 1); } ccf.buye(11, 1); if (breakObjects.length > 0 && getEl("mode").value == "clear") { ccf.selectWeapon(cch.weapons[1]); let cfs = UTILS.getDist(breakObjects[0], cch, 0, 2); let cft = UTILS.getDirect(breakObjects[0], cch, 0, 2); cck = ccj.filter(cfu => cfu.active && (breakObjects.find(acs => acs.sid == cfu.sid) ? true : !cfu.trap || player.sid != cfu.owner.sid && !player.findAllianceBySid(cfu.owner.sid)) && cfu.isItem && UTILS.getDist(cfu, cch, 0, 2) <= items.weapons[cch.weaponIndex].range + cfu.scale).sort(function(cfv, cfw) { return UTILS.getDist(cfv, cch, 0, 2) - UTILS.getDist(cfw, cch, 0, 2); })[0]; if (cck) { let cfy = UTILS.getDist(breakObjects[0], cck, 0, 0); if (cfs - cfy > 0) { if (breakObjects.find(acs => acs.sid == cck.sid) ? true : cck.dmg || cck.trap) { if (cch.moveDir != undefined) { cch.moveDir = undefined; ccf.sendWS("f", cch.moveDir); ccf.sendWS("D", cch.nDir); } } else { cch.moveDir = cft; ccf.sendWS("f", cch.moveDir); ccf.sendWS("D", cch.nDir); } if (cch.nDir != UTILS.getDirect(cck, cch, 0, 2)) { cch.nDir = UTILS.getDirect(cck, cch, 0, 2); ccf.sendWS("D", cch.nDir); } if (ccn == 0) { ccf.sendWS("K", 1); ccn = 1; } ccf.buye(40, 0); ccf.fastGear(); } else { cch.moveDir = cft; ccf.sendWS("f", cch.moveDir); ccf.sendWS("D", cch.nDir); ccf.fastGear(); } } else { cch.moveDir = cft; ccf.sendWS("f", cch.moveDir); ccf.sendWS("D", cch.nDir); ccf.fastGear(); } if (cfs > 300) { if (UTILS.getDist(ccm, cch, 0, 2) > 90) { let cfz = UTILS.getDirect(ccm, cch, 0, 2); ccf.place(3, cfz + 7.7); ccf.place(3, cfz - 7.7); ccf.place(3, cfz); ccm = { x: cch.x2, y: cch.y2 }; } } } } if (ccj.length > 0 && getEl("mode").value == "zync") { let cga = ccj.filter(cgb => cgb.active && cgb.isItem && UTILS.getDist(cgb, player, 0, 2) <= items.weapons[cch.weaponIndex].range + cgb.scale); if (!cga.length) { if (cdw == "no") { ccf.sendWS("D", UTILS.getDirect(player, cch, 0, 2)); } ccf.sendWS("f", cdk(player, cch) + Math.PI); } if (cga.length) { let cgc = UTILS.getDist(cga[0], cch, 0, 2); let cgd = UTILS.getDirect(cga[0], cch, 0, 2); cck = ccj.filter(cge => cge.active && (cga.find(acs => acs.sid == cge.sid) ? true : !cge.trap || player.sid != cge.owner.sid && !player.findAllianceBySid(cge.owner.sid)) && cge.isItem && UTILS.getDist(cge, cch, 0, 2) <= items.weapons[cch.weaponIndex].range + cge.scale).sort(function(cgf, cgg) { return UTILS.getDist(cgf, cch, 0, 2) - UTILS.getDist(cgg, cch, 0, 2); })[0]; if (cck) { let cgi = UTILS.getDist(cga[0], cck, 0, 0); if (cgc - cgi > 0) { if (cga.find(acs => acs.sid == cck.sid) ? true : cck.dmg || cck.trap) { if (cch.moveDir != undefined) { cch.moveDir = undefined; ccf.sendWS("f", cch.moveDir); ccf.sendWS("D", cch.nDir); } } else { ccf.sendWS("D", cch.nDir); } if (cch.nDir != UTILS.getDirect(cck, cch, 0, 2)) { cch.nDir = UTILS.getDirect(cck, cch, 0, 2); ccf.sendWS("D", cch.nDir); } if (ccn == 0) { ccf.sendWS("K", 1); ccn = 1; } ccf.buye(40, 0); ccf.fastGear(); } else { if (cdw == "no") { ccf.sendWS("D", UTILS.getDirect(cck, cch, 0, 2)); } if (cdr(player, cch) <= 110) { ccf.sendWS("f", undefined); } else { ccf.sendWS("f", cdk(player, cch) + Math.PI); } } } else if (cga.length) { if (cdw == "no") { ccf.sendWS("D", UTILS.getDirect(cga[0], cch, 0, 2)); } if (cdr(player, cch) <= 110) { ccf.sendWS("f", undefined); } else { ccf.sendWS("f", cdk(player, cch) + Math.PI); } } else { if (cdw == "no") { ccf.sendWS("D", UTILS.getDirect(player, cch, 0, 2)); } if (cdr(player, cch) <= 110) { ccf.sendWS("f", undefined); } else { ccf.sendWS("f", cdk(player, cch) + Math.PI); } } } } } } } if (ceq == "H") { let cgj = ceo[0]; for (let cgk = 0; cgk < cgj.length;) { cco.add(cgj[cgk], cgj[cgk + 1], cgj[cgk + 2], cgj[cgk + 3], cgj[cgk + 4], cgj[cgk + 5], items.list[cgj[cgk + 6]], true, cgj[cgk + 7] >= 0 ? { sid: cgj[cgk + 7] } : null); cgk += 8; } } if (ceq == "N") { let cgl = ceo[0]; let cgm = ceo[1]; if (cch) { cch[cgl] = cgm; } } if (ceq == "O") { if (ceo[0] == cch.sid) { cch.oldHealth = cch.health; cch.health = ceo[1]; cch.judgeShame(); if (cch.oldHealth > cch.health) { if (cch.shameCount < 5) { for (let cgn = 0; cgn < 2; cgn++) { ccf.place(0, cch.nDir); } } else { setTimeout(() => { for (let cgp = 0; cgp < 2; cgp++) { ccf.place(0, cch.nDir); } }, 95); } } } } if (ceq == "Q") { let cgq = ceo[0]; cco.disableBySid(cgq); } if (ceq == "R") { let cgr = ceo[0]; if (cch.alive) { cco.removeAllItems(cgr); } } if (ceq == "S") { let cgs = ceo[0]; let cgt = ceo[1]; if (cch) { cch.itemCounts[cgs] = cgt; } } if (ceq == "U") { if (ceo[0] > 0) { if (getEl("setup").value == "dm") { if (cch.upgraded == 0) { ccf.sendUpgrade(7); } else if (cch.upgraded == 1) { ccf.sendUpgrade(17); } else if (cch.upgraded == 2) { ccf.sendUpgrade(31); } else if (cch.upgraded == 3) { ccf.sendUpgrade(23); } else if (cch.upgraded == 4) { ccf.sendUpgrade(9); } else if (cch.upgraded == 5) { ccf.sendUpgrade(34); } else if (cch.upgraded == 6) { ccf.sendUpgrade(12); } else if (cch.upgraded == 7) { ccf.sendUpgrade(15); } } else if (getEl("setup").value == "dr") { if (cch.upgraded == 0) { ccf.sendUpgrade(7); } else if (cch.upgraded == 1) { ccf.sendUpgrade(17); } else if (cch.upgraded == 2) { ccf.sendUpgrade(31); } else if (cch.upgraded == 3) { ccf.sendUpgrade(23); } else if (cch.upgraded == 4) { ccf.sendUpgrade(9); } else if (cch.upgraded == 5) { ccf.sendUpgrade(34); } else if (cch.upgraded == 6) { ccf.sendUpgrade(12); } else if (cch.upgraded == 7) { ccf.sendUpgrade(13); } } else if (getEl("setup").value == "kh") { if (cch.upgraded == 0) { ccf.sendUpgrade(3); } else if (cch.upgraded == 1) { ccf.sendUpgrade(17); } else if (cch.upgraded == 2) { ccf.sendUpgrade(31); } else if (cch.upgraded == 3) { ccf.sendUpgrade(27); } else if (cch.upgraded == 4) { ccf.sendUpgrade(10); } else if (cch.upgraded == 5) { ccf.sendUpgrade(34); } else if (cch.upgraded == 6) { ccf.sendUpgrade(4); } else if (cch.upgraded == 7) { ccf.sendUpgrade(25); } } else if (getEl("setup").value == "zd") { if (cch.upgraded == 0) { ccf.sendUpgrade(3); } else if (cch.upgraded == 1) { ccf.sendUpgrade(17); } else if (cch.upgraded == 2) { ccf.sendUpgrade(31); } else if (cch.upgraded == 3) { ccf.sendUpgrade(27); } else if (cch.upgraded == 4) { ccf.sendUpgrade(9); } else if (cch.upgraded == 5) { ccf.sendUpgrade(34); } else if (cch.upgraded == 6) { ccf.sendUpgrade(12); } else if (cch.upgraded == 7) { ccf.sendUpgrade(15); } } cch.upgraded++; } } if (ceq == "V") { let cgu = ceo[0]; let cgv = ceo[1]; if (cgu) { if (cgv) { cch.weapons = cgu; } else { cch.items = cgu; } } } if (ceq == "5") { let cgw = ceo[0]; let cgx = ceo[1]; let cgy = ceo[2]; if (cgy) { if (!cgw) { cch.tails[cgx] = 1; } else { cch.latestTail = cgx; } } else if (!cgw) { cch.skins[cgx] = 1; } else { cch.latestSkin = cgx; } } if (ceq == "6") { let cgz = ceo[0]; let cha = ceo[1] + ""; if (cgz == player.sid && cha.includes("syncon")) { ccf.zync(cch.near); } } }; ccf.onclose = function() { cch.inGame = false; ccl.inGame = false; }; } let spikes = { near: [], aim: undefined, nearSpike: false, nearBreak: false }; let trapData = { sid: undefined, hitCount: 0 }; let tracker = { draw3: { active: false, x: 0, y: 0, scale: 0 }, draw2: { active: false, x: 0, y: 0, scale: 0 }, moveDir: undefined, lastPos: { x: 0, y: 0 } }; function renderLeaf(chc, chd, che, chf, chg) { let chi = chc + che * Math.cos(chf); let chj = chd + che * Math.sin(chf); let chk = che * 0.4; chg.moveTo(chc, chd); chg.beginPath(); chg.quadraticCurveTo((chc + chi) / 2 + chk * Math.cos(chf + Math.PI / 2), (chd + chj) / 2 + chk * Math.sin(chf + Math.PI / 2), chi, chj); chg.quadraticCurveTo((chc + chi) / 2 - chk * Math.cos(chf + Math.PI / 2), (chd + chj) / 2 - chk * Math.sin(chf + Math.PI / 2), chc, chd); chg.closePath(); chg.fill(); chg.stroke(); } function renderCircle(chl, chm, chn, cho, chp, chq) { cho = cho || mainContext; cho.beginPath(); cho.arc(chl, chm, chn, 0, Math.PI * 2); if (!chq) { cho.fill(); } if (!chp) { cho.stroke(); } } function renderHealthCircle(chs, cht, chu, chv, chw, chx) { chv = chv || mainContext; chv.beginPath(); chv.arc(chs, cht, chu, 0, Math.PI * 2); if (!chx) { chv.fill(); } if (!chw) { chv.stroke(); } } function renderStar(chz, cia, cib, cic) { let cie = Math.PI / 2 * 3; let cif; let cig; let cih = Math.PI / cia; chz.beginPath(); chz.moveTo(0, -cib); for (let cii = 0; cii < cia; cii++) { cif = Math.cos(cie) * cib; cig = Math.sin(cie) * cib; chz.lineTo(cif, cig); cie += cih; cif = Math.cos(cie) * cic; cig = Math.sin(cie) * cic; chz.lineTo(cif, cig); cie += cih; } chz.lineTo(0, -cib); chz.closePath(); } function renderHealthStar(cij, cik, cil, cim) { let cio = Math.PI / 2 * 3; let cip; let ciq; let cir = Math.PI / cik; cij.beginPath(); cij.moveTo(0, -cil); for (let cis = 0; cis < cik; cis++) { cip = Math.cos(cio) * cil; ciq = Math.sin(cio) * cil; cij.lineTo(cip, ciq); cio += cir; cip = Math.cos(cio) * cim; ciq = Math.sin(cio) * cim; cij.lineTo(cip, ciq); cio += cir; } cij.lineTo(0, -cil); cij.closePath(); } function renderRect(cit, ciu, civ, ciw, cix, ciy, ciz) { if (!ciz) { cix.fillRect(cit - civ / 2, ciu - ciw / 2, civ, ciw); } if (!ciy) { cix.strokeRect(cit - civ / 2, ciu - ciw / 2, civ, ciw); } } function renderHealthRect(cjb, cjc, cjd, cje, cjf, cjg, cjh) { if (!cjh) { cjf.fillRect(cjb - cjd / 2, cjc - cje / 2, cjd, cje); } if (!cjg) { cjf.strokeRect(cjb - cjd / 2, cjc - cje / 2, cjd, cje); } } function renderRectCircle(cjj, cjk, cjl, cjm, cjn, cjo, cjp, cjq) { cjo.save(); cjo.translate(cjj, cjk); cjn = Math.ceil(cjn / 2); for (let cjs = 0; cjs < cjn; cjs++) { renderRect(0, 0, cjl * 2, cjm, cjo, cjp, cjq); cjo.rotate(Math.PI / cjn); } cjo.restore(); } function renderBlob(cjt, cju, cjv, cjw) { let cjy = Math.PI / 2 * 3; let cjz; let cka; let ckb = Math.PI / cju; let ckc; cjt.beginPath(); cjt.moveTo(0, -cjw); for (let ckd = 0; ckd < cju; ckd++) { ckc = UTILS.randInt(cjv + 0.9, cjv * 1.2); cjt.quadraticCurveTo(Math.cos(cjy + ckb) * ckc, Math.sin(cjy + ckb) * ckc, Math.cos(cjy + ckb * 2) * cjw, Math.sin(cjy + ckb * 2) * cjw); cjy += ckb * 2; } cjt.lineTo(0, -cjw); cjt.closePath(); } function renderTriangle(cke, ckf) { ckf = ckf || mainContext; let ckh = cke * (Math.sqrt(3) / 2); ckf.beginPath(); ckf.moveTo(0, -ckh / 2); ckf.lineTo(-cke / 2, ckh / 2); ckf.lineTo(cke / 2, ckh / 2); ckf.lineTo(0, -ckh / 2); ckf.fill(); ckf.closePath(); } function prepareMenuBackground() {} const speed = 1; function renderDeadPlayers(cki, ckj) { mainContext.fillStyle = "#91b2db"; const ckl = Date.now(); deadPlayers.filter(ckm => ckm.active).forEach(ckn => { if (!ckn.startTime) { ckn.startTime = ckl; ckn.angle = 0; ckn.radius = 0.1; } const ckp = ckl - ckn.startTime; const ckq = 1; ckn.alpha = Math.max(0, ckq - ckp / 3000); ckn.animate(delta); mainContext.globalAlpha = ckn.alpha; mainContext.strokeStyle = outlineColor; mainContext.save(); mainContext.translate(ckn.x - cki, ckn.y - ckj); ckn.radius -= 0.001; ckn.angle += 10; const ckr = 1; const cks = ckn.radius * Math.cos(ckn.angle); const ckt = ckn.radius * Math.sin(ckn.angle); ckn.x += cks * ckr; ckn.y += ckt * ckr; mainContext.rotate(ckn.angle); renderDeadPlayer(ckn, mainContext); mainContext.restore(); mainContext.fillStyle = "#91b2db"; if (ckp >= 3000) { ckn.active = false; ckn.startTime = null; } }); } function renderPlayers(cku, ckv, ckw) { mainContext.globalAlpha = 1; mainContext.fillStyle = "#91b2db"; for (var cky = 0; cky < players.length; ++cky) { tmpObj = players[cky]; if (tmpObj.zIndex == ckw) { tmpObj.animate(delta); if (tmpObj.visible) { tmpObj.skinRot += delta * 0.002; tmpDir = !getEl("showDir").checked && !useWasd && tmpObj == player ? getEl("attackDir").checked ? getVisualDir() : getSafeDir() : tmpObj.dir || 0; mainContext.save(); mainContext.translate(tmpObj.x - cku, tmpObj.y - ckv); if (getEl("spinner").checked && tmpObj == player) { mainContext.rotate(tmpDir + tmpObj.dt); } else { mainContext.rotate(tmpDir + tmpObj.dirPlus); } renderPlayer(tmpObj, mainContext); mainContext.restore(); } } } } function renderDeadPlayer(ckz, cla) { cla = cla || mainContext; cla.lineWidth = outlineWidth; cla.lineJoin = "miter"; let clc = Math.PI / 4 * (items.weapons[ckz.weaponIndex].armS || 1); let cld = ckz.buildIndex < 0 ? items.weapons[ckz.weaponIndex].hndS || 1 : 1; let cle = ckz.buildIndex < 0 ? items.weapons[ckz.weaponIndex].hndD || 1 : 1; renderTail2(13, cla, ckz); if (ckz.buildIndex < 0 && !items.weapons[ckz.weaponIndex].aboveHand) { renderTool(items.weapons[ckz.weaponIndex], config.weaponVariants[ckz.weaponVariant || 0].src || "", ckz.scale, 0, cla); if (items.weapons[ckz.weaponIndex].projectile != undefined && !items.weapons[ckz.weaponIndex].hideProjectile) { renderProjectile(ckz.scale, 0, items.projectiles[items.weapons[ckz.weaponIndex].projectile], mainContext); } } cla.fillStyle = "#ececec"; renderCircle(ckz.scale * Math.cos(clc), ckz.scale * Math.sin(clc), 14); renderCircle(ckz.scale * cle * Math.cos(-clc * cld), ckz.scale * cle * Math.sin(-clc * cld), 14); if (ckz.buildIndex < 0 && items.weapons[ckz.weaponIndex].aboveHand) { renderTool(items.weapons[ckz.weaponIndex], config.weaponVariants[ckz.weaponVariant || 0].src || "", ckz.scale, 0, cla); if (items.weapons[ckz.weaponIndex].projectile != undefined && !items.weapons[ckz.weaponIndex].hideProjectile) { renderProjectile(ckz.scale, 0, items.projectiles[items.weapons[ckz.weaponIndex].projectile], mainContext); } } if (ckz.buildIndex >= 0) { var clf = getItemSprite(items.list[ckz.buildIndex]); cla.drawImage(clf, ckz.scale - items.list[ckz.buildIndex].holdOffset, -clf.width / 2); } renderCircle(0, 0, ckz.scale, cla); renderSkin2(48, cla, null, ckz); } function renderPlayer(clg, clh) { clh = clh || mainContext; clh.lineWidth = outlineWidth; clh.lineJoin = "miter"; let clj = Math.PI / 4 * (items.weapons[clg.weaponIndex].armS || 1); let clk = clg.buildIndex < 0 ? items.weapons[clg.weaponIndex].hndS || 1 : 1; let cll = clg.buildIndex < 0 ? items.weapons[clg.weaponIndex].hndD || 1 : 1; let clm = clg == player && clg.weapons[0] == 3 && clg.weapons[1] == 15; if (clg.tailIndex > 0) { renderTailTextureImage(clg.tailIndex, clh, clg); } if (clg.buildIndex < 0 && !items.weapons[clg.weaponIndex].aboveHand) { renderTool(items.weapons[clm ? 4 : clg.weaponIndex], config.weaponVariants[clg.weaponVariant].src, clg.scale, 0, clh); if (items.weapons[clg.weaponIndex].projectile != undefined && !items.weapons[clg.weaponIndex].hideProjectile) { renderProjectile(clg.scale, 0, items.projectiles[items.weapons[clg.weaponIndex].projectile], mainContext); } } clh.fillStyle = config.skinColors[clg.skinColor]; renderCircle(clg.scale * Math.cos(clj), clg.scale * Math.sin(clj), 14); renderCircle(clg.scale * cll * Math.cos(-clj * clk), clg.scale * cll * Math.sin(-clj * clk), 14); if (clg.buildIndex < 0 && items.weapons[clg.weaponIndex].aboveHand) { renderTool(items.weapons[clg.weaponIndex], config.weaponVariants[clg.weaponVariant].src, clg.scale, 0, clh); if (items.weapons[clg.weaponIndex].projectile != undefined && !items.weapons[clg.weaponIndex].hideProjectile) { renderProjectile(clg.scale, 0, items.projectiles[items.weapons[clg.weaponIndex].projectile], mainContext); } } if (clg.buildIndex >= 0) { var cln = getItemSprite(items.list[clg.buildIndex]); clh.drawImage(cln, clg.scale - items.list[clg.buildIndex].holdOffset, -cln.width / 2); } renderCircle(0, 0, clg.scale, clh); if (clg.skinIndex > 0) { clh.rotate(Math.PI / 2); renderTextureSkin(clg.skinIndex, clh, null, clg); } } var skinSprites2 = {}; var skinPointers2 = {}; function renderSkin2(clo, clp, clq, clr) { tmpSkin = skinSprites2[clo]; if (!tmpSkin) { var clt = new Image(); clt.onload = function() { this.isLoaded = true; this.onload = null; }; clt.src = "https://moomoo.io/img/hats/hat_" + clo + ".png"; skinSprites2[clo] = clt; tmpSkin = clt; } var clv = clq || skinPointers2[clo]; if (!clv) { for (var clw = 0; clw < hats.length; ++clw) { if (hats[clw].id == clo) { clv = hats[clw]; break; } } skinPointers2[clo] = clv; } if (tmpSkin.isLoaded) { clp.drawImage(tmpSkin, -clv.scale / 2, -clv.scale / 2, clv.scale, clv.scale); } if (!clq && clv.topSprite) { clp.save(); clp.rotate(clr.skinRot); renderSkin2(clo + "_top", clp, clv, clr); clp.restore(); } } function renderTextureSkin(clx, cly, clz, cma) { if (!(tmpSkin = skinSprites[clx + (txt ? "lol" : 0)])) { var cmc = new Image(); cmc.onload = function() { this.isLoaded = true; this.onload = null; }; cmc.src = setSkinTextureImage(clx, "hat", clx); skinSprites[clx + (txt ? "lol" : 0)] = cmc; tmpSkin = cmc; } var cme = clz || skinPointers[clx]; if (!cme) { for (var cmf = 0; cmf < hats.length; ++cmf) { if (hats[cmf].id == clx) { cme = hats[cmf]; break; } } skinPointers[clx] = cme; } if (tmpSkin.isLoaded) { cly.drawImage(tmpSkin, -cme.scale / 2, -cme.scale / 2, cme.scale, cme.scale); } if (!clz && cme.topSprite) { cly.save(); cly.rotate(cma.skinRot); renderSkin(clx + "_top", cly, cme, cma); cly.restore(); } } var FlareZHat = { 6: "https://i.imgur.com/HjWADL7.png", 7: "http://i.imgur.com/wqG2CBb.png" }; function setSkinTextureImage(cmg, cmh, cmi) { if (FlareZHat[cmg] && cmh == "hat") { return FlareZHat[cmg]; } else if (cmh == "acc") { return ".././img/accessories/access_" + cmg + ".png"; } else if (cmh == "hat") { return ".././img/hats/hat_" + cmg + ".png"; } else { return ".././img/weapons/" + cmg + ".png"; } } let skinSprites = {}; let skinPointers = {}; let tmpSkin; function renderSkin(cmk, cml, cmm, cmn) { tmpSkin = skinSprites[cmk]; if (!tmpSkin) { let cmq = new Image(); cmq.onload = function() { this.isLoaded = true; this.onload = null; }; cmq.src = "https://moomoo.io/img/hats/hat_" + cmk + ".png"; skinSprites[cmk] = cmq; tmpSkin = cmq; } let cms = cmm || skinPointers[cmk]; if (!cms) { for (let cmt = 0; cmt < hats.length; ++cmt) { if (hats[cmt].id == cmk) { cms = hats[cmt]; break; } } skinPointers[cmk] = cms; } if (tmpSkin.isLoaded) { cml.drawImage(tmpSkin, -cms.scale / 2, -cms.scale / 2, cms.scale, cms.scale); } if (!cmm && cms.topSprite) { cml.save(); cml.rotate(cmn.skinRot); renderSkin(cmk + "_top", cml, cms, cmn); cml.restore(); } } var FlareZAcc = {}; function setTailTextureImage(cmu, cmv, cmw) { if (FlareZAcc[cmu] && cmv == "acc") { return FlareZAcc[cmu]; } else if (cmv == "acc") { return ".././img/accessories/access_" + cmu + ".png"; } else if (cmv == "hat") { return ".././img/hats/hat_" + cmu + ".png"; } else { return ".././img/weapons/" + cmu + ".png"; } } function renderTailTextureImage(cmy, cmz, cna) { if (!(tmpSkin = accessSprites[cmy + (txt ? "lol" : 0)])) { var cnc = new Image(); cnc.onload = function() { this.isLoaded = true; this.onload = null; }; cnc.src = setTailTextureImage(cmy, "acc"); accessSprites[cmy + (txt ? "lol" : 0)] = cnc; tmpSkin = cnc; } var cne = accessPointers[cmy]; if (!cne) { for (var cnf = 0; cnf < accessories.length; ++cnf) { if (accessories[cnf].id == cmy) { cne = accessories[cnf]; break; } } accessPointers[cmy] = cne; } if (tmpSkin.isLoaded) { cmz.save(); cmz.translate(-20 - (cne.xOff || 0), 0); if (cne.spin) { cmz.rotate(cna.skinRot); } cmz.drawImage(tmpSkin, -(cne.scale / 2), -(cne.scale / 2), cne.scale, cne.scale); cmz.restore(); } } let accessSprites = {}; let accessPointers = {}; var txt = true; function renderTail(cng, cnh, cni) { tmpSkin = accessSprites[cng]; if (!tmpSkin) { let cnk = new Image(); cnk.onload = function() { this.isLoaded = true; this.onload = null; }; cnk.src = "https://moomoo.io/img/accessories/access_" + cng + ".png"; accessSprites[cng] = cnk; tmpSkin = cnk; } let cnm = accessPointers[cng]; if (!cnm) { for (let cnn = 0; cnn < accessories.length; ++cnn) { if (accessories[cnn].id == cng) { cnm = accessories[cnn]; break; } } accessPointers[cng] = cnm; } if (tmpSkin.isLoaded) { cnh.save(); cnh.translate(-20 - (cnm.xOff || 0), 0); if (cnm.spin) { cnh.rotate(cni.skinRot); } cnh.drawImage(tmpSkin, -(cnm.scale / 2), -(cnm.scale / 2), cnm.scale, cnm.scale); cnh.restore(); } } var accessSprites2 = {}; var accessPointers2 = {}; function renderTail2(cno, cnp, cnq) { tmpSkin = accessSprites2[cno]; if (!tmpSkin) { var cns = new Image(); cns.onload = function() { this.isLoaded = true; this.onload = null; }; cns.src = "https://moomoo.io/img/accessories/access_" + cno + ".png"; accessSprites2[cno] = cns; tmpSkin = cns; } var cnu = accessPointers2[cno]; if (!cnu) { for (var cnv = 0; cnv < accessories.length; ++cnv) { if (accessories[cnv].id == cno) { cnu = accessories[cnv]; break; } } accessPointers2[cno] = cnu; } if (tmpSkin.isLoaded) { cnp.save(); cnp.translate(-20 - (cnu.xOff || 0), 0); if (cnu.spin) { cnp.rotate(cnq.skinRot); } cnp.drawImage(tmpSkin, -(cnu.scale / 2), -(cnu.scale / 2), cnu.scale, cnu.scale); cnp.restore(); } } let toolSprites = {}; function renderTool(cnw, cnx, cny, cnz, coa) { let coc = cnw.src + (cnx || ""); let cod = toolSprites[coc]; if (!cod) { cod = new Image(); cod.onload = function() { this.isLoaded = true; }; cod.src = "https://moomoo.io/img/weapons/" + coc + ".png"; toolSprites[coc] = cod; } if (cod.isLoaded) { coa.drawImage(cod, cny + cnw.xOff - cnw.length / 2, cnz + cnw.yOff - cnw.width / 2, cnw.length, cnw.width); } } function renderProjectiles(cof, cog, coh) { for (let coj = 0; coj < projectiles.length; coj++) { tmpObj = projectiles[coj]; if (tmpObj.active && tmpObj.layer == cof && tmpObj.inWindow) { tmpObj.update(delta); if (tmpObj.active && tmpObj.x - cog + tmpObj.scale >= 0 && tmpObj.x - cog - tmpObj.scale <= maxScreenWidth && tmpObj.y - coh + tmpObj.scale >= 0 && (tmpObj.y - coh, tmpObj.scale, maxScreenHeight)) { mainContext.save(); mainContext.translate(tmpObj.x - cog, tmpObj.y - coh); mainContext.rotate(tmpObj.dir); renderProjectile(0, 0, tmpObj, mainContext, 1); mainContext.restore(); } } }; } let projectileSprites = {}; function renderProjectile(cok, col, con, coo, cop) { if (con.src) { let cor = items.projectiles[con.indx].src; let cot = projectileSprites[cor]; if (!cot) { cot = new Image(); cot.onload = function() { this.isLoaded = true; }; cot.src = "https://moomoo.io/img/weapons/" + cor + ".png"; projectileSprites[cor] = cot; } if (cot.isLoaded) { coo.drawImage(cot, cok - con.scale / 2, col - con.scale / 2, con.scale, con.scale); } } else if (con.indx == 1) { coo.fillStyle = "#939393"; renderCircle(cok, col, con.scale, coo); } } let aiSprites = {}; function renderAI(cov, cox) { let coz = cov.index; let cpa = aiSprites[coz]; if (!cpa) { let cpb = new Image(); cpb.onload = function() { this.isLoaded = true; this.onload = null; }; cpb.src = "https://moomoo.io/img/animals/" + cov.src + ".png"; cpa = cpb; aiSprites[coz] = cpa; } if (cpa.isLoaded) { let cpd = cov.scale * 1.2 * (cov.spriteMlt || 1); cox.drawImage(cpa, -cpd, -cpd, cpd * 2, cpd * 2); } } function renderWaterBodies(cpe, cpf, cpg, cph) { let cpj = config.riverWidth + cph; let cpk = config.mapScale / 2 - cpf - cpj / 2; if (cpk < maxScreenHeight && cpk + cpj > 0) { cpg.fillRect(0, cpk, maxScreenWidth, cpj); } } let gameObjectSprites = {}; function getResSprite(cpl) { let cpn = cpl.y >= config.mapScale - config.snowBiomeTop ? 2 : cpl.y <= config.snowBiomeTop ? 1 : 0; let cpo = cpl.type + "_" + cpl.scale + "_" + cpn; let cpp = gameObjectSprites[cpo]; if (!cpp) { let cpq = 6; let cpr = document.createElement("canvas"); cpr.width = cpr.height = cpl.scale * 2.1 + outlineWidth; let cps = cpr.getContext("2d"); cps.translate(cpr.width / 2, cpr.height / 2); cps.rotate(UTILS.randFloat(0, Math.PI)); cps.strokeStyle = outlineColor; cps.lineWidth = outlineWidth; if (cpl.type == 0) { let cpt; let cpu = 8; cps.globalAlpha = cdf(cpl, player) <= 250 ? 0.5 : 0.5; for (let cpv = 0; cpv < 2; ++cpv) { cpt = tmpObj.scale * (!cpv ? 1 : 0.5); renderBlob(cps, cpu, cpt, cpt * 0.7); cps.fillStyle = !cpn ? !cpv ? "#9ebf57" : "#b4db62" : !cpv ? "#e3f1f4" : "#fff"; cps.fill(); if (!cpv) { cps.stroke(); cps.globalAlpha = 1; } if (!cpv) {} else {} } } else if (cpl.type == 1) { if (cpn == 2) { cps.fillStyle = "#606060"; renderStar(cps, 6, cpl.scale * 0.3, cpl.scale * 0.71); cps.fill(); cps.stroke(); cps.fillStyle = "#89a54c"; renderCircle(0, 0, cpl.scale * 0.55, cps); cps.fillStyle = "#a5c65b"; renderCircle(0, 0, cpl.scale * 0.3, cps, true); } else { renderBlob(cps, 6, tmpObj.scale, tmpObj.scale * 0.7); cps.fillStyle = cpn ? "#e3f1f4" : "#89a54c"; cps.fill(); cps.stroke(); cps.fillStyle = cpn ? "#6a64af" : "#c15555"; let cpw; let cpx = 4; let cpy = Math.PI * 2 / cpx; for (let cpz = 0; cpz < cpx; ++cpz) { cpw = UTILS.randInt(tmpObj.scale / 3.5, tmpObj.scale / 2.3); renderCircle(cpw * Math.cos(cpy * cpz), cpw * Math.sin(cpy * cpz), UTILS.randInt(10, 12), cps); } } } else if (cpl.type == 2 || cpl.type == 3) { cps.fillStyle = cpl.type == 2 ? cpn == 2 ? "#938d77" : "#939393" : "#e0c655"; renderStar(cps, 3, cpl.scale, cpl.scale); cps.fill(); cps.stroke(); cps.fillStyle = cpl.type == 2 ? cpn == 2 ? "#b2ab90" : "#bcbcbc" : "#ebdca3"; renderStar(cps, 3, cpl.scale * 0.55, cpl.scale * 0.65); cps.fill(); } cpp = cpr; gameObjectSprites[cpo] = cpp; } return cpp; } let itemSprites = []; function getItemSprite(cqa, cqb) { let cqd = itemSprites[cqa.id]; if (!cqd || cqb) { let cqe = !cqb ? 20 : 5; let cqf = document.createElement("canvas"); let cqg = !cqb && cqa.name == "windmill" ? items.list[4].scale : cqa.scale; cqf.width = cqf.height = cqg * 2.5 + outlineWidth + (items.list[cqa.id].spritePadding || 0) + cqe; let cqh = cqf.getContext("2d"); cqh.translate(cqf.width / 2, cqf.height / 2); cqh.rotate(cqb ? 0 : Math.PI / 2); cqh.strokeStyle = outlineColor; cqh.lineWidth = outlineWidth * (cqb ? cqf.width / 81 : 1); if (!cqb) {} if (cqa.name == "apple") { cqh.fillStyle = "#c15555"; renderCircle(0, 0, cqa.scale, cqh); cqh.fillStyle = "#89a54c"; let cqi = -(Math.PI / 2); renderLeaf(cqa.scale * Math.cos(cqi), cqa.scale * Math.sin(cqi), 25, cqi + Math.PI / 2, cqh); } else if (cqa.name == "cookie") { cqh.fillStyle = "#cca861"; renderCircle(0, 0, cqa.scale, cqh); cqh.fillStyle = "#937c4b"; let cqj = 4; let cqk = Math.PI * 2 / cqj; let cql; for (let cqm = 0; cqm < cqj; ++cqm) { cql = UTILS.randInt(cqa.scale / 2.5, cqa.scale / 1.7); renderCircle(cql * Math.cos(cqk * cqm), cql * Math.sin(cqk * cqm), UTILS.randInt(4, 5), cqh, true); } } else if (cqa.name == "cheese") { cqh.fillStyle = "#f4f3ac"; renderCircle(0, 0, cqa.scale, cqh); cqh.fillStyle = "#c3c28b"; let cqn = 4; let cqo = Math.PI * 2 / cqn; let cqp; for (let cqq = 0; cqq < cqn; ++cqq) { cqp = UTILS.randInt(cqa.scale / 2.5, cqa.scale / 1.7); renderCircle(cqp * Math.cos(cqo * cqq), cqp * Math.sin(cqo * cqq), UTILS.randInt(4, 5), cqh, true); } } else if (cqa.name == "wood wall" || cqa.name == "stone wall" || cqa.name == "castle wall") { cqh.fillStyle = cqa.name == "castle wall" ? "#83898e" : cqa.name == "wood wall" ? "#a5974c" : "#939393"; let cqr = cqa.name == "castle wall" ? 4 : 3; renderStar(cqh, cqr, cqa.scale * 1.1, cqa.scale * 1.1); cqh.fill(); cqh.stroke(); cqh.fillStyle = cqa.name == "castle wall" ? "#9da4aa" : cqa.name == "wood wall" ? "#c9b758" : "#bcbcbc"; renderStar(cqh, cqr, cqa.scale * 0.65, cqa.scale * 0.65); cqh.fill(); } else if (cqa.name == "spikes" || cqa.name == "greater spikes" || cqa.name == "poison spikes" || cqa.name == "spinning spikes") { cqh.fillStyle = cqa.name == "poison spikes" ? "#7b935d" : "#939393"; let cqs = cqa.scale * 0.6; renderStar(cqh, cqa.name == "spikes" ? 5 : 6, cqa.scale, cqs); cqh.fill(); cqh.stroke(); cqh.fillStyle = "#a5974c"; renderCircle(0, 0, cqs, cqh); cqh.fillStyle = "#c9b758"; renderCircle(0, 0, cqs / 2, cqh, true); } else if (cqa.name == "windmill" || cqa.name == "faster windmill" || cqa.name == "power mill") { cqh.fillStyle = "#a5974c"; renderCircle(0, 0, cqg, cqh); cqh.fillStyle = "#c9b758"; renderRectCircle(0, 0, cqg * 1.5, 29, 4, cqh); cqh.fillStyle = "#a5974c"; renderCircle(0, 0, cqg * 0.5, cqh); } else if (cqa.name == "mine") { cqh.fillStyle = "#939393"; renderStar(cqh, 3, cqa.scale, cqa.scale); cqh.fill(); cqh.stroke(); cqh.fillStyle = "#bcbcbc"; renderStar(cqh, 3, cqa.scale * 0.55, cqa.scale * 0.65); cqh.fill(); } else if (cqa.name == "sapling") { for (let cqt = 0; cqt < 2; ++cqt) { let cqu = cqa.scale * (!cqt ? 1 : 0.5); renderStar(cqh, 7, cqu, cqu * 0.7); cqh.fillStyle = !cqt ? "#9ebf57" : "#b4db62"; cqh.fill(); if (!cqt) { cqh.stroke(); } } } else if (cqa.name == "pit trap") { cqh.fillStyle = "#a5974c"; renderStar(cqh, 3, cqa.scale * 1.1, cqa.scale * 1.1); cqh.fill(); cqh.stroke(); cqh.fillStyle = outlineColor; renderStar(cqh, 3, cqa.scale * 0.65, cqa.scale * 0.65); cqh.fill(); } else if (cqa.name == "boost pad") { cqh.fillStyle = "#7e7f82"; renderRect(0, 0, cqa.scale * 2, cqa.scale * 2, cqh); cqh.fill(); cqh.stroke(); cqh.fillStyle = "#dbd97d"; renderTriangle(cqa.scale * 1, cqh); } else if (cqa.name == "turret") { cqh.fillStyle = "#a5974c"; renderCircle(0, 0, cqa.scale, cqh); cqh.fill(); cqh.stroke(); cqh.fillStyle = "#939393"; let cqv = 50; renderRect(0, -cqv / 2, cqa.scale * 0.9, cqv, cqh); renderCircle(0, 0, cqa.scale * 0.6, cqh); cqh.fill(); cqh.stroke(); } else if (cqa.name == "platform") { cqh.fillStyle = "#cebd5f"; let cqw = 4; let cqx = cqa.scale * 2; let cqy = cqx / cqw; let cqz = -(cqa.scale / 2); for (let cra = 0; cra < cqw; ++cra) { renderRect(cqz - cqy / 2, 0, cqy, cqa.scale * 2, cqh); cqh.fill(); cqh.stroke(); cqz += cqx / cqw; } } else if (cqa.name == "healing pad") { cqh.fillStyle = "#7e7f82"; renderRect(0, 0, cqa.scale * 2, cqa.scale * 2, cqh); cqh.fill(); cqh.stroke(); cqh.fillStyle = "#db6e6e"; renderRectCircle(0, 0, cqa.scale * 0.65, 20, 4, cqh, true); } else if (cqa.name == "spawn pad") { cqh.fillStyle = "#7e7f82"; renderRect(0, 0, cqa.scale * 2, cqa.scale * 2, cqh); cqh.fill(); cqh.stroke(); cqh.fillStyle = "#71aad6"; renderCircle(0, 0, cqa.scale * 0.6, cqh); } else if (cqa.name == "blocker") { cqh.fillStyle = "#7e7f82"; renderCircle(0, 0, cqa.scale, cqh); cqh.fill(); cqh.stroke(); cqh.rotate(Math.PI / 4); cqh.fillStyle = "#db6e6e"; renderRectCircle(0, 0, cqa.scale * 0.65, 20, 4, cqh, true); } else if (cqa.name == "teleporter") { cqh.fillStyle = "#7e7f82"; renderCircle(0, 0, cqa.scale, cqh); cqh.fill(); cqh.stroke(); cqh.rotate(Math.PI / 4); cqh.fillStyle = "#d76edb"; renderCircle(0, 0, cqa.scale * 0.5, cqh, true); } cqd = cqf; if (!cqb) { itemSprites[cqa.id] = cqd; } } return cqd; } function getItemSprite2(crb, crc, crd) { let crf = mainContext; let crg = crb.name == "windmill" ? items.list[4].scale : crb.scale; crf.save(); crf.translate(crc, crd); crf.rotate(crb.dir); crf.strokeStyle = outlineColor; crf.lineWidth = outlineWidth; if (crb.name == "apple") { crf.fillStyle = "#c15555"; renderCircle(0, 0, crb.scale, crf); crf.fillStyle = "#89a54c"; let crh = -(Math.PI / 2); renderLeaf(crb.scale * Math.cos(crh), crb.scale * Math.sin(crh), 25, crh + Math.PI / 2, crf); } else if (crb.name == "cookie") { crf.fillStyle = "#cca861"; renderCircle(0, 0, crb.scale, crf); crf.fillStyle = "#937c4b"; let cri = 4; let crj = Math.PI * 2 / cri; let crk; for (let crl = 0; crl < cri; ++crl) { crk = UTILS.randInt(crb.scale / 2.5, crb.scale / 1.7); renderCircle(crk * Math.cos(crj * crl), crk * Math.sin(crj * crl), UTILS.randInt(4, 5), crf, true); } } else if (crb.name == "cheese") { crf.fillStyle = "#f4f3ac"; renderCircle(0, 0, crb.scale, crf); crf.fillStyle = "#c3c28b"; let crm = 4; let crn = Math.PI * 2 / crm; let cro; for (let crp = 0; crp < crm; ++crp) { cro = UTILS.randInt(crb.scale / 2.5, crb.scale / 1.7); renderCircle(cro * Math.cos(crn * crp), cro * Math.sin(crn * crp), UTILS.randInt(4, 5), crf, true); } } else if (crb.name == "wood wall" || crb.name == "stone wall" || crb.name == "castle wall") { crf.fillStyle = crb.name == "castle wall" ? "#83898e" : crb.name == "wood wall" ? "#a5974c" : "#939393"; let crq = crb.name == "castle wall" ? 4 : 3; renderStar(crf, crq, crb.scale * 1.1, crb.scale * 1.1); crf.fill(); crf.stroke(); crf.fillStyle = crb.name == "castle wall" ? "#9da4aa" : crb.name == "wood wall" ? "#c9b758" : "#bcbcbc"; renderStar(crf, crq, crb.scale * 0.65, crb.scale * 0.65); crf.fill(); } else if (crb.name == "spikes" || crb.name == "greater spikes" || crb.name == "poison spikes" || crb.name == "spinning spikes") { crf.fillStyle = crb.name == "poison spikes" ? "#7b935d" : "#939393"; let crr = crb.scale * 0.6; renderStar(crf, crb.name == "spikes" ? 5 : 6, crb.scale, crr); crf.fill(); crf.stroke(); crf.fillStyle = "#a5974c"; renderCircle(0, 0, crr, crf); crf.fillStyle = "#c9b758"; renderCircle(0, 0, crr / 2, crf, true); } else if (crb.name == "windmill" || crb.name == "faster windmill" || crb.name == "power mill") { crf.fillStyle = "#a5974c"; renderCircle(0, 0, crg, crf); crf.fillStyle = "#c9b758"; renderRectCircle(0, 0, crg * 1.5, 29, 4, crf); crf.fillStyle = "#a5974c"; renderCircle(0, 0, crg * 0.5, crf); } else if (crb.name == "mine") { crf.fillStyle = "#939393"; renderStar(crf, 3, crb.scale, crb.scale); crf.fill(); crf.stroke(); crf.fillStyle = "#bcbcbc"; renderStar(crf, 3, crb.scale * 0.55, crb.scale * 0.65); crf.fill(); } else if (crb.name == "sapling") { for (let crs = 0; crs < 2; ++crs) { let crt = crb.scale * (!crs ? 1 : 0.5); renderStar(crf, 7, crt, crt * 0.7); crf.fillStyle = !crs ? "#9ebf57" : "#b4db62"; crf.fill(); if (!crs) { crf.stroke(); } } } else if (crb.name == "pit trap") { crf.fillStyle = "#a5974c"; renderStar(crf, 3, crb.scale * 1.1, crb.scale * 1.1); crf.fill(); crf.stroke(); crf.fillStyle = outlineColor; renderStar(crf, 3, crb.scale * 0.65, crb.scale * 0.65); crf.fill(); } else if (crb.name == "boost pad") { crf.fillStyle = "#7e7f82"; renderRect(0, 0, crb.scale * 2, crb.scale * 2, crf); crf.fill(); crf.stroke(); crf.fillStyle = "#dbd97d"; renderTriangle(crb.scale * 1, crf); } else if (crb.name == "turret") { crf.fillStyle = "#a5974c"; renderCircle(0, 0, crb.scale, crf); crf.fill(); crf.stroke(); crf.fillStyle = "#939393"; let cru = 50; renderRect(0, -cru / 2, crb.scale * 0.9, cru, crf); renderCircle(0, 0, crb.scale * 0.6, crf); crf.fill(); crf.stroke(); } else if (crb.name == "platform") { crf.fillStyle = "#cebd5f"; let crv = 4; let crw = crb.scale * 2; let crx = crw / crv; let crz = -(crb.scale / 2); for (let csa = 0; csa < crv; ++csa) { renderRect(crz - crx / 2, 0, crx, crb.scale * 2, crf); crf.fill(); crf.stroke(); crz += crw / crv; } } else if (crb.name == "healing pad") { crf.fillStyle = "#7e7f82"; renderRect(0, 0, crb.scale * 2, crb.scale * 2, crf); crf.fill(); crf.stroke(); crf.fillStyle = "#db6e6e"; renderRectCircle(0, 0, crb.scale * 0.65, 20, 4, crf, true); } else if (crb.name == "spawn pad") { crf.fillStyle = "#7e7f82"; renderRect(0, 0, crb.scale * 2, crb.scale * 2, crf); crf.fill(); crf.stroke(); crf.fillStyle = "#71aad6"; renderCircle(0, 0, crb.scale * 0.6, crf); } else if (crb.name == "blocker") { crf.fillStyle = "#7e7f82"; renderCircle(0, 0, crb.scale, crf); crf.fill(); crf.stroke(); crf.rotate(Math.PI / 4); crf.fillStyle = "#db6e6e"; renderRectCircle(0, 0, crb.scale * 0.65, 20, 4, crf, true); } else if (crb.name == "teleporter") { crf.fillStyle = "#7e7f82"; renderCircle(0, 0, crb.scale, crf); crf.fill(); crf.stroke(); crf.rotate(Math.PI / 4); crf.fillStyle = "#d76edb"; renderCircle(0, 0, crb.scale * 0.5, crf, true); } crf.restore(); } let objSprites = []; function getObjSprite(csb) { let csd = objSprites[csb.id]; if (!csd) { let cse = 0; let csf = document.createElement("canvas"); csf.width = csf.height = csb.scale * 2.5 + outlineWidth + (items.list[csb.id].spritePadding || 0) + cse; let csg = csf.getContext("2d"); csg.translate(csf.width / 2, csf.height / 2); csg.rotate(Math.PI / 2); csg.strokeStyle = outlineColor; csg.lineWidth = outlineWidth; if (csb.name == "spikes" || csb.name == "greater spikes" || csb.name == "poison spikes" || csb.name == "spinning spikes") { csg.fillStyle = csb.name == "poison spikes" ? "#7b935d" : "#939393"; let csh = csb.scale * 0.6; renderStar(csg, csb.name == "spikes" ? 5 : 6, csb.scale, csh); csg.fill(); csg.stroke(); csg.shadowColor = "rgba(255, 0, 0, 0.8)"; csg.shadowBlur = 20; csg.shadowOffsetX = 0; csg.shadowOffsetY = 0; csg.fillStyle = "#a5974c"; renderCircle(0, 0, csh, csg); csg.shadowColor = "transparent"; csg.shadowBlur = 0; csg.shadowOffsetX = 0; csg.shadowOffsetY = 0; } else if (csb.name == "pit trap") { csg.fillStyle = "#a5974c"; renderStar(csg, 3, csb.scale * 1.1, csb.scale * 1.1); csg.fill(); csg.stroke(); csg.fillStyle = "#cc5151"; renderStar(csg, 3, csb.scale * 0.65, csb.scale * 0.65); csg.fill(); } csd = csf; objSprites[csb.id] = csd; } return csd; } function getMarkSprite(csi, csj, csk, csl) { let csn = { x: screenWidth / 2, y: screenHeight / 2 }; csj.lineWidth = outlineWidth; mainContext.globalAlpha = 0.2; csj.strokeStyle = outlineColor; csj.save(); csj.translate(csk, csl); csj.rotate(34867844010000000000); if (csi.name == "spikes" || csi.name == "greater spikes" || csi.name == "poison spikes" || csi.name == "spinning spikes") { csj.fillStyle = csi.name == "poison spikes" ? "#7b935d" : "#939393"; var cso = csi.scale; renderStar(csj, csi.name == "spikes" ? 5 : 6, csi.scale, cso); csj.fill(); csj.stroke(); csj.fillStyle = "#a5974c"; renderCircle(0, 0, cso, csj); if (player && csi.owner && player.sid != csi.owner.sid && !tmpObj.findAllianceBySid(csi.owner.sid)) { csj.fillStyle = "#a34040"; } else { csj.fillStyle = "#c9b758"; } renderCircle(0, 0, cso / 2, csj, true); } else if (csi.name == "turret") { renderCircle(0, 0, csi.scale, csj); csj.fill(); csj.stroke(); csj.fillStyle = "#939393"; let csp = 50; renderRect(0, -csp / 2, csi.scale * 0.9, csp, csj); renderCircle(0, 0, csi.scale * 0.6, csj); csj.fill(); csj.stroke(); } else if (csi.name == "teleporter") { csj.fillStyle = "#7e7f82"; renderCircle(0, 0, csi.scale, csj); csj.fill(); csj.stroke(); csj.rotate(Math.PI / 4); csj.fillStyle = "#d76edb"; renderCircle(0, 0, csi.scale * 0.5, csj, true); } else if (csi.name == "platform") { csj.fillStyle = "#cebd5f"; let csq = 4; let csr = csi.scale * 2; let cst = csr / csq; let csu = -(csi.scale / 2); for (let csv = 0; csv < csq; ++csv) { renderRect(csu - cst / 2, 0, cst, csi.scale * 2, csj); csj.fill(); csj.stroke(); csu += csr / csq; } } else if (csi.name == "healing pad") { csj.fillStyle = "#7e7f82"; renderRect(0, 0, csi.scale * 2, csi.scale * 2, csj); csj.fill(); csj.stroke(); csj.fillStyle = "#db6e6e"; renderRectCircle(0, 0, csi.scale * 0.65, 20, 4, csj, true); } else if (csi.name == "spawn pad") { csj.fillStyle = "#7e7f82"; renderRect(0, 0, csi.scale * 2, csi.scale * 2, csj); csj.fill(); csj.stroke(); csj.fillStyle = "#71aad6"; renderCircle(0, 0, csi.scale * 0.6, csj); } else if (csi.name == "blocker") { csj.fillStyle = "#7e7f82"; renderCircle(0, 0, csi.scale, csj); csj.fill(); csj.stroke(); csj.rotate(Math.PI / 4); csj.fillStyle = "#db6e6e"; renderRectCircle(0, 0, csi.scale * 0.65, 20, 4, csj, true); } else if (csi.name == "windmill" || csi.name == "faster windmill" || csi.name == "power mill") { csj.fillStyle = "#a5974c"; renderCircle(0, 0, csi.scale, csj); csj.fillStyle = "#c9b758"; renderRectCircle(0, 0, csi.scale * 1.5, 29, 4, csj); csj.fillStyle = "#a5974c"; renderCircle(0, 0, csi.scale * 0.5, csj); } else if (csi.name == "pit trap") { csj.fillStyle = "#a5974c"; renderStar(csj, 3, csi.scale * 1.1, csi.scale * 1.1); csj.fill(); csj.stroke(); if (player && csi.owner && player.sid != csi.owner.sid && !tmpObj.findAllianceBySid(csi.owner.sid)) { csj.fillStyle = "#a34040"; } else { csj.fillStyle = outlineColor; } renderStar(csj, 3, csi.scale * 0.65, csi.scale * 0.65); csj.fill(); } csj.restore(); } function renderGameObjects(csw, csx, csy) { let cta; let ctb; let ctc; liztobj.forEach(ctd => { tmpObj = ctd; if (tmpObj.active && liztobj.includes(ctd) && tmpObj.render) { ctb = tmpObj.x + tmpObj.xWiggle - csx; ctc = tmpObj.y + tmpObj.yWiggle - csy; if (csw == 0) { tmpObj.update(delta); } mainContext.globalAlpha = tmpObj.alpha; if (tmpObj.layer == csw && ctb + (tmpObj.scale + (tmpObj.blocker || 0)) >= 0 && ctb - (tmpObj.scale + (tmpObj.blocker || 0)) <= maxScreenWidth && ctc + (tmpObj.scale + (tmpObj.blocker || 0)) >= 0 && (ctc, tmpObj.scale + (tmpObj.blocker || 0), maxScreenHeight)) { if (tmpObj.isItem) { if ((tmpObj.dmg || tmpObj.trap) && !tmpObj.isTeamObject(player)) { cta = getObjSprite(tmpObj); } else { cta = getItemSprite(tmpObj); } mainContext.save(); mainContext.translate(ctb, ctc); mainContext.rotate(tmpObj.dir); if (!tmpObj.active) { mainContext.scale(tmpObj.visScale / tmpObj.scale, tmpObj.visScale / tmpObj.scale); } mainContext.drawImage(cta, -(cta.width / 2), -(cta.height / 2)); if (tmpObj.blocker) { mainContext.strokeStyle = "#db6e6e"; mainContext.globalAlpha = 0.3; mainContext.lineWidth = 6; renderCircle(0, 0, tmpObj.blocker, mainContext, false, true); } mainContext.restore(); } else { cta = getResSprite(tmpObj); mainContext.drawImage(cta, ctb - cta.width / 2, ctc - cta.height / 2); } } if (csw == 3) { if (tmpObj.health < tmpObj.maxHealth && getEl("BuildHealth").value == "bh1") { mainContext.fillStyle = darkOutlineColor; mainContext.roundRect(ctb - config.healthBarWidth / 2 - config.healthBarPad, ctc - config.healthBarPad, config.healthBarWidth + config.healthBarPad * 2, 17, 8); mainContext.fill(); mainContext.fillStyle = tmpObj.isTeamObject(player) ? "#8ecc51" : "#cc5151"; mainContext.roundRect(ctb - config.healthBarWidth / 2, ctc, config.healthBarWidth * (tmpObj.health / tmpObj.maxHealth), 17 - config.healthBarPad * 2, 7); mainContext.fill(); } if (tmpObj.health < tmpObj.maxHealth && getEl("BuildHealth").value == "bh2") { mainContext.fillStyle = darkOutlineColor; mainContext.beginPath(); mainContext.arc(ctb, ctc, config.healthBarWidth / 2 + config.healthBarPad, 0, Math.PI * 2); mainContext.fill(); mainContext.fillStyle = tmpObj.isTeamObject(player) ? "#8ecc51" : "#cc5151"; mainContext.beginPath(); const ctf = tmpObj.health / tmpObj.maxHealth; mainContext.arc(ctb, ctc, config.healthBarWidth / 2, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2 * ctf); mainContext.lineTo(ctb, ctc); mainContext.fill(); } if (tmpObj.health < tmpObj.maxHealth && getEl("BuildHealth").value == "bh3") { const ctg = tmpObj.health / tmpObj.maxHealth * 360 * (Math.PI / 180); const cth = 14; const cti = 22; mainContext.save(); mainContext.lineWidth = 9; mainContext.lineCap = "round"; mainContext.translate(ctb, ctc); mainContext.beginPath(); mainContext.arc(0, 0, cti, 0, ctg); mainContext.stroke(); mainContext.restore(); mainContext.save(); mainContext.strokeStyle = tmpObj.isTeamObject(player) ? "#8ecc51" : "#cc5151"; mainContext.lineCap = "round"; mainContext.translate(ctb, ctc); mainContext.beginPath(); mainContext.arc(0, 0, cti, 0, ctg); mainContext.stroke(); mainContext.restore(); } } } }); if (csw == 0) { if (placeVisible.length) { placeVisible.forEach(ctj => { ctb = ctj.x - csx; ctc = ctj.y - csy; markObject(ctj, ctb, ctc); }); } } } function markObject(ctk, ctl, ctm) { yen(mainContext, ctl, ctm); } function yen(ctn, cto, ctp) { ctn.fillStyle = "rgba(0, 255, 255, 0.5)"; ctn.beginPath(); ctn.arc(cto, ctp, 55, 0, Math.PI * 2); ctn.fill(); ctn.closePath(); ctn.globalAlpha = 1; } class MapPing { constructor(ctr, cts) { this.init = function(ctu, ctv) { this.scale = 0; this.x = ctu; this.y = ctv; this.active = true; }; this.update = function(ctx, cty) { if (this.active) { this.scale += cty * 0.05; if (this.scale >= cts) { this.active = false; } else { ctx.globalAlpha = 1 - Math.max(0, this.scale / cts); ctx.beginPath(); ctx.arc(this.x / config.mapScale * mapDisplay.width, this.y / config.mapScale * mapDisplay.width, this.scale, 0, Math.PI * 2); ctx.stroke(); } } }; this.color = ctr; } } let relMin = 55; let relMax = 385; function getBarColor(cua, cub) { let cud = tmpObj; if (cub) { if (cua <= 0.3703703703703704) { return "#8ecc51"; } else if (cua <= 0.7407407407407408) { return "hsl(" + relMin + ", 50%, 60%)"; } else { return "#f9f64f"; } } else { let cue = 1 - cua; if (cud.secondary != 10) { let cuf = "hsl(" + Math.round(relMax + cue * (relMin - relMax)) % 360 + ", 50%, 60%)"; if (cua == 1) { return "#f4f259"; } else { return cuf; } } else if (cud.secondary == 10) { let cug = "hsl(" + Math.round(relMax + cue * (relMin - relMax)) % 360 + ", 50%, 60%)"; if (cua <= 0.3703703703703704) { return "#73bfa2"; } else if (cua <= 0.7407407407407408) { return "#8ecc51"; } else { return "#f9f64f"; } } } } function pingMap(cuh, cui) { tmpPing = mapPings.find(cuk => !cuk.active); if (!tmpPing) { tmpPing = new MapPing("#fff", config.mapPingScale); mapPings.push(tmpPing); } tmpPing.init(cuh, cui); } function updateMapMarker() { mapMarker.x = player.x; mapMarker.y = player.y; } function renderMinimap(cul) { if (player && player.alive) { mapContext.clearRect(0, 0, mapDisplay.width, mapDisplay.height); mapContext.lineWidth = 4; for (let cuo = 0; cuo < mapPings.length; ++cuo) { tmpPing = mapPings[cuo]; mapContext.strokeStyle = tmpPing.color; tmpPing.update(mapContext, cul); } mapContext.globalAlpha = 1; mapContext.fillStyle = "#ff0000"; if (breakTrackers.length) { mapContext.fillStyle = "#abcdef"; mapContext.font = "34px Hammersmith One"; mapContext.textBaseline = "middle"; mapContext.textAlign = "center"; for (let cup = 0; cup < breakTrackers.length;) { mapContext.fillText("!", breakTrackers[cup].x / config.mapScale * mapDisplay.width, breakTrackers[cup].y / config.mapScale * mapDisplay.height); cup += 2; } } mapContext.globalAlpha = 1; mapContext.fillStyle = "#fff"; renderCircle(player.x / config.mapScale * mapDisplay.width, player.y / config.mapScale * mapDisplay.height, 7, mapContext, true); mapContext.fillStyle = "rgba(255,255,255,0.35)"; if (player.team && minimapData) { for (let cuq = 0; cuq < minimapData.length;) { renderCircle(minimapData[cuq] / config.mapScale * mapDisplay.width, minimapData[cuq + 1] / config.mapScale * mapDisplay.height, 7, mapContext, true); cuq += 2; } } if (bots.length) { bots.forEach(cur => { if (cur.inGame) { mapContext.globalAlpha = 1; mapContext.strokeStyle = "#cc5151"; renderCircle(cur.x2 / config.mapScale * mapDisplay.width, cur.y2 / config.mapScale * mapDisplay.height, 7, mapContext, false, true); } }); } if (lastDeath) { mapContext.fillStyle = "#fc5553"; mapContext.font = "34px Hammersmith One"; mapContext.textBaseline = "middle"; mapContext.textAlign = "center"; mapContext.fillText("x", lastDeath.x / config.mapScale * mapDisplay.width, lastDeath.y / config.mapScale * mapDisplay.height); } if (mapMarker) { mapContext.fillStyle = "#fff"; mapContext.font = "34px Hammersmith One"; mapContext.textBaseline = "middle"; mapContext.textAlign = "center"; mapContext.fillText("x", mapMarker.x / config.mapScale * mapDisplay.width, mapMarker.y / config.mapScale * mapDisplay.height); } } } let crossHairs = ["https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Crosshairs_Red.svg/1200px-Crosshairs_Red.svg.png", "https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Crosshairs_Red.svg/1200px-Crosshairs_Red.svg.png"]; let crossHairSprites = {}; let iconSprites = {}; let icons = ["crown", "skull"]; function loadIcons() { for (let cuu = 0; cuu < icons.length; ++cuu) { let cuv = new Image(); cuv.onload = function() { this.isLoaded = true; }; cuv.src = "./../img/icons/" + icons[cuu] + ".png"; iconSprites[icons[cuu]] = cuv; } for (let cux = 0; cux < crossHairs.length; ++cux) { let cuy = new Image(); cuy.onload = function() { this.isLoaded = true; }; cuy.src = crossHairs[cux]; crossHairSprites[cux] = cuy; } } loadIcons(); function cdf(cva, cvb) { try { return Math.hypot((cvb.y2 || cvb.y) - (cva.y2 || cva.y), (cvb.x2 || cvb.x) - (cva.x2 || cva.x)); } catch (cvd) { return Infinity; } } function updateGame() { if (gameObjects.length && inGame) { gameObjects.forEach(cvf => { if (UTILS.getDistance(cvf.x, cvf.y, player.x, player.y) <= 1200) { if (!liztobj.includes(cvf)) { liztobj.push(cvf); cvf.render = true; } } else if (liztobj.includes(cvf)) { if (UTILS.getDistance(cvf.x, cvf.y, player.x, player.y) >= 1200) { cvf.render = false; const cvh = liztobj.indexOf(cvf); if (cvh > -1) { liztobj.splice(cvh, 1); } } } else if (UTILS.getDistance(cvf.x, cvf.y, player.x, player.y) >= 1200) { cvf.render = false; const cvi = liztobj.indexOf(cvf); if (cvi > -1) { liztobj.splice(cvi, 1); } } else { cvf.render = false; const cvj = liztobj.indexOf(cvf); if (cvj > -1) { liztobj.splice(cvj, 1); } } }); } mainContext.beginPath(); mainContext.clearRect(0, 0, gameCanvas.width, gameCanvas.height); mainContext.globalAlpha = 1; function cvk(cvl, cvm, cvn = 25) { camX = (camX * (cvn - 1) + cvl) / cvn; camY = (camY * (cvn - 1) + cvm) / cvn; } if (player) { let cvo = player.x; let cvp = player.y; if (near.dist2 <= 1000 && inGame || !getEl("combatZoom").checked) { maxScreenWidth = config.maxScreenWidth * 1; maxScreenHeight = config.maxScreenHeight * 1; } else { maxScreenWidth = config.maxScreenWidth * 1.4; maxScreenHeight = config.maxScreenHeight * 1.4; } let cvq = getEl("cameramodes").value; if (cvq === "camera3") { cvk(cvo, cvp); let cvr = (mouseX - window.innerWidth / 2) / 175; let cvs = (mouseY - window.innerHeight / 2) / 175; camX += cvr; camY += cvs; resize(); let cvt = UTILS.getDistance(camX, camY, cvo, cvp); let cvu = UTILS.getDirection(cvo, cvp, camX, camY); let cvv = 0.0001; let cvw = cvt * cvv; if (cvt > 1e-19) { camX += (cvw * Math.cos(cvu) - camX) * cvv; camY += (cvw * Math.sin(cvu) - camY) * cvv; } else { camX = cvo; camY = cvp; } } else if (cvq === "camera2") { cvk(cvo, cvp); let cvx = UTILS.getDistance(camX, camY, cvo, cvp); let cvy = UTILS.getDirection(cvo, cvp, camX, camY); let cvz = 0.0001; let cwa = cvx * cvz; if (cvx > 1e-19) { camX += (cwa * Math.cos(cvy) - camX) * cvz; camY += (cwa * Math.sin(cvy) - camY) * cvz; } else { camX = cvo; camY = cvp; } } else if (cvq === "camera1") { camX = cvo; camY = cvp; let cwb = UTILS.getDistance(camX, camY, cvo, cvp); let cwc = UTILS.getDirection(cvo, cvp, camX, camY); let cwd = Math.min(cwb * 0.005 * delta, cwb); if (cwb > 0.05) { camX += cwd * Math.cos(cwc); camY += cwd * Math.sin(cwc); } else { camX = cvo; camY = cvp; } } else { camX = config.mapScale / 2; camY = config.mapScale / 2; } } else { camX = config.mapScale / 2; camY = config.mapScale / 2; } let cwe = now - 950 / config.serverUpdateRate; let cwf; for (let cwg = 0; cwg < players.length + ais.length; ++cwg) { tmpObj = players[cwg] || ais[cwg - players.length]; if (tmpObj && tmpObj.visible) { if (tmpObj.forcePos) { tmpObj.x = tmpObj.x2; tmpObj.y = tmpObj.y2; tmpObj.dir = tmpObj.d2; } else { let cwh = tmpObj.t2 - tmpObj.t1; let cwi = cwe - tmpObj.t1; let cwj = cwi / cwh; let cwk = 170; tmpObj.dt += delta; let cwl = Math.min(1.7, tmpObj.dt / cwk); cwf = tmpObj.x2 - tmpObj.x1; tmpObj.x = tmpObj.x1 + cwf * cwl; cwf = tmpObj.y2 - tmpObj.y1; tmpObj.y = tmpObj.y1 + cwf * cwl; if (config.anotherVisual) { tmpObj.dir = Math.lerpAngle(tmpObj.d2, tmpObj.d1, Math.min(1.2, cwj)); } else { tmpObj.dir = Math.lerpAngle(tmpObj.d2, tmpObj.d1, Math.min(1.2, cwj)); } } } } let cwm = camX - maxScreenWidth / 2; let cwn = camY - maxScreenHeight / 2; if (config.snowBiomeTop - cwn <= 0 && config.mapScale - config.snowBiomeTop - cwn >= maxScreenHeight) { mainContext.fillStyle = "#b6db66"; mainContext.fillRect(0, 0, maxScreenWidth, maxScreenHeight); } else if (config.mapScale - config.snowBiomeTop - cwn <= 0) { mainContext.fillStyle = "#dbc666"; mainContext.fillRect(0, 0, maxScreenWidth, maxScreenHeight); } else if (config.snowBiomeTop - cwn >= maxScreenHeight) { mainContext.fillStyle = "#fff"; mainContext.fillRect(0, 0, maxScreenWidth, maxScreenHeight); } else if (config.snowBiomeTop - cwn >= 0) { mainContext.fillStyle = "#fff"; mainContext.fillRect(0, 0, maxScreenWidth, config.snowBiomeTop - cwn); mainContext.fillStyle = "#b6db66"; mainContext.fillRect(0, config.snowBiomeTop - cwn, maxScreenWidth, maxScreenHeight - (config.snowBiomeTop - cwn)); } else { mainContext.fillStyle = "#b6db66"; mainContext.fillRect(0, 0, maxScreenWidth, config.mapScale - config.snowBiomeTop - cwn); mainContext.fillStyle = "#dbc666"; mainContext.fillRect(0, config.mapScale - config.snowBiomeTop - cwn, maxScreenWidth, maxScreenHeight - (config.mapScale - config.snowBiomeTop - cwn)); } if (!firstSetup) { waterMult += waterPlus * config.waveSpeed * delta; if (waterMult >= config.waveMax) { waterMult = config.waveMax; waterPlus = -1; } else if (waterMult <= 1) { waterMult = waterPlus = 1; } mainContext.globalAlpha = 1; mainContext.fillStyle = "#dbc666"; renderWaterBodies(cwm, cwn, mainContext, config.riverPadding); mainContext.fillStyle = "#91b2db"; renderWaterBodies(cwm, cwn, mainContext, (waterMult - 1) * 250); } if (getEl("showgrid").checked) { mainContext.lineWidth = 4; mainContext.strokeStyle = "#000"; mainContext.globalAlpha = 0.06; } else { mainContext.lineWidth = 0; mainContext.strokeStyle = "#000"; mainContext.globalAlpha = 0; } for (let cwo = -camX; cwo < maxScreenWidth; cwo += maxScreenHeight / 18) { if (cwo > 0) { mainContext.moveTo(cwo, 0); mainContext.lineTo(cwo, maxScreenHeight); } } for (let cwp = -camY; cwp < maxScreenHeight; cwp += maxScreenHeight / 18) { if (cwp > 0) { mainContext.moveTo(0, cwp); mainContext.lineTo(maxScreenWidth, cwp); } } mainContext.stroke(); if (pathFind.active) { if (pathFind.array && (pathFind.chaseNear ? enemy.length : true)) { mainContext.lineWidth = 3; mainContext.globalAlpha = 1; mainContext.strokeStyle = "cyan"; mainContext.beginPath(); pathFind.array.forEach((cwq, cwr) => { let cwt = { x: pathFind.scale / pathFind.grid * cwq.x, y: pathFind.scale / pathFind.grid * cwq.y }; let cwu = { x: player.x2 - pathFind.scale / 2 + cwt.x - cwm, y: player.y2 - pathFind.scale / 2 + cwt.y - cwn }; if (cwr == 0) { mainContext.moveTo(cwu.x, cwu.y); } else { mainContext.lineTo(cwu.x, cwu.y); } }); mainContext.stroke(); } } mainContext.globalAlpha = 1; mainContext.strokeStyle = outlineColor; renderDeadPlayers(cwm, cwn); mainContext.globalAlpha = 1; mainContext.strokeStyle = outlineColor; renderGameObjects(-1, cwm, cwn); mainContext.globalAlpha = 1; mainContext.lineWidth = outlineWidth; renderProjectiles(0, cwm, cwn); renderPlayers(cwm, cwn, 0); mainContext.globalAlpha = 1; for (let cwv = 0; cwv < ais.length; ++cwv) { tmpObj = ais[cwv]; if (tmpObj.active && tmpObj.visible) { tmpObj.animate(delta); mainContext.save(); mainContext.translate(tmpObj.x - cwm, tmpObj.y - cwn); mainContext.rotate(tmpObj.dir + tmpObj.dirPlus - Math.PI / 2); renderAI(tmpObj, mainContext); mainContext.restore(); } } renderGameObjects(0, cwm, cwn); renderProjectiles(1, cwm, cwn); renderGameObjects(1, cwm, cwn); renderPlayers(cwm, cwn, 1); renderGameObjects(2, cwm, cwn); renderGameObjects(3, cwm, cwn); mainContext.fillStyle = "#000"; mainContext.globalAlpha = 0.09; if (cwm <= 0) { mainContext.fillRect(0, 0, -cwm, maxScreenHeight); } if (config.mapScale - cwm <= maxScreenWidth) { let cww = Math.max(0, -cwn); mainContext.fillRect(config.mapScale - cwm, cww, maxScreenWidth - (config.mapScale - cwm), maxScreenHeight - cww); } if (cwn <= 0) { mainContext.fillRect(-cwm, 0, maxScreenWidth + cwm, -cwn); } if (config.mapScale - cwn <= maxScreenHeight) { let cwx = Math.max(0, -cwm); let cwy = 0; if (config.mapScale - cwm <= maxScreenWidth) { cwy = maxScreenWidth - (config.mapScale - cwm); } mainContext.fillRect(cwx, config.mapScale - cwn, maxScreenWidth - cwx - cwy, maxScreenHeight - (config.mapScale - cwn)); } if (getEl("daytime").checked) { mainContext.globalAlpha = 1; mainContext.fillStyle = "rgba(0, 0, 70, 0.35)"; mainContext.fillRect(0, 0, maxScreenWidth, maxScreenHeight); } else { mainContext.globalAlpha = 1; mainContext.fillStyle = "rgba(0, 0, 70, 0.6)"; mainContext.fillRect(0, 0, maxScreenWidth, maxScreenHeight); } if (tracker.draw3.active) { mainContext.globalAlpha = 1; let cwz = { x: tracker.draw3.x - cwm, y: tracker.draw3.y - cwn, scale: tracker.draw3.scale }; mainContext.strokeStyle = "#cc5151"; mainContext.lineWidth = 3.25; mainContext.beginPath(); mainContext.arc(cwz.x, cwz.y, cwz.scale, 0, Math.PI * 2); mainContext.stroke(); } if (tracker.draw2.active) { mainContext.globalAlpha = 0.5; let cxa = { x: tracker.draw2.x - cwm, y: tracker.draw2.y - cwn, scale: tracker.draw2.scale }; mainContext.fillStyle = "rgba(255, 0, 0, 0.5)"; mainContext.beginPath(); mainContext.arc(cxa.x, cxa.y, cxa.scale, 0, Math.PI * 2); mainContext.fill(); mainContext.closePath(); mainContext.globalAlpha = 1; } mainContext.strokeStyle = darkOutlineColor; mainContext.globalAlpha = 1; mainContext.beginPath(); for (let cxb = 0; cxb < players.length + ais.length; ++cxb) { tmpObj = players[cxb] || ais[cxb - players.length]; if (tmpObj.visible) { mainContext.strokeStyle = darkOutlineColor; let cxc = (tmpObj.team ? "[" + tmpObj.team + "] " : "") + (tmpObj.name || ""); if (cxc != "") { mainContext.globalAlpha = 1; mainContext.font = (tmpObj.nameScale || 30) + "px Hammersmith One"; mainContext.fillStyle = "#fff"; mainContext.textBaseline = "middle"; mainContext.textAlign = "center"; mainContext.lineWidth = tmpObj.nameScale ? 11 : 8; mainContext.lineJoin = "round"; mainContext.strokeText(cxc, tmpObj.x - cwm, tmpObj.y - cwn - tmpObj.scale - config.nameY); mainContext.fillText(cxc, tmpObj.x - cwm, tmpObj.y - cwn - tmpObj.scale - config.nameY); if (tmpObj.isLeader && iconSprites.crown.isLoaded) { let cxd = config.crownIconScale; let cxe = tmpObj.x - cwm - cxd / 2 - mainContext.measureText(cxc).width / 2 - config.crownPad; mainContext.drawImage(iconSprites.crown, cxe, tmpObj.y - cwn - tmpObj.scale - config.nameY - cxd / 2 - 5, cxd, cxd); } if (tmpObj.iconIndex == 1 && iconSprites.skull.isLoaded) { let cxf = config.crownIconScale; let cxg = tmpObj.x - cwm - cxf / 2 + mainContext.measureText(cxc).width / 2 + config.crownPad; mainContext.drawImage(iconSprites.skull, cxg, tmpObj.y - cwn - tmpObj.scale - config.nameY - cxf / 2 - 5, cxf, cxf); } if (tmpObj.isPlayer && instaC.wait && near == tmpObj && (tmpObj.backupNobull ? crossHairSprites[1].isLoaded : crossHairSprites[0].isLoaded) && enemy.length && !useWasd) { let cxh = tmpObj.scale * 2.2; mainContext.drawImage(tmpObj.backupNobull ? crossHairSprites[1] : crossHairSprites[0], tmpObj.x - cwm - cxh / 2, tmpObj.y - cwn - cxh / 2, cxh, cxh); } } if (!getEl("cleanmode").checked) { if (tmpObj.isPlayer) { let cxi = tmpObj.x - cwm + mainContext.measureText(cxc).width / 2 + config.crownPad; let cxj = tmpObj.y - cwn - tmpObj.scale - config.nameY; if (tmpObj.iconIndex == 1) { cxi = tmpObj.x - cwm - 30 + mainContext.measureText(cxc).width / 2 + config.crownPad * 3.5 + 5; } mainContext.font = (tmpObj.nameScale || 30) + "px Hammersmith One"; if (tmpObj.shameCount > 4) { mainContext.fillStyle = "#cc5151"; } else if (tmpObj.shameCount > 2) { mainContext.fillStyle = "#ffff00"; } else { mainContext.fillStyle = tmpObj == player || tmpObj.team && tmpObj.team == player.team ? "#8ecc51" : "#fff"; } mainContext.textBaseline = "middle"; mainContext.textAlign = "center"; mainContext.lineWidth = tmpObj.nameScale ? 11 : 8; mainContext.lineJoin = "round"; mainContext.strokeText(tmpObj.shameCount, cxi, cxj); mainContext.fillText(tmpObj.shameCount, cxi, cxj); } } if (tmpObj.health > 0) { if (tmpObj.name != "") { mainContext.fillStyle = darkOutlineColor; mainContext.roundRect(tmpObj.x - cwm - config.healthBarWidth - config.healthBarPad, tmpObj.y - cwn + tmpObj.scale + config.nameY, config.healthBarWidth * 2 + config.healthBarPad * 2, 17, 8); mainContext.fill(); mainContext.fillStyle = tmpObj == player || tmpObj.team && tmpObj.team == player.team ? "#8ecc51" : "#cc5151"; mainContext.roundRect(tmpObj.x - cwm - config.healthBarWidth, tmpObj.y - cwn + tmpObj.scale + config.nameY + config.healthBarPad, config.healthBarWidth * 2 * (tmpObj.health / tmpObj.maxHealth), 17 - config.healthBarPad * 2, 7); mainContext.fill(); } if (tmpObj.isPlayer && !getEl("cleanmode").checked) { mainContext.globalAlpha = 1; let cxk = { primary: tmpObj.primaryIndex == undefined ? 1 : (items.weapons[tmpObj.primaryIndex].speed - tmpObj.reloads[tmpObj.primaryIndex]) / items.weapons[tmpObj.primaryIndex].speed, secondary: tmpObj.secondaryIndex == undefined ? 1 : (items.weapons[tmpObj.secondaryIndex].speed - tmpObj.reloads[tmpObj.secondaryIndex]) / items.weapons[tmpObj.secondaryIndex].speed, turret: (2500 - tmpObj.reloads[53]) / 2500 }; if (!tmpObj.currentReloads) { tmpObj.currentReloads = { primary: cxk.primary, secondary: cxk.secondary, turret: cxk.turret }; } const cxl = 0.3; tmpObj.currentReloads.primary = (1 - cxl) * tmpObj.currentReloads.primary + cxl * cxk.primary; tmpObj.currentReloads.secondary = (1 - cxl) * tmpObj.currentReloads.secondary + cxl * cxk.secondary; tmpObj.currentReloads.turret = (1 - cxl) * tmpObj.currentReloads.turret + cxl * cxk.turret; if (tmpObj.currentReloads.secondary < 0.999) { let cxm = tmpObj.currentReloads.secondary; mainContext.fillStyle = darkOutlineColor; mainContext.roundRect(tmpObj.x - cwm + 2 - config.healthBarPad, tmpObj.y - cwn + tmpObj.scale + config.nameY - 13, 47 + config.healthBarPad * 2, 17, 10); mainContext.fill(); mainContext.fillStyle = tmpObj == player || tmpObj.team && tmpObj.team == player.team ? "#8ecc51" : "#cc5151"; mainContext.roundRect(tmpObj.x - cwm + 2, tmpObj.y - cwn + tmpObj.scale + config.nameY - 13 + config.healthBarPad, cxm * 47, 16 - config.healthBarPad * 2, 10); mainContext.fill(); } if (tmpObj.currentReloads.primary < 0.999) { let cxn = tmpObj.currentReloads.primary; mainContext.fillStyle = darkOutlineColor; mainContext.roundRect(tmpObj.x - cwm - 50 - config.healthBarPad, tmpObj.y - cwn + tmpObj.scale + config.nameY - 13, 47 + config.healthBarPad * 2, 17, 10); mainContext.fill(); mainContext.fillStyle = tmpObj == player || tmpObj.team && tmpObj.team == player.team ? "#8ecc51" : "#cc5151"; mainContext.roundRect(tmpObj.x - cwm - 50, tmpObj.y - cwn + tmpObj.scale + config.nameY - 13 + config.healthBarPad, cxn * 47, 16 - config.healthBarPad * 2, 10); mainContext.fill(); } if (tmpObj == player) {} } if (inGame) { cxo(0, 20, 20, "rgba(0,0,0,5)", "auto", 6, true); } } } } function cxo(cxp, cxq, cxr, cxs, cxt, cxu = 0, cxv) { let cxx = cxv == true ? tmpObj.isPlayer && tmpObj != player : tmpObj.isPlayer && tmpObj.sid != player.sid && (!isAlly(tmpObj.sid) || tmpObj.sid == player.sid); let cxy = { x: screenWidth / 2, y: screenHeight / 2 }; let cxz = Math.min(1, UTILS.getDistance(0, 0, player.x - tmpObj.x, (player.y - tmpObj.y) * 1.7777777777777777) * 100 / (config.maxScreenHeight / 2) / cxy.y); if (cxx && !tmpObj.isTeam(player)) { let cya = Math.sqrt((tmpObj.x - player.x) ** 2 + (tmpObj.x - player.x) ** 2); let cyb = player.x + cya * 0.5 * Math.cos(Math.atan2(tmpObj.y - player.y, tmpObj.x - player.x)); let cyc = player.y + cya * 0.5 * Math.sin(Math.atan2(tmpObj.y - player.y, tmpObj.x - player.x)); mainContext.save(); mainContext.translate(cyb - cwm, cyc - cwn); mainContext.rotate(Math.atan2(tmpObj.y - player.y, tmpObj.x - player.x) + Math.PI / 2); mainContext.fillStyle = cxs; mainContext.globalAlpha = cxt == "auto" ? cxz : cxt; mainContext.lineWidth = cxu; mainContext.lineCap = "round"; mainContext.beginPath(); mainContext.strokeStyle = "transparent"; mainContext.moveTo(cxp, cxp); mainContext.lineTo(cxq, cxq); mainContext.lineTo(-cxr, cxr); mainContext.fill(); mainContext.stroke(); mainContext.closePath(); mainContext.restore(); } } function cyd(cye, cyf, cyg, cyh, cyi, cyj, cyk, cyl) { mainContext.save(); mainContext.translate(cyg - cye, cyh - cyf); mainContext.rotate(Math.PI / 4); mainContext.rotate(cyk); mainContext.globalAlpha = 1; mainContext.strokeStyle = cyj; mainContext.lineCap = "round"; mainContext.lineWidth = cyl; mainContext.beginPath(); mainContext.moveTo(-cyi, -cyi); mainContext.lineTo(cyi, -cyi); mainContext.lineTo(cyi, cyi); mainContext.stroke(); mainContext.closePath(); mainContext.restore(); } if (player) { if (my.autoPush && my.pushData) { let cyn = near.dist2; mainContext.lineWidth = 5; mainContext.globalAlpha = Math.max(0.5, 1 - cyn / 1000000); mainContext.lineCap = "round"; mainContext.beginPath(); mainContext.strokeStyle = "#FFFFFF"; let cyo = Math.max(5, Math.min(20, cyn / 100)); mainContext.setLineDash([cyo, cyo * 2]); mainContext.moveTo(player.x - cwm, player.y - cwn); let cyp = (player.x + my.pushData.x) / 2 - cwm; let cyq = (player.y + my.pushData.y) / 2 - cwn - 100; mainContext.quadraticCurveTo(cyp, cyq, my.pushData.x - cwm, my.pushData.y - cwn); mainContext.stroke(); mainContext.setLineDash([]); mainContext.lineWidth = 9; mainContext.globalAlpha = 0.2; mainContext.stroke(); } } mainContext.globalAlpha = 1; renderMinimap(delta); textManager.update(delta, mainContext, cwm, cwn); for (let cyr = 0; cyr < players.length; ++cyr) { tmpObj = players[cyr]; if (tmpObj.visible) { if (tmpObj.chatCountdown > 0) { tmpObj.chatCountdown -= delta; if (tmpObj.chatCountdown <= 0) { tmpObj.chatCountdown = 0; } mainContext.font = "22px Lilita One"; let cys = mainContext.measureText(tmpObj.chatMessage); mainContext.textBaseline = "middle"; mainContext.textAlign = "center"; let cyt = tmpObj.x - cwm; let cyu = tmpObj.y - tmpObj.scale - cwn - 130; let cyv = 47; let cyw = cys.width + 17; mainContext.fillStyle = "rgba(0,0,0,0.2)"; mainContext.roundRect(cyt - cyw / 2, cyu - cyv / 2, cyw, cyv, 6); mainContext.fill(); mainContext.fillStyle = "#fff"; mainContext.fillText(tmpObj.chatMessage, cyt, cyu); } if (tmpObj.chat.count > 0) { tmpObj.chat.count -= delta; if (tmpObj.chat.count <= 0) { tmpObj.chat.count = 0; } mainContext.font = "25px Lilita One"; let cyx = mainContext.measureText(tmpObj.chat.message); mainContext.textBaseline = "middle"; mainContext.textAlign = "center"; let cyy = tmpObj.x - cwm; let cyz = tmpObj.y - tmpObj.scale - cwn + 140; let cza = 47; let czb = cyx.width + 17; mainContext.fillStyle = "rgba(0,0,0,0)"; mainContext.roundRect(cyy - czb / 2, cyz - cza / 2, czb, cza, 6); mainContext.fill(); mainContext.fillStyle = "#cc5151"; mainContext.fillText(tmpObj.chat.message, cyy, cyz); } else { tmpObj.chat.count = 0; } } } if (allChats.length) { allChats.filter(czc => czc.active).forEach(czd => { if (!czd.alive) { if (czd.alpha <= 1) { czd.alpha += delta / 250; if (czd.alpha >= 1) { czd.alpha = 1; czd.alive = true; } } } else { czd.alpha -= delta / 5000; if (czd.alpha <= 0) { czd.alpha = 0; czd.active = false; } } if (czd.active) { mainContext.font = "20px Hammersmith One"; let czf = mainContext.measureText(czd.chat); mainContext.textBaseline = "middle"; mainContext.textAlign = "center"; let czg = czd.x - cwm; let czh = czd.y - cwn - 90; let czi = 40; let czj = czf.width + 15; mainContext.globalAlpha = czd.alpha; mainContext.fillStyle = czd.owner.isTeam(player) ? "#8ecc51" : "#cc5151"; mainContext.strokeStyle = "rgb(25, 25, 25)"; mainContext.strokeText(czd.owner.name, czg, czh - 45); mainContext.fillText(czd.owner.name, czg, czh - 45); mainContext.lineWidth = 5; mainContext.fillStyle = "#ccc"; mainContext.strokeStyle = "rgb(25, 25, 25)"; mainContext.roundRect(czg - czj / 2, czh - czi / 2, czj, czi, 6); mainContext.stroke(); mainContext.fill(); mainContext.fillStyle = "#fff"; mainContext.strokeStyle = "#000"; mainContext.strokeText(czd.chat, czg, czh); mainContext.fillText(czd.chat, czg, czh); czd.y -= delta / 100; } }); } mainContext.globalAlpha = 1; renderMinimap(delta); } window.requestAnimFrame = function() { return null; }; window.rAF = function() { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(czl) { window.setTimeout(czl, 111.11111111111111); }; }(); function doUpdate() { now = performance.now(); delta = now - lastUpdate; lastUpdate = now; let czo = performance.now(); let czp = czo - fpsTimer.last; if (czp >= 950) { fpsTimer.ltime = fpsTimer.time * (950 / czp); fpsTimer.last = czo; fpsTimer.time = 0; } fpsTimer.time++; let czq = window.pingTime; if (getEl("fakePing").checked) { getEl("pingFps").innerHTML = czq + " | FPS: " + Math.round(fpsTimer.ltime) + " | Packet: " + secPacket + " | AutoMills: " + mills.place + " | CanInsta?: " + instaC.isTrue; } else { getEl("pingFps").innerHTML = window.pingTime + " | FPS: " + Math.round(fpsTimer.ltime) + " | Packet: " + secPacket + " | AutoMills: " + mills.place + " | CanInsta?: " + instaC.isTrue; } updateGame(); rAF(doUpdate); ms.avg = Math.round((ms.min + ms.max) / 2); } prepareMenuBackground(); doUpdate(); function toggleUseless(czr) { getEl("antiBullType").disabled = czr; getEl("BuildHealth").disabled = czr; } toggleUseless(useWasd); let changeDays = {}; window.debug = function() { my.waitHit = 0; my.autoAim = false; instaC.isTrue = false; traps.inTrap = false; my.autoPush = false; pathFind.active = false; pathFind.chaseNear = false; itemSprites = []; objSprites = []; gameObjectSprites = []; }; window.wasdMode = function() { useWasd = !useWasd; toggleUseless(useWasd); }; window.startGrind = function() { if (getEl("weaponGrind").checked) { for (let czx = 0; czx < Math.PI * 2; czx += Math.PI / 2) { checkPlace(player.getItemType(22), czx); } } }; let projects = ["adorable-eight-guppy", "galvanized-bittersweet-windshield"]; let botIDS = 0; window.connectFillBots = function() { botSkts = []; botIDS = 0; for (let czz = 0; czz < projects.length; czz++) { let daa = new WebSocket("wss://" + projects[czz] + ".glitch.me"); daa.binaryType = "arraybuffer"; daa.onopen = function() { daa.ssend = function(dac) { let dae = Array.prototype.slice.call(arguments, 1); let daf = window.msgpack.encode([dac, dae]); daa.send(daf); }; for (let dag = 0; dag < 4; dag++) { window.grecaptcha.execute("6LfahtgjAAAAAF8SkpjyeYMcxMdxIaQeh-VoPATP", { action: "homepage" }).then(function(dah) { let daj = WS.url.split("wss://")[1].split("?")[0]; daa.ssend("bots", "wss://" + daj + "?token=re:" + encodeURIComponent(dah), botIDS); botSkts.push([daa]); botIDS++; }); } }; daa.onmessage = function(dak) { let dam = new Uint8Array(dak.data); let dan = window.msgpack.decode(dam); let dao = dan[0]; dam = dan[1]; }; } }; window.destroyFillBots = function() { botSkts.forEach(dap => { dap[0].close(); }); botSkts = []; }; window.tryConnectBots = function() { for (let dat = 0; dat < (bots.length < 3 ? 3 : 4); dat++) { window.grecaptcha.execute("6LfahtgjAAAAAF8SkpjyeYMcxMdxIaQeh-VoPATP", { action: "homepage" }).then(function(dau) { botSpawn(dau); }); } }; window.destroyBots = function() { bots.forEach(daw => { daw.closeSocket = true; }); bots = []; }; window.resBuild = function() { if (gameObjects.length) { gameObjects.forEach(day => { day.breakObj = false; }); breakObjects = []; } }; window.toggleBotsCircle = function() { player.circle = !player.circle; }; window.toggleVisual = function() { config.anotherVisual = !config.anotherVisual; gameObjects.forEach(dbc => { if (dbc.active) { dbc.dir = dbc.lastDir; } }); }; window.prepareUI = function(dbe) { resize(); var dbg = document.getElementById("chatBox"); var dbh = document.getElementById("chatHolder"); var dbi = document.createElement("div"); dbi.id = "suggestBox"; var dbj = []; var dbk = 0; function dbl() { if (!usingTouch) { if (dbh.style.display == "block") { if (dbg.value) { sendChat(dbg.value); } dbn(); } else { storeMenu.style.display = "none"; allianceMenu.style.display = "none"; dbh.style.display = "block"; dbg.focus(); resetMoveDir(); } } else { setTimeout(function() { var dbp = prompt("chat message"); if (dbp) { sendChat(dbp); } }, 1); } dbg.value = ""; (() => { dbk = 0; })(); } function dbn() { dbg.value = ""; dbh.style.display = "none"; } UTILS.removeAllChildren(actionBar); for (let dbr = 0; dbr < items.weapons.length + items.list.length; ++dbr) { (function(dbs) { UTILS.generateElement({ id: "actionBarItem" + dbs, class: "actionBarItem", onmouseout: function() { showItemInfo(); }, parent: actionBar }); })(dbr); } for (let dbt = 0; dbt < items.list.length + items.weapons.length; ++dbt) { (function(dbu) { let dbw = document.createElement("canvas"); dbw.width = dbw.height = 66; let dbx = dbw.getContext("2d"); dbx.translate(dbw.width / 2, dbw.height / 2); dbx.imageSmoothingEnabled = false; dbx.webkitImageSmoothingEnabled = false; dbx.mozImageSmoothingEnabled = false; if (items.weapons[dbu]) { dbx.rotate(Math.PI); let dby = new Image(); toolSprites[items.weapons[dbu].src] = dby; dby.onload = function() { this.isLoaded = true; let dca = 1 / (this.height / this.width); let dcb = items.weapons[dbu].iPad || 1; dbx.drawImage(this, -(dbw.width * dcb * config.iconPad * dca) / 2, -(dbw.height * dcb * config.iconPad) / 2, dbw.width * dcb * dca * config.iconPad, dbw.height * dcb * config.iconPad); dbx.fillStyle = "rgba(0, 0, 70, 0.2)"; dbx.globalCompositeOperation = "source-atop"; dbx.fillRect(-dbw.width / 2, -dbw.height / 2, dbw.width, dbw.height); getEl("actionBarItem" + dbu).style.backgroundImage = "url(" + dbw.toDataURL() + ")"; }; dby.src = "./../img/weapons/" + items.weapons[dbu].src + ".png"; let dcc = getEl("actionBarItem" + dbu); dcc.onclick = UTILS.checkTrusted(function() { selectWeapon(dbe.weapons[items.weapons[dbu].type]); }); UTILS.hookTouchEvents(dcc); } else { let dce = getItemSprite(items.list[dbu - items.weapons.length], true); let dcf = Math.min(dbw.width - config.iconPadding, dce.width); dbx.globalAlpha = 1; dbx.drawImage(dce, -dcf / 2, -dcf / 2, dcf, dcf); dbx.fillStyle = "rgba(0, 0, 70, 0.1)"; dbx.globalCompositeOperation = "source-atop"; dbx.fillRect(-dcf / 2, -dcf / 2, dcf, dcf); getEl("actionBarItem" + dbu).style.backgroundImage = "url(" + dbw.toDataURL() + ")"; let dcg = getEl("actionBarItem" + dbu); dcg.onclick = UTILS.checkTrusted(function() { selectToBuild(dbe.items[dbe.getItemType(dbu - items.weapons.length)]); }); UTILS.hookTouchEvents(dcg); } })(dbt); } }; window.profineTest = function(dci) { if (dci) { let dck = dci + ""; dck = dck.slice(0, config.maxNameLength); return dck; } }; var uwu = document.getElementById("foodDisplay"); var da = document.getElementById("woodDisplay"); var das = document.getElementById("stoneDisplay"); var dsa = document.getElementById("killCounter"); var ds312a = document.getElementById("scoreDisplay"); var dsa2 = document.getElementById("chatBox"); var ds312a2 = document.getElementById("leaderboard"); var ds312a3 = document.getElementById("ageText"); var ds312a4 = document.getElementById("actionBar"); var ds312a5 = document.getElementById("pingDisplay"); var ds312a6 = document.getElementById("upgradeCounter"); var elements = [uwu, da, das, dsa, ds312a, dsa2, ds312a2, ds312a3, ds312a4, ds312a5, ds312a6]; elements.forEach(function(dcl) { if (dcl) { dcl.style.fontFamily = "Lilita One"; } }); const getContextHandler = { apply(dcn, dco, dcp) { const dcr = dcn.apply(dco, dcp); if (dco.id == "gameCanvas") { context = dcr; } return dcr; } }; const requestAnimationFrameHandler = { apply(dcs, dct, dcu) { if (context) { context.globalAlpha = 0.3; } return dcs.apply(dct, dcu); } }; let context = null; Object.setPrototypeOf(getContextHandler, null); Object.setPrototypeOf(requestAnimationFrameHandler, null); HTMLCanvasElement.prototype.getContext = new Proxy(HTMLCanvasElement.prototype.getContext, getContextHandler); window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, requestAnimationFrameHandler); document.getElementById("altcha").style.display = "none"; let antiAltcha = () => { document.getElementById("altcha_checkbox").click(); }; antiAltcha();