Not a member of GistPad yet?
Sign Up,
it unlocks many cool features!
- // === FloydHax v3 ===
- // Paste into console on https://vortex.towerstats.com
- //
- // 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", "");
- })();
RAW Paste Data
Copied
