// === FloydHax v3 ===
//
// Position changes ARE visible to other players.
//
// F = fly N = noclip . = chat bypass
// [ ] = +/-0.5x speed C = descend Backspace = reset speed
// WASD = move Space = fly up / jump Mouse = look I/O = zoom
(function () {
if (window.__floyd) return console.log("%cAlready active. Refresh to reset.", "color:#f80");
window.__floyd = true;
var speedMul = 2;
var MIN_SPD = 1;
var MAX_SPD = 10;
var BASE_WALK = 16;
var BASE_FLY = 64;
var JUMP_MUL = 1.8;
var flying = false;
var noclip = false;
var bypassActive = false;
var _velX = 0, _velZ = 0;
// ── Unicode bypass (Cyrillic homoglyphs + invisible separators) ─
function bypassText(s) {
var map = {
a: "\u0430", c: "\u0441", e: "\u0435", i: "\u0456",
o: "\u043E", p: "\u0440", x: "\u0445", y: "\u0443",
A: "\u0410", B: "\u0412", C: "\u0421", E: "\u0415",
H: "\u041D", I: "\u0406", K: "\u041A", M: "\u041C",
O: "\u041E", P: "\u0420", T: "\u0422", X: "\u0425",
Y: "\u04AE",
};
var out = "";
for (var i = 0; i < s.length; i++) {
out += (map[s[i]] || s[i]) + "\u200C";
}
return out;
}
// ── draggable GUI ────────────────────────────────────────────
var gui = document.createElement("div");
gui.id = "floyd-gui";
gui.style.cssText =
"position:fixed;top:16px;right:16px;width:210px;z-index:2147483647;" +
"border-radius:12px;overflow:hidden;" +
"box-shadow:0 0 30px rgba(0,0,0,.6),0 0 8px rgba(253,224,0,.15);" +
"font:12px system-ui;user-select:none;transition:opacity .2s";
// title bar
var titleBar = document.createElement("div");
titleBar.style.cssText =
"background:linear-gradient(135deg,rgba(20,20,35,.95),rgba(10,10,25,.95));" +
"color:#fde050;padding:10px 14px;font-weight:700;font-size:13px;" +
"cursor:move;display:flex;align-items:center;justify-content:space-between;" +
"border-bottom:1px solid rgba(253,224,0,.2);letter-spacing:.5px";
titleBar.innerHTML = '<span>\u26a1 FloydHax v3</span>' +
'<span id="floyd-collapse" style="cursor:pointer;font-size:16px;opacity:.6;padding:0 2px" title="Collapse">\u2013</span>';
gui.appendChild(titleBar);
// body
var body = document.createElement("div");
body.id = "floyd-body";
body.style.cssText =
"background:rgba(8,8,22,.92);padding:12px 14px 14px;position:relative;overflow:hidden;transition:max-height .25s;max-height:200px";
gui.appendChild(body);
// background image layer
var bgImg = document.createElement("img");
bgImg.src = "data:image/jpeg;base64,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";
bgImg.style.cssText =
"position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;opacity:.08;pointer-events:none;filter:grayscale(30%)";
body.appendChild(bgImg);
var rowsWrap = document.createElement("div");
rowsWrap.style.cssText = "position:relative;z-index:1;display:flex;flex-direction:column;gap:6px";
body.appendChild(rowsWrap);
function _row(label, icon) {
var r = document.createElement("div");
r.style.cssText =
"display:flex;justify-content:space-between;align-items:center;" +
"padding:5px 8px;border-radius:6px;background:rgba(255,255,255,.03)";
var left = document.createElement("span");
left.style.cssText = "display:flex;align-items:center;gap:7px;color:#bbb";
left.innerHTML = '<span style="font-size:13px">' + icon + '</span>' + label;
var val = document.createElement("span");
val.style.cssText = "font-weight:700;font-size:11px;letter-spacing:.3px;padding:2px 8px;border-radius:4px";
val.textContent = "OFF";
r.appendChild(left);
r.appendChild(val);
rowsWrap.appendChild(r);
return val;
}
var flyRow = _row("Fly", "\u2708");
var noclipRow = _row("Noclip", "\u2b1b");
var bypassRow = _row("Bypass", "\u2b1a");
var speedRow = _row("Speed", "\u26a1");
speedRow.textContent = "x2.0";
speedRow.style.background = "rgba(253,224,0,.12)";
speedRow.style.color = "#fde050";
document.body.appendChild(gui);
var collapsed = false;
document.getElementById("floyd-collapse").addEventListener("mousedown", function (e) {
e.stopPropagation();
collapsed = !collapsed;
this.textContent = collapsed ? "+" : "\u2013";
body.style.maxHeight = collapsed ? "0" : "200px";
body.style.padding = collapsed ? "0 14px" : "12px 14px 14px";
});
function refreshGui() {
function set(row, on, color) {
row.textContent = on ? "ON" : "OFF";
row.style.background = on ? color : "rgba(255,255,255,.04)";
row.style.color = on ? "#111" : "#777";
}
set(flyRow, flying, "rgba(68,255,68,.85)");
set(noclipRow, noclip, "rgba(255,136,0,.85)");
set(bypassRow, bypassActive, "rgba(255,224,80,.85)");
speedRow.textContent = "x" + speedMul.toFixed(1);
}
refreshGui();
// ── drag logic (works with pointer lock) ──────────────────────
var dragging = false;
var dragOffX = 0, dragOffY = 0;
titleBar.addEventListener("mousedown", function (e) {
dragging = true;
if (document.pointerLockElement) {
dragOffX = 0; dragOffY = 0;
} else {
dragOffX = e.clientX - gui.offsetLeft;
dragOffY = e.clientY - gui.offsetTop;
}
document.body.style.userSelect = "none";
});
document.addEventListener("mousemove", function (e) {
if (!dragging) return;
if (document.pointerLockElement) {
gui.style.left = (gui.offsetLeft + e.movementX) + "px";
gui.style.top = (gui.offsetTop + e.movementY) + "px";
} else {
gui.style.left = (e.clientX - dragOffX) + "px";
gui.style.top = (e.clientY - dragOffY) + "px";
}
gui.style.right = "auto";
});
document.addEventListener("mouseup", function () {
dragging = false;
document.body.style.userSelect = "";
});
// ── intercept chat Enter key in capture phase ──────────────────
document.addEventListener("keydown", function (e) {
if (!bypassActive) return;
if (e.key !== "Enter") return;
if (!window._chatFocused) return;
var inputEl = document.getElementById("chat-input");
var text = (inputEl.textContent || "").trim();
if (!text) return;
e.stopImmediatePropagation();
var safeText = bypassText(text);
var _origMp = window._mpSendChat;
window._mpSendChat = function () {};
window.Chat.send();
window._mpSendChat = _origMp;
window._mpSendChat(safeText);
}, true);
// ── save original update ──────────────────────────────────────
var _orig = update;
// ── sweep collision helpers ───────────────────────────────────
function _sweepX(dt) {
var ch = character;
var fy0 = ch.position.y - CHAR_FOOT_OFFSET;
var acos = Math.abs(Math.cos(ch.rotation.y));
var asin = Math.abs(Math.sin(ch.rotation.y));
var halfX = CHAR_HALF_W * acos + CHAR_HALF_D * asin;
var halfZ = CHAR_HALF_W * asin + CHAR_HALF_D * acos;
var sw = getNearbyColliders(ch.position.x, ch.position.y, ch.position.z);
var dx = _velX * dt;
sw.forEach(function (b) {
if (b.maxY <= fy0 + 0.05 || b.minY >= fy0 + CHAR_HEIGHT) return;
if (ch.position.z + halfZ <= b.minZ || ch.position.z - halfZ >= b.maxZ) return;
if (dx > 0) {
var edge = ch.position.x + halfX;
if (edge > b.minX) return;
var allow = b.minX - edge;
if (allow < dx) dx = Math.max(0, allow);
} else if (dx < 0) {
edge = ch.position.x - halfX;
if (edge < b.maxX) return;
allow = b.maxX - edge;
if (allow > dx) dx = Math.min(0, allow);
}
});
ch.position.x += dx;
}
function _sweepZ(dt) {
var ch = character;
var fy0 = ch.position.y - CHAR_FOOT_OFFSET;
var acos = Math.abs(Math.cos(ch.rotation.y));
var asin = Math.abs(Math.sin(ch.rotation.y));
var halfX = CHAR_HALF_W * acos + CHAR_HALF_D * asin;
var halfZ = CHAR_HALF_W * asin + CHAR_HALF_D * acos;
var sw = getNearbyColliders(ch.position.x, ch.position.y, ch.position.z);
var dz = _velZ * dt;
sw.forEach(function (b) {
if (b.maxY <= fy0 + 0.05 || b.minY >= fy0 + CHAR_HEIGHT) return;
if (ch.position.x + halfX <= b.minX || ch.position.x - halfX >= b.maxX) return;
if (dz > 0) {
var edge = ch.position.z + halfZ;
if (edge > b.minZ) return;
var allow = b.minZ - edge;
if (allow < dz) dz = Math.max(0, allow);
} else if (dz < 0) {
edge = ch.position.z - halfZ;
if (edge < b.maxZ) return;
allow = b.maxZ - edge;
if (allow > dz) dz = Math.min(0, allow);
}
});
ch.position.z += dz;
}
// ── helpers ──────────────────────────────────────────────────
function _buildMove() {
var m = new THREE.Vector3();
if (keys["KeyW"] || keys["ArrowUp"]) m.z -= 1;
if (keys["KeyS"] || keys["ArrowDown"]) m.z += 1;
if (keys["KeyA"] || keys["ArrowLeft"]) m.x -= 1;
if (keys["KeyD"] || keys["ArrowRight"]) m.x += 1;
var hLen = Math.sqrt(m.x * m.x + m.z * m.z);
if (hLen > 1) { m.x /= hLen; m.z /= hLen; }
var yq = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), cam.yaw);
m.applyQuaternion(yq);
return { x: m.x, z: m.z, len: hLen };
}
function _faceMove(ch, move, dt) {
if (!shiftLock && move.len > 0.01) {
ch.rotation.y = lerpAngle(ch.rotation.y, Math.atan2(move.x, move.z), Math.min(1, ROT_SPEED * dt));
}
if (shiftLock) ch.rotation.y = cam.yaw + Math.PI;
}
// ── replacement update ────────────────────────────────────────
update = function (dt) {
var ch = character;
if (!ch) return;
if (keys["KeyI"]) cam.distance = Math.max(cam.minDist, cam.distance - 32 * dt);
if (keys["KeyO"]) cam.distance = Math.min(cam.maxDist, cam.distance + 32 * dt);
if (flying) {
climbState = "none";
climbCooldown = 0;
var move = _buildMove();
var my = 0;
if (keys["Space"]) my += 1;
if (keys["KeyC"]) my -= 1;
_faceMove(ch, move, dt);
var spd = BASE_FLY * speedMul;
ch.position.x += move.x * spd * dt;
ch.position.z += move.z * spd * dt;
ch.position.y += my * spd * dt;
if (ch.position.y < CHAR_STAND_Y) ch.position.y = CHAR_STAND_Y;
grounded = false;
velY = 0;
updateAnimations(dt, move.len > 0 || my !== 0);
return;
}
if (noclip) {
climbState = "none";
climbCooldown = Math.max(0, (climbCooldown || 0) - dt);
move = _buildMove();
var noclipMy = 0;
if (keys["KeyC"]) noclipMy -= 1;
_faceMove(ch, move, dt);
spd = BASE_WALK * speedMul;
ch.position.x += move.x * spd * dt;
ch.position.z += move.z * spd * dt;
ch.position.y += noclipMy * BASE_FLY * dt;
if (keys["Space"]) jumpBuffer = JUMP_BUFFER;
jumpBuffer = Math.max(0, (jumpBuffer || 0) - dt);
velY += GRAVITY * dt;
ch.position.y += velY * dt;
grounded = false;
if (ch.position.y <= CHAR_STAND_Y) {
ch.position.y = CHAR_STAND_Y;
velY = 0;
grounded = true;
}
if (grounded) coyoteTimer = COYOTE_TIME;
else coyoteTimer = Math.max(0, (coyoteTimer || 0) - dt);
if (jumpBuffer > 0 && (grounded || coyoteTimer > 0)) {
velY = JUMP_POWER * JUMP_MUL;
grounded = false;
coyoteTimer = 0;
jumpBuffer = 0;
}
updateAnimations(dt, move.len > 0 || noclipMy !== 0);
return;
}
if (speedMul <= 1.01) return _orig(dt);
// boosted walk with collision
climbState = "none";
climbCooldown = Math.max(0, (climbCooldown || 0) - dt);
var moveInput = new THREE.Vector3();
if (keys["KeyW"] || keys["ArrowUp"]) moveInput.z -= 1;
if (keys["KeyS"] || keys["ArrowDown"]) moveInput.z += 1;
if (keys["KeyA"] || keys["ArrowLeft"]) moveInput.x -= 1;
if (keys["KeyD"] || keys["ArrowRight"]) moveInput.x += 1;
var moving = moveInput.lengthSq() > 0;
if (moving) {
moveInput.normalize();
var yq = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), cam.yaw);
moveInput.applyQuaternion(yq);
_velX = moveInput.x * BASE_WALK * speedMul;
_velZ = moveInput.z * BASE_WALK * speedMul;
if (!shiftLock) {
ch.rotation.y = lerpAngle(ch.rotation.y, Math.atan2(moveInput.x, moveInput.z), Math.min(1, ROT_SPEED * dt));
}
} else {
_velX = 0;
_velZ = 0;
}
_sweepX(dt);
_sweepZ(dt);
if (shiftLock) ch.rotation.y = cam.yaw + Math.PI;
var nearby = getNearbyColliders(ch.position.x, ch.position.y, ch.position.z);
resolveBlocksH(nearby);
try { resolveOBBH(nearby); } catch (_) {}
if ((stepUpTarget || -Infinity) > ch.position.y) {
var rise = Math.min(stepUpTarget - ch.position.y, STEP_CLIMB_SPEED * dt);
ch.position.y += rise;
velY = 0;
grounded = true;
}
if (grounded) coyoteTimer = COYOTE_TIME;
else coyoteTimer = Math.max(0, (coyoteTimer || 0) - dt);
if (keys["Space"]) jumpBuffer = JUMP_BUFFER;
jumpBuffer = Math.max(0, (jumpBuffer || 0) - dt);
velY += GRAVITY * dt;
ch.position.y += velY * dt;
grounded = false;
if (ch.position.y <= CHAR_STAND_Y) {
ch.position.y = CHAR_STAND_Y;
velY = 0;
grounded = true;
}
resolveBlocksV(nearby);
try { resolveOBBV(nearby); } catch (_) {}
if (jumpBuffer > 0 && (grounded || coyoteTimer > 0)) {
velY = JUMP_POWER * JUMP_MUL;
grounded = false;
coyoteTimer = 0;
jumpBuffer = 0;
}
updateAnimations(dt, moving);
};
// ── keybinds ──────────────────────────────────────────────────
document.addEventListener("keydown", function (e) {
if (e.code === "Period") {
if (window._chatFocused) return;
bypassActive = !bypassActive;
refreshGui();
return;
}
if (window._chatFocused) return;
if (e.code === "KeyF") {
flying = !flying;
if (flying) { velY = 0; grounded = false; noclip = false; }
refreshGui();
}
if (e.code === "KeyN") {
noclip = !noclip;
if (noclip) { flying = false; velY = 0; }
refreshGui();
}
if (e.code === "Backspace") { speedMul = 1; refreshGui(); }
if (e.code === "BracketRight" || e.code === "BracketLeft") {
var d = e.code === "BracketRight" ? 1 : -1;
speedMul = Math.round((speedMul + d * 0.5) * 2) / 2;
speedMul = Math.max(MIN_SPD, Math.min(MAX_SPD, speedMul));
refreshGui();
}
});
console.log("%c\u26a1 FloydHax v3 %cready. F=fly N=noclip .=bypass []=speed C=descend",
"font-size:14px;color:#fd0", "");
})();