// ==UserScript==
// @name SigMod Client (Macros)
// @version 8.3
// @description The best mod you can find for Sigmally - Agar.io: Macros, tag system (minimap, chat), FPS boost, color mod, custom skins, save names, themes and 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 = 8;
let cversion = 1.1;
let storageName = "SigModClient-settings";
let logo = "https://i.ibb.co/Hn9qnjm/Sigmod-Logo.png";
let logoAnim = "https://i.ibb.co/Q8CN5Cj/sigmodclient.gif";
'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,
gradientName: {
enabled: false,
color1: null,
color2: null,
},
borderColor: null,
foodColor: null,
cellColor: 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)",
themeColor: "#8a25e5",
showTime: true,
showNameColors: true,
showClientChat: false,
showChatButtons: true,
blurTag: false,
locationText: "{pos}",
},
deathScreenPos: "center",
fps: {
fpsMode: false,
hideFood: false,
showNames: true,
shortLongNames: false,
removeOutlines: false,
},
removeShopPopup: false,
playTimer: false,
};
updateStorage();
} else {
modSettings = JSON.parse(modSettings);
}
function updateStorage() {
localStorage.setItem(storageName, JSON.stringify(modSettings));
}
// remove old storage
if (localStorage.getItem("settings-sigmod-v7")) localStorage.removeItem("settings-sigmod-v7");
if (localStorage.getItem("settings-sigmod")) localStorage.removeItem("settings-sigmod");
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;
mods.setProfile(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 menuClosed() {
const menuWrapper = document.getElementById("menu-wrapper");
return 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 (!menuClosed()) {
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 = -17022 + (i * gridSize2);
const minY = -17022 + (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/sigmod/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));
}
close() {
console.log(this.ws);
if (this.ws) {
this.ws.close();
this.readyState = 3;
}
}
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,
});
}
clearInterval(sendStartData);
});
}
onClose(event) {
this.readyState = 3;
const message = document.createElement("div");
message.classList.add("error-message_sigMod")
message.innerHTML = `
You Disconnected from the SigMod WebSocket. Error code: ${event.code}. Please refresh the page.
`;
setTimeout(() => {
message.style.right = "20px";
}, 200)
document.querySelector(".body__inner").append(message)
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", () => {
this.connect();
message.style.right = "-500px";
setTimeout(() => {
message.remove();
}, 500)
});
}
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();
});
}
// Tournaments //
if (message.type === "tournament-preview") {
mods.showTournament(message.content);
mods.tData = message.content;
}
if (message.type === "t-ready") {
const content = message.content;
const readyText = document.getElementById("t-ready-0");
if (readyText) {
readyText.innerText = content;
}
}
if (message.type === "tournament-go") {
mods.startTournament();
}
if (message.type === "get-score") {
mods.getScore(message.content);
}
if (message.type === "user-died") {
const { dead, max } = message.content;
document.getElementById("usersDead").textContent = `(${dead}/${max})`;
}
if (message.type === "round-end") {
mods.roundEnd(message.content);
}
if (message.type === "round-ready") {
const text = document.getElementById("round-ready");
text.textContent = `Ready (${message.content.ready}/${message.content.max})`;
}
if (message.type === "next-round") {
mods.nextRound(message.content);
}
if (message.type === "tournament-end") {
mods.endTournament(message.content);
}
}
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 activeCellY = null;
let activeCellX = null;
let sendingPos = false;
let _getScore = false;
let lastScore = 0;
let myId = null;
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 isUpdate = reader.getUint8() === 0;
let isPlayer = !!reader.getUint8();
let isSub = !!reader.getUint8();
let clan = reader.getStringUTF8();
let color = updColor
? bytesToHex(reader.getUint8(), reader.getUint8(), reader.getUint8())
: null;
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 (id !== myId) return;
activeCellX = x;
activeCellY = y;
if (!sendingPos) sendingPos = true;
client.send({
type: "minimap-update",
content: [activeCellX, activeCellY, mods.nick, client.id],
});
}
}
break;
case 0x20: {
// new cell from me
const id = reader.getUint32();
myId = 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: {
const border = mods.border;
mods.border.left = reader.getFloat64();
mods.border.top = reader.getFloat64();
mods.border.right = reader.getFloat64();
mods.border.bottom = reader.getFloat64();
border.width = border.right - border.left;
border.height = border.bottom - border.top;
border.centerX = (border.left + border.right) / 2;
border.centerY = (border.top + border.bottom) / 2;
unsafeWindow.border = { ...border };
}
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.tData = {};
this.load();
}
mod.prototype = {
get style() {
return `
:root {
--default-mod-color: #2E2D80;
}
.mod_menu * {
margin: 0;
padding: 0;
font-family: 'Ubuntu';
box-sizing: border-box;
}
.mod_menu {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background: rgba(0, 0, 0, .6);
z-index: 999999;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
transition: all .3s ease;
}
.mod_menu_wrapper {
position: relative;
display: flex;
flex-direction: column;
width: 700px;
height: 500px;
background: #111;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 5px 10px #000;
}
.mod_menu_header {
display: flex;
width: 100%;
position: relative;
height: 60px;
}
.mod_menu_header .header_img {
width: 100%;
height: 60px;
object-fit: cover;
object-position: center;
position: absolute;
}
.mod_menu_header button {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
right: 10px;
top: 30px;
background: rgba(11, 11, 11, .7);
width: 42px;
height: 42px;
font-size: 16px;
transform: translateY(-50%);
}
.mod_menu_header button:hover {
background: rgba(11, 11, 11, .5);
}
.mod_menu_inner {
display: flex;
}
.mod_menu_navbar {
display: flex;
flex-direction: column;
gap: 10px;
min-width: 132px;
padding: 10px;
background: #181818;
height: 440px;
}
.mod_nav_btn {
display: flex;
justify-content: space-evenly;
align-items: center;
padding: 5px;
background: #050505;
border-radius: 8px;
font-size: 16px;
border: 1px solid transparent;
outline: none;
width: 100%;
transition: all .3s ease;
}
.mod_nav_btn:nth-child(8) {
margin-top: auto;
}
.mod_selected {
border: 1px solid rgba(89, 89, 89, .9);
}
.mod_nav_btn img {
width: 22px;
}
.mod_menu_content {
width: 100%;
padding: 10px;
}
.mod_tab {
width: 100%;
display: flex;
flex-direction: column;
gap: 5px;
overflow-y: auto;
overflow-x: hidden;
max-height: 420px;
opacity: 1;
transition: all .2s ease;
}
.text-center {
text-align: center;
}
.f-big {
font-size: 18px;
}
.modColItems {
display: flex;
flex-direction: column;
align-items: center;
gap: 15px;
width: 100%;
}
.modRowItems {
display: flex;
justify-content: center;
align-items: center;
background: #050505;
gap: 58px;
border-radius: 0.5rem;
padding: 10px;
width: 100%;
}
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;
}
.macros_wrapper {
display: flex;
width: 100%;
justify-content: center;
flex-direction: column;
gap: 10px;
background: #050505;
padding: 10px;
border-radius: 0.75rem;
}
.macro_grid {
display: grid;
grid-template-columns: 1.2fr 1.1fr;
gap: 5px;
}
.g-2 {
gap: 2px;
}
.g-5 {
gap: 5px;
}
.g-10 {
gap: 10px;
}
.p-2 {
padding: 2px;
}
.macrosContainer {
display: flex;
width: 100%;
justify-content: center;
align-items: center;
gap: 20px;
}
.macroRow {
background: #121212;
border-radius: 5px;
padding: 7px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
}
.keybinding {
border-radius: 5px;
background: #242424;
border: none;
color: #fff;
padding: 2px 5px;
max-width: 50px;
font-weight: 500;
text-align: center;
}
.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;
}
.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
}
.modInput {
background-color: #111;
border: none;
border-radius: 5px;
position: relative;
border-top-right-radius: 4px;
border-top-left-radius: 4px;
font-weight: 500;
padding: 5px;
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: 2px solid #fff;
}
.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;
}
#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;
}
.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%
}
.btn:hover {
color: unset;
}
#savedNames {
background-color: #000;
padding: 5px;
border-radius: 5px;
overflow-y: auto;
height: 155px;
background-image: url("https://raw.githubusercontent.com/Sigmally/SigMod/main/images/purple_gradient.png");
background-size: cover;
background-position: center;
background-repeat: no-repeat;
box-shadow: 0 0 10px #000;
}
.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: 420px;
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: #111;
border-radius: 5px;
margin: 5px;
padding: 3px 8px;
height: 34px;
align-items: center;
justify-content: space-between;
cursor: pointer;
box-shadow: 0 5px 10px -2px #000;
}
.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;
}
@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
.tournamentAlert {
position: fixed;
top: 100px;
left: 50%;
transform: translate(-50%, -50%);
z-index: 99995;
background: url("https://app.czrsd.com/static/tournament_winteredition.png");
background-size: cover;
background-position: center;
border-radius: 10px;
overflow: hidden;
box-shadow: 0 0 10px #4e7ed5;
}
.tournamentAlert * {
font-family: 'Poppins', sans-serif;
}
.tournamentAlert__inner {
border-radius: 10px;
display: flex;
flex-direction: column;
gap: 10px;
color: #fff;
padding: 10px;
border-radius: 10px;
}
.tournamentAlert .tHeader span {
font-size: 16px;
font-weight: 600;
}
.tournamentAlert p {
text-align: center;
}
.tournamentAlert .tHeader button {
background: #C13939;
border: none;
border-radius: 50%;
height: 32px;
width: 32px;
display: flex;
justify-content: center;
align-items: center;
transition: all 0.3s ease-in-out;
}
.tournamentAlert .tHeader button:hover {
background: #e05151;
scale: 1.05;
box-shadow: 0 0 10px #e05151;
}
.tournamentAlert::after {
content: '';
width: 102%;
height: 100%;
position: absolute;
top: 0;
left: -2px;
background: rgba(0, 0, 0, .8);
z-index: -1;
}
.tournamentAlert .tFooter img {
width: 50px;
height: 50px;
border-radius: 100%;
}
.tournamentAlert .tFooter button {
background: #0057FF;
border: none;
border-radius: 20px;
padding: 8px;
display: flex;
align-items: center;
gap: 10px;
transition: all 0.3s ease-in-out;
}
.tournamentAlert .tFooter button:hover {
background: #0077ff;
scale: 1.1;
box-shadow: 0 0 10px #0077ff;
}
.alert_overlay {
position: absolute;
top: 0;
left: 0;
z-index: 9999999;
pointer-events: none;
width: 100%;
height: 100vh;
display: flex;
flex-direction: column;
justify-content: start;
align-items: center;
}
.infoAlert {
padding: 5px;
border-radius: 5px;
margin-top: 5px;
color: #fff;
}
.alert-success {
background: #39d73c;
}
.alert-success .alert-loader {
background: #2a971f;
}
.alert-default {
background: #151515;
}
.alert-default .alert-loader {
background: #222;
}
.alert-danger {
background: #D44121;
}
.alert-danger .alert-loader {
background: #A5361E;
}
#free-coins .alert-danger {
background: #fff !important;
}
.alert-loader {
width: 100%;
height: 2px;
margin-top: 5px;
transition: all .3s ease-in-out;
animation: loadAlert 2s forwards;
}
@keyframes loadAlert {
0% {
width: 100%;
}
100% {
width: 0%;
}
}
.themeEditor {
z-index: 999999999999;
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 #000;
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: #050505;
border: 1px solid var(--default-mod);
border-radius: 5px;
}
.my-5 {
margin: 5px 0;
}
.stats-info-text {
color: #7d7d7d;
}
.setting-card-wrapper {
margin-right: 10px;
padding: 10px;
background: #161616;
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 {
display: flex;
flex-direction: column;
gap: 10px;
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(25,25,25, .6);
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;
}
.minimapContainer {
display: flex;
flex-direction: column;
align-items: end;
pointer-events: none;
position: absolute;
bottom: 0;
right: 0;
z-index: 99999;
}
.tournament_time {
color: #fff;
font-size: 15px;
}
.minimap {
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;
}
.progress-row button {
background: transparent;
}
.mod_player-stats {
display: flex;
flex-direction: column;
gap: 5px;
align-self: start;
}
.mod_player-stats .player-stats-grid {
display: grid;
grid-template-columns: 1.2fr 1.1fr;
gap: 5px;
}
.player-stat {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 10px;
background: rgba(05, 05, 05, .75);
border-radius: 5px;
width: 100%;
height: 85px;
box-shadow: 0px 2px 10px -2px #000;
z-index: 2;
}
.player-stat span[id] {
font-size: 17px;
}
.quickAccess {
background: #050505;
display: flex;
flex-direction: column;
gap: 5px;
padding: 5px;
border-radius: 5px;
width: 100%;
max-height: 154px;
overflow-y: auto;
}
.quickAccess div.modRowItems {
padding: 2px!important;
}
#mod_home .justify-sb {
z-index: 2;
}
.modTitleText {
font-size: 15px;
color: #fafafa;
text-align: start;
}
.modDescText {
text-align: start;
font-size: 12px;
color: #777;
}
.modButton-secondary {
background-color: #171717;
color: #fff;
border: none;
padding: 5px 15px;
border-radius: 15px;
}
.vr {
width: 2px;
height: 250px;
background-color: #fafafa;
}
.modProfileWrapper {
display: flex;
flex-direction: column;
gap: 5px;
}
.modUserProfile {
display: flex;
flex-direction: column;
gap: 7px;
border-radius: 5px;
background: #050505;
min-width: 300px;
max-width: 300px;
height: 154px;
max-height: 154px;
padding: 5px 10px;
}
.modUserProfile .user-level {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.mod-user-level {
position: relative;
margin: 0 auto;
color: #fff;
text-shadow: 1px 0 0 #000, -1px 0 0 #000, 0 1px 0 #000, 0 -1px 0 #000, 1px 1px #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000;
}
.brand_wrapper {
position: relative;
height: 72px;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.brand_img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 72px;
border-radius: 10px;
object-fit: cover;
object-position: center;
z-index: 1;
box-shadow: 0 0 10px #000;
}
.brand_credits {
font-size: 16px;
color: #D3A7FF
}
.p_s_n {
background-color: #050505;
border-radius: 15px;
box-shadow: 0 3px 10px -2px #050505;
margin: 35px 0;
font-size: 16px;
width: 50%;
align-self: center;
}
.brand_yt {
display: flex;
justify-content: center;
align-items: center;
gap: 20px;
}
.yt_wrapper {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 10px;
width: 122px;
height: 100px;
padding: 10px;
background-color: #B63333;
border-radius: 15px;
cursor: pointer;
}
.yt_wrapper span {
user-select: none;
}
.hidden_full {
display: none !important;
visibility: hidden;
}
.mod_overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background: rgba(0, 0, 0, .7);
z-index: 999999;
display: flex;
justify-content: center;
align-items: center;
}
.tournaments-wrapper {
position: absolute;
top: 60%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 999999;
background: #151515;
box-shadow: 0 5px 10px 2px #000;
border-radius: 0.75rem;
padding: 2.25rem;
color: #fafafa;
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
min-width: 632px;
opacity: 0;
transition: all .3s ease;
animation: 0.5s ease fadeIn forwards;
}
@keyframes fadeIn {
0% {
top: 60%;
opacity: 0;
}
100% {
top: 50%;
opacity: 1;
}
}
.tournaments h1 {
margin: 0;
}
.t_profile {
display: flex;
flex-direction: column;
align-items: center;
}
.t_profile img {
border: 2px solid #ccc;
border-radius: 50%;
}
.team {
display: flex;
gap: 10px;
padding: 10px;
position: relative;
}
.team.blue {
border-radius: 0 5px 5px 0;
}
.team.red {
border-radius: 5px 0 0 5px;
}
.blue {
background: rgb(71, 113, 203);
}
.red {
background: rgb(203, 71, 71);
}
.blue_polygon {
width: 75px;
clip-path: polygon(100% 0, 0 0, 100% 100%);
background: rgb(71, 113, 203);
}
.red_polygon {
width: 75px;
clip-path: polygon(0 100%, 0 0, 100% 100%);
background: rgb(203, 71, 71);
}
.vs {
position: relative;
align-items: center;
justify-content: center;
}
.vs span {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-shadow: 1px 0 0 #000, -1px 0 0 #000, 0 1px 0 #000, 0 -1px 0 #000, 1px 1px #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 0 0 6px #000;
font-size: 28px;
}
details {
border: 1px solid #aaa;
border-radius: 4px;
padding: 0.5em 0.5em 0;
user-select: none;
text-align: start;
}
summary {
font-weight: bold;
margin: -0.5em -0.5em 0;
padding: 0.5em;
}
details[open] {
padding: 0.5em;
}
details[open] summary {
border-bottom: 1px solid #aaa;
margin-bottom: 0.5em;
}
button[disabled] {
filter: grayscale(1);
}
.tournament_alert {
position: absolute;
top: 20px;
left: 50%;
transform: translateX(-50%);
background: #151515;
color: #fff;
text-align: center;
padding: 20px;
z-index: 999999;
border-radius: 10px;
box-shadow: 0 0 10px #000;
display: flex;
gap: 10px;
}
.tournament-profile {
width: 50px;
height: 50px;
border-radius: 50%;
box-shadow: 0 0 10px #000;
}
.tround_text {
color: #fff;
font-size: 24px;
position: absolute;
bottom: 30%;
left: 50%;
transform: translate(-50%, -50%);
}
.claimedBadgeWrapper {
background: linear-gradient(232deg, #020405 1%, #04181E 100%);
border-radius: 10px;
width: 320px;
height: 330px;
box-shadow: 0 0 40px -20px #39bdff;
display: flex;
flex-direction: column;
gap: 10px;
align-items: center;
justify-content: center;
color: #fff;
padding: 10px;
}
.btn-cyan {
background: #53B6CC;
border: none;
border-radius: 5px;
font-size: 16px;
color: #fff;
font-weight: 500;
width: fit-content;
padding: 5px 10px;
}
.playTimer {
z-index: 2;
position: absolute;
top: 128px;
left: 4px;
color: #8d8d8d;
font-size: 14px;
font-weight: 500;
user-select: none;
pointer-events: 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);
},
game() {
const { fillRect, fillText, strokeText, moveTo, arc } = CanvasRenderingContext2D.prototype;
const byId = (id) => document.getElementById(id);
const mapColor = byId("mapColor");
const nameColor = byId("nameColor");
const borderColor = byId("borderColor");
const foodColor = byId("foodColor");
const cellColor = byId("cellColor");
const gradientNameColor1 = byId("gradientNameColor1");
const gradientNameColor2 = byId("gradientNameColor2");
const mapColorReset = byId("mapColorReset");
const nameColorReset = byId("nameColorReset");
const borderColorReset = byId("borderColorReset");
const foodColorReset = byId("foodColorReset");
const cellColorReset = byId("cellColorReset");
const gradientColorReset1 = byId("gradientColorReset1");
const gradientColorReset2 = byId("gradientColorReset2");
let disabledGColors = 0;
const reset = (type) => {
const white = "#ffffff";
switch (type) {
case 'map':
modSettings.mapColor = null;
mapColor.value = white;
break;
case 'name':
modSettings.nameColor = null;
nameColor.value = white;
break;
case 'gradName1':
modSettings.gradientName.color1 = null;
gradientNameColor1.value = white;
if (modSettings.gradientName.color2 === null) {
modSettings.gradientName.enabled = false;
}
break;
case 'gradName2':
modSettings.gradientName.color2 = null;
gradientNameColor2.value = white;
if (modSettings.gradientName.color1 === null) {
modSettings.gradientName.enabled = false;
}
break;
case 'border':
modSettings.borderColor = null;
borderColor.value = white;
break;
case 'food':
modSettings.foodColor = null;
foodColor.value = white;
break;
case 'cell':
modSettings.cellColor = null;
cellColor.value = white;
break;
case 'skin':
modSettings.skinImage.original = null;
modSettings.skinImage.replaceImg = null;
if (confirm("Please refresh the page to make it work. Reload?")) {
location.reload();
}
break;
case 'virus':
modSettings.virusImage = "/assets/images/viruses/2.png";
if (confirm("Please refresh the page to make it work. Reload?")) {
location.reload();
}
break;
}
updateStorage();
};
const loadStorage = () => {
if (modSettings.nameColor) {
nameColor.value = modSettings.nameColor;
}
if (modSettings.mapColor) {
mapColor.value = modSettings.mapColor;
}
if (modSettings.borderColor) {
borderColor.value = modSettings.borderColor;
}
if (modSettings.foodColor) {
foodColor.value = modSettings.foodColor;
}
if (modSettings.cellColor) {
cellColor.value = modSettings.cellColor;
}
loadVirusImage(modSettings.virusImage);
if (modSettings.skinImage.original !== null) {
loadSkinImage(modSettings.skinImage.original, modSettings.skinImage.replaceImg);
}
};
loadStorage();
mapColor.addEventListener("input", () => {
modSettings.mapColor = mapColor.value;
updateStorage();
});
nameColor.addEventListener("input", () => {
modSettings.nameColor = nameColor.value;
updateStorage();
});
gradientNameColor1.addEventListener("input", () => {
if (!modSettings.gradientName.enabled) {
modSettings.gradientName.enabled = true;
}
modSettings.gradientName.color1 = gradientNameColor1.value;
updateStorage();
});
gradientNameColor2.addEventListener("input", () => {
modSettings.gradientName.color2 = gradientNameColor2.value;
updateStorage();
});
borderColor.addEventListener("input", () => {
modSettings.borderColor = borderColor.value;
updateStorage();
});
foodColor.addEventListener("input", () => {
modSettings.foodColor = foodColor.value;
updateStorage();
});
cellColor.addEventListener("input", () => {
modSettings.cellColor = cellColor.value;
updateStorage();
});
mapColorReset.addEventListener("click", () => reset("map"));
borderColorReset.addEventListener("click", () => reset("border"));
nameColorReset.addEventListener("click", () => reset("name"));
gradientColorReset1.addEventListener("click", () => reset("gradName1"));
gradientColorReset2.addEventListener("click", () => reset("gradName2"));
foodColorReset.addEventListener("click", () => reset("food"));
cellColorReset.addEventListener("click", () => reset("cell"));
// Render new colors / images
CanvasRenderingContext2D.prototype.fillRect = function (x, y, width, height) {
if ((width + height) / 2 === (window.innerWidth + window.innerHeight) / 2) {
this.fillStyle = modSettings.mapColor;
}
fillRect.apply(this, arguments);
};
CanvasRenderingContext2D.prototype.arc = function(x, y, radius, startAngle, endAngle, anticlockwise) {
if (modSettings.fps.hideFood || modSettings.fps.fpsMode) {
if (radius <= 20) {
this.fillStyle = "transparent";
this.strokeStyle = "transparent";
}
}
if (radius >= 86) {
this.fillStyle = modSettings.cellColor;
} else if (radius <= 20 && modSettings.foodColor !== null && !modSettings.fps.fpsMode && !modSettings.fps.hideFood) {
this.fillStyle = modSettings.foodColor;
this.strokeStyle = modSettings.foodColor;
}
arc.apply(this, arguments);
};
CanvasRenderingContext2D.prototype.fillText = function (text, x, y) {
if (text === byId("nick").value && !modSettings.gradientName.enabled && modSettings.nameColor !== null) {
this.fillStyle = modSettings.nameColor;
}
if (text === byId("nick").value && modSettings.gradientName.enabled) {
const width = this.measureText(text).width;
const fontSize = 8;
const gradient = this.createLinearGradient(x - width / 2 + fontSize / 2, y, x + width / 2 - fontSize / 2, y + fontSize);
const color1 = modSettings.gradientName.color1 ?? "#ffffff";
const color2 = modSettings.gradientName.color2 ?? "#ffffff";
gradient.addColorStop(0, color1);
gradient.addColorStop(1, color2);
this.fillStyle = gradient;
}
if (text.startsWith("X:")) {
this.fillStyle = "transparent";
}
if (modSettings.fps.removeOutlines) {
this.shadowBlur = 0;
this.shadowColor = "transparent";
}
if (text.length > 21 && modSettings.fps.shortLongNames || modSettings.fps.fpsMode) {
text = text.slice(0, 21) + "...";
}
if (text.includes("Score") && _getScore) {
_getScore = false;
const currentScore = text.substring(6).replace(/\s/g, '');
lastScore = parseInt(currentScore, 10);
const scoreText = document.getElementById("t-myScore");
if (!scoreText) return;
scoreText.textContent = `Your score: ${lastScore}`;
}
return fillText.apply(this, arguments);
};
CanvasRenderingContext2D.prototype.strokeText = function (text, x, y) {
if (text.length > 21 && modSettings.fps.shortLongNames || modSettings.fps.fpsMode) {
text = text.slice(0, 21) + "...";
}
if (modSettings.fps.removeOutlines) {
this.shadowBlur = 0;
this.shadowColor = "transparent";
} else {
this.shadowBlur = 7;
this.shadowColor = '#000';
}
return strokeText.apply(this, arguments);
};
CanvasRenderingContext2D.prototype.moveTo = function (x, y) {
this.strokeStyle = modSettings.borderColor;
return moveTo.apply(this, arguments);
};
// Virus & Skin image
const virusPreview = byId("virus");
const setVirus = byId("setVirus");
const virusURL = byId("virusURL");
const openVirusModal = byId("virusImageSelect");
const closeVirusModal = byId("closeVirusModal");
const virusModal = byId("virusModal");
const resetSkin = byId("resetSkin");
const resetVirus = byId("resetVirus");
openVirusModal.addEventListener("click", () => {
virusModal.style.display = "flex";
});
closeVirusModal.addEventListener("click", () => {
virusModal.style.display = "none";
});
setVirus.addEventListener("click", () => {
modSettings.virusImage = virusURL.value;
loadVirusImage(modSettings.virusImage);
updateStorage();
virusPreview.src = modSettings.virusImage;
});
const skinPreview = byId("skinPreview");
const skinURL = byId("skinURL");
const setSkin = byId("setSkin");
const openSkinModal = byId("SkinReplaceSelect");
const closeSkinModal = byId("closeSkinModal");
const skinModal = byId("skinModal");
const originalSkin = byId("originalSkinSelect");
openSkinModal.addEventListener("click", () => {
skinModal.style.display = "flex";
});
closeSkinModal.addEventListener("click", () => {
skinModal.style.display = "none";
});
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;
});
const deathScreenPos = byId("deathScreenPos");
const deathScreen = byId("__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() {
const mod_menu = document.createElement("div");
mod_menu.classList.add("mod_menu");
mod_menu.style.display = "none";
mod_menu.style.opacity = "0";
mod_menu.innerHTML = `