// ==UserScript==
// @name Kour.io Zeph Menu
// @match *://kour.io/*
// @version 1.2.1
// @author Happyjeffery
// @icon https://i.imgur.com/11sYWVM.png
// @description Speed Hack, Set KP (Work In Progress) Invisibility, Set Secondary and Melee Weapons
// @run-at document-start
// @grant unsafeWindow
// @license All Rights Reserved
// @namespace https://gf.qytechs.cn/users/1369586
// ==/UserScript==
(function() {
'use strict';
/***************************************
* Performance.now Speed Hack
***************************************/
const originalPerfNow = performance.now.bind(performance);
function updatePerformanceNow(multiplier) {
if (multiplier === 1) {
performance.now = originalPerfNow;
} else {
performance.now = new Proxy(originalPerfNow, {
apply: function(target, thisArg, argArray) {
try {
throw new Error();
} catch (e) {
if (!e.stack.includes("invoke_")) {
return target.apply(thisArg, argArray) * multiplier;
}
}
return target.apply(thisArg, argArray);
}
});
}
}
updatePerformanceNow(1);
/***************************************
* Invisibility WebSocket Hook
***************************************/
const wsInstances = [];
const OriginalWebSocket = unsafeWindow.WebSocket;
function hookOnMessage(ws) {
const originalAddEventListener = ws.addEventListener;
ws.addEventListener = function(type, listener, options) {
if (type === "message") {
const wrappedListener = function(event) {
try {
if (event.data && typeof event.data !== "string") {
const data = new Uint8Array(event.data);
const hexString = Array.from(data)
.map(b => b.toString(16).padStart(2, '0'))
.join(" ");
const damageSignature = "f3 04 c8 02 f5 15 04";
if (hexString.startsWith(damageSignature) && kourInstance.config.Invisible) {
return; // Block this damage packet.
}
}
} catch (e) { }
listener.call(this, event);
};
return originalAddEventListener.call(this, type, wrappedListener, options);
} else {
return originalAddEventListener.call(this, type, listener, options);
}
};
const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(ws), 'onmessage');
Object.defineProperty(ws, 'onmessage', {
set: function(fn) {
const wrapped = function(event) {
try {
if (event.data && typeof event.data !== "string") {
const data = new Uint8Array(event.data);
const hexString = Array.from(data)
.map(b => b.toString(16).padStart(2, '0'))
.join(" ");
const damageSignature = "f3 04 c8 02 f5 15 04";
if (hexString.startsWith(damageSignature) && kourInstance.config.Invisible) {
return;
}
}
} catch (e) { }
fn(event);
};
descriptor.set.call(this, wrapped);
},
get: function() {
return descriptor.get.call(this);
}
});
}
unsafeWindow.WebSocket = function(...args) {
const ws = new OriginalWebSocket(...args);
wsInstances.push(ws);
hookOnMessage(ws);
return ws;
};
unsafeWindow.WebSocket.prototype = OriginalWebSocket.prototype;
class Kour {
constructor() {
this.config = {
Invisible: true
};
}
}
const kourInstance = new Kour();
unsafeWindow.kourInstance = kourInstance;
const weapons = [
{ name: "AK-47", id: "00" },
{ name: "Deagle", id: "01" },
{ name: "AWP", id: "02" },
{ name: "Bayonet", id: "03" },
{ name: "Uzi", id: "04" },
{ name: "PKM", id: "05" },
{ name: "Revolver", id: "06" },
{ name: "RPG", id: "07" },
{ name: "USPS", id: "08" },
{ name: "MP5", id: "09" },
{ name: "Shotgun", id: "10" },
{ name: "Glock", id: "11" },
{ name: "Karambit", id: "12" },
{ name: "Knife", id: "13" },
{ name: "Scar", id: "14" },
{ name: "Minigun", id: "15" },
{ name: "Famas", id: "16" },
{ name: "Vector", id: "17" },
{ name: "Flamethrower", id: "18" },
{ name: "Kar98k", id: "19" },
{ name: "M4A4", id: "20" },
{ name: "Tec-9", id: "21" },
{ name: "CZ", id: "22" },
{ name: "Berretta92fs", id: "23" },
{ name: "AK-109", id: "24" },
{ name: "P90", id: "25" },
{ name: "Thompson", id: "26" },
{ name: "UMP45", id: "27" },
{ name: "XM1014", id: "28" },
{ name: "Butterfly", id: "29" },
{ name: "Laser Gun", id: "30" },
{ name: "Bomb", id: "31" },
{ name: "Smoke Grenade", id: "32" },
{ name: "Molotov", id: "33" },
{ name: "Grenade", id: "34" },
{ name: "Flashbang", id: "35" },
{ name: "Glizzy", id: "36" },
{ name: "Axe", id: "37" },
{ name: "Bare Fists", id: "38" }
];
function setSecondaryWeapon(weaponID) {
firebase.database().goOffline();
firebase.database().ref('users/' + firebase.auth().currentUser.uid).child('overrideWeaponIndexes1').set(weaponID);
firebase.database().goOnline();
showReloadMessage();
setTimeout(() => location.reload(), 5000);
}
function setMeleeWeapon(weaponID) {
firebase.database().goOffline();
firebase.database().ref('users/' + firebase.auth().currentUser.uid).child('overrideWeaponIndexes2').set(weaponID);
firebase.database().goOnline();
showReloadMessage();
setTimeout(() => location.reload(), 5000);
}
function showReloadMessage() {
setTimeout(function () {
const reloadMessage = document.createElement("div");
reloadMessage.innerHTML = `Changes applying in <span id="countdown" style="color: #FF3C3C; font-weight: bold;">5</span> seconds`;
Object.assign(reloadMessage.style, {
position: "fixed",
bottom: "60px",
left: "50%",
transform: "translateX(-50%)",
backgroundColor: "#8F00FF",
color: "#FFFFFF",
padding: "10px 18px",
borderRadius: "5px",
fontSize: "16px",
fontFamily: "'Burbank Big Condensed', 'Arial Black', sans-serif",
zIndex: "10001",
textAlign: "center",
animation: "fadeInOut 5s forwards"
});
document.body.appendChild(reloadMessage);
const countdownSpan = reloadMessage.querySelector("#countdown");
let secondsLeft = 5;
const interval = setInterval(() => {
secondsLeft--;
if (secondsLeft > 0) {
countdownSpan.textContent = secondsLeft;
countdownSpan.style.animation = "flashRed 0.5s";
countdownSpan.addEventListener("animationend", () => {
countdownSpan.style.animation = ""; // Reset
}, { once: true });
} else {
clearInterval(interval);
countdownSpan.textContent = "1";
countdownSpan.style.animation = "flashRed 0.5s";
countdownSpan.addEventListener("animationend", () => {
countdownSpan.style.animation = "";
}, { once: true });
setTimeout(() => {
reloadMessage.remove();
location.reload();
}, 1000);
}
}, 1000);
}, 500);
}
function setKP() {
let kpValue = prompt("Enter KP value:", "35");
if (!kpValue) return;
const numKP = Number(kpValue);
if (isNaN(numKP)) {
console.error("Invalid KP value entered.");
return;
}
if (typeof unityInstance !== 'undefined' && typeof unityInstance.SendMessage === 'function') {
try {
unityInstance.SendMessage('MainManager', 'OnReceivedIsAdmin', numKP);
console.log(`[Zeph Menu] Sent KP value ${numKP} via SendMessage.`);
const notification = document.createElement("div");
notification.textContent = `KP set to: ${numKP}`;
Object.assign(notification.style, {
position: "fixed",
bottom: "20px",
left: "50%",
transform: "translateX(-50%)",
backgroundColor: "#9b3e9f",
color: "#fff",
padding: "10px 20px",
borderRadius: "5px",
zIndex: "10001",
fontSize: "14px",
boxShadow: "0 2px 5px rgba(0,0,0,0.2)",
animation: "fadeInOut 3s forwards"
});
document.body.appendChild(notification);
setTimeout(() => {
notification.style.animation = "fadeOut 0.5s forwards";
setTimeout(() => notification.remove(), 500);
}, 2500);
} catch (e) {
console.error("[Zeph Menu] SendMessage failed:", e);
}
} else {
console.error("[Zeph Menu] unityInstance not found.");
}
unsafeWindow.kpValue = numKP;
}
function refreshWebSocketHandlers() {
wsInstances.forEach(ws => {
try {
let current = ws.onmessage;
ws.onmessage = current;
} catch (e) { /* ignore errors */ }
});
}
function createUI() {
const menu = document.createElement('div');
menu.id = "zephMenu";
Object.assign(menu.style, {
position: "fixed",
top: "50px",
right: "50px",
width: "250px",
backgroundColor: "#5a2d72",
color: "#fff",
padding: "15px",
zIndex: "10000",
fontFamily: "Arial, sans-serif",
fontSize: "16px",
borderRadius: "8px",
boxShadow: "0 4px 8px rgba(0,0,0,0.2)",
display: "none",
transition: "all 0.3s ease-in-out"
});
const secondaryWeaponMenu = createWeaponMenu("Secondary Weapon", false);
const meleeWeaponMenu = createWeaponMenu("Melee Weapon", true);
const headerContainer = document.createElement("div");
headerContainer.style.marginBottom = "15px";
headerContainer.style.position = "relative";
const madeByText = document.createElement("div");
madeByText.textContent = "Made by: Happyjeffery & Rasperiiii";
madeByText.style.fontSize = "10px";
madeByText.style.textAlign = "center";
madeByText.style.marginBottom = "5px";
madeByText.style.fontWeight = "bold";
madeByText.style.letterSpacing = "0.5px";
let hue = 0;
function updateRGB() {
hue = (hue + 1) % 360;
madeByText.style.color = `hsl(${hue}, 100%, 70%)`;
requestAnimationFrame(updateRGB);
}
updateRGB();
headerContainer.appendChild(madeByText);
const titleContainer = document.createElement("div");
titleContainer.style.display = "flex";
titleContainer.style.alignItems = "center";
titleContainer.style.justifyContent = "center";
titleContainer.style.gap = "8px";
const header = document.createElement("div");
header.textContent = "Zeph Menu";
header.style.fontWeight = "bold";
header.style.fontSize = "20px";
const discordLogo = document.createElement("img");
discordLogo.src = "https://i.ibb.co/sJV6y56H/Zeph-Menu-Discordlogo.png";
discordLogo.alt = "Discord Logo";
discordLogo.style.width = "22px";
discordLogo.style.height = "22px";
discordLogo.style.cursor = "pointer";
discordLogo.style.transition = "all 0.2s ease";
discordLogo.style.borderRadius = "4px";
discordLogo.addEventListener("click", () => window.open("https://discord.gg/3XCAwXdRUh", "_blank"));
discordLogo.addEventListener("mouseover", () => {
discordLogo.style.transform = "scale(1.1) rotate(2deg)";
discordLogo.style.filter = "brightness(1.2) drop-shadow(0 0 2px rgba(255,255,255,0.3))";
});
discordLogo.addEventListener("mouseout", () => {
discordLogo.style.transform = "scale(1) rotate(0deg)";
discordLogo.style.filter = "none";
});
titleContainer.appendChild(header);
titleContainer.appendChild(discordLogo);
headerContainer.appendChild(titleContainer);
menu.appendChild(headerContainer);
const adminBtn = document.createElement("button");
adminBtn.textContent = "Set KP (Work in progress)";
Object.assign(adminBtn.style, {
width: "100%",
margin: "8px 0",
padding: "8px",
cursor: "pointer",
backgroundColor: "#9b3e9f",
border: "none",
borderRadius: "5px",
fontSize: "14px",
color: "#fff",
transition: "background-color 0.3s",
});
adminBtn.addEventListener("click", setKP);
adminBtn.addEventListener("mouseover", () => adminBtn.style.backgroundColor = "#a74cbf");
adminBtn.addEventListener("mouseout", () => adminBtn.style.backgroundColor = "#9b3e9f");
menu.appendChild(adminBtn);
const secondaryWeaponBtn = document.createElement("button");
secondaryWeaponBtn.textContent = "Set Secondary Weapon";
Object.assign(secondaryWeaponBtn.style, {
width: "100%",
margin: "8px 0",
padding: "8px",
cursor: "pointer",
backgroundColor: "#53277E",
border: "none",
borderRadius: "5px",
fontSize: "14px",
color: "#fff",
transition: "background-color 0.3s",
});
secondaryWeaponBtn.addEventListener("click", () => {
secondaryWeaponMenu.style.display = secondaryWeaponMenu.style.display === "none" ? "block" : "none";
meleeWeaponMenu.style.display = "none";
});
secondaryWeaponBtn.addEventListener("mouseover", () => secondaryWeaponBtn.style.backgroundColor = "#6a359c");
secondaryWeaponBtn.addEventListener("mouseout", () => secondaryWeaponBtn.style.backgroundColor = "#53277E");
menu.appendChild(secondaryWeaponBtn);
const meleeWeaponBtn = document.createElement("button");
meleeWeaponBtn.textContent = "Set Melee Weapon";
Object.assign(meleeWeaponBtn.style, {
width: "100%",
margin: "8px 0",
padding: "8px",
cursor: "pointer",
backgroundColor: "#53277E",
border: "none",
borderRadius: "5px",
fontSize: "14px",
color: "#fff",
transition: "background-color 0.3s",
});
meleeWeaponBtn.addEventListener("click", () => {
meleeWeaponMenu.style.display = meleeWeaponMenu.style.display === "none" ? "block" : "none";
secondaryWeaponMenu.style.display = "none";
});
meleeWeaponBtn.addEventListener("mouseover", () => meleeWeaponBtn.style.backgroundColor = "#6a359c");
meleeWeaponBtn.addEventListener("mouseout", () => meleeWeaponBtn.style.backgroundColor = "#53277E");
menu.appendChild(meleeWeaponBtn);
const speedContainer = document.createElement("div");
speedContainer.style.margin = "15px 0";
const speedLabel = document.createElement("label");
speedLabel.textContent = "Speed Hack Multiplier: ";
speedContainer.appendChild(speedLabel);
const speedValue = document.createElement("span");
speedValue.textContent = "1x";
speedContainer.appendChild(speedValue);
const speedSlider = document.createElement("input");
speedSlider.type = "range";
speedSlider.min = "1";
speedSlider.max = "6";
speedSlider.step = "0.5";
speedSlider.value = "1";
speedSlider.style.width = "100%";
speedSlider.addEventListener("input", function() {
let multiplier = parseFloat(speedSlider.value);
speedValue.textContent = multiplier.toFixed(1) + "x";
updatePerformanceNow(multiplier);
});
speedContainer.appendChild(speedSlider);
menu.appendChild(speedContainer);
const invisContainer = document.createElement("div");
const invisCheckbox = document.createElement("input");
invisCheckbox.type = "checkbox";
invisCheckbox.id = "invisToggle";
invisCheckbox.checked = kourInstance.config.Invisible;
invisCheckbox.addEventListener("change", function() {
kourInstance.config.Invisible = this.checked;
console.log("Invisibility set to " + this.checked);
refreshWebSocketHandlers();
});
const invisLabel = document.createElement("label");
invisLabel.htmlFor = "invisToggle";
invisLabel.textContent = " Invisible";
invisContainer.appendChild(invisCheckbox);
invisContainer.appendChild(invisLabel);
menu.appendChild(invisContainer);
const style = document.createElement("style");
style.textContent = `
@keyframes fadeInOut {
0% { opacity: 0; }
10% { opacity: 1; }
90% { opacity: 1; }
100% { opacity: 0; }
}
@keyframes fadeOut {
from { opacity: 1; }
to { opacity: 0; }
}
`;
document.head.appendChild(style);
document.body.appendChild(menu);
document.body.appendChild(secondaryWeaponMenu);
document.body.appendChild(meleeWeaponMenu);
}
function createWeaponMenu(title, isMelee) {
const weaponMenu = document.createElement('div');
weaponMenu.id = `zeph${isMelee ? "Melee" : "Secondary"}WeaponMenu`;
Object.assign(weaponMenu.style, {
position: "fixed",
top: "50px",
right: "320px",
width: "250px",
maxHeight: "400px",
overflowY: "auto",
backgroundColor: "#5a2d72",
color: "#fff",
padding: "15px",
zIndex: "10000",
fontFamily: "Arial, sans-serif",
fontSize: "14px",
borderRadius: "8px",
boxShadow: "0 4px 8px rgba(0,0,0,0.2)",
display: "none",
transition: "all 0.3s ease-in-out"
});
const weaponHeader = document.createElement("div");
weaponHeader.textContent = title;
weaponHeader.style.textAlign = "center";
weaponHeader.style.fontWeight = "bold";
weaponHeader.style.marginBottom = "10px";
weaponMenu.appendChild(weaponHeader);
weapons.forEach(weapon => {
const btn = document.createElement("button");
btn.textContent = `${weapon.name} (${weapon.id})`;
Object.assign(btn.style, {
width: "100%",
margin: "5px 0",
padding: "5px",
cursor: "pointer",
backgroundColor: "#9b3e9f",
border: "none",
borderRadius: "5px",
fontSize: "12px",
color: "#fff",
transition: "background-color 0.3s",
});
btn.addEventListener("click", () => {
if (isMelee) {
setMeleeWeapon(weapon.id);
} else {
setSecondaryWeapon(weapon.id);
}
weaponMenu.style.display = "none";
});
btn.addEventListener("mouseover", () => btn.style.backgroundColor = "#a74cbf");
btn.addEventListener("mouseout", () => btn.style.backgroundColor = "#9b3e9f");
weaponMenu.appendChild(btn);
});
return weaponMenu;
}
document.addEventListener("keydown", function(e) {
if (e.key === "o" && !e.target.matches("input, textarea")) {
const menu = document.getElementById("zephMenu");
if (menu) {
menu.style.display = (menu.style.display === "none" ? "block" : "none");
// Hide weapon menus when main menu is closed
if (menu.style.display === "none") {
document.getElementById("zephSecondaryWeaponMenu").style.display = "none";
document.getElementById("zephMeleeWeaponMenu").style.display = "none";
}
}
}
});
window.addEventListener("load", createUI);
})();