// ==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 = `
Death screen Position:
`;
Tab2.classList.add("tab", "hidden");
Tab2.setAttribute("id", "Tab2");
Tab3 = document.createElement("div");
Tab3.innerHTML = `
Save names
`;
Tab3.classList.add("tab", "hidden", "centerX");
Tab3.setAttribute("id", "Tab3");
Tab4 = document.createElement("div");
Tab4.innerHTML = `
`;
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
Feed or Split with mouse buttons
Mouse Button 1 (left)
Mouse Button 2 (right)
Freeze your player on the Map and linesplit
Type of Freeze
Bind
`;
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 = `
Select Theme Type:
`;
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 = `
`;
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();
})();