// ==UserScript== // @name SigMod Client (Macros) // @version 7.1 // @description Mod for Sigmally.com | Macros, Custom Skins, Themes, Autorespawn and much more! // @author Cursed // @match *://sigmally.com/* // @match *://beta.sigmally.com/ // @icon https://raw.githubusercontent.com/Sigmally/SigMod/main/images/sigmodclient2.gif // @run-at document-end // @license MIT // @namespace https://greasyfork.org/users/981958 // @downloadURL none // ==/UserScript== (function() { let version = 7; let cversion = 1.0; let storageName = "settings-sigmod-v7" let logo = "https://i.ibb.co/Hn9qnjm/Sigmod-Logo.png"; 'use strict'; let modSettings = localStorage.getItem(storageName); if (!modSettings) { modSettings = { keyBindings: { rapidFeed: "w", doubleSplit: "d", tripleSplit: "f", quadSplit: "g", freezePlayer: "s", verticalSplit: "t", doubleTrick: "", selfTrick: "", toggleMenu: "v", location: "y", toggleChat: "z", toggleNames: "", toggleSkins: "", toggleAutoRespawn: "", }, freezeType: "press", m1: null, m2: null, mapColor: null, nameColor: null, borderColor: null, mapImageURL: "", virusImage: "/assets/images/viruses/2.png", skinImage: { original: null, replaceImg: null, }, Theme: "Dark", addedThemes: [], savedNames: [], AutoRespawn: false, tag: null, chatSettings: { limit: 100, bgColor: "rgba(0, 0, 0, 0.4)", showTime: true, showNameColors: true, showClientChat: false, showChatButtons: true, blurTag: false, locationText: "{pos}", }, deathScreenPos: "center", }; updateStorage(); } else { modSettings = JSON.parse(modSettings); } function updateStorage() { localStorage.setItem(storageName, JSON.stringify(modSettings)); } function keypress(key, keycode) { const keyDownEvent = new KeyboardEvent("keydown", { key: key, code: keycode }); const keyUpEvent = new KeyboardEvent("keyup", { key: key, code: keycode }); window.dispatchEvent(keyDownEvent); window.dispatchEvent(keyUpEvent); } function mousemove(sx, sy) { const mouseMoveEvent = new MouseEvent("mousemove", { clientX: sx, clientY: sy }); const canvas = document.getElementById("canvas"); canvas.dispatchEvent(mouseMoveEvent); } function formatTime(timestamp) { const date = new Date(timestamp); const hours = date.getHours(); const minutes = String(date.getMinutes()).padStart(2, '0'); const ampm = hours >= 12 ? 'PM' : 'AM'; const formattedHours = (hours % 12 || 12).toString().padStart(2, '0'); return `${formattedHours}:${minutes} ${ampm}`; } function noXSS(data) { return data .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } const originalFetch = unsafeWindow.fetch; unsafeWindow.fetch = function(url, options) { if (url.includes('auth')) { return originalFetch(url, options) .then(response => { return response.json().then(data => { unsafeWindow.user = data.body.user; return new Response(JSON.stringify(data), response); }); }); } else if (url.includes('v3')) { const body = JSON.parse(options.body); unsafeWindow.v3 = body.recaptchaV3Token; } return originalFetch.apply(this, arguments); }; function hexToRgba(hex, alpha) { const r = parseInt(hex.substring(1, 3), 16); const g = parseInt(hex.substring(3, 5), 16); const b = parseInt(hex.substring(5, 7), 16); return `rgba(${r}, ${g}, ${b}, ${alpha})`; } function RgbaToHex(code) { const rgbaValues = code.match(/\d+/g); const [r, g, b] = rgbaValues.slice(0, 3); return `#${Number(r).toString(16).padStart(2, '0')}${Number(g).toString(16).padStart(2, '0')}${Number(b).toString(16).padStart(2, '0')}`; } function isMainMenuClosed() { const __line2 = document.getElementById("__line2"); const menuWrapper = document.getElementById("menu-wrapper"); return __line2.classList.contains("line--hidden") && menuWrapper.style.display === "none"; } function isDeath() { const __line2 = document.getElementById("__line2"); return !__line2.classList.contains("line--hidden"); } function getGameMode() { const gameMode = document.getElementById("gamemode") const options = Object.values(gameMode.querySelectorAll("option")) const selectedOption = options.filter((option) => option.value === gameMode.value)[0] const serverName = selectedOption.textContent.split(" ")[0] return serverName } function minimapUpdate() { setInterval(() => { if (isDeath()) return; const miniMap = mods.canvas; const border = mods.border; const ctx = miniMap.getContext("2d"); ctx.clearRect(0, 0, miniMap.width, miniMap.height); if (!isMainMenuClosed()) { ctx.clearRect(0, 0, miniMap.width, miniMap.height); return; } for (const miniMapData of client.miniMapData) { if (!border.width) break if (miniMapData[2] === null || miniMapData[3] === client.id) continue; if (!miniMapData[0] && !miniMapData[1]) { ctx.clearRect(0, 0, miniMap.width, miniMap.height); continue; } const fullX = miniMapData[0] + border.width / 2 const fullY = miniMapData[1] + border.width / 2 const x = (fullX / border.width) * miniMap.width const y = (fullY / border.width) * miniMap.height ctx.fillStyle = "#3283bd" ctx.beginPath(); ctx.arc(x, y, 3, 0, 2 * Math.PI); ctx.fill(); const minDist = (y - 15.5); const nameYOffset = minDist <= 1 ? - (4.5) : 10; ctx.fillStyle = "#fff"; ctx.textAlign = "center"; ctx.font = "9px Ubuntu"; ctx.fillText(miniMapData[2], x, y - nameYOffset); } }, 500); } // EU server const coordinates = {}; const gridSize = 4500; for (let i = 0; i < 5; i++) { for (let j = 0; j < 5; j++) { const label = String.fromCharCode(65 + i) + (j + 1); const minX = -11000 + (i * gridSize); const minY = -11000 + (j * gridSize); const maxX = -6500 + (i * gridSize); const maxY = -6500 + (j * gridSize); coordinates[label] = { min: { x: minX, y: minY }, max: { x: maxX, y: maxY } }; } } // US1; US2 servers const coordinates2 = {}; const gridSize2 = 7000; for (let i = 0; i < 5; i++) { for (let j = 0; j < 5; j++) { const label = String.fromCharCode(65 + i) + (j + 1); const minX = -17023 + (i * gridSize2); const minY = -17023 + (j * gridSize2); const maxX = -10000 + (i * gridSize2); const maxY = -10000 + (j * gridSize2); coordinates2[label] = { min: { x: minX, y: minY }, max: { x: maxX, y: maxY } }; } } // This following external script is safe (msgpack-lite) "Fast Pure JavaScript MessagePack Encoder and Decoder". // msgpack-lite Repository: github.com/kawanet/msgpack-lite; npm: https://www.npmjs.com/package/msgpack-lite let client = null; let msgpackloaded = false; fetch("https://rawgit.com/kawanet/msgpack-lite/master/dist/msgpack.min.js") .then((res) => res.text()) .then((script) => { const executeScript = new Function(script); executeScript(); msgpackloaded = true; }); let miniMapReseted = false class modClient { constructor() { this.ws = null; this.wsUrl = "wss://app.czrsd.com/ws"; this.readyState = null; this.miniMapData = []; this.id = Math.abs(~~(Math.random() * 9e10)); this.connect(); } connect() { this.ws = new WebSocket(this.wsUrl); this.ws.binaryType = "arraybuffer"; this.ws.addEventListener("open", this.onOpen.bind(this)); this.ws.addEventListener("close", this.onClose.bind(this)); this.ws.addEventListener("message", this.onMessage.bind(this)); this.ws.addEventListener("error", this.onError.bind(this)); } onOpen(event) { console.log("WebSocket connection opened."); this.readyState = 1; const tagElement = document.querySelector("#tag"); const tagText = document.querySelector(".tagText"); const sendStartData = setInterval(() => { setTimeout(() => { clearInterval(sendStartData); }, 1000); if (!msgpackloaded) return; this.send({ type: "server-changed", content: getGameMode() }); this.send({ type: "version", content: cversion, }); function getTagFromUrl() { const urlParams = new URLSearchParams(window.location.search); const tagValue = urlParams.get('tag'); return tagValue ? tagValue.replace(/\/$/, '') : null; } const tagValue = getTagFromUrl(); if (tagValue !== null) { modSettings.tag = tagValue; updateStorage(); tagElement.value = tagValue; tagText.innerText = `Tag: ${tagValue}`; this.send({ type: "update-tag", content: modSettings.tag, }); } if (modSettings.tag && tagValue == null) { tagElement.value = modSettings.tag; tagText.innerText = `Tag: ${modSettings.tag}`; this.send({ type: "update-tag", content: modSettings.tag, }); } if (unsafeWindow.user) { fetch('https://app.czrsd.com/user', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify(unsafeWindow.user), }); } clearInterval(sendStartData); }); } onClose(event) { this.readyState = 3; const message = document.createElement("div"); message.innerHTML = ` You Disconnected from the SigMod WebSocket. Error code: ${event.code}. Please refresh the page.
`; setTimeout(() => { message.style.right = "20px"; }, 200) setTimeout(() => { const close = document.getElementById("close-error-message_sigMod"); const refresh = document.getElementById("refresh-error-message_sigMod"); close.addEventListener("click", () => { message.style.right = "-500px"; setTimeout(() => { message.remove(); }, 500) }); refresh.addEventListener("click", () => { location.reload(); }); }); message.classList.add("error-message_sigMod") document.querySelector(".body__inner").append(message) } onMessage(event) { const message = unsafeWindow.msgpack.decode(new Uint8Array(event.data)); if (message.type === "ping") { mods.ping.end = Date.now(); mods.ping.latency = mods.ping.end - mods.ping.start; document.getElementById("clientPing").innerHTML = `Client Ping: ${mods.ping.latency}ms`; } if (message.type === "minimap-data") { this.miniMapData = message.content; } if (message.type === "chat-message") { let content = message.content; if (content) { let admin = content.admin; let mod = content.mod; let vip = content.vip; let name = content.nickname; let chatMessage = content.text; let color = content.color || ""; if (admin) name = "[Owner] " + name; if (mod) name = "[Mod] " + name; if (vip) name = "[VIP] " + name; if (name == "") name = "Unnamed"; mods.updateChat({ admin, mod, color, name, message: chatMessage, time: modSettings.chatSettings.showTime ? Date.now() : null, }); } } if (message.type === "update-available") { console.log("New update available."); const modAlert = document.createElement("div"); modAlert.classList.add("modAlert"); modAlert.innerHTML = ` You are using an old mod version. Please update.
`; document.body.append(modAlert); document.getElementById("updateMod").addEventListener("click", () => { window.open(message.content); modAlert.remove(); }); } } onError(event) { console.error("WebSocket error. More details: ", event); } send(data) { if (!msgpackloaded || !data || this.readyState !== 1) return; const msg = unsafeWindow.msgpack.encode(data); this.ws.send(msg); } } const __buf = new DataView(new ArrayBuffer(8)) function Writer(littleEndian) { this._e = littleEndian; this.reset(); return this; } Writer.prototype = { writer: true, reset: function (littleEndian) { this._b = []; this._o = 0; }, setUint8: function (a) { if (a >= 0 && a < 256) this._b.push(a); return this; }, setInt8: function (a) { if (a >= -128 && a < 128) this._b.push(a); return this; }, setUint16: function (a) { __buf.setUint16(0, a, this._e); this._move(2); return this; }, setInt16: function (a) { __buf.setInt16(0, a, this._e); this._move(2); return this; }, setUint32: function (a) { __buf.setUint32(0, a, this._e); this._move(4); return this; }, setInt32: function (a) { __buf.setInt32(0, a, this._e); this._move(4); return this; }, setFloat32: function (a) { __buf.setFloat32(0, a, this._e); this._move(4); return this; }, setFloat64: function (a) { __buf.setFloat64(0, a, this._e); this._move(8); return this; }, _move: function (b) { for (let i = 0; i < b; i++) this._b.push(__buf.getUint8(i)); }, setStringUTF8: function (s) { const bytesStr = unescape(encodeURIComponent(s)); for (let i = 0, l = bytesStr.length; i < l; i++) this._b.push(bytesStr.charCodeAt(i)); this._b.push(0); return this; }, build: function () { return new Uint8Array(this._b); }, }; function Reader(view, offset, littleEndian) { this._e = littleEndian; if (view) this.repurpose(view, offset); } Reader.prototype = { reader: true, repurpose: function (view, offset) { this.view = view; this._o = offset || 0; }, getUint8: function () { return this.view.getUint8(this._o++, this._e); }, getInt8: function () { return this.view.getInt8(this._o++, this._e); }, getUint16: function () { return this.view.getUint16((this._o += 2) - 2, this._e); }, getInt16: function () { return this.view.getInt16((this._o += 2) - 2, this._e); }, getUint32: function () { return this.view.getUint32((this._o += 4) - 4, this._e); }, getInt32: function () { return this.view.getInt32((this._o += 4) - 4, this._e); }, getFloat32: function () { return this.view.getFloat32((this._o += 4) - 4, this._e); }, getFloat64: function () { return this.view.getFloat64((this._o += 8) - 8, this._e); }, getStringUTF8: function (decode = true) { let bytes = []; let b; while ((b = this.view.getUint8(this._o++)) !== 0) bytes.push(b); let uint8Array = new Uint8Array(bytes); let decoder = new TextDecoder('utf-8'); let s = decoder.decode(uint8Array); return decode ? s : uint8Array; }, raw: function (len = 0) { const buf = this.view.buffer.slice(this._o, this._o + len); this._o += len; return buf; }, }; let sendChat = null; let cells = new Map(); let activeCellY = null; let activeCellX = null; let sendingPos = false; class Cell { constructor({ id }) { this.id = id this.x = void 0 this.y = void 0 } setData({ id, x, y }) { this.id = id this.x = x this.y = y } } function getWs() { unsafeWindow.socket = null; const oldSend = WebSocket.prototype.send function wsSend(data) { if (data.build) unsafeWindow.socket.send(data.build()) else unsafeWindow.socket.send(data) } sendChat = function sendChat(text) { const writer = new Writer(); writer.setUint8(C[0x63]); writer.setUint8(0); writer.setStringUTF8(text); wsSend(writer); } function bytesToHex(r, g, b) { return '#' + ((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1); } const C = new Uint8Array(256) const R = new Uint8Array(256) let handshake = false; WebSocket.prototype.send = function(data) { if (!unsafeWindow.socket) { unsafeWindow.socket = this; unsafeWindow.socket.addEventListener("close", () => { unsafeWindow.socket = null; handshake = false; const chatMessages = document.getElementById("mod-messages"); if (chatMessages) chatMessages.innerHTML = ""; }) this.addEventListener("message", (event) => { Reader.prototype.reader = true const reader = new Reader(new DataView(event.data), 0, true) if (!handshake) { const ver = reader.getStringUTF8(false) C.set(new Uint8Array(reader.raw(256))) for (const i in C) R[C[i]] = ~~i; handshake = true return } const r = reader.getUint8() switch (R[r]) { case 0x10: { let count = reader.getUint16(); for (let i = 0; i < count; i++) { let killer = reader.getUint32(); let killed = reader.getUint32(); } for (let i = 0; i < count; i++) { let id = reader.getUint32(); if (id === 0) break; let x = reader.getInt16(); let y = reader.getInt16(); let s = reader.getUint16(); let flags = reader.getUint8(); let updColor = !!(flags & 0x02); let updSkin = !!(flags & 0x04); let updName = !!(flags & 0x08); let skin = updSkin ? reader.getStringUTF8() : null; let name = updName ? reader.getStringUTF8() : null; if (isDeath()) { activeCellX = null; activeCellY = null; if (sendingPos) { client.send({ type: "minimap-update", content: [ null, null, null, client.id ] }); sendingPos = false; } return; }; if (!cells.get(id)) return; activeCellX = x; activeCellY = y; if (!sendingPos) sendingPos = true; client.send({ type: "minimap-update", content: [ activeCellX, activeCellY, mods.nick, client.id ] }); } } break; case 0x14: { cells = new Map() } break case 0x20: { // new cell from me const id = reader.getUint32(); cells.set(id, new Cell({ id })); } break; case 0x63: { // chat message const flags = reader.getUint8(); const color = bytesToHex( reader.getUint8(), reader.getUint8(), reader.getUint8() ); let name = reader.getStringUTF8(); const message = reader.getStringUTF8(); const server = !!(flags & 0x80); const admin = !!(flags & 0x40); const mod = !!(flags & 0x20); if (server && name !== 'SERVER') name = '[SERVER]'; if (admin) name = '[ADMIN] ' + name; if (mod) name = '[MOD] ' + name; if (name == "") name = "Unnamed"; if (modSettings.chatSettings.showClientChat) return; mods.updateChat({ server, admin, mod, color: modSettings.chatSettings.showNameColors ? color : "#fafafa", name, message, time: modSettings.chatSettings.showTime ? Date.now() : null, }); break; } case 0x40: { mods.border.left = reader.getFloat64() mods.border.top = reader.getFloat64() mods.border.right = reader.getFloat64() mods.border.bottom = reader.getFloat64() mods.border.width = mods.border.right - mods.border.left mods.border.height = mods.border.bottom - mods.border.top mods.border.centerX = (mods.border.left + mods.border.right) / 2 mods.border.centerY = (mods.border.top + mods.border.bottom) / 2 } break } }) } return oldSend.apply(this, arguments); } } setTimeout(() => { const gameSettings = document.querySelector(".checkbox-grid"); gameSettings.innerHTML += `
  • `; let autoRespawn = document.getElementById("autoRespawn"); let autoRespawnEnabled = false; autoRespawn.addEventListener("change", () => { if(!autoRespawnEnabled) { modSettings.AutoRespawn = true; updateStorage(); autoRespawnEnabled = true; } else { modSettings.AutoRespawn = false; updateStorage(); autoRespawnEnabled = false; } }); if(modSettings.AutoRespawn) { autoRespawn.checked = true; autoRespawnEnabled = true; } }); function loadVirusImage(img) { const replacementVirus = new Image(); replacementVirus.src = img; const originalDrawImage = CanvasRenderingContext2D.prototype.drawImage; CanvasRenderingContext2D.prototype.drawImage = function(image, ...args) { if (image instanceof HTMLImageElement && image.src.includes("2.png")) { originalDrawImage.call(this, replacementVirus, ...args); } else { originalDrawImage.apply(this, arguments); } }; } function loadSkinImage(skin, img) { const replacementSkin = new Image(); replacementSkin.src = img; const originalDrawImage = CanvasRenderingContext2D.prototype.drawImage; CanvasRenderingContext2D.prototype.drawImage = function(image, ...args) { if (image instanceof HTMLImageElement && image.src.includes(`${skin}.png`)) { originalDrawImage.call(this, replacementSkin, ...args); } else { originalDrawImage.apply(this, arguments); } }; } const getEmojis = async () => { const response = await fetch("https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json"); const emojis = await response.json(); // Add more objects if u want: emojis.push( { "emoji": "โค", "description": "Default heart", "category": "Smileys & Emotion", "tags": ["heart", "love"], }, { "emoji": "๐Ÿงก", "description": "Orange heart", "category": "Smileys & Emotion", "tags": ["heart", "love"], }, { "emoji": "๐Ÿ’›", "description": "Yellow heart", "category": "Smileys & Emotion", "tags": ["heart", "love"], }, { "emoji": "๐Ÿ’š", "description": "Green heart", "category": "Smileys & Emotion", "tags": ["heart", "love"], }, { "emoji": "๐Ÿ’™", "description": "Blue heart", "category": "Smileys & Emotion", "tags": ["heart", "love"], }, { "emoji": "๐Ÿ’œ", "description": "Purple heart", "category": "Smileys & Emotion", "tags": ["heart", "love"], }, { "emoji": "๐ŸคŽ", "description": "Brown heart", "category": "Smileys & Emotion", "tags": ["heart", "love"], }, { "emoji": "๐Ÿ–ค", "description": "Black heart", "category": "Smileys & Emotion", "tags": ["heart", "love"], }, ); return emojis; }; function mod() { this.Username = "Guest"; this.splitKey = { keyCode: 32, code: "Space", cancelable: true, composed: true, isTrusted: true, which: 32, } this.border = {}; this.currentTag = null; this.nick = null; this.ping = { latency: NaN, intervalId: null, start: null, end: null, } this.load(); } mod.prototype = { get style() { return ` :root { --default-mod-color: #2E2D80; } input[type=range] { -webkit-appearance: none; height: 22px; background: transparent; cursor: pointer; } input[type=range]::-webkit-slider-runnable-track { -webkit-appearance: none; background: #542499; height: 4px; border-radius: 6px; } input[type=range]::-webkit-slider-thumb { appearance: none; background: #6B32BD; height: 16px; width: 16px; position: relative; top: -5px; border-radius: 50%; } input:focus, select:focus, button:focus{ outline: none; } .flex { display: flex; } .centerX { display: flex; justify-content: center; } .centerY { display: flex; align-items: center; } .centerXY { display: flex; align-items: center; justify-content: center } .f-column { display: flex; flex-direction: column; } #sig-mod-settings { border-radius: 4px; border: 2px solid rgba(255,255,255,.5); width: 525px; height: 380px; } .tabs_navigation { display: flex; justify-content: space-around; } .keybinding { max-width: 20px; text-align: center; margin-right: 5px; outline: none; color: #fff; background-color: #111; border: 0px solid #fff; font-weight: 500; border-bottom: 2px solid var(--default-mod-color); position: relative; border-top-right-radius: 4px; border-top-left-radius: 4px; transition: all .3s ease; } .keybinding:hover { background-color: #333; } .hidden { display: none; } #text-block,#left_ad_block,#ad_bottom,.ad-block,.ad-block-left,.ad-block-right { display: none; } .SettingsTitle{ font-size: 32px; color: #EEE; margin-left: 10px; } .CloseBtn{ width: 46px; background-color: transparent; } .select-btn { padding: 15px 20px; background: #222; border-radius: 2px; position: relative; } .select-btn:active { scale: 0.95 } .select-btn::before { content: "..."; font-size: 20px; color: #fff; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .text { user-select: none; font-weight: 500; text-align: left; } .titleImg{ width: 50px; height: 50px; border-radius: 20px; object-fit: cover; } .modContainer { display: flex; justify-content: space-between; } .modButton{ background-color: #333; border-radius: 5px; color: #fff; transition: all .3s; outline: none; padding: 5px; font-size: 13px; border: none; } .modButton:hover { background-color: #222 } .tabbtn { background-color: #111; border-bottom: 2px solid var(--default-mod-color); border-radius: 0; position: relative; border-top-right-radius: 2px; border-top-left-radius: 2px; box-shadow: 0 4px 10px -4px var(--default-mod-color); } .tabbtn::before { content: ""; position: absolute; left: 0; bottom: 0; width: 100%; height: 0; background: linear-gradient(to top, var(--default-mod-color), transparent); transition: all .3s ease; } .tabbtn:hover::before { height: 30%; } .modInput { background-color: #111; border: none; border-bottom: 2px solid var(--default-mod-color); border-radius: 0; position: relative; border-top-right-radius: 4px; border-top-left-radius: 4px; font-family: arial; font-weight: 500; padding: 4px; box-shadow: 0 4px 10px -4px var(--default-mod-color); color: #fff; } .modCheckbox input[type="checkbox"] { display: none; visibility: hidden; } .modCheckbox label { display: inline-block; } .modCheckbox .cbx { position: relative; top: 1px; width: 17px; height: 17px; margin: 2px; border: 1px solid #c8ccd4; border-radius: 3px; vertical-align: middle; transition: background 0.1s ease; cursor: pointer; } .modCheckbox .cbx:after { content: ''; position: absolute; top: 1px; left: 5px; width: 5px; height: 11px; opacity: 0; transform: rotate(45deg) scale(0); border-right: 2px solid #fff; border-bottom: 2px solid #fff; transition: all 0.3s ease; transition-delay: 0.15s; } .modCheckbox input[type="checkbox"]:checked ~ .cbx { border-color: transparent; background: #6871f1; box-shadow: 0 0 10px #2E2D80; } .modCheckbox input[type="checkbox"]:checked ~ .cbx:after { opacity: 1; transform: rotate(45deg) scale(1); } .SettingsButton{ border: none; outline: none; margin-right: 10px; transition: all .3s ease; } .SettingsButton:hover { scale: 1.1; } .colorInput{ background-color: transparent; width: 33px; height: 35px; border-radius: 50%; border: none; } .colorInput::-webkit-color-swatch { border-radius: 50%; border: 1px solid #000; } .whiteBorder_colorInput::-webkit-color-swatch { border-color: #fff; } #dclinkdiv { display: flex; flex-direction: row; } .dclinks { width: calc(50% - 5px); height: 36px; display: flex; justify-content: center; align-items: center; background-color: rgba(88, 101, 242, 1); border-radius: 6px; margin: 0 auto; color: #fff; } #settings { display: flex; flex-direction: column; } #cm_close__settings { width: 50px; transition: all .3s ease; } #cm_close__settings svg:hover { scale: 1.1; } #cm_close__settings svg { transition: all .3s ease; } .modTitleText { text-align: center; font-size: 16px; } #settings > .checkbox-grid { width: 232px; grid-template-columns: 1.2fr 1.1fr!important; grid-column-gap: 0px; } .ModSettings { display: flex; justify-content: space-around; } .settingsTitle { margin-bottom: 6px; text-decoration: underline; font-size: 16px font-weight: 600 } .tab { display: none; } .modItem { display: flex; justify-content: center; align-items: center; flex-direction: column; } .mod_tab-content { width: 100%; margin: 10px; overflow: auto; display: flex; flex-direction: column; } #Tab6 .mod_tab-content { overflow-y: auto; max-height: 230px; display: flex; flex-wrap: nowrap; flex-direction: column; gap: 10px; } .tab-content, #coins-tab, #chests-tab { overflow-x: hidden; justify-content: center; } #shop-skins-buttons::after { background: #050505; } .w-100 { width: 100% } .btnRS { margin: 0 5px; width: 50% } #savedNames { background-color: #222; padding: 5px; border-top-left-radius: 5px; overflow-y: scroll; width: 200px; height: 170px; display: flex; border-bottom: 2px solid var(--default-mod-color); box-shadow: 0 4px 20px -4px var(--default-mod-color); } .scroll::-webkit-scrollbar { width: 7px; } .scroll::-webkit-scrollbar-track { background: #222; border-radius: 5px; } .scroll::-webkit-scrollbar-thumb { background-color: #333; border-radius: 5px; } .scroll::-webkit-scrollbar-thumb:hover { background: #353535; } .themes { display: flex; flex-direction: row; width: 100%; height: 220px; background: #000; border-radius: 5px; overflow-y: scroll; gap: 10px; padding: 5px; flex-wrap: wrap; justify-content: center; } .themeContent { width: 50px; height: 50px; border: 2px solid #222; border-radius: 50%; background-position: center; } .theme { height: 75px; display: flex; align-items: center; justify-content: center; flex-direction: column; cursor: pointer; } .delName { font-weight: 500; background: #e17e7e; height: 20px; border: none; border-radius: 5px; font-size: 10px; margin-left: 5px; color: #fff; display: flex; justify-content: center; align-items: center; width: 20px; } .NameDiv { display: flex; background: #151515; border-radius: 5px; margin: 5px; padding: 3px 8px; height: 34px; align-items: center; justify-content: space-between; cursor: pointer; box-shadow: 0 4px 10px -4px var(--default-mod-color); } .NameLabel { cursor: pointer; font-weight: 500; text-align: center; color: #fff; } .resetButton { width: 25px; height: 25px; background-image: url("https://raw.githubusercontent.com/Sigmally/SigMod/main/images/reset.svg"); background-color: transparent; border: none; } .modAlert { position: fixed; top: 80px; left: 50%; transform: translate(-50%, -50%); z-index: 99995; background: #3F3F3F; border-radius: 10px; display: flex; flex-direction: column; gap: 5px; padding: 10px; color: #fff; } .themeEditor { z-index: 100000; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: rgba(0, 0, 0, .85); color: #fff; padding: 10px; border-radius: 10px; box-shadow: 0 0 10px #fff; width: 400px; } .theme_editor_header { display: flex; justify-content: space-between; align-items: center; gap: 10px; } .theme-editor-tab { display: flex; justify-content: center; align-items: start; flex-direction: column; margin-top: 10px } .themes_preview { width: 50px; height: 50px; border: 2px solid #fff; border-radius: 2px; display: flex; justify-content: center; align-items: center; } .modKeybindings { display: flex; flex-direction: column; overflow-y: scroll; max-height: 170px; } .modKeybindings > label { margin-right: 5px; } #signInBtn, #nick, #gamemode, #option_0, #option_1, #option_2, .form-control, .profile-header, .coins-num, #clan-members, .member-index, .member-level, #clan-requests { background: rgba(0, 0, 0, 0.4) !important; color: #fff !important; } .profile-name, #progress-next, .member-desc > p:first-child, #clan-leave > div, .clans-item > div > b, #clans-input input, #shop-nav button { color: #fff !important; } .head-desc, #shop-nav button { border: 1px solid #000; } #clan-handler, #request-handler, #clans-list, #clans-input, .clans-item button, #shop-content, #shop-nav button:hover, .card-particles-bar-bg { background: #111; color: #fff !important; } #clans_and_settings { height: auto !important; } .card-body { background: linear-gradient(180deg, #000 0%, #1b354c 100%); } .free-card:hover .card-body { background: linear-gradient(180deg, #111 0%, #1b354c 100%); } #shop-tab-body, #shop-skins-buttons, #shop-nav { background: #050505; } #clan-leave { background: #111; bottom: -1px; } .sent { position: relative; width: 100px; } .sent::before { content: "Sent request"; width: 100%; height: 10px; word-spacing: normal; white-space: nowrap; position: absolute; background: #4f79f9; display: flex; justify-content: center; align-items: center; } .btn, .sign-in-out-btn { transition: all .2s ease; } #clan .connecting__content, #clans .connecting__content { background: #151515; color: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, .5); } .skin-select__icon-text { color: #fff; } .justify-sb { display: flex; align-items: center; justify-content: space-between; } .macro-extanded_input { width: 75px; text-align: center; } #gamemode option { background: #111; } .stats-line { width: 100%; user-select: none; margin-bottom: 5px; padding: 5px; background: #151515; border: 1px solid var(--default-mod); border-radius: 5px; } .setting-card-wrapper { margin-right: 10px; padding: 10px; background: #222; border: #252525; border-radius: 5px; display: flex; flex-direction: column; } .setting-card { display: flex; align-items: center; justify-content: space-between; } .setting-card-action { display: flex; align-items: center; gap: 5px; cursor: pointer; } .setting-card-action { width: 100%; } .setting-card-name { font-size: 16px; user-select: none; width: 100%; } .mod-small-modal { position: absolute; z-index: 99999; top: 50%; left: 50%; transform: translate(-50%, -50%); background: #191919; box-shadow: 0 5px 15px -2px #000; border: 2px solid var(--default-mod-color); padding: 10px; border-radius: 5px; } .mod-small-modal-header { display: flex; justify-content: space-between; align-items: center; } .mod-small-modal-header h1 { font-size: 20px; font-weight: 500; margin: 0; } .mod-small-modal-content { display: flex; flex-direction: column; width: 100%; align-items: center; } .mod-small-modal-content_selectImage { display: flex; flex-direction: column; gap: 10px; } .previmg { width: 50px; height: 50px; border: 2px solid #ccc; } .stats__item>span, #title, .stats-btn__text { color: #fff; } .top-users__inner::-webkit-scrollbar-thumb { border: none; } .modChat { min-width: 450px; max-width: 450px; min-height: 285px; max-height: 285px; color: #fafafa; padding: 10px; position: absolute; bottom: 10px; left: 10px; z-index: 999; border-radius: .5rem; overflow: hidden; opacity: 1; transition: all .3s ease; } .modChat__inner { min-width: 430px; max-width: 430px; min-height: 265px; max-height: 265px; height: 100%; display: flex; flex-direction: column; gap: 5px; justify-content: flex-end; opacity: 1; transition: all .3s ease; } .modchat-chatbuttons { margin-bottom: auto; display: flex; gap: 5px; } .tagText { margin-left: auto; font-size: 14px; } #mod-messages { position: relative; display: flex; flex-direction: column; max-height: 185px; overflow-y: auto; direction: rtl; scroll-behavior: smooth; } .message { direction: ltr; margin: 2px 0 0 5px; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; display: flex; justify-content: space-between; align-items: center; } .message_name { user-select: none; } .message .time { color: rgba(255, 255, 255, 0.7); font-size: 12px; } #chatInputContainer { display: flex; gap: 5px; align-items: center; padding: 5px; background: rgba(42, 42, 42, .8); border-radius: .5rem; overflow: hidden; } .chatInput { flex-grow: 1; border: none; background: transparent; color: #fff; padding: 5px; outline: none; max-width: 100%; } .chatButton { background: #8a25e5; border: none; border-radius: 5px; padding: 5px 10px; height: 100%; color: #fff; transition: all 0.3s; cursor: pointer; display: flex; align-items: center; height: 28px; justify-content: center; gap: 5px; } .chatButton:hover { background: #7a25e5; } .chatCloseBtn { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .emojisContainer { flex-direction: column; gap: 5px; } .chatAddedContainer { position: absolute; bottom: 10px; left: 465px; z-index: 9999; padding: 10px; background: #151515; border-radius: .5rem; min-width: 172px; max-width: 172px; min-height: 250px; max-height: 250px; } #categories { overflow-y: auto; max-height: calc(250px - 50px); gap: 2px; } .category { width: 100%; display: flex; flex-direction: column; gap: 2px; } .category span { color: #fafafa; font-size: 14px; text-align: center; } .emojiContainer { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; } #categories .emoji { padding: 2px; border-radius: 5px; font-size: 16px; user-select: none; cursor: pointer; } .chatSettingsContainer { padding: 10px 3px; } .chatSettingsContainer .scroll { display: flex; flex-direction: column; gap: 10px; max-height: 235px; overflow-y: auto; padding: 0 10px; } .csBlock { border: 2px solid #050505; border-radius: .5rem; color: #fff; display: flex; align-items: center; flex-direction: column; gap: 5px; padding-bottom: 5px; } .csBlock .csBlockTitle { background: #080808; width: 100%; padding: 3px; text-align: center; } .csRow { display: flex; justify-content: space-between; align-items: center; padding: 0 5px; width: 100%; } .csRowName { display: flex; gap: 5px; align-items: start; } .csRowName .infoIcon { width: 14px; cursor: pointer; } .modInfoPopup { position: absolute; top: 2px; left: 58%; text-align: center; background: #151515; border: 1px solid #607bff; border-radius: 10px; transform: translateX(-50%); white-space: nowrap; padding: 5px; z-index: 99999; } .modInfoPopup::after { content: ''; display: block; position: absolute; bottom: -7px; background: #151515; right: 50%; transform: translateX(-50%) rotate(-45deg); width: 12px; height: 12px; border-left: 1px solid #607bff; border-bottom: 1px solid #607bff; } .modInfoPopup p { margin: 0; font-size: 12px; color: #fff; } .error-message_sigMod { display: flex; align-items: center; position: absolute; bottom: 20px; right: -500px; background: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, .8); z-index: 9999999; width: 426px; border-radius: 10px; padding: 10px; gap: 6px; transition: all .3s ease-out; } .minimap { pointer-events: none; position: absolute; float: right; bottom: 0; right: 0; z-index: 99999; border-radius: 2px; border-top: 1px solid rgba(255, 255, 255, .5); border-left: 1px solid rgba(255, 255, 255, .5); box-shadow: 0 0 4px rgba(255, 255, 255, .5); } #tag { width: 50px; } .blur { color: transparent!important; text-shadow: 0 0 5px hsl(0deg 0% 90% / 70%); transition: all .2s; } .blur:focus, .blur:hover { color: #fafafa!important; text-shadow: none; } ` }, respawnTime: Date.now(), respawnCooldown: 1000, move(cx, cy) { const mouseMoveEvent = new MouseEvent("mousemove", { clientX: cx, clientY: cy }); const canvas = document.querySelector("canvas"); canvas.dispatchEvent(mouseMoveEvent); }, getColors() { const mapColor = document.getElementById("mapColor"); const mapImage = document.getElementById("mapImage"); const originalFillRect = CanvasRenderingContext2D.prototype.fillRect; function ChangeMapColor() { CanvasRenderingContext2D.prototype.fillRect = function (x, y, width, height) { if ((width + height) / 2 === (window.innerWidth + window.innerHeight) / 2) { this.fillStyle = mapColor.value; } originalFillRect.apply(this, arguments); }; modSettings.mapColor = mapColor.value; updateStorage(); } mapColor.addEventListener("input", ChangeMapColor); function ChangeMapImage() { const canvas = document.getElementById("canvas"); const ctx = canvas.getContext("2d"); const img = new Image(); let pattern; img.onload = function () { const tempCanvas = document.createElement("canvas"); const tempCtx = tempCanvas.getContext("2d"); tempCanvas.width = img.width; tempCanvas.height = img.height; tempCtx.drawImage(img, 0, 0); pattern = ctx.createPattern(tempCanvas, "repeat"); fillCanvas(); }; function fillCanvas() { const fillRect = CanvasRenderingContext2D.prototype.fillRect; CanvasRenderingContext2D.prototype.fillRect = function (x, y, width, height) { this.fillStyle = pattern; fillRect.apply(this, arguments); }; ctx.fillRect(0, 0, canvas.width, canvas.height); } img.src = mapImage.value; modSettings.mapImageURL = mapImage.value; updateStorage(); } document.getElementById("setMapImage").addEventListener("click", () => { if(mapImage.value == "") return const canvas = document.getElementById("canvas"); const ctx = canvas.getContext("2d"); const img = new Image(); let pattern; img.onload = function() { const tempCanvas = document.createElement("canvas"); const tempCtx = tempCanvas.getContext("2d"); tempCanvas.width = img.width; tempCanvas.height = img.height; tempCtx.drawImage(img, 0, 0); pattern = ctx.createPattern(tempCanvas, "repeat"); fillCanvas(); }; function fillCanvas() { const fillRect = CanvasRenderingContext2D.prototype.fillRect; CanvasRenderingContext2D.prototype.fillRect = function(x, y, width, height) { this.fillStyle = pattern; fillRect.apply(this, arguments); }; ctx.fillRect(0, 0, canvas.width, canvas.height); } img.src = mapImage.value; modSettings.mapImageURL = mapImage.value; updateStorage(); }); const mapColorReset = document.getElementById("mapColorReset"); mapColorReset.addEventListener("click", () => { modSettings.mapColor = null; updateStorage(); const mapColor = document.getElementById("mapColor"); mapColor.value = ""; }); const removeButton = document.getElementById("removeMapImage"); removeButton.addEventListener("click", () => { if (mapImage.value == "" || modSettings.mapImageURL === "") return; if (confirm("You need to reload the page to remove the background image. Reload?")) { modSettings.mapImageURL = ""; updateStorage(); location.reload(); } }); if (modSettings) { function ChangeMapColor() { CanvasRenderingContext2D.prototype.fillRect = function (x, y, width, height) { if ((width + height) / 2 === (window.innerWidth + window.innerHeight) / 2) { this.fillStyle = modSettings.mapColor; } originalFillRect.apply(this, arguments); }; } ChangeMapColor(); function ChangeMapImage() { const canvas = document.getElementById("canvas"); const ctx = canvas.getContext("2d"); const img = new Image(); let pattern; img.onload = function () { const tempCanvas = document.createElement("canvas"); const tempCtx = tempCanvas.getContext("2d"); tempCanvas.width = img.width; tempCanvas.height = img.height; tempCtx.drawImage(img, 0, 0); pattern = ctx.createPattern(tempCanvas, "repeat"); fillCanvas(); }; function fillCanvas() { const fillRect = CanvasRenderingContext2D.prototype.fillRect; CanvasRenderingContext2D.prototype.fillRect = function (x, y, width, height) { this.fillStyle = pattern; fillRect.apply(this, arguments); }; ctx.fillRect(0, 0, canvas.width, canvas.height); } img.src = modSettings.mapImageURL; } mapImage.value = modSettings.mapImageURL; ChangeMapImage(); } loadVirusImage(modSettings.virusImage) if(modSettings.skinImage.original !== null) { loadSkinImage(modSettings.skinImage.original, modSettings.skinImage.replaceImg) } }, setColors() { // - NAME - // const nameColorValue = document.getElementById("nameColor"); const fillText = CanvasRenderingContext2D.prototype.fillText; nameColorValue.addEventListener("input", () => { CanvasRenderingContext2D.prototype.fillText = function(text, x, y) { if (text === document.getElementById("nick").value) { const width = this.measureText(text).width; this.fillStyle = nameColorValue.value; } return fillText.apply(this, arguments); }; modSettings.nameColor = nameColorValue.value updateStorage(); }) if (modSettings.nameColor) { const nameColor = document.getElementById("nameColor"); CanvasRenderingContext2D.prototype.fillText = function(text, x, y) { if (text === document.getElementById("nick").value) { const width = this.measureText(text).width; this.fillStyle = modSettings.nameColor; } return fillText.apply(this, arguments); }; nameColor.value = modSettings.nameColor; } const nameColorReset = document.getElementById("nameColorReset"); nameColorReset.addEventListener("click", () => { CanvasRenderingContext2D.prototype.fillText = function(text, x, y) { if (text === document.getElementById("nick").value) { const width = this.measureText(text).width; const fontSize = 8; this.fillStyle = "#ffffff"; } return fillText.apply(this, arguments); }; nameColorValue.value = "#ffffff" modSettings.nameColor = null; updateStorage(); }); if(modSettings.nameColor == null) nameColorValue.value = "#ffffff"; // - BORDER - // const borderColorinput = document.getElementById("borderColor"); const borderColorReset = document.getElementById("borderColorReset"); const moveTo = CanvasRenderingContext2D.prototype.moveTo; borderColorinput.addEventListener("input", () => { CanvasRenderingContext2D.prototype.moveTo = function(x, y) { this.strokeStyle = borderColorinput.value; return moveTo.apply(this, arguments) } modSettings.borderColor = borderColorinput.value; updateStorage(); }) borderColorReset.addEventListener("click", () => { CanvasRenderingContext2D.prototype.moveTo = function(x, y) { this.strokeStyle = "" return moveTo.apply(this, arguments) } modSettings.borderColor = ""; updateStorage(); }) if(modSettings.borderColor !== null) { CanvasRenderingContext2D.prototype.moveTo = function(x, y) { this.strokeStyle = modSettings.borderColor; return moveTo.apply(this, arguments) } } const virusPreview = document.getElementById("virus"); const setVirus = document.getElementById("setVirus"); const virusURL = document.getElementById("virusURL"); const openVirusModal = document.getElementById("virusImageSelect"); const virusModal = document.getElementById("virusModal"); const resetVirus = document.getElementById("resetVirus"); openVirusModal.addEventListener("click", () => { virusModal.style.display = "block"; }); setVirus.addEventListener("click", () => { modSettings.virusImage = virusURL.value; loadVirusImage(modSettings.virusImage) updateStorage(); virusPreview.src = modSettings.virusImage; }); resetVirus.addEventListener("click", () => { modSettings.virusImage = "/assets/images/viruses/2.png"; updateStorage(); if(confirm("Please Refresh the page to make it work. Reload?")) { location.reload(); } }); const skinPreview = document.getElementById("skinPreview"); const skinURL = document.getElementById("skinURL"); const setSkin = document.getElementById("setSkin"); const openSkinModal = document.getElementById("SkinReplaceSelect"); const skinModal = document.getElementById("skinModal"); const originalSkin = document.getElementById("originalSkinSelect"); const resetSkin = document.getElementById("resetSkin"); openSkinModal.addEventListener("click", () => { skinModal.style.display = "block"; }); setSkin.addEventListener("click", () => { modSettings.skinImage.original = originalSkin.value; modSettings.skinImage.replaceImg = skinURL.value; loadSkinImage(modSettings.skinImage.original, modSettings.skinImage.replaceImg) updateStorage(); skinPreview.src = modSettings.skinImage.replaceImg; }); resetSkin.addEventListener("click", () => { modSettings.skinImage.original = null; modSettings.skinImage.replaceImg = null; updateStorage(); if(confirm("Please Refresh the page to make it work. Reload?")) { location.reload(); } }); const deathScreenPos = document.getElementById("deathScreenPos"); const deathScreen = document.getElementById("__line2"); const applyMargin = (position) => { switch (position) { case "left": deathScreen.style.marginLeft = "0"; break; case "right": deathScreen.style.marginRight = "0"; break; case "top": deathScreen.style.marginTop = "20px"; break; case "bottom": deathScreen.style.marginBottom = "20px"; break; default: deathScreen.style.margin = "auto"; } }; deathScreenPos.addEventListener("change", () => { const selected = deathScreenPos.value; applyMargin(selected); modSettings.deathScreenPos = selected; updateStorage(); }); const defaultPosition = modSettings.deathScreenPos || "center"; applyMargin(defaultPosition); deathScreenPos.value = defaultPosition; }, menu() { let Tab1; let Tab2; let Tab3; let Tab4; let Tab5; let Tab6; const welcomeuser = document.createElement("span"); const ModSettings = document.createElement("div"); const KeyBindings = document.createElement("div"); function openTab(tab) { let tabSelected = document.getElementById(tab); let allTabs = document.getElementsByClassName("tab"); for (let i = 0; i < allTabs.length; i++) { allTabs[i].style.display = "none"; } tabSelected.style.display = "flex"; } const settings = document.querySelector("#cm_modal__settings > .ctrl-modal__overlay > .ctrl-modal__modal"); const DefaultSettings = document.querySelector("#settings > .checkbox-grid"); const settingsTitle = settings.querySelector(".ctrl-modal__header > .ctrl-modal__title"); settingsTitle.innerHTML = ` SigMod Settings` settingsTitle.style.textAlign = "left"; settings.setAttribute("id", "sig-mod-settings"); const settingsHeader = settings.querySelector(".ctrl-modal__header"); const menuTabs = document.createElement("div"); menuTabs.classList.add("tabs_navigation"); menuTabs.innerHTML = ` `; settingsHeader.insertAdjacentElement("afterend", menuTabs); const gameSettings = document.querySelector("#settings"); const defaultSettingsTitle = document.createElement("span"); defaultSettingsTitle.textContent = "Basic Settings"; defaultSettingsTitle.classList.add("text", "settingsTitle"); gameSettings.insertAdjacentElement("afterbegin", defaultSettingsTitle); welcomeuser.textContent = `Welcome ${this.Username}, to SigMod!`; welcomeuser.classList.add("text"); welcomeuser.style = "margin: 10px 0; text-align: center; font-size: 16px;"; const bsettings = document.querySelector("#sig-mod-settings > .ctrl-modal__content > .menu__item"); bsettings.classList.add("tab") bsettings.style = "display: flex; flex-direction: column; margin: 0"; bsettings.insertAdjacentElement("afterbegin", welcomeuser); Tab1 = bsettings; Tab1.setAttribute("id", "Tab1") function virusImgVal() { if(modSettings.virusImage === "/assets/images/viruses/2.png" || modSettings.virusImage === "") return ""; return modSettings.virusImage; } function skinImgVal() { if(modSettings.skinImage.replaceImg === "" || modSettings.skinImage.replaceImg === null) return ""; return modSettings.skinImage.replaceImg; } Tab2 = document.createElement("div"); Tab2.classList.add("centerX"); Tab2.innerHTML = `
    Map Color
    Border Colors
    Virus Image
    Replace Skins
    Map image:
    Death screen Position:
    `; Tab2.classList.add("tab", "hidden"); Tab2.setAttribute("id", "Tab2"); Tab3 = document.createElement("div"); Tab3.innerHTML = `
    Save names
    Name Color
    saved:
    `; Tab3.classList.add("tab", "hidden", "centerX"); Tab3.setAttribute("id", "Tab3"); Tab4 = document.createElement("div"); Tab4.innerHTML = `
    Create
    `; Tab4.classList.add("tab", "hidden", "centerX"); Tab4.setAttribute("id", "Tab4"); Tab5 = document.createElement("div"); Tab5.innerHTML = ` `; Tab5.classList.add("tab", "hidden"); Tab5.setAttribute("id", "Tab5"); Tab5.style.margin = "20px 0" Tab6 = document.createElement("div"); Tab6.innerHTML = `
    Advanced Keybinding options
    Mouse macros
    Freeze Player
    Toggle Settings
    Tricksplits
    `; Tab6.classList.add("tab", "hidden", "scroll"); Tab6.setAttribute("id", "Tab6"); document.getElementById("modHome").addEventListener("click", () => { openTab("Tab1"); }); document.getElementById("GameOptions").addEventListener("click", () => { openTab("Tab2"); }); document.getElementById("NameOptions").addEventListener("click", () => { openTab("Tab3"); }); document.getElementById("modThemes").addEventListener("click", () => { openTab("Tab4"); }); document.getElementById("modInfo").addEventListener("click", () => { openTab("Tab5"); }); document.getElementById("macroSettings").addEventListener("click", () => { openTab("Tab6"); }); const tabContent = document.querySelector("#sig-mod-settings > .ctrl-modal__content"); tabContent.append(Tab2) tabContent.append(Tab3) tabContent.append(Tab4) tabContent.append(Tab5) tabContent.append(Tab6) KeyBindings.classList.add("modKeybindings", "scroll") KeyBindings.innerHTML = ` KeyBindings `; bsettings.append(ModSettings); ModSettings.append(gameSettings) ModSettings.append(KeyBindings); ModSettings.classList.add("ModSettings") document.querySelector("#cm_close__settings svg").setAttribute("width", "22"); document.querySelector("#cm_close__settings svg").setAttribute("height", "24"); const closeModalButtons = document.querySelectorAll(".mod_small_modal_close"); closeModalButtons.forEach((closeModalButton) => { closeModalButton.addEventListener("click", () => { const modal = closeModalButton.closest(".mod-small-modal"); modal.style.display = "none"; }); }); }, Themes() { const elements = [ "#menu", "#title", ".top-users__inner", "#left-menu", ".menu-links", ".menu--stats-mode", "#cm_modal__settings > .ctrl-modal__overlay > .ctrl-modal__modal" ]; const themeEditor = document.createElement("div"); themeEditor.classList.add("themeEditor", "hidden"); themeEditor.innerHTML = `

    Theme Editor


    Select Theme Type:
    preview
    `; document.body.append(themeEditor); setTimeout(() => { document.querySelectorAll(".stats-btn__share-btn")[1].querySelector("rect").remove(); const themeTypeSelect = document.getElementById("theme-type-select"); const colorTab = document.getElementById("theme_editor_color"); const gradientTab = document.getElementById("theme_editor_gradient"); const imageTab = document.getElementById("theme_editor_image"); const gradientAngleDiv = document.getElementById("theme-editor-gradient_angle"); themeTypeSelect.addEventListener("change", function() { const selectedOption = themeTypeSelect.value; switch (selectedOption) { case "Static Color": colorTab.style.display = "flex"; gradientTab.style.display = "none"; imageTab.style.display = "none"; break; case "Gradient": colorTab.style.display = "none"; gradientTab.style.display = "flex"; imageTab.style.display = "none"; break; case "Image / Gif": colorTab.style.display = "none"; gradientTab.style.display = "none"; imageTab.style.display = "flex"; break; default: colorTab.style.display = "flex"; gradientTab.style.display = "none"; imageTab.style.display = "none"; } }); const colorInputs = document.querySelectorAll("#theme_editor_color .colorInput"); colorInputs.forEach(input => { input.addEventListener("input", function() { const bgColorInput = document.getElementById("theme-editor-bgcolorinput").value; const textColorInput = document.getElementById("theme-editor-colorinput").value; applyColorTheme(bgColorInput, textColorInput); }); }); const gradientInputs = document.querySelectorAll("#theme_editor_gradient .colorInput"); gradientInputs.forEach(input => { input.addEventListener("input", function() { const gColor1 = document.getElementById("theme-editor-gcolor1").value; const gColor2 = document.getElementById("theme-editor-g_color").value; const gTextColor = document.getElementById("theme-editor-gcolor2").value; const gAngle = document.getElementById("g_angle").value; const gradientType = document.getElementById("gradient-type").value; applyGradientTheme(gColor1, gColor2, gTextColor, gAngle, gradientType); }); }); const imageInputs = document.querySelectorAll("#theme_editor_image .colorInput"); imageInputs.forEach(input => { input.addEventListener("input", function() { const imageLinkInput = document.getElementById("theme-editor-imagelink").value; const textColorImageInput = document.getElementById("theme-editor-textcolorImage").value; let img; if(imageLinkInput == "") { img = "https://i.ibb.co/k6hn4v0/Galaxy-Example.png" } else { img = imageLinkInput; } applyImageTheme(img, textColorImageInput); }); }); const image_preview = document.getElementById("image_preview"); const image_link = document.getElementById("theme-editor-imagelink"); let isWriting = false; let timeoutId; image_link.addEventListener("input", () => { if (!isWriting) { isWriting = true; } else { clearTimeout(timeoutId); } timeoutId = setTimeout(() => { const imageLinkInput = image_link.value; const textColorImageInput = document.getElementById("theme-editor-textcolorImage").value; let img; if (imageLinkInput === "") { img = "https://i.ibb.co/k6hn4v0/Galaxy-Example.png"; } else { img = imageLinkInput; } applyImageTheme(img, textColorImageInput); isWriting = false; }, 1000); }); const gradientTypeSelect = document.getElementById("gradient-type"); const angleInput = document.getElementById("g_angle"); gradientTypeSelect.addEventListener("change", function() { const selectedType = gradientTypeSelect.value; gradientAngleDiv.style.display = selectedType === "linear" ? "flex" : "none"; const gColor1 = document.getElementById("theme-editor-gcolor1").value; const gColor2 = document.getElementById("theme-editor-g_color").value; const gTextColor = document.getElementById("theme-editor-gcolor2").value; const gAngle = document.getElementById("g_angle").value; applyGradientTheme(gColor1, gColor2, gTextColor, gAngle, selectedType); }); angleInput.addEventListener("input", function() { const gradient_angle_text = document.getElementById("gradient_angle_text"); gradient_angle_text.innerText = `Angle (${angleInput.value}deg): `; const gColor1 = document.getElementById("theme-editor-gcolor1").value; const gColor2 = document.getElementById("theme-editor-g_color").value; const gTextColor = document.getElementById("theme-editor-gcolor2").value; const gAngle = document.getElementById("g_angle").value; const gradientType = document.getElementById("gradient-type").value; applyGradientTheme(gColor1, gColor2, gTextColor, gAngle, gradientType); }); function applyColorTheme(bgColor, textColor) { const previewDivs = document.querySelectorAll("#theme_editor_color .themes_preview"); previewDivs.forEach(previewDiv => { previewDiv.style.backgroundColor = bgColor; const textSpan = previewDiv.querySelector("span.text"); textSpan.style.color = textColor; }); } function applyGradientTheme(gColor1, gColor2, gTextColor, gAngle, gradientType) { const previewDivs = document.querySelectorAll("#theme_editor_gradient .themes_preview"); previewDivs.forEach(previewDiv => { const gradient = gradientType === "linear" ? `linear-gradient(${gAngle}deg, ${gColor1}, ${gColor2})` : `radial-gradient(circle, ${gColor1}, ${gColor2})`; previewDiv.style.background = gradient; const textSpan = previewDiv.querySelector("span.text"); textSpan.style.color = gTextColor; }); } function applyImageTheme(imageLink, textColor) { const previewDivs = document.querySelectorAll("#theme_editor_image .themes_preview"); previewDivs.forEach(previewDiv => { previewDiv.style.backgroundImage = `url('${imageLink}')`; const textSpan = previewDiv.querySelector("span.text"); textSpan.style.color = textColor; }); } const createTheme = document.getElementById("createTheme"); createTheme.addEventListener("click", () => { themeEditor.style.display = "block"; }); const closeThemeEditor = document.getElementById("closeThemeEditor"); closeThemeEditor.addEventListener("click", () => { themeEditor.style.display = "none"; }); let themesDiv = document.getElementById("themes") const saveColorThemeBtn = document.getElementById("saveColorTheme"); const saveGradientThemeBtn = document.getElementById("saveGradientTheme"); const saveImageThemeBtn = document.getElementById("saveImageTheme"); saveColorThemeBtn.addEventListener("click", () => { const name = document.getElementById("colorThemeName").value; const bgColorInput = document.getElementById("theme-editor-bgcolorinput").value; const textColorInput = document.getElementById("theme-editor-colorinput").value; if(name == "") return const theme = { name: name, background: bgColorInput, text: textColorInput }; const themeCard = document.createElement("div"); themeCard.classList.add("theme"); let themeBG; if (theme.background.includes("http")) { themeBG = `background: url(${theme.background})`; } else { themeBG = `background: ${theme.background}`; } themeCard.innerHTML = `
    ${theme.name}
    `; themeCard.addEventListener("click", () => { toggleTheme(theme); }); themeCard.addEventListener('contextmenu', (ev) => { ev.preventDefault(); if(confirm("Do you want to delete this Theme?")) { themeCard.remove(); const themeIndex = modSettings.addedThemes.findIndex((addedTheme) => addedTheme.name === theme.name); if (themeIndex !== -1) { modSettings.addedThemes.splice(themeIndex, 1); updateStorage(); } } }); themesDiv.appendChild(themeCard); modSettings.addedThemes.push(theme) updateStorage(); themeEditor.style.display = "none"; themesDiv.scrollTop = themesDiv.scrollHeight; }); saveGradientThemeBtn.addEventListener("click", () => { const name = document.getElementById("GradientThemeName").value; const gColor1 = document.getElementById("theme-editor-gcolor1").value; const gColor2 = document.getElementById("theme-editor-g_color").value; const gTextColor = document.getElementById("theme-editor-gcolor2").value; const gAngle = document.getElementById("g_angle").value; const gradientType = document.getElementById("gradient-type").value; if(name == "") return let gradient_radial_linear = () => { if(gradientType == "linear") { return `${gradientType}-gradient(${gAngle}deg, ${gColor1}, ${gColor2})` } else if (gradientType == "radial") { return `${gradientType}-gradient(circle, ${gColor1}, ${gColor2})` } } const theme = { name: name, background: gradient_radial_linear(), text: gTextColor, }; const themeCard = document.createElement("div"); themeCard.classList.add("theme"); let themeBG; if (theme.background.includes("http")) { themeBG = `background: url(${theme.background})`; } else { themeBG = `background: ${theme.background}`; } themeCard.innerHTML = `
    ${theme.name}
    `; themeCard.addEventListener("click", () => { toggleTheme(theme); }); themeCard.addEventListener('contextmenu', (ev) => { ev.preventDefault(); if(confirm("Do you want to delete this Theme?")) { themeCard.remove(); const themeIndex = modSettings.addedThemes.findIndex((addedTheme) => addedTheme.name === theme.name); if (themeIndex !== -1) { modSettings.addedThemes.splice(themeIndex, 1); updateStorage(); } } }); themesDiv.appendChild(themeCard); modSettings.addedThemes.push(theme) updateStorage(); themeEditor.style.display = "none"; themesDiv.scrollTop = themesDiv.scrollHeight; }); saveImageThemeBtn.addEventListener("click", () => { const name = document.getElementById("imageThemeName").value; const imageLink = document.getElementById("theme-editor-imagelink").value; const textColorImageInput = document.getElementById("theme-editor-textcolorImage").value; if(name == "" || imageLink == "") return const theme = { name: name, background: imageLink, text: textColorImageInput }; const themeCard = document.createElement("div"); themeCard.classList.add("theme"); let themeBG; if (theme.background.includes("http")) { themeBG = `background: url(${theme.background})`; } else { themeBG = `background: ${theme.background}`; } themeCard.innerHTML = `
    ${theme.name}
    `; themeCard.addEventListener("click", () => { toggleTheme(theme); }); themeCard.addEventListener('contextmenu', (ev) => { ev.preventDefault(); if(confirm("Do you want to delete this Theme?")) { themeCard.remove(); const themeIndex = modSettings.addedThemes.findIndex((addedTheme) => addedTheme.name === theme.name); if (themeIndex !== -1) { modSettings.addedThemes.splice(themeIndex, 1); updateStorage(); } } }); themesDiv.appendChild(themeCard); modSettings.addedThemes.push(theme) updateStorage(); themeEditor.style.display = "none"; themesDiv.scrollTop = themesDiv.scrollHeight; }); }); const b_inner = document.querySelector(".body__inner"); let bodyColorElements = b_inner.querySelectorAll( ".body__inner > :not(.body__inner), #s-skin-select-icon-text" ); const toggleColor = (element, background, text) => { let image = `url("${background}")`; if (background.includes("http")) { element.style.background = image; element.style.backgroundPosition = "center"; element.style.backgroundSize = "cover"; element.style.backgroundRepeat = "no-repeat"; } else { element.style.background = background; element.style.backgroundRepeat = "no-repeat"; } element.style.color = text; }; const openSVG = document.querySelector("#clans_and_settings > Button > svg"); const openSVGPath = document.querySelector("#clans_and_settings > Button > svg > path"); const newPath = openSVG.setAttribute("fill", "#fff") const closeSVGPath = document.querySelector("#cm_close__settings > svg > path"); openSVG.setAttribute("width", "36") openSVG.setAttribute("height", "36") const toggleTheme = (theme) => { if (theme.text === "#FFFFFF") { openSVGPath.setAttribute("fill", "#fff") closeSVGPath.setAttribute("stroke", "#fff") } else { closeSVGPath.setAttribute("stroke", "#222"); openSVG.setAttribute("fill", "#222"); } const backgroundColor = theme.background; const textColor = theme.text; elements.forEach(selector => { const el = document.querySelector(selector); if (selector === "#title") { el.style.color = textColor; } else { toggleColor(el, backgroundColor, textColor); } }); bodyColorElements.forEach((element) => { element.style.color = textColor; }); modSettings.Theme = theme.name; updateStorage(); }; const themes = { defaults: [ { name: "Dark", background: "#151515", text: "#FFFFFF" }, { name: "White", background: "#ffffff", text: "#000000" }, ], orderly: [ { name: "THC", background: "linear-gradient(160deg, #9BEC7A, #117500)", text: "#000000" }, { name: "4 AM", background: "linear-gradient(160deg, #8B0AE1, #111)", text: "#FFFFFF" }, { name: "OTO", background: "linear-gradient(160deg, #A20000, #050505)", text: "#FFFFFF" }, { name: "Gaming", background: "https://i.ibb.co/DwKkQfh/BG-1-lower-quality.jpg", text: "#FFFFFF" }, { name: "Shapes", background: "https://i.ibb.co/h8TmVyM/BG-2.png", text: "#FFFFFF" }, { name: "Blue", background: "https://i.ibb.co/9yQBfWj/BG-3.png", text: "#FFFFFF" }, { name: "Blue - 2", background: "https://i.ibb.co/7RJvNCX/BG-4.png", text: "#FFFFFF" }, { name: "Purple", background: "https://i.ibb.co/vxY15Tv/BG-5.png", text: "#FFFFFF" }, { name: "Orange Blue", background: "https://i.ibb.co/99nfFBN/BG-6.png", text: "#FFFFFF" }, { name: "Gradient", background: "https://i.ibb.co/hWMLwLS/BG-7.png", text: "#FFFFFF" }, { name: "Sky", background: "https://i.ibb.co/P4XqDFw/BG-9.png", text: "#000000" }, { name: "Sunset", background: "https://i.ibb.co/0BVbYHC/BG-10.png", text: "#FFFFFF" }, { name: "Galaxy", background: "https://i.ibb.co/MsssDKP/Galaxy.png", text: "#FFFFFF" }, { name: "Planet", background: "https://i.ibb.co/KLqWM32/Planet.png", text: "#FFFFFF" }, { name: "colorful", background: "https://i.ibb.co/VqtB3TX/colorful.png", text: "#FFFFFF" }, { name: "Sunset - 2", background: "https://i.ibb.co/TLp2nvv/Sunset.png", text: "#FFFFFF" }, { name: "Epic", background: "https://i.ibb.co/kcv4tvn/Epic.png", text: "#FFFFFF" }, { name: "Galaxy - 2", background: "https://i.ibb.co/smRs6V0/galaxy.png", text: "#FFFFFF" }, { name: "Cloudy", background: "https://i.ibb.co/MCW7Bcd/cloudy.png", text: "#000000" }, ] }; function createThemeCard(theme) { const themeCard = document.createElement("div"); themeCard.classList.add("theme"); let themeBG; if (theme.background.includes("http")) { themeBG = `background: url(${theme.background})`; } else { themeBG = `background: ${theme.background}`; } themeCard.innerHTML = `
    ${theme.name}
    `; themeCard.addEventListener("click", () => { toggleTheme(theme); }); if (modSettings.addedThemes.includes(theme)) { themeCard.addEventListener('contextmenu', (ev) => { ev.preventDefault(); if (confirm("Do you want to delete this Theme?")) { themeCard.remove(); const themeIndex = modSettings.addedThemes.findIndex((addedTheme) => addedTheme.name === theme.name); if (themeIndex !== -1) { modSettings.addedThemes.splice(themeIndex, 1); updateStorage(); } } }, false); } return themeCard; } const themesContainer = document.getElementById("themes"); themes.defaults.forEach((theme) => { const themeCard = createThemeCard(theme); themesContainer.append(themeCard); }); const orderlyThemes = [...themes.orderly, ...modSettings.addedThemes]; orderlyThemes.sort((a, b) => a.name.localeCompare(b.name)); orderlyThemes.forEach((theme) => { const themeCard = createThemeCard(theme); themesContainer.appendChild(themeCard); }); const savedTheme = modSettings.Theme; if (savedTheme) { let selectedTheme; selectedTheme = themes.defaults.find((theme) => theme.name === savedTheme); if (!selectedTheme) { selectedTheme = themes.orderly.find((theme) => theme.name === savedTheme) || modSettings.addedThemes.find((theme) => theme.name === savedTheme); } if (selectedTheme) { toggleTheme(selectedTheme); } } }, chat() { const showChat = document.querySelector('#showChat'); if (showChat.checked) { showChat.click(); } setTimeout(() => { if (showChat) { const parent = showChat.parentNode; const secondParent = parent.parentNode; secondParent.remove(); } }); const chatDiv = document.createElement("div"); chatDiv.classList.add("modChat"); chatDiv.innerHTML = `
    `; document.body.append(chatDiv); const main = document.getElementById("mainchat"); const party = document.getElementById("partychat"); main.addEventListener("click", () => { if (modSettings.chatSettings.showClientChat) { document.getElementById("mod-messages").innerHTML = ""; modSettings.chatSettings.showClientChat = false; updateStorage(); } }); party.addEventListener("click", () => { if (!modSettings.chatSettings.showClientChat) { modSettings.chatSettings.showClientChat = true; updateStorage(); } const modMessages = document.getElementById("mod-messages"); if (!modSettings.tag) { modMessages.innerHTML = `
    [SERVER]: You need to be in a tag to use the SigMod party chat.
    `; } else { modMessages.innerHTML = `
    [SERVER]: Welcome to the SigMod party chat!
    `; } }); if (modSettings.chatSettings.showClientChat) { const modMessages = document.getElementById("mod-messages"); if (modMessages.children.length > 1) return; modMessages.innerHTML = `
    [SERVER]: Welcome to the SigMod party chat!
    `; } const text = document.getElementById("chatSendInput"); const send = document.getElementById("sendButton"); send.addEventListener("click", () => { let val = text.value; if (val == "") return; if (modSettings.chatSettings.showClientChat) { const id = unsafeWindow.user ? unsafeWindow.user._id : null; client.send({ type: "chat-message", content: { name: this.nick, message: val, id: id, } }); } else { // MAX 15 CHARS PER MSG if (val.length > 15) { const parts = []; for (let i = 0; i < val.length; i += 15) { parts.push(val.substring(i, i + 15)); } let index = 0; const sendPart = () => { if (index < parts.length) { sendChat(parts[index]); index++; setTimeout(sendPart, 1000); } }; sendPart(); } else { sendChat(val); } } text.value = ""; text.blur(); }); this.chatSettings(); this.emojiMenu(); const chatSettingsContainer = document.querySelector(".chatSettingsContainer") const emojisContainer = document.querySelector(".emojisContainer") document.getElementById("openChatSettings").addEventListener("click", () => { if (chatSettingsContainer.classList.contains("hidden")) { chatSettingsContainer.classList.remove("hidden"); emojisContainer.classList.add("hidden"); } else { chatSettingsContainer.classList.add("hidden"); } }); document.getElementById("openEmojiMenu").addEventListener("click", () => { if (emojisContainer.classList.contains("hidden")) { emojisContainer.classList.remove("hidden"); chatSettingsContainer.classList.add("hidden"); } else { emojisContainer.classList.add("hidden"); } }); const scrollUpButton = document.createElement("button"); scrollUpButton.style = "position: absolute;bottom: 60px;left: 50%;transform: translateX(-50%);width: 80px;display:none;box-shadow:0 0 5px #000;"; scrollUpButton.innerHTML = "โ†“"; scrollUpButton.id = "scroll-down-btn"; scrollUpButton.classList.add("modButton"); document.querySelector(".modChat__inner").appendChild(scrollUpButton); let focused = false; let typed = false; document.addEventListener("keydown", (e) => { if (e.key === "Enter" && text.value.length > 0) { send.click(); focused = false; scrollUpButton.click(); } else if (e.key === "Enter") { if (document.activeElement == HTMLInputElement) return; focused ? text.blur() : text.focus(); focused = !focused; } }); text.addEventListener("input", (e) => { typed = text.value.length > 1; }); text.addEventListener("blur", (e) => { focused = false; }); text.addEventListener("keydown", (e) => { const key = e.key.toLowerCase(); if (key == "w") { e.stopPropagation(); } if (key == " ") { e.stopPropagation(); } }); }, updateChat(data) { let time = "" if (data.time != null) time = formatTime(data.time); const name = noXSS(data.name); const msg = noXSS(data.message); const chatMessage = document.createElement("div"); chatMessage.classList.add("message"); chatMessage.innerHTML = ` ${name}: ${msg} ${time} ` const chatContainer = document.getElementById("mod-messages"); const manuallyScrolled = chatContainer.scrollHeight - chatContainer.scrollTop > 200; if (!manuallyScrolled) { setTimeout(() => { chatContainer.scrollTop = chatContainer.scrollHeight; }); } const scrollDownButton = document.getElementById("scroll-down-btn"); chatContainer.addEventListener("scroll", () => { if (chatContainer.scrollHeight - chatContainer.scrollTop > 300) { scrollDownButton.style.display = "block"; } if (chatContainer.scrollHeight - chatContainer.scrollTop < 299 && scrollDownButton.style.display === "block") { scrollDownButton.style.display = "none"; } }); scrollDownButton.addEventListener("click", () => { chatContainer.scrollTop = chatContainer.scrollHeight; }); document.getElementById("mod-messages").append(chatMessage); const messageCount = chatContainer.children.length; const messageLimit = modSettings.chatSettings.limit; if (messageCount > messageLimit) { const messagesToRemove = messageCount - messageLimit; for (let i = 0; i < messagesToRemove; i++) { chatContainer.removeChild(chatContainer.firstChild); } } }, emojiMenu() { const emojisContainer = document.createElement("div"); emojisContainer.classList.add("chatAddedContainer", "emojisContainer", "hidden"); emojisContainer.innerHTML = `
    `; const categoriesContainer = emojisContainer.querySelector("#categories"); const updateEmojis = (searchTerm) => { categoriesContainer.innerHTML = ''; window.emojis.forEach(emojiData => { const { emoji, description, category, tags } = emojiData; if (tags.some(tag => tag.includes(searchTerm.toLowerCase()))) { let categoryId = category.replace(/\s+/g, '-').replace('&', 'and').toLowerCase(); let categoryDiv = categoriesContainer.querySelector(`#${categoryId}`); if (!categoryDiv) { categoryDiv = document.createElement("div"); categoryDiv.id = categoryId; categoryDiv.classList.add("category"); categoryDiv.innerHTML = `${category}
    `; categoriesContainer.appendChild(categoryDiv); } const emojiContainer = categoryDiv.querySelector(".emojiContainer"); const emojiDiv = document.createElement("div"); emojiDiv.classList.add("emoji"); emojiDiv.innerHTML = emoji; emojiDiv.title = `${emoji} - ${description}`; emojiDiv.addEventListener("click", () => { const chatInput = document.querySelector("#chatSendInput"); chatInput.value += emoji; }); emojiContainer.appendChild(emojiDiv); } }); }; const chatInput = emojisContainer.querySelector("#searchEmoji"); chatInput.addEventListener("input", (event) => { const searchTerm = event.target.value.toLowerCase(); updateEmojis(searchTerm); }); document.body.append(emojisContainer); getEmojis().then(emojis => { window.emojis = emojis; updateEmojis(""); }); }, chatSettings() { const menu = document.createElement("div"); menu.classList.add("chatAddedContainer", "chatSettingsContainer", "scroll", "hidden"); menu.innerHTML = `
    Keybindings
    Location
    Show / Hide
    General
    Time
    Name colors
    Party / Main
    Blur Tag
    Location text
    Style
    Background
    `; document.body.append(menu); const infoIcon = document.querySelector(".infoIcon"); const modInfoPopup = document.querySelector(".modInfoPopup"); let popupOpen = false; infoIcon.addEventListener("click", (event) => { event.stopPropagation(); modInfoPopup.style.display = popupOpen ? "none" : "block"; popupOpen = !popupOpen; }); document.addEventListener("click", (event) => { if (popupOpen && !modInfoPopup.contains(event.target)) { modInfoPopup.style.display = "none"; popupOpen = false; } }); const showChatTime = document.querySelector("#showChatTime"); const showNameColors = document.querySelector("#showNameColors"); showChatTime.addEventListener("change", () => { const timeElements = document.querySelectorAll(".time"); if (showChatTime.checked) { modSettings.chatSettings.showTime = true; updateStorage(); } else { modSettings.chatSettings.showTime = false; if (timeElements) { timeElements.forEach(el => el.innerHTML=""); } updateStorage(); } }); showNameColors.addEventListener("change", () => { const message_names = document.querySelectorAll(".message_name"); if (showNameColors.checked) { modSettings.chatSettings.showNameColors = true; updateStorage(); } else { modSettings.chatSettings.showNameColors = false; if (message_names) { message_names.forEach(el => el.style.color="#fafafa"); } updateStorage(); } }); const bgChanger = document.querySelector("#chatbgChanger"); bgChanger.addEventListener("input", () => { const hexColor = bgChanger.value; const rgbaColor = hexToRgba(hexColor, 0.4); modSettings.chatSettings.bgColor = rgbaColor; modChat.style.background = rgbaColor; updateStorage(); }); const modChat = document.querySelector(".modChat"); modChat.style.background = modSettings.chatSettings.bgColor; const showPartyMain = document.querySelector("#showPartyMain"); const chatHeader = document.querySelector(".modchat-chatbuttons"); const changeButtonsState = (show) => { chatHeader.style.display = show ? "flex" : "none"; modChat.style.maxHeight = show ? "285px" : "250px"; modChat.style.minHeight = show ? "285px" : "250px"; const modChatInner = document.querySelector(".modChat__inner"); modChatInner.style.maxHeight = show ? "265px" : "230px"; modChatInner.style.minHeight = show ? "265px" : "230px"; } showPartyMain.addEventListener("change", () => { const show = showPartyMain.checked; modSettings.chatSettings.showChatButtons = show; changeButtonsState(show); updateStorage(); }); showPartyMain.checked = modSettings.chatSettings.showChatButtons; changeButtonsState(modSettings.chatSettings.showChatButtons); setTimeout(() => { const blurTag = document.getElementById("blurTag"); const tagText = document.querySelector(".tagText"); const tagElement = document.querySelector("#tag"); blurTag.addEventListener("change", () => { const state = blurTag.checked; state ? (tagText.classList.add("blur"), tagElement.classList.add("blur")) : (tagText.classList.remove("blur"), tagElement.classList.remove("blur")); modSettings.chatSettings.blurTag = state; updateStorage(); }); blurTag.checked = modSettings.chatSettings.blurTag; if (modSettings.chatSettings.blurTag) { tagText.classList.add("blur"); tagElement.classList.add("blur"); } }); const locationText = document.getElementById("locationText"); locationText.addEventListener("input", (e) => { e.stopPropagation(); modSettings.chatSettings.locationText = locationText.value; }); locationText.value = modSettings.chatSettings.locationText || "{pos}"; }, toggleChat() { const modChat = document.querySelector(".modChat"); const modChatAdded = document.querySelectorAll(".chatAddedContainer"); const isModChatHidden = modChat.style.display === "none" || getComputedStyle(modChat).display === "none"; if (isModChatHidden) { modChat.style.opacity = 0; modChat.style.display = "flex"; setTimeout(() => { modChat.style.opacity = 1; }, 10); } else { modChat.style.opacity = 0; modChatAdded.forEach(container => container.classList.add("hidden")); setTimeout(() => { modChat.style.display = "none"; }, 300); } }, macroSettings() { const allSettingNames = document.querySelectorAll(".setting-card-name") for (const settingName of Object.values(allSettingNames)) { settingName.addEventListener("click", (event) => { const settingCardWrappers = document.querySelectorAll(".setting-card-wrapper") const currentWrapper = Object.values(settingCardWrappers).filter((wrapper) => wrapper.querySelector(".setting-card-name").textContent === settingName.textContent)[0] const settingParameters = currentWrapper.querySelector(".setting-parameters") settingParameters.style.display = settingParameters.style.display === "none" ? "block" : "none" }) } }, smallMods() { const playBtn = document.getElementById("play-btn"); playBtn.addEventListener("click", (e) => { cells = new Map(); activeCellX = null; activeCellY = null; }); const gameTitle = document.getElementById("title"); gameTitle.innerHTML = 'SigmallyMod by Cursed'; const nickName = document.getElementById("nick"); nickName.maxLength = 50; nickName.type = "text"; const nickname = document.querySelector("#nick"); const nick = nickname.value; this.Username = nick; const topusersInner = document.querySelector(".top-users__inner"); topusersInner.classList.add("scroll"); topusersInner.style.border = "none"; }, credits() { console.log(`%c โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Žโ–‘โ–ˆโ–€โ–€โ–€โ–ˆ โ–€โ–ˆโ–€ โ–‘โ–ˆโ–€โ–€โ–ˆ โ–‘โ–ˆโ–€โ–„โ–€โ–ˆ โ–‘โ–ˆโ–€โ–€โ–€โ–ˆ โ–‘โ–ˆโ–€โ–€โ–„ โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Žโ”€โ–€โ–€โ–€โ–„โ–„ โ–‘โ–ˆโ”€ โ–‘โ–ˆโ”€โ–„โ–„ โ–‘โ–ˆโ–‘โ–ˆโ–‘โ–ˆ โ–‘โ–ˆโ”€โ”€โ–‘โ–ˆ โ–‘โ–ˆโ”€โ–‘โ–ˆ โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž V${version} โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Žโ–‘โ–ˆโ–„โ–„โ–„โ–ˆ โ–„โ–ˆโ–„ โ–‘โ–ˆโ–„โ–„โ–ˆ โ–‘โ–ˆโ”€โ”€โ–‘โ–ˆ โ–‘โ–ˆโ–„โ–„โ–„โ–ˆ โ–‘โ–ˆโ–„โ–„โ–€ โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–‘โ–ˆโ–ˆโ•—โ–‘โ–‘โ–‘โ–ˆโ–ˆโ•—โ€ƒโ€ƒโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–‘โ–ˆโ–ˆโ•—โ–‘โ–‘โ–‘โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–‘โ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–‘ โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ•—โ–‘โ–ˆโ–ˆโ•”โ•โ€ƒโ€ƒโ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–‘โ–‘โ–‘โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•ฆโ•โ–‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–‘โ€ƒโ€ƒโ–ˆโ–ˆโ•‘โ–‘โ–‘โ•šโ•โ•โ–ˆโ–ˆโ•‘โ–‘โ–‘โ–‘โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–‘โ–‘โ–ˆโ–ˆโ•‘โ–‘โ–‘โ–ˆโ–ˆโ•‘ โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–‘โ–‘โ•šโ–ˆโ–ˆโ•”โ•โ–‘โ–‘โ€ƒโ€ƒโ–ˆโ–ˆโ•‘โ–‘โ–‘โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–‘โ–‘โ–‘โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–‘โ•šโ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ•โ–‘โ–‘โ–ˆโ–ˆโ•‘โ–‘โ–‘โ–ˆโ–ˆโ•‘ โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•ฆโ•โ–‘โ–‘โ–‘โ–ˆโ–ˆโ•‘โ–‘โ–‘โ–‘โ€ƒโ€ƒโ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘โ–‘โ–‘โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ•šโ•โ•โ•โ•โ•โ•โ–‘โ–‘โ–‘โ–‘โ•šโ•โ•โ–‘โ–‘โ–‘โ€ƒโ€ƒโ–‘โ•šโ•โ•โ•โ•โ•โ–‘โ–‘โ•šโ•โ•โ•โ•โ•โ•โ–‘โ•šโ•โ•โ–‘โ–‘โ•šโ•โ•โ•šโ•โ•โ•โ•โ•โ•โ–‘โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ–‘ โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž โ€Ž `, 'background-color: black; color: green') }, saveNames() { let savedNames = modSettings.savedNames; let savedNamesOutput = document.getElementById("savedNames"); let saveNameBtn = document.getElementById("saveName"); let saveNameInput = document.getElementById("saveNameValue"); const createNameDiv = (name) => { let nameDiv = document.createElement("div"); nameDiv.classList.add("NameDiv"); let nameLabel = document.createElement("label"); nameLabel.classList.add("NameLabel"); nameLabel.innerText = name; let delName = document.createElement("button"); delName.innerText = "X"; delName.classList.add("delName"); nameDiv.addEventListener("click", () => { navigator.clipboard.writeText(nameLabel.innerText).then(() => { const copiedAlert = document.createElement("div"); copiedAlert.innerHTML = ` Added Nickname to clipboard! `; copiedAlert.classList.add("modAlert"); setTimeout(() => { copiedAlert.style.opacity = 0; setTimeout(() => { copiedAlert.remove(); }, 300) }, 500) document.querySelector(".body__inner").append(copiedAlert) }); }); delName.addEventListener("click", () => { if (confirm("Are you sure you want to delete the name '" + nameLabel.innerText + "'?")) { console.log("deleted name: " + nameLabel.innerText); nameDiv.remove(); savedNames = savedNames.filter((n) => n !== nameLabel.innerText); modSettings.savedNames = savedNames; updateStorage(); } }); nameDiv.appendChild(nameLabel); nameDiv.appendChild(delName); return nameDiv; }; saveNameBtn.addEventListener("click", () => { if (saveNameInput.value == "") { console.log("empty name"); } else { setTimeout(() => { saveNameInput.value = ""; }, 10); if (savedNames.includes(saveNameInput.value)) { console.log("You already have this name saved!"); return; } let nameDiv = createNameDiv(saveNameInput.value); savedNamesOutput.appendChild(nameDiv); savedNames.push(saveNameInput.value); modSettings.savedNames = savedNames; updateStorage(); } }); if (savedNames.length > 0) { savedNames.forEach((name) => { let nameDiv = createNameDiv(name); savedNamesOutput.appendChild(nameDiv); }); } }, Macros() { const KEY_SPLIT = this.splitKey; let ff = null; let keydown = false; let open = false; const canvas = document.getElementById("canvas"); const freezeType = document.getElementById("freezeType"); let freezeKeyPressed = false; let freezeMouseClicked = false; let freezeOverlay = null; freezeType.value = modSettings.freezeType; freezeType.addEventListener("change", () => { modSettings.freezeType = freezeType.value; updateStorage(); }); function fastMass() { let x = 15; while (x--) { keypress("w", "KeyW"); } } function splitRecursive(times) { if (times > 0) { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); splitRecursive(times - 1); } } function split() { splitRecursive(1); } function split2() { splitRecursive(2); } function split3() { splitRecursive(3); } function split4() { splitRecursive(4); } async function selfTrick() { let i = 4; while (i--) { splitRecursive(1); await Math.delay(20) } } async function doubleTrick() { let i = 2; while (i--) { splitRecursive(1); await Math.delay(20) } } function mouseToScreenCenter() { const screenCenterX = canvas.width / 2 const screenCenterY = canvas.height / 2 mousemove(screenCenterX, screenCenterY) return { x: screenCenterX, y: screenCenterY } } async function verticalLine() { let i = 4; while (i--) { const centerXY = mouseToScreenCenter(); const offsetUpX = centerXY.x const offsetUpY = centerXY.y - 100 const offsetDownX = centerXY.x const offsetDownY = centerXY.y + 100 await Math.delay(50) mousemove(offsetUpX, offsetUpY) await Math.delay(80) split(); await Math.delay(160) mousemove(offsetDownX, offsetDownY) if (i == 0) break await Math.delay(80) split(); } freezePlayer("hold", false); } function freezePlayer(type, mouse) { if(freezeType.value === "hold" && type === "hold") { const CX = canvas.width / 2; const CY = canvas.height / 2; mousemove(CX, CY); } else if(freezeType.value === "press" && type === "press") { if(!freezeKeyPressed) { const CX = canvas.width / 2; const CY = canvas.height / 2; mousemove(CX, CY); freezeOverlay = document.createElement("div"); freezeOverlay.innerHTML = ` Movement Stopped `; freezeOverlay.style = "position: absolute; top: 0; left: 0; z-index: 99; width: 100%; height: 100vh; overflow: hidden;"; if(mouse && modSettings.m1 === "freeze" || modSettings.m2 === "freeze") { freezeOverlay.addEventListener("click", () => { if(freezeOverlay != null) freezeOverlay.remove(); freezeOverlay = null; freezeKeyPressed = false; }); freezeOverlay.addEventListener("contextmenu", (e) => { e.preventDefault(); if(freezeOverlay != null) freezeOverlay.remove(); freezeOverlay = null; freezeKeyPressed = false; }); } document.querySelector(".body__inner").append(freezeOverlay) freezeKeyPressed = true; } else { if(freezeOverlay != null) freezeOverlay.remove(); freezeOverlay = null; freezeKeyPressed = false; } } } function sendLocation() { if (!activeCellX || !activeCellY) return; const gamemode = document.getElementById("gamemode"); const coordinatesToCheck = (gamemode.value === "eu0.sigmally.com/ws/") ? coordinates : coordinates2; let field = ""; for (const label in coordinatesToCheck) { const { min, max } = coordinatesToCheck[label]; if ( activeCellX >= min.x && activeCellX <= max.x && activeCellY >= min.y && activeCellY <= max.y ) { field = label; break; } } const locationText = modSettings.chatSettings.locationText || field; const message = locationText.replace('{pos}', field); sendChat(message); } function toggleSettings(setting) { const settingElement = document.querySelector(`.checkbox-grid > li > div > input#${setting}`); if (settingElement) { settingElement.click(); } else { console.error(`Setting "${setting}" not found`); } } document.addEventListener("keyup", (e) => { const key = e.key.toLowerCase(); if (key == modSettings.keyBindings.rapidFeed && keydown) { clearInterval(ff); keydown = false; } }); document.addEventListener("keydown", (e) => { const key = e.key.toLowerCase(); if (key == "p") { e.stopPropagation(); } if (key == "Tab") { e.preventDefault(); } if (document.activeElement instanceof HTMLInputElement && document.activeElement.type == 'text') return; if (key == modSettings.keyBindings.toggleMenu) { if (!open) { _cm_settings_open(); open = true; } else { document.querySelector("#cm_close__settings").click(); open = false; } } if (key == modSettings.keyBindings.freezePlayer) { freezePlayer(modSettings.freezeType, false); } if (key == modSettings.keyBindings.rapidFeed && !keydown) { keydown = true; ff = setInterval(fastMass, 50); } if (key == modSettings.keyBindings.doubleSplit) { split2(); } if (key == modSettings.keyBindings.tripleSplit) { split3(); } if (key == modSettings.keyBindings.quadSplit) { split4(); } if (key == modSettings.keyBindings.selfTrick) { selfTrick(); } if (key == modSettings.keyBindings.doubleTrick) { doubleTrick(); } if (key == modSettings.keyBindings.verticalSplit) { verticalLine(); } if (key == modSettings.keyBindings.location) { sendLocation(); } if (key == modSettings.keyBindings.toggleChat) { mods.toggleChat(); } if (key == modSettings.keyBindings.toggleNames) { toggleSettings("showNames"); } if (key == modSettings.keyBindings.toggleSkins) { toggleSettings("showSkins"); } if (key == modSettings.keyBindings.toggleAutoRespawn) { toggleSettings("autoRespawn"); } }); let mouseFastFeed; canvas.addEventListener("mousedown", () => { if(modSettings.m1 === "fastfeed") { mouseFastFeed = setInterval(fastMass, 15); } else if(modSettings.m1 === "split1") { split(); } else if(modSettings.m1 === "split2") { split2(); } else if(modSettings.m1 === "split3") { split3(); } else if(modSettings.m1 === "split4") { split4(); } else if(modSettings.m1 === "freeze") { freezePlayer(modSettings.freezeType, true); } }); canvas.addEventListener("contextmenu", (e) => { e.preventDefault(); if (modSettings.m1 === "fastfeed") { clearInterval(mouseFastFeed); } else if(modSettings.m2 === "split1") { split(); } else if(modSettings.m2 === "split2") { split2(); } else if(modSettings.m2 === "split3") { split3(); } else if(modSettings.m2 === "split4") { split4(); } else if(modSettings.m2 === "freeze") { freezePlayer(modSettings.freezeType, true); } }); canvas.addEventListener("mouseup", () => { clearInterval(mouseFastFeed); }); const m1_macroSelect = document.getElementById("m1_macroSelect"); const m2_macroSelect = document.getElementById("m2_macroSelect"); m1_macroSelect.value = modSettings.m1 || "none"; m2_macroSelect.value = modSettings.m2 || "none"; m1_macroSelect.addEventListener("change", () => { const selectedOption = m1_macroSelect.value; const optionActions = { "none": () => { modSettings.m1 = null; updateStorage(); }, "fastfeed": () => { modSettings.m1 = "fastfeed"; updateStorage(); }, "split": () => { modSettings.m1 = "split"; updateStorage(); }, "split2": () => { modSettings.m1 = "split2"; updateStorage(); }, "split3": () => { modSettings.m1 = "split3"; updateStorage(); }, "split4": () => { modSettings.m1 = "split4"; updateStorage(); }, "freeze": () => { modSettings.m1 = "freeze"; updateStorage(); }, }; if (optionActions[selectedOption]) { optionActions[selectedOption](); } }); m2_macroSelect.addEventListener("change", () => { const selectedOption = m2_macroSelect.value; const optionActions = { "none": () => { modSettings.m2 = null; updateStorage(); }, "fastfeed": () => { modSettings.m2 = "fastfeed"; updateStorage(); }, "split": () => { modSettings.m2 = "split"; updateStorage(); }, "split2": () => { modSettings.m2 = "split2"; updateStorage(); }, "split3": () => { modSettings.m2 = "split3"; updateStorage(); }, "split4": () => { modSettings.m2 = "split4"; updateStorage(); }, "freeze": () => { modSettings.m2 = "freeze"; updateStorage(); }, }; if (optionActions[selectedOption]) { optionActions[selectedOption](); } }); }, setInputActions() { const numModInputs = 15; const macroInputs = Array.from({ length: numModInputs }, (_, i) => `modinput${i + 1}`); macroInputs.forEach((modkey) => { const modInput = document.getElementById(modkey); document.addEventListener("keydown", (event) => { if (document.activeElement !== modInput) return; if (event.key === "Backspace") { modInput.value = ""; let propertyName = modInput.name; modSettings.keyBindings[propertyName] = ""; updateStorage(); return; } modInput.value = event.key.toLowerCase(); if (modInput.value !== "" && (macroInputs.filter((item) => item === modInput.value).length > 1 || macroInputs.some((otherKey) => { const otherInput = document.getElementById(otherKey); return otherInput !== modInput && otherInput.value === modInput.value; }))) { alert("You can't use 2 keybindings at the same time."); setTimeout(() => {modInput.value = ""}) return; } let propertyName = modInput.name; modSettings.keyBindings[propertyName] = modInput.value; updateStorage(); }); }); }, mainMenu() { let menucontent = document.querySelector(".menu-center-content"); menucontent.style.margin = "auto"; const discordlinks = document.createElement("div"); discordlinks.setAttribute("id", "dclinkdiv") discordlinks.innerHTML = ` Sigmally Discord SigModz Discord `; document.getElementById("discord_link").remove(); document.getElementById("menu").appendChild(discordlinks) document.querySelector("#cm_modal__settings .ctrl-modal__modal").style.padding = "20px"; let clansbtn = document.querySelector("#clans_and_settings button"); clansbtn.innerHTML = "Clans"; }, respawn() { const __line2 = document.getElementById("__line2") const c = document.getElementById("continue_button") const p = document.getElementById("play-btn") if (__line2.classList.contains("line--hidden")) return this.respawnTime = null setTimeout(() => { c.click() setTimeout(() => { p.click() this.respawnTime = Date.now() }, 200) }, 200) }, clientPing() { const pingElement = document.createElement("span"); pingElement.innerHTML = `Client Ping: 0ms`; pingElement.id = "clientPing"; pingElement.style = ` position: absolute; right: 10px; bottom: 5px; color: #fff; font-size: 1.8rem; ` document.querySelector("#cm_modal__settings > .ctrl-modal__overlay").append(pingElement); this.ping.intervalId = setInterval(() => { if (client.readyState != 1) return; this.ping.start = Date.now(); client.send({ type: "get-ping", }); }, 2000); }, createMinimap() { const playBtn = document.getElementById("play-btn") const miniMap = document.createElement("canvas"); miniMap.width = 200; miniMap.height = 200; miniMap.classList.add("minimap"); this.canvas = miniMap; let viewportScale = 1 document.body.append(miniMap); function resizeMiniMap() { viewportScale = Math.max(window.innerWidth / 1920, window.innerHeight / 1080) miniMap.width = miniMap.height = 200 * viewportScale } resizeMiniMap() window.addEventListener("resize", resizeMiniMap) minimapUpdate(); }, tagsystem() { const nick = document.querySelector("#nick"); const tagElement = document.createElement("input"); const tagText = document.querySelector(".tagText"); tagElement.classList.add("form-control"); tagElement.placeholder = "tag"; tagElement.id = "tag"; tagElement.maxLength = 3; const pnick = nick.parentElement; pnick.style = "display: flex; gap: 5px;"; tagElement.addEventListener("input", (e) => { e.stopPropagation(); const tagValue = tagElement.value; tagText.innerText = tagValue ? `Tag: ${tagValue}` : ""; modSettings.tag = tagElement.value; updateStorage(); client.send({ type: "update-tag", content: modSettings.tag, }); const miniMap = this.canvas; const ctx = miniMap.getContext("2d"); ctx.clearRect(0, 0, miniMap.width, miniMap.height); this.miniMapData = []; }); nick.insertAdjacentElement("beforebegin", tagElement); }, updateNick() { const nick = document.getElementById("nick"); this.nick = nick.value; nick.addEventListener("input", () => { this.nick = nick.value; }); }, checkConn() { const gamemode = document.getElementById("gamemode"); gamemode.addEventListener("change", () => { getWs(); }); setInterval(() => { if (unsafeWindow.socket && unsafeWindow.socket.readyState === 3) { console.log("Reconnecting..."); getWs(); } }, 1000); }, load() { // Load game faster function randomPos() { let eventOptions = { clientX: Math.floor(Math.random() * window.innerWidth), clientY: Math.floor(Math.random() * window.innerHeight), bubbles: true, cancelable: true }; let event = new MouseEvent('mousemove', eventOptions); document.dispatchEvent(event); } setInterval(randomPos); setTimeout(() => clearInterval(), 500); getWs(); const intervalId = setInterval(() => { if (unsafeWindow.socket && unsafeWindow.socket.readyState === 1) { this.createMenu(); this.checkConn(); client = new modClient(); clearInterval(intervalId); } }, 100); }, support() { const links = [ "https://link-target.net/216278/support-for-mod", "https://direct-link.net/216278/support-for-mod1", "https://direct-link.net/216278/sigmally-mod-support" ]; let usedLinks = []; function ranLink() { if (usedLinks.length === links.length) { usedLinks = []; } let randomIndex; do { randomIndex = Math.floor(Math.random() * links.length); } while (usedLinks.includes(randomIndex)); usedLinks.push(randomIndex); window.open(links[randomIndex]); alert("There are 3 links you can support Sigmod with. Click 2 times again and you will support me as much as you can. Big thanks!"); } const supportDiv = document.createElement("div"); supportDiv.classList.add("modAlert"); supportDiv.innerHTML = ` Support mod by watching ads
    `; document.body.append(supportDiv); document.getElementById("supportmod").addEventListener("click", ranLink); document.getElementById("supportmodclose").addEventListener("click", () => { supportDiv.remove(); }); }, createMenu() { this.smallMods(); this.menu(); this.credits(); this.support(); const styleTag = document.createElement("style") styleTag.innerHTML = this.style; document.head.append(styleTag) this.chat(); this.Macros(); this.Themes(); this.updateNick(); this.clientPing(); this.tagsystem(); this.createMinimap(); this.saveNames(); this.setInputActions(); this.getColors(); this.setColors(); this.mainMenu(); this.macroSettings(); setInterval(() => { if (document.getElementById("autoRespawn").checked && modSettings.AutoRespawn && this.respawnTime && Date.now() - this.respawnTime >= this.respawnCooldown) { this.respawn(); } }) } } window.setInterval = new Proxy(setInterval, { apply(target, _this, args) { if (args[1] === (1000 / 7)) { args[1] = 0 } return target.apply(_this, args) } }); Math.delay = function(ms) { return new Promise((resolve, reject) => { setTimeout(resolve, ms) }) } const mods = new mod(); })();