Greasy Fork is available in English.

4uUnion

Look at the description down there...

// ==UserScript==
// @name         4uUnion
// @version      4.9.6
// @description  Look at the description down there...
// @author       KeineAhnung4u
// @license      GPL-3.0-or-later
// @run-at       document-end
// @match        http*://*.craftnite.io/*
// @icon         hdata:image/jpeg;base64,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
// @grant        none
// @namespace https://greasyfork.org/users/1266137
// ==/UserScript==

let espGeometry, espMaterial

{
    if (!window.temmMods) {
        window.temmMods = [];
        playGame = new Proxy(playGame, {
            apply: (tar, that, args) => {
                window.dispatchEvent(new Event("temm.playGame"))
                return tar.apply(that, args);
            }
        });
        G.Game.prototype.postLoad = new Proxy(G.Game.prototype.postLoad, {
            apply: (tar, that, args) => {
                let val = tar.apply(that, args);
                window.dispatchEvent(new Event("temm.loadFinish"))
                G.socket.addEventListener("connect", () => {
                    window.dispatchEvent(new Event("temm.connected"))
                })
                let onMsg = (m) => {
                    if (new DataView(m.data).getUint8(0) == G.a823.a174) {
                        G.socket.removeEventListener("message", onMsg);
                        setTimeout(() => {
                            let c = new a201;
                            let mods = window.temmMods.filter(m => m.announce).map(m => m.name).join(", ");
                            c.msg = "[4uArmy+Union " + mods + " Hi peoples This scribt is made by KeineAhnung4u. Free download on Greasy Fork! Name: 4uUnion]"
                            G.socket.send(c.a614());
                            window.dispatchEvent(new Event("temm.joined"))
                        }, 500)
                    }
                }
                G.socket.addEventListener("message", onMsg)
                return val;
            }
        })
    }
     window.temmMods.push({ "name": "= 4uUnion", "announce": true })
    function htmlToElement(html) {
        var template = document.createElement('template');
        template.innerHTML = html.trim();
        return template.content.firstChild;
    }

    let elem = document.createElement("input");
    elem.style.height = "50px";
    elem.style.width = "100%"
    elem.style.background = "white"
    elem.style.borderRadius = "2px"
    elem.style.border = "0px"
    elem.style.textAlign = "center"
    elem.style.fontSize = "15px"
    elem.style.fontFamily = "Madera"

    elem.placeholder = "Type ffa+ a number from 1 to 11"
    document.getElementById("middlewrap").appendChild(elem)
    // Set Server
    let officialServer = true;
    requestServerName = new Proxy(requestServerName, {
        apply: tar => {
            let v = elem.value.trim();
            if (v != "") {
                let addr;
                if (v.includes(".")) {
                    addr = v;
                    officialServer = !v.endsWith(craftnite.io)
                } else {
                    addr = v + ".craftnite.io"
                }
                Object.defineProperty(G, "gameServerAddress", {
                    value: addr,
                    writable: false
                })
            }
            tar();
        }
    })
let first = true;
    window.addEventListener("temm.playGame", () => {
        a234.prototype.a614 = new Proxy(a234.prototype.a614, {
            apply: function (target, that, args) {
                let res = target.apply(that, args);
                let { i: cx, e: cy, o: cz, v: locs, u: ids } = that;
                if (new Set(cx).size != 1 || new Set(cy).size != 1 || new Set(cz).size != 1) {
                    console.log("Multi-place crosses chunk borders... skipping.");
                    return res;
                }
                console.log(JSON.stringify({ cx, cy, cz, locs, ids }));
                // Set changed blocks in chunks
                let chunks = new Set();
                for (let i = 0; i < that.i.length; i++) {
                    try {
                        chunks.add(GAME.a865.a643s[cx[i]][cy[i]][cz[i]]);
                        GAME.a865.a643s[cx[i]][cy[i]][cz[i]].volume[locs[i]] = ids[i];
                    } catch (e) {
                        return res;
                    }
                }

                let compressed = []
                for (let chunk of chunks) {
                    compressed.push(compressChunk(chunk.volume));
                }
                // Write to Packet buffer
                let chunkByteTotal = compressed.reduce((acc, curr) => {
                    return acc + 4 * 4 + 4 * curr.blockTypes.length;
                }, 0)
                let buf = new ArrayBuffer(1 + chunkByteTotal);
                let view = new DataView(buf);

                let idx = 0;
                view.setUint8(idx++, G.a823.a120); // Packet ID

                for (let i in compressed) {
                    // Write Chunk Coordinates
                    view.setUint32(idx, cx[i], true);
                    idx += 4;
                    view.setUint32(idx, cy[i], true);
                    idx += 4;
                    view.setUint32(idx, cz[i], true);
                    idx += 4;

                    view.setUint32(idx, compressed[i].blockTypes.length, true);
                    idx += 4;

                    for (let j in compressed[i].blockTypes) {
                        view.setUint16(idx, compressed[i].blockTypes[j], true);
                        idx += 2;
                        view.setUint16(idx, compressed[i].blockAmounts[j], true); // Block Amount
                        idx += 2;
                    }
                }

                console.log("Finished writing " + compressed.length + " chunks at " + idx + "/" + buf.byteLength, cx, cy, cz);

                GAME.firstChunkWorker.postMessage({
                    ao: G.a813.ao,
                    buffer: view,
                    first: true
                });
                return res;
            }
        })
        if (first) {
            first = false;

            // Draw current Server
            document.getElementById("gameContainer").appendChild(htmlToElement('<canvas id="temm-utils" style="background-color: rgba(0, 0, 0, 0); z-index: 11;"></canvas>'))
            let cvs = document.getElementById("temm-utils");
            cvs.width = window.innerWidth;
            cvs.height = window.innerHeight;

            let ctx = cvs.getContext("2d");

            ctx.fillStyle = "#02149c";
            ctx.font = "25px Madera"
            if (!officialServer) {
                ctx.fillText("Server: " + G.gameServerAddress, 270, cvs.height - 36);
            } else {
                let server = G.gameServerAddress.split(".")[0];
                let w = ctx.measureText("Server: " + server).width;
                ctx.fillText("Server: " + server, 270, cvs.height - 36);
                ctx.font = "13px Madera"
                ctx.fillText(".craftnite.io", 270 + w, cvs.height - 36);
                ctx.font = "25px Madera"
                ctx.fillText("thx by ka4u", 1350 + w, cvs.height - 36);
            }

            // No Water/NAN spawn
            G.a822er.prototype.respawned = new Proxy(G.a822er.prototype.respawned, {
                apply: (tar, that, args) => {
                    if (isNaN(args[0])) {
                        console.log("[Temm-Utils] Protected you from spawning in the water!")
                        setTimeout(() => G.socket.send((new a192).a614()), 2000)
                    }
                    return tar.apply(that, args);
                }
            })
        }
    })
    function compressChunk(blocks) {
        let blockAmounts = [];
        let blockTypes = [];

        for (let i = 0; i < blocks.length; i++) {
            if (blockAmounts.length === 0 || blockTypes[blockAmounts.length - 1] !== blocks[i]) {
                blockTypes.push(blocks[i]);
                blockAmounts.push(1);
            } else {
                blockAmounts[blockAmounts.length - 1]++;
            }
        }

        return {
            blockTypes,
            blockAmounts
        };
    }
}

(function() {
    'use strict';
 
    console.log('IPBLOCK ====>> Listening for requests...');
    // Lista de URLs de API conhecidas para capturar o IP
    const blockedApiUrls = [
        'https://api.ipify.org',
        'https://api.ipify.org?format=json',
        'https://ipinfo.io',
        'https://api.ipapi.com',
        'https://www.iplocation.net',
        'https://api.iplocation.net',
        'https://website-cdn.ipinfo.io',
        'https://p.typekit.net',
        'https://use.typekit.net',
        'https://pagead2.googlesyndication.com',
        'https://data-jsext.com',
        'https:main.exoclick.com',
        'https:main.exdynsrv.com',
        'https:main.exosrv.com',
        'https://geolocation.onetrust.com',
        'https://cdn.cookielaw.org',
        'http://axeocy.com',
        'https://chikzzz.com',
        'https://themeetpartners.life',
        'https://api.ip-api.com',
        'https://ipapi.co',
        'https://geo.ipify.org',
        'https://extreme-ip-lookup.com',
        'https://freeipapi.com',
        'https://application/vnd.maxmind.com',
        'https://freegeoip.io',
        'ipbase.com',
        'https://api.ip2location.com',
        'https://ipstack.com',
        'https://ipstack1.p.rapidapi.com',
        'https://app.fusebox.fm',
        'https://api.usercentrics.eu',
        'https://maps.googleapis.com',
        'https://www.expressvpn.com',
        'https://graphql.usercentrics.eu',
        'https://ipaddress',
        'https://tls.browserleaks.com',
        'https://rf.revolvermaps.com',
        'whoisxmlapi.com',
        'maxmind.com',
        'ip-api',
        '/cookie',
        '/location',
        '/ip',
        '/ips',
        '/api/hostname',
        '/api/whois',
        'https://[',
        'geoip',
        'geoip2',
        'ipaddress'
        // Adicione mais URLs de API que deseja bloquear, se necessário
    ];
 
    let listBlock1 = "list of blocked ==> ";
    let listBlock2 = "list of blocked --> ";
 
    var verifyc1 = false;
    // Intercepta as solicitações AJAX feitas pelo website
    const open = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function(method, url) {
        // Verifica se a URL da solicitação corresponde a uma URL de API bloqueada
        console.log('====>>', url);
        if (blockedApiUrls.some(apiUrl => url.startsWith(apiUrl))) {
            verifyc1 = true;
            listBlock1 += url+" ~ ";
            console.log(`Solicitação de API bloqueada: ${url}`);
            return; // Interrompe a execução da solicitação
        }
        for (var i = 0; i < blockedApiUrls.length; i++) {
          var palavra = blockedApiUrls[i];
          if (url.includes(palavra)) {
            console.log(`~ Block: ${palavra}`);
            listBlock1 += palavra+" ~ ";
            verifyc1 = true;
            return;
          }
        }
        // Continua com a execução normal da solicitação
        open.apply(this, arguments);
    };
 
 
 
  let bloquearFetch = true;
  let verifyc2 = false;
 
  function interceptarFetch(url, options) {
    console.log('---->>', url);
    for (var i = 0; i < blockedApiUrls.length; i++) {
        var palavra = blockedApiUrls[i];
        if (url.includes(palavra)) {
          console.log(`~ Block: ${palavra}`);
          listBlock2 += palavra+" ~ ";
          verifyc2 = true;
          return Promise.resolve({ status: 200, body: 'A solicitação foi bloqueada.' });
        }
      }
    if (bloquearFetch && correspondeAUrlBloqueada(url)) {
      console.log('Solicitação fetch bloqueada:', url);
      verifyc2 = true;
      listBlock2 += url+" ~ ";
      return Promise.resolve({ status: 200, body: 'A solicitação foi bloqueada.' });
    } else {
      return window.originalFetch.call(this, url, options);
    }
  }
 
  function correspondeAUrlBloqueada(url) {
    for (const urlBloqueada of blockedApiUrls) {
      if (url.startsWith(urlBloqueada)) {
        return true;
      }
      for (var i = 0; i < blockedApiUrls.length; i++) {
        var palavra = blockedApiUrls[i];
        if (url.includes(palavra)) {
          console.log(`~ Block: ${palavra}`);
          return true;
        }
      }
    }
    return false;
  }
 
  // Substituir a função fetch globalmente
  window.originalFetch = window.fetch;
  window.fetch = interceptarFetch;
 
  // Aguarde o evento de carregamento total da página
  window.addEventListener('load', function() {
    // Após o carregamento total da página, permitir todas as solicitações fetch
    bloquearFetch = false;
  });
 
 
 
  function notificaAlert() {
    setTimeout(function(){
      if(verifyc1 == true){
        alert("~~ 4uBlocked ~~\n\n"+listBlock1);
        listBlock1 = "list of 4uBlocked ==> ";
        verifyc1 = false;
      }
      else if(verifyc2 == true){
        alert("~~ 4uBlocked Fetch ~~\n\n"+listBlock2);
        listBlock2 = "list of 4uBlocked --> ";
        verifyc2 = false;
      }
      else{
        console.log('IPBLOCK ====>> No API requests for IP identified.');
      }
    },1000);
  }
 
  window.addEventListener('load', notificaAlert);
 
})();