Now available for Hytale

ServerProtection
MadeSimple

Themostadvancedserver-sideanticheatforHytale.Powerfuldetection,real-timeanalytics,andseamlessserverintegration.

Products

Free account lets you explore all features. Subscription required to download and use BlockShield.

Trusted by Top Servers

Join these amazing communities already protected by BlockShield

Hyfable

Hyfable

Official Hyfable community server

3,200 players
Hytale PVP

Hytale PVP

Competitive PvP arenas

2,800 players
Hyvale

Hyvale

RPG Survival Server

200 players
SnowTale Community

SnowTale Community

Deutscher Survival RPG Server

100 players
Coming Soon

Coming Soon

Join our partner program

Partner slot available
Hyfable

Hyfable

Official Hyfable community server

3,200 players
Hytale PVP

Hytale PVP

Competitive PvP arenas

2,800 players
Hyvale

Hyvale

RPG Survival Server

200 players
SnowTale Community

SnowTale Community

Deutscher Survival RPG Server

100 players
Coming Soon

Coming Soon

Join our partner program

Partner slot available
Coming Soon

Coming Soon

Join our partner program

Partner slot available
SnowTale Community

SnowTale Community

Deutscher Survival RPG Server

100 players
Hyvale

Hyvale

RPG Survival Server

200 players
Hytale PVP

Hytale PVP

Competitive PvP arenas

2,800 players
Hyfable

Hyfable

Official Hyfable community server

3,200 players
Coming Soon

Coming Soon

Join our partner program

Partner slot available
SnowTale Community

SnowTale Community

Deutscher Survival RPG Server

100 players
Hyvale

Hyvale

RPG Survival Server

200 players
Hytale PVP

Hytale PVP

Competitive PvP arenas

2,800 players
Hyfable

Hyfable

Official Hyfable community server

3,200 players
6K+
Total Players Protected
5
Partner Servers
99.9%
Uptime

Everything You Need

Comprehensive protection with powerful features designed for Hytale server owners

Advanced Detection

Multi-layered fly, speed, and teleport detection with rubberband system

Real-time Protection

Instant violation detection and automatic punishment escalation

Live Analytics

Comprehensive statistics and violation tracking in real-time

Secure Licensing

HWID and IP locking for maximum security

Multi-Server

Manage unlimited Hytale servers from one dashboard

Configurable

Fine-tune every check and threshold to your needs

Java Obfuscation Engine

The same pipeline that protects BlockShield itself — 5 transformation passes, 1,856 virtualized methods

String Encryption

All string literals are transformed into encrypted arrays. Each string has unique per-build keys — impossible to batch-decrypt.

Control Flow Obfuscation

Method logic is restructured into forms that defeat decompilers. Automatic analysis tools produce meaningless output.

Class & Member Renaming

All classes, fields, and methods are renamed. Package structure is flattened. Decompiler output becomes unreadable.

Method Virtualization

Method bodies are extracted and replaced with VM dispatch stubs. Original bytecode is gone — nothing left to reverse.

Metadata Stripping

All debug information, source references, and structural metadata are removed. No breadcrumbs for reverse engineers.

Constant Obfuscation

Numeric and string constants are transformed into computed expressions. Static analysis cannot recover the original values.

Real Output

Decompiled from BlockShield's own protected JAR — this is what attackers see

String Encryption

Every string literal becomes encrypted int[] arrays, decoded at runtime through a multi-layer XOR engine with rotating keys

Original
public class ViolationManager {
    private static final String PREFIX = "[BlockShield] ";
    private static final String LOG_FORMAT = "%s flagged for %s (x%d)";
    private static final long DECAY_TIME = 300000L;
    private final Map<UUID, Map<String, Integer>> violations;
    private final Map<UUID, Long> lastViolation;
    private final BanManager banManager;
    private int totalViolations;

    public ViolationManager(BanManager banManager) {
        this.violations = new ConcurrentHashMap<>();
        this.lastViolation = new ConcurrentHashMap<>();
        this.banManager = banManager;
        this.totalViolations = 0;
    }

    public int addViolation(UUID player, String checkName) {
        Map<String, Integer> playerVls = violations
            .computeIfAbsent(player, k -> new ConcurrentHashMap<>());
        int vl = playerVls.merge(checkName, 1, Integer::sum);
        lastViolation.put(player, System.currentTimeMillis());
        totalViolations++;

        String name = getPlayerName(player);
        Logger.info(String.format(LOG_FORMAT, name, checkName, vl));

        if (vl >= banManager.getThreshold(checkName)) {
            banManager.executeBan(player,
                PREFIX + "Excessive " + checkName + " violations");
        }
        return vl;
    }

    public void decay() {
        long now = System.currentTimeMillis();
        lastViolation.forEach((uuid, time) -> {
            if (now - time > DECAY_TIME) {
                violations.remove(uuid);
                lastViolation.remove(uuid);
            }
        });
    }

    public Map<String, Integer> getViolations(UUID player) {
        return violations.getOrDefault(player, Collections.emptyMap());
    }

    public void clear() {
        violations.clear();
        lastViolation.clear();
        totalViolations = 0;
    }
}
Obfuscated
public class ViolationManager {
    private static final String U;
    private static final String q;
    private static final long O = (long)(0x493E0 ^ 0x400);
    private final Map x;
    private final Map t;
    private final xc b;
    private int H;

    static {
        int[] n = new int[]{-782341092, 0x7C3A1, --3};
        int[] n2 = new int[]{943812001, -0x2B1C, 3 ^ 3};
        int[] n3 = new int[]{0x4FA301, -129381, 5 >> 3};
        U = ja_0.J(n, n2, n3, new int[3 & 4],
            -1495741345, 0x37 & 0x5E);
        int[] n4 = new int[]{381209471, 0x91A3C, 2 ^ 3};
        int[] n5 = new int[]{-471829310, 0x3C1, --2};
        int[] n6 = new int[]{0x8B2103, -2819301, 3 >> 2};
        q = ja_0.J(n4, n5, n6, new int[5 >> 2],
            547901223, 0x23 ^ 0x71);
    }

    public ViolationManager(xc b) {
        aa_0.J(890, new Object[]{this, b});
    }

    public int J(UUID u, String s) {
        return (Integer)aa_0.J(891,
            new Object[]{this, u, s});
    }

    public void b() {
        aa_0.J(892, new Object[]{this});
    }

    public Map J(UUID u) {
        return (Map)aa_0.J(893,
            new Object[]{this, u});
    }

    public void J() {
        aa_0.J(894, new Object[]{this});
    }
}

Method Virtualization

All method bodies replaced with VM dispatch calls through aa_0.J() — zero visible logic remains

Original
public class ServiceLocator {
    private static ServiceLocator instance;
    private FlyCheck flyCheck;
    private SpeedCheck speedCheck;
    private TeleportCheck teleportCheck;
    private KillAuraCheck killAuraCheck;
    private ReachCheck reachCheck;
    private TimerCheck timerCheck;
    private ConfigManager configManager;
    private BanManager banManager;
    private ViolationManager violationManager;
    private DashboardClient dashboardClient;

    public static ServiceLocator getInstance() {
        if (instance == null) {
            instance = new ServiceLocator();
        }
        return instance;
    }

    public FlyCheck getFlyCheck() {
        return this.flyCheck;
    }
    public SpeedCheck getSpeedCheck() {
        return this.speedCheck;
    }
    public TeleportCheck getTeleportCheck() {
        return this.teleportCheck;
    }
    public KillAuraCheck getKillAuraCheck() {
        return this.killAuraCheck;
    }
    public ReachCheck getReachCheck() {
        return this.reachCheck;
    }
    public TimerCheck getTimerCheck() {
        return this.timerCheck;
    }
    public ConfigManager getConfigManager() {
        return this.configManager;
    }
    public BanManager getBanManager() {
        return this.banManager;
    }
    public ViolationManager getViolationManager() {
        return this.violationManager;
    }
    public DashboardClient getDashboardClient() {
        return this.dashboardClient;
    }

    public boolean initialize(BlockShieldPlugin plugin) {
        this.configManager = new ConfigManager(plugin);
        this.banManager = new BanManager(plugin);
        this.violationManager = new ViolationManager(banManager);
        this.flyCheck = new FlyCheck(configManager);
        this.speedCheck = new SpeedCheck(configManager);
        this.teleportCheck = new TeleportCheck(configManager);
        this.killAuraCheck = new KillAuraCheck(configManager);
        this.reachCheck = new ReachCheck(configManager);
        this.timerCheck = new TimerCheck(configManager);
        this.dashboardClient = new DashboardClient(configManager);
        return true;
    }

    public void shutdown() {
        this.banManager.saveAll();
        this.violationManager.clear();
        this.dashboardClient.disconnect();
    }
}
Obfuscated
public final class hc {
    private static hc U;
    private ma q;
    private Ad O;
    private v_0 x;
    private dc t;
    private jd b;
    private Qc H;
    private NB f;
    private xc z;
    private Rb_0 L;
    private Gd I;

    public static hc J() {
        return (hc)aa_0.J(1180,
            new Object[0]);
    }

    public ma b() {
        return (ma)aa_0.J(1181,
            new Object[]{this});
    }

    public Ad J(int n) {
        return (Ad)aa_0.J(1182,
            new Object[]{this});
    }

    public v_0 J(long l) {
        return (v_0)aa_0.J(1183,
            new Object[]{this});
    }

    public dc b(int n) {
        return (dc)aa_0.J(1184,
            new Object[]{this});
    }

    public jd J(String s) {
        return (jd)aa_0.J(1185,
            new Object[]{this});
    }

    public Qc b(long l) {
        return (Qc)aa_0.J(1186,
            new Object[]{this});
    }

    public NB J(boolean z) {
        return (NB)aa_0.J(1187,
            new Object[]{this});
    }

    public xc b(String s) {
        return (xc)aa_0.J(1188,
            new Object[]{this});
    }

    public Rb_0 J(byte n) {
        return (Rb_0)aa_0.J(1189,
            new Object[]{this});
    }

    public Gd b(boolean z) {
        return (Gd)aa_0.J(1190,
            new Object[]{this});
    }

    public boolean b(BlockShieldPlugin p) {
        return (Boolean)aa_0.J(1191,
            new Object[]{this, p});
    }

    public void J(char c) {
        aa_0.J(1192,
            new Object[]{this});
    }
}

Full Pipeline Result

Complete anti-cheat module after all 5 obfuscation passes — strings encrypted, class renamed, methods virtualized

Original
public class SpeedDetector extends AbstractCheck {
    private static final double MAX_SPEED = 8.0;
    private static final double MAX_SPRINT = 12.5;
    private static final double TOLERANCE = 0.15;
    private static final long SAMPLE_WINDOW = 500L;
    private static final String CHECK_NAME = "Speed";
    private static final String BAN_REASON = "Speed hack detected";

    private final Map<UUID, List<MoveSample>> samples;
    private final Map<UUID, Integer> violations;
    private int totalChecks;
    private boolean enabled;

    public SpeedDetector(ConfigManager config) {
        super("SpeedDetector", config);
        this.samples = new ConcurrentHashMap<>();
        this.violations = new ConcurrentHashMap<>();
        this.totalChecks = 0;
        this.enabled = config.getBoolean("speed.enabled", true);
    }

    @Override
    public CheckResult check(Player player, MoveEvent event) {
        if (!enabled) return CheckResult.PASS;
        UUID id = player.getUUID();
        Vector3d from = event.getFrom();
        Vector3d to = event.getTo();
        long now = System.currentTimeMillis();

        double dx = to.x - from.x;
        double dz = to.z - from.z;
        double horizontal = Math.sqrt(dx * dx + dz * dz);

        List<MoveSample> history = samples.computeIfAbsent(
            id, k -> new ArrayList<>());
        history.add(new MoveSample(horizontal, now));
        history.removeIf(s -> now - s.time > SAMPLE_WINDOW);
        totalChecks++;

        if (history.size() < 3) {
            return CheckResult.PASS;
        }

        double avgSpeed = history.stream()
            .mapToDouble(s -> s.speed)
            .average().orElse(0.0);

        double maxAllowed = player.isSprinting()
            ? MAX_SPRINT : MAX_SPEED;
        maxAllowed *= (1.0 + TOLERANCE);

        if (avgSpeed > maxAllowed) {
            int vl = violations.merge(id, 1, Integer::sum);
            Logger.warn(String.format(
                "%s failed %s: %.2f > %.2f (vl:%d)",
                player.getName(), CHECK_NAME,
                avgSpeed, maxAllowed, vl));
            return new CheckResult(
                CheckResult.Type.FAIL,
                String.format("%.2f > %.2f", avgSpeed, maxAllowed),
                vl);
        }
        return CheckResult.PASS;
    }

    public void reset(UUID player) {
        samples.remove(player);
        violations.remove(player);
    }

    public Map<UUID, Integer> getViolations() {
        return Collections.unmodifiableMap(violations);
    }

    public int getTotalChecks() {
        return this.totalChecks;
    }
}
Obfuscated
public final class qB extends m_0 {
    private static final double L = 8.0;
    private static final double I = 12.5;
    private static final double k;
    private static final long A;
    private static final String Il;
    private static final String lI;

    private final Map II;
    private final Map Iu;
    private int IlI;
    private boolean lIl;

    static {
        k = Double.longBitsToDouble(0x3FC3333333L);
        A = (long)(0x1F4 ^ 0x100);
        int[] n = new int[]{-129448371, 0xAB3C1, 7 & 3};
        int[] n2 = new int[]{883401772, -37291, 5 >> 2};
        Il = ja_0.J(n, n2, new int[]{0x91},
            new int[0], -1495741345, 0x37 & 0x5E);
        int[] n3 = new int[]{749103281, 0x1BB7C0, 3 ^ 3};
        int[] n4 = new int[]{-308217546, -1227139, 2 ^ 3};
        lI = ja_0.J(n3, n4, new int[]{0x4C91A},
            new int[0], 547901223, 0x23 ^ 0x71);
    }

    public qB(NB n) {
        aa_0.J(2100, new Object[]{this, n});
    }

    public l_0 J(Player p, IB e) {
        return (l_0)aa_0.J(2101,
            new Object[]{this, p, e});
    }

    public void b(UUID u) {
        aa_0.J(2102,
            new Object[]{this, u});
    }

    public Map J(int n) {
        return (Map)aa_0.J(2103,
            new Object[]{this});
    }

    public int J() {
        return (Integer)aa_0.J(2104,
            new Object[]{this});
    }
}
169
Classes Renamed
1,856
Methods Virtualized
5
Encryption Layers
1,856
.bsm VM Files

Ready to Protect Your Server?

Join server owners who trust BlockShield to keep their communities safe.

Get Started for Free

Join Our Community

Connect with server owners, get support, and help shape the future of BlockShield

Active Community

Server owners sharing tips, configs, and best practices

Priority Support

Get help directly from the developers and experienced users

Early Updates

Be the first to test new features and provide feedback

Simple Pricing

One plan, all features included. No hidden fees.

Early Access

Starter

Freeduring beta

Perfect for testing and small servers

  • Basic detection modules
  • Dashboard access
  • 1 server
  • Community support
Get Started
Recommended

BlockShield Pro

€9.99/month

Full protection for serious server owners

  • All detection modules
  • Real-time dashboard
  • Unlimited servers
  • WebSocket live updates
  • Priority support
  • HWID & IP protection

Available after early access phase

Add-on

Obfuscator

€4.99/month

Enterprise Java obfuscation engine

  • String encryption (XOR+AES)
  • Control flow flattening
  • Il/lI/O0 renaming
  • 5-layer virtualization
  • Metadata stripping
  • Real-time code preview

Requires BlockShield Pro subscription

BlockShield is currently in early access. All features are free during the beta phase. Register now to lock in your early adopter benefits.