// ==UserScript== // @name Sigmally Mod (Macros, Client) // @version 5 // @description Mod for Sigmally.com | Macros, Themes, Client, Autorespawn and much more! // @author Cursed // @match *://sigmally.com/* // @icon https://i.ibb.co/Hn9qnjm/Sigmod-Logo.png // @run-at document-end // @license MIT // @namespace https://greasyfork.org/users/981958 // @require https://greasyfork.org/scripts/470003-game-engine/code/Game%20Engine.js?version=1214473 // @downloadURL none // ==/UserScript== (function() { const gt = window.gt; let version = 5; let logo = "https://i.ibb.co/Hn9qnjm/Sigmod-Logo.png"; 'use strict'; if(localStorage.getItem("SigmodSettings")) localStorage.removeItem("SigmodSettings"); let bl = []; let modSettings = localStorage.getItem("sig_modSettings"); if (!modSettings) { modSettings = { keyBindingsRapidFeed: "w", keyBindingsdoubleSplit: "d", keyBindingsTripleSplit: "f", keyBindingsQuadSplit: "g", keyBindingsFreezePlayer: "s", keyBindingsToggleMenu: "v", keyBindingsSwitchChat: "t", mapColor: null, nameColor: null, borderColor: null, mapImageURL: "", Theme: "Dark", addedThemes: [], savedNames: [], AutoRespawn: false, tag: 0, showClientChat: false, chatBGcolor: "#2a3052", chatTextColor: "#ffffff", showNews: true, }; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); } else { modSettings = JSON.parse(modSettings); } 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 isMainMenuClosed() { const __line2 = document.getElementById("__line2") const menuWrapper = document.getElementById("menu-wrapper") return __line2.classList.contains("line--hidden") && menuWrapper.style.display === "none" } function hexToRGBA (hex, alpha) { const r = parseInt(hex.slice(1, 3), 16); const g = parseInt(hex.slice(3, 5), 16); const b = parseInt(hex.slice(5, 7), 16); return `rgba(${r}, ${g}, ${b}, ${alpha})`; } class Client { constructor() { this.ws = new gt.GTSocket({ url: "wss://sigmally-mod.marco077x.repl.co", packetType: "msgpack", hideMsgpack: true }); this.id = ""; this.playerId = Math.floor(Math.random() * 1e15); this.miniMapXOffset = null this.miniMapYOffset = null this.lastSentMiniMapData = Date.now() this.miniMapUsersData = [] this.chatData = []; this.Username = "User"; this.specialUsers = []; this.currentTag = 0; this.lastSentPing = 0 this.ping = 0 this.settingsShown = false; this.chatIsDown = false; this.unreadedMessages = 0; this.notification = document.getElementById("notification"); this.init(); } get style() { return ` #client-chat { position: fixed; bottom: 10px; left: 10px; z-index: 2147483647; overflow: hidden; width: 435px; height: 250px; border-radius: 2px; border-top-left-radius: 10px; border-top-right-radius: 10px; display: flex; flex-direction: column; justify-content: flex-end; transform-origin: bottom; transition: all .3s ease; } #client-messages { display: flex; flex-direction: column; max-height: 200px; overflow-y: auto; direction: rtl; } .message { direction: ltr; margin: 2px 0 0 5px; } #client-messages::-webkit-scrollbar { width: 10px; } #client-messages::-webkit-scrollbar-track { background: #222; border-radius: 5px; } #client-messages::-webkit-scrollbar-thumb { background-color: #333; border-radius: 5px; } #client-messages::-webkit-scrollbar-thumb:hover { background: #444; } #chatInputContainer { display: flex; align-items: center; padding: 5px; background: rgba(68, 68, 68, 0.5); } #chatSendInput { flex-grow: 1; border: none; background: transparent; color: #fff; padding: 5px; outline: none; } #sendButton { background: #e37955; border: none; border-radius: 5px; padding: 5px 10px; color: #fff; transition: all 0.3s; cursor: pointer; } #sendButton:hover { background: #cc603b; } .chatOptions { position: fixed; bottom: 10px; left: 450px; z-index: 2147483647; } .chatButton { background: #e37955; border: 0; border-radius: 5px; padding: 5px 10px; color: #fff; transition: all 0.3s; } .chatButton:hover { background: #cc603b; } .chatButton:active { scale: 0.95; } .chatText { color: #ffffff; font-weight: 500; -webkit-text-stroke: 0.5px #000; text-stroke: 0.5px #000; } #tag { width: 50px; margin-left: 5px } .ClientChatTitle { position: absolute; top: 5px; right: 5px; pointer-events: none; -webkit-text-stroke: 0.5px #000; text-stroke: 0.5px #000; color: #7400FF; font-size: 16px; font-weight: 500; } #sendButton { display: flex; align-items: center; gap: 5px; } #notification { position: absolute; top: -10px; right: -10px; background-color: #3EDF6F; color: #ffffff; font-size: 12px; font-weight: bold; padding: 2px 7px; border-radius: 50px; transform: rotate(15deg); font-weight: 500; } .chatSettings { position: absolute; top: 30px; right: 36px; border: none; background-color: transparent; transition: all .3s ease; } .chatSettings:hover { transform: scale(.9) } .chatDown { position: absolute; top: 30px; right: 5px; width: 30px; } .chatSettingsDiv { z-index: 99996; position: absolute; bottom: 45px; left: 450px; height: 215px; width: 150px; border-radius: 10px; display: flex; flex-direction: column; align-items: center; padding: 10px; transition: all .3s ease; } /* Mod Style */ :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 #2E2D80; width: 440px; box-shadow: inset 0 0 10px #424190, 0 0 10px #424190; height: 355px; } .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; } .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: height 0.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; } .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; } .ModSettings { display: flex; justify-content: center; } .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; } .tab-content { margin: 10px; } .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); } #savedNames::-webkit-scrollbar, .themes::-webkit-scrollbar, .modKeybindings::-webkit-scrollbar { width: 10px; } #savedNames::-webkit-scrollbar-track, .themes::-webkit-scrollbar-track, .modKeybindings::-webkit-scrollbar-track { background: #222; border-radius: 5px; } #savedNames::-webkit-scrollbar-thumb, .themes::-webkit-scrollbar-thumb, .modKeybindings::-webkit-scrollbar-thumb { background-color: #555; border-radius: 5px; } #savedNames::-webkit-scrollbar-thumb:hover, .themes::-webkit-scrollbar-thumb:hover, .modKeybindings::-webkit-scrollbar-thumb:hover { background: #666; } .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: absolute; top: 50px; left: 50%; transform: translate(-50%, -50%); z-index: 99998; background: #57C876; padding: 10px; border-radius: 10px; text-align: center; transition: all .3s ease-out; } .modAlert > .text { color: #fff; } .donate { position: fixed; top: 80px; left: 50%; transform: translate(-50%, -50%); z-index: 99995; background: #3F3F3F; border-radius: 10px; display: flex; flex-direction: column; 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; } .mod_news { z-index: 999999; position: absolute; top: 50px; left: 50%; transform: translateX(-50%); box-shadow: inset 0 0 10px #000; color: #fff; padding: 10px; border-radius: 10px; min-width: 350px; max-width: 380px; overflow: hidden; } .mod_news_background { object-fit: cover; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; } .mod_news_header { display: flex; justify-content: space-between; align-items: center; } .mod_news_header img { border-radius: 5px } #signInBtn, #nick, #tag, #gamemode, #option_0, #option_1, #option_2 { background: rgba(0, 0, 0, 0.4); color: #fff; } .skin-select__icon-text { 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; } `; } sendLog(msg) { const logMessage = { type: "log", content: msg, name: this.Username, gamemode: getGameMode(), tag: this.currentTag }; this.ws.send(logMessage); } onServerMessage(event) { const data = this.ws.decodePacket(event.data) if (data.type === "log-back") { console.log(data.content); } if (data.type === "minimap-data") { this.miniMapUsersData = data.content } if (data.type === "new-chat-message") { const content = data.content; const msgUser = content.nickname; const msgContent = content.text; const tag = content.tag; const id = content.playerId; if (tag === this.currentTag) { this.chatData.push(msgUser, msgContent); this.updateChat(id, msgUser, msgContent); } } if (data.type === "auth") { this.specialUsers = data.content; } if (data.type === "get-ping") { this.ping = Date.now() - this.lastSentPing // console.log(`Client ping: ${this.ping}ms`) turn on if you want to know the ping of the Client. } } createTagElement() { const nick = document.querySelector("#nick"); const tagElement = document.createElement("input"); tagElement.classList.add("form-control"); tagElement.placeholder = "tag"; tagElement.setAttribute("id", "tag"); tagElement.setAttribute("maxLength", 3); tagElement.value = "0"; const pnick = nick.parentElement; pnick.style.display = "flex"; document.getElementById("play-btn").addEventListener("click", () => { this.currentTag = tagElement.value; document.getElementById("client-chat-title").innerText = `SigMod Client Chat | Tag: ${this.currentTag}`; modSettings.tag = this.currentTag; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); this.ws.send({ type: "update-tag", content: this.currentTag }) }) nick.insertAdjacentElement("afterend", tagElement); } sendData(type, content) { const msg = { type: type, content: content } this.ws.send(msg) } createClientChat() { const chat = document.createElement("div"); chat.id = "client-chat"; chat.classList.add("client_chat_div") chat.innerHTML = ` SigMod Client Chat | Tag: ${this.currentTag}
`; const chatOptions = document.createElement("div"); chatOptions.innerHTML = ` `; chatOptions.classList.add("chatOptions"); document.body.append(chatOptions); document.body.append(chat); const send = document.getElementById("sendButton"); send.addEventListener("click", () => { this.sendMsg(); }) const chatSendInput = document.getElementById("chatSendInput"); chatSendInput.addEventListener("keydown", (e) => { e.stopPropagation(); if(e.code == "Enter") { this.sendMsg(); setTimeout(() => { chatSendInput.blur(); }, 10) } }) chatSendInput.addEventListener("click", () => { const noti = document.getElementById("notifications"); if(document.getElementById("notification")) { document.getElementById("notification").remove(); this.unreadedMessages = 0; } }) document.addEventListener("keydown", (e) => { if(e.code == "Enter") { chatSendInput.focus(); if(document.getElementById("notification")) { document.getElementById("notification").remove(); this.unreadedMessages = 0; } } }) } switchChat() { const mainBtn = document.getElementById("mainBtn"); const partyBtn = document.getElementById("partyBtn"); const chatBlock = document.getElementById("chat_block"); const clientChat = document.getElementById("client-chat"); const showChat = document.getElementById("showChat"); mainBtn.addEventListener("click", () => { chatBlock.style.display = "block"; clientChat.style.display = "none"; if(!showChat.checked) showChat.click() modSettings.showClientChat = false; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)) }) partyBtn.addEventListener("click", () => { chatBlock.style.display = "none"; clientChat.style.display = "flex"; if(document.getElementById("notification")) { document.getElementById("notification").remove(); this.unreadedMessages = 0; } if(showChat.checked) showChat.click() modSettings.showClientChat = true; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)) }) } updateChat(id, user, message) { const chatContainer = document.getElementById("client-messages"); const formattedMessage = `${user}: ${message}`; chatContainer.innerHTML += formattedMessage; const messageCount = chatContainer.children.length; const messageLimit = 50; if (messageCount > messageLimit) { const messagesToRemove = messageCount - messageLimit; for (let i = 0; i < messagesToRemove; i++) { chatContainer.removeChild(chatContainer.firstChild); this.chatData.splice(0, 2); } } chatContainer.scrollTop = chatContainer.scrollHeight; if(id == this.playerId) return this.unreadedMessages++; if (this.unreadedMessages === 0) return; const partyBtn = document.getElementById("partyBtn"); const notification = this.notification; if (notification) { notification.textContent = this.unreadedMessages; } else { const notificationElement = document.createElement("span"); notificationElement.id = "notification"; notificationElement.textContent = this.unreadedMessages; partyBtn.appendChild(notificationElement); } } sendMsg() { const username = document.getElementById("nick").value; let msg = document.querySelector("#chatSendInput").value; let tag = this.currentTag; let id = this.playerId; const msgContent = { nick: username, message: msg, tag: tag, playerId: id }; if(msg == "") return const settings = document.querySelector(".chatSettings"); const chatDown = document.querySelector(".chatDown"); const sendButton = document.getElementById("sendButton"); const client_messages = document.getElementById("client-messages"); if(!this.chatIsDown) { document.getElementById("client-chat").style.height = "250px"; document.getElementById("client-chat-title").style.display = "block"; chatDown.style.rotate = "0deg"; chatDown.style.top = "30px"; settings.style.display = "block"; sendButton.style.display = "block"; client_messages.style.display = "flex"; this.chatIsDown = false; } this.sendData("chat-message", msgContent); document.getElementById("chatSendInput").value = ""; } chatOptions() { let chatIsDown = this.chatIsDown; const sendButton = document.getElementById("sendButton"); const settings = document.createElement("button"); const client_messages = document.getElementById("client-messages"); settings.innerHTML = "" settings.classList.add("chatSettings") document.getElementById("client-chat").append(settings) settings.addEventListener("click", this.chatSettings) const chatDown = document.createElement("button"); chatDown.innerHTML = "↓"; chatDown.addEventListener("click", () => { if(!chatIsDown) { document.getElementById("client-chat").style.height = "40px"; document.getElementById("client-chat-title").style.display = "none"; chatDown.style.rotate = "180deg"; chatDown.style.top = "6px"; settings.style.display = "none"; sendButton.style.display = "none"; client_messages.style.display = "none"; const chatstngs = document.getElementById("ClientChatSettings") if(chatstngs) { chatstngs.remove(); this.settingsShown = false; } chatIsDown = true; } else { document.getElementById("client-chat").style.height = "250px"; document.getElementById("client-chat-title").style.display = "block"; chatDown.style.rotate = "0deg"; chatDown.style.top = "30px"; settings.style.display = "block"; sendButton.style.display = "block"; client_messages.style.display = "flex"; chatIsDown = false; } }) chatDown.classList.add("chatDown", "modButton") document.getElementById("client-chat").append(chatDown) } chatSettings() { if(!this.settingsShown) { const settings = document.createElement("div"); settings.classList.add("chatSettingsDiv", "client_chat_div"); settings.id = "ClientChatSettings"; settings.innerHTML = ` More coming soon `; settings.style.backgroundColor = hexToRGBA(modSettings.chatBGcolor, 0.4); document.body.append(settings) setTimeout(() => { const changeBg = document.getElementById("changeChatBg") changeBg.addEventListener("input", () => { const clientChatDivs = document.getElementsByClassName("client_chat_div"); for (let i = 0; i < clientChatDivs.length; i++) { const rgbaColor = hexToRGBA(changeBg.value, 0.4); clientChatDivs[i].style.backgroundColor = rgbaColor; } modSettings.chatBGcolor = changeBg.value; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); }); const changeChatColor = document.getElementById("changeChatColor") changeChatColor.addEventListener("input", () => { const chatText = document.getElementsByClassName("chatText"); for(let i=0; i < chatText.length; i++) { chatText[i].style.color = changeChatColor.value; } modSettings.chatTextColor = changeChatColor.value; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); }); }); this.settingsShown = true; } else { if(document.getElementById("ClientChatSettings")) document.getElementById("ClientChatSettings").remove(); this.settingsShown = false; } } onClose() { const message = document.createElement("div"); message.innerHTML = ` You Disconnected from the SigMod WebSocket. This happens when you went afk or when there was an update on the Server. Please refresh the page to use the mod properly.
`; 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) } init() { const chatBlock = document.getElementById("chat_block"); const showChat = document.getElementById("showChat"); //style const styleTag = document.createElement("style") styleTag.innerHTML = this.style; document.head.append(styleTag) setTimeout(() => { this.Username = uData.fullName || document.getElementById("nick").value || "User"; this.id = uData.id || ""; }, 1500) this.ws.connect(() => { this.ws.on("on-message", "message", this.onServerMessage.bind(this)); this.ws.on("on-close", "close", this.onClose.bind(this)); setTimeout(() => { this.sendLog(`${this.Username} connected to Client.`); this.ws.send({ type: "auth" }) }, 1600) setInterval(() => { this.lastSentPing = Date.now() this.ws.send({ type: "get-ping" }) }, 5000) }); setTimeout(() => { const changeBg = document.getElementById("changeChatBg"); const changeChatColor = document.getElementById("changeChatColor"); this.switchChat(); this.chatOptions() const gameMode = document.getElementById("gamemode") gameMode.addEventListener("change", (event) => { this.ws.send({ type: "server-changed", content: getGameMode() }) }); const clientChat = document.getElementById("client-chat"); if (localStorage.getItem("sig_modSettings")) { const modSettings = JSON.parse(localStorage.getItem("sig_modSettings")); if (modSettings.tag) { this.currentTag = modSettings.tag; document.getElementById("tag").value = this.currentTag; document.getElementById("client-chat-title").innerText = `SigMod Client Chat | Tag: ${this.currentTag}`; } if(!modSettings.showClientChat) { chatBlock.style.display = "block"; clientChat.style.display = "none"; if(showChat.checked) showChat.click(); } else { chatBlock.style.display = "none"; clientChat.style.display = "flex"; if(!showChat.checked) showChat.click(); } if(changeBg || changeChatColor) { changeBg.value = modSettings.chatBGcolor; changeChatColor.value = modSettings.chatTextColor; } const clientChatDivs = document.getElementsByClassName("client_chat_div"); for (let i = 0; i < clientChatDivs.length; i++) { const rgbaColor = hexToRGBA(modSettings.chatBGcolor, 0.4); clientChatDivs[i].style.backgroundColor = rgbaColor; } const chatText = document.getElementsByClassName("chatText"); for(let i=0; i < chatText.length; i++) { chatText[i].style.color = modSettings.chatTextColor; } } }); this.createTagElement(); this.createClientChat(); setTimeout(() => { for(let i = 0; i < bl.length; i++) { if(document.getElementById("nick").value.includes(bl[i])){ alert("You are banned from Sigmally Mod."); location.href = "https://google.com"; } } }, 3000) } } const client = new Client(); 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 mod() { this.welcomeUser = document.createElement("span"); this.splitKey = { keyCode: 32, code: "Space", cancelable: true, composed: true, isTrusted: true, which: 32, } this.createMenu(); } mod.prototype = { 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); }, center(sx, sy) { const mouseMoveEvent = new MouseEvent("mousemove", { clientX: sx, clientY: sy }); const canvas = document.getElementById("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; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); } 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; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); } 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; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); }); const mapColorReset = document.getElementById("mapColorReset"); mapColorReset.addEventListener("click", () => { modSettings.mapColor = null; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); 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 = ""; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); location.reload(); } }); if (localStorage.getItem("sig_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(); } }, 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 && this.playerId == this.playerId) { const width = this.measureText(text).width; this.fillStyle = nameColorValue.value; } return fillText.apply(this, arguments); }; modSettings.nameColor = nameColorValue.value localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)) }) if (localStorage.getItem("sig_modSettings")) { 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; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)) }); 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; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)) }) borderColorReset.addEventListener("click", () => { CanvasRenderingContext2D.prototype.moveTo = function(x, y) { this.strokeStyle = "" return moveTo.apply(this, arguments) } modSettings.borderColor = ""; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); }) if(modSettings.borderColor !== null) { CanvasRenderingContext2D.prototype.moveTo = function(x, y) { this.strokeStyle = modSettings.borderColor; return moveTo.apply(this, arguments) } } }, menu() { let Tab1; let Tab2; let Tab3; let Tab4; let Tab5; const welcomeuser = this.welcomeUser; 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 Guest, 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") Tab2 = document.createElement("div"); Tab2.classList.add("centerX"); Tab2.innerHTML = `
Map Color
Border Colors
Map image:
`; 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" 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"); }); const tabContent = document.querySelector("#sig-mod-settings > .ctrl-modal__content"); tabContent.append(Tab2) tabContent.append(Tab3) tabContent.append(Tab4) tabContent.append(Tab5) KeyBindings.classList.add("modKeybindings") 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") }, Themes() { const elements = [ "#menu", ".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(() => { 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); localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); } } }); themesDiv.appendChild(themeCard); modSettings.addedThemes.push(theme) localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); 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); localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); } } }); themesDiv.appendChild(themeCard); modSettings.addedThemes.push(theme) localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); 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); localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); } } }); themesDiv.appendChild(themeCard); modSettings.addedThemes.push(theme) localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); 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((element) => { const el = document.querySelector(element); toggleColor(el, backgroundColor, textColor); }); bodyColorElements.forEach((element) => { element.style.color = textColor; }); modSettings.Theme = theme.name; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); }; 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', function(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); localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); } } }, 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); } } }, smallMods() { const welcomeuser = this.welcomeUser; setTimeout(() => { welcomeuser.textContent = `Welcome ${client.Username}, to SigMod!` }, 1500) const gameSettings = document.querySelector(".checkbox-grid"); gameSettings.innerHTML += `
  • `; let autoRespawn = document.getElementById("autoRespawn"); let autoRespawnEnabled = false; autoRespawn.addEventListener("change", () => { if(!autoRespawnEnabled) { modSettings.AutoRespawn = true; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)) autoRespawnEnabled = true; } else { modSettings.AutoRespawn = false; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)) autoRespawnEnabled = false; } }); if(localStorage.getItem("sig_modSettings")) { if(modSettings.AutoRespawn) { autoRespawn.checked = true; autoRespawnEnabled = true; } } const gameTitle = document.getElementById("title"); gameTitle.innerHTML = 'SigmallyMod by Cursed'; const nickName = document.getElementById("nick"); nickName.maxLength = 50; }, 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; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); } }); 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; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); } }); 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; document.addEventListener("keyup", (e) => { if (e.key == modSettings.keyBindingsRapidFeed && keydown) { clearInterval(ff); keydown = false; } }); document.addEventListener("keydown", (e) => { if (document.activeElement instanceof HTMLInputElement) return; if (e.key == "Tab") { e.preventDefault(); } if (e.key == modSettings.keyBindingsToggleMenu) { if (!open) { _cm_settings_open(); open = true; } else { document.querySelector("#cm_close__settings").click(); open = false; } } if (e.key === modSettings.keyBindingsSwitchChat) { if (modSettings.showClientChat) { document.getElementById("mainBtn").click(); } else { document.getElementById("partyBtn").click(); } } if (e.key == modSettings.keyBindingsFreezePlayer) { const CX = document.getElementById("canvas").width / 2; const CY = document.getElementById("canvas").height / 2; this.center(CX, CY); } if (e.key == modSettings.keyBindingsRapidFeed && !keydown) { keydown = true; function fastMass() { let x = 15; while (x--) { keypress("w", "KeyW"); } } ff = setInterval(fastMass, 50); } if (e.key == modSettings.keyBindingsdoubleSplit) { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); setTimeout(() => { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); }, 50); return; } if (e.key == modSettings.keyBindingsTripleSplit) { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); setTimeout(() => { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); setTimeout(() => { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); }, 50) }, 50) return; } if (e.key == modSettings.keyBindingsQuadSplit) { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); setTimeout(() => { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); setTimeout(() => { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); setTimeout(() => { window.dispatchEvent(new KeyboardEvent("keydown", KEY_SPLIT)); window.dispatchEvent(new KeyboardEvent("keyup", KEY_SPLIT)); }, 50) }, 50) }, 50) return; } }); }, setInputActions() { const macroInputs = ["modinput1", "modinput2", "modinput3", "modinput4", "modinput5", "modinput6", "modinput7"]; 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[propertyName] = ""; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); 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[propertyName] = modInput.value; localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); }); }); }, 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" }, 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) }, donate() { const link = "https://Sigmally.sell.app/product/donation"; // Disabled for now to not annoy people with this message /* const Donate = document.createElement("div"); Donate.classList.add("donate") Donate.innerHTML = ` Donate to get custom color!
    `; setTimeout(() => { document.getElementById("closeDonate").addEventListener("click", () => { Donate.remove(); }); document.getElementById("donateBtn").addEventListener("click", () => { window.open("https://Sigmally.sell.app/product/donation"); }) }, 10) document.body.append(Donate); */ }, news() { const newsMenu = document.createElement("div"); newsMenu.classList.add("mod_news"); newsMenu.innerHTML = `

    SigMod V${version} | What's new?


    Hi, this is a new version of SigMod, New Features and fixes but you have to keep some things in mind while using this mod.

    New features / fixed:

    There are still some bugs with Client minimap, might be fixed soon. If you find any other bugs or need help, ask me on discord: czrsd or cursd#0126.

    `; document.body.append(newsMenu); if(localStorage.getItem("sig_modSettings")) { if (!modSettings.showNews) { newsMenu.remove(); } else { const showAgain = document.getElementById("showNewsAgain"); const ok = document.getElementById("ok_mod_news"); ok.addEventListener("click", () => { if(!showAgain.checked) { modSettings.showNews = true; } else { modSettings.showNews = false; } localStorage.setItem("sig_modSettings", JSON.stringify(modSettings)); newsMenu.remove(); }) } } }, createMenu() { this.smallMods(); this.menu(); this.news(); setTimeout(() => { this.Macros(); this.Themes(); this.saveNames(); this.setInputActions(); this.getColors(); this.setColors(); this.mainMenu(); 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) } }); new mod(); const { arc, fillText, fillRect, drawImage } = CanvasRenderingContext2D.prototype CanvasRenderingContext2D.prototype.fillText = new Proxy(fillText, { apply(target, _this, args) { const [text, x, y] = args; for (let i = 0; i < client.specialUsers.length; i++) { const s_u = client.specialUsers[i]; if (text === s_u) { _this.fillStyle = "#dc1818"; break; } } return target.apply(_this, args); } }); const playBtn = document.getElementById("play-btn") const border = {} const miniMap = new gt.GTCanvas({ id: "client-minimap", width: 200, height: 200 }) let viewportScale = 1 let miniMapReseted = false miniMap.appendTo(document.body) miniMap.view.style.set({ pointerEvents: "none", position: "absolute", float: "right", bottom: "0px", right: "0px", zIndex: "9999999", }) function resizeMiniMap() { viewportScale = Math.max(window.innerWidth / 1920, window.innerHeight / 1080) miniMap.width = miniMap.height = 200 * viewportScale } resizeMiniMap() window.addEventListener("resize", resizeMiniMap) CanvasRenderingContext2D.prototype.drawImage = new Proxy(drawImage, { apply(target, _this, args) { const [ img, x, y, width, height ] = args if (!isMainMenuClosed() && !miniMapReseted) { client.ws.send({ type: "update-minimap", content: [ null, null, null, null, null ] }) miniMap.context.clear() miniMapReseted = true return target.apply(_this, args) } if (img?.src && isMainMenuClosed()) { if (typeof img.src === 'string') { miniMap.context.clear(); for (const miniMapData of client.miniMapUsersData) { if (!border.width) break if(miniMapData[0] == null && miniMapData[1] == null) { miniMap.context.clear(); } if (miniMapData[2] === null) 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 miniMap.context.begin(x, y) .setFillColor("red") .circle(2) .end() const minDist = (y - 15.5) const nameYOffset = minDist <= 1 ? -(4.5) : 10 miniMap.context.begin(x, y - nameYOffset) .setFillColor("#fff") .setAlign("center") .setFont("9px Ubuntu") .text(miniMapData[2]) .end() } } } return target.apply(_this, args) } }) function bytesToHex(r, g, b) { return ("#" + ((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1)) } const __buf = new DataView(new ArrayBuffer(8)) 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) { var s = "", b; while ((b = this.view.getUint8(this._o++)) !== 0) s += String.fromCharCode(b); return decode ? decodeURIComponent(escape(s)) : s; }, raw: function(len=0) { const buf = this.view.buffer.slice(this._o, this._o + len); this._o += len; return buf; }, } const oldSend = WebSocket.prototype.send const C = new Uint8Array(256) const R = new Uint8Array(256) let cells = new Map() let activeCellX = null let activeCellY = null let handshake = null let socket = null playBtn.addEventListener("click", () => { cells = new Map() activeCellX = null activeCellY = null }) 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 } } WebSocket.prototype.send = function(data) { if (!socket) { socket = this socket.id = Math.random() socket.addEventListener("close", () => { socket = null handshake = false }) socket.sendPacket = function(packet) { if (packet.build) { return socket.send(packet.build()) } socket.send(packet) } socket.addEventListener("message", (event) => { 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 killer, killed, id, node, x, y, s, flags, cell, updColor, updName, updSkin, count, color, name, skin count = reader.getUint16() for (let i = 0; i < count; i++) { killer = reader.getUint32() killed = reader.getUint32() } while (true) { id = reader.getUint32() if (id === 0) break x = reader.getInt16() y = reader.getInt16() s = reader.getUint16() flags = reader.getUint8() updColor = !!(flags & 0x02) updSkin = !!(flags & 0x04) updName = !!(flags & 0x08) color = updColor ? bytesToHex(reader.getUint8(), reader.getUint8(), reader.getUint8()) : null skin = updSkin ? reader.getStringUTF8() : null name = updName ? reader.getStringUTF8() : null if (!cells.get(id)) break activeCellX = x activeCellY = y if (miniMapReseted) { miniMapReseted = false } client.ws.send({ type: "update-minimap", content: [ activeCellX, activeCellY, document.getElementById("nick").value, client.currentTag ] }) } } break case 0x14: { cells = new Map() } break case 0x20: { const id = reader.getUint32() cells.set(id, new Cell({ id })) } break case 0x40: { border.left = reader.getFloat64() border.top = reader.getFloat64() border.right = reader.getFloat64() border.bottom = reader.getFloat64() border.width = border.right - border.left border.height = border.bottom - border.top border.centerX = (border.left + border.right) / 2 border.centerY = (border.top + border.bottom) / 2 } break } }) } return oldSend.apply(this, arguments) } })();