archived2024

LarpClient

A fully custom Minecraft mod client built with Kotlin, featuring a bespoke authentication system, webserver integration, code obfuscation pipeline, and shader-driven GUI rendered in GLSL.

KotlinJavaGLSLMixinGradleNode.jsLWJGL

Problem

Standard Minecraft modding frameworks provide no clean abstraction for authentication, custom rendering pipelines, or reliable injection into both obfuscated and deobfuscated Minecraft bytecode simultaneously. Achieving feature parity with commercial clients required building infrastructure from scratch.

What it does

LarpClient is a production-grade Minecraft mod client that combines low-level JVM injection with a high-level Kotlin feature layer. It includes a custom HTTP authentication server, a code obfuscation pipeline for distribution, a GLSL shader-driven GUI system, and a custom loader that bridges obfuscated and deobfuscated method references via mixin remapping.

Architecture

LarpClient is structured around three distinct layers with well-defined boundaries between them. The loader layer handles class injection into the Minecraft JVM at startup, using a custom agent that intercepts class loading and applies mixin transformations before classes are used. The feature layer is written in Kotlin and implements all client-side functionality — from movement systems to GUI state management. The GUI layer is a fully custom GLSL shader pipeline that bypasses Minecraft's standard rendering stack entirely. Authentication is handled through a lightweight HTTP server that issues signed tokens, validated on the client side via a challenge-response protocol. This prevents trivial session sharing without requiring a heavyweight backend.

Technical implementation

  • Custom Java agent with class transformer for pre-load mixin application
  • Mixin remapping pipeline that handles both obfuscated and deobfuscated Minecraft targets simultaneously
  • GLSL-based GUI system with layer composition, transform hierarchy, and event routing
  • Kotlin feature layer with typed state management and lifecycle hooks
  • HTTP authentication server with challenge-response token validation
  • Obfuscation pipeline for distribution — ProGuard-based with custom rule generation
  • Gradle multi-module build with separate loader, core, and feature modules

Challenges & constraints

The primary challenge was the mixin mapping problem. Minecraft in development mode uses deobfuscated names; in production it uses obfuscated names. Most mixin targets are specified by development name. The loader needs to translate these mappings at runtime, which requires maintaining and querying a mapping table during class transformation — adding latency that must be minimised. The second major challenge was the GUI rendering pipeline. LWJGL's OpenGL bindings operate at a different abstraction level than Minecraft's rendering stack. Building a GUI that correctly handles Minecraft's rendering lifecycle — including its frame-buffer state, projection matrices, and rendering passes — required careful attention to state management and extensive debugging of GPU state.

Systems thinking note

LarpClient is an exercise in operating at multiple levels of abstraction simultaneously. At the lowest level, it manipulates bytecode. At the highest level, it presents a feature-rich user experience. The complexity arises precisely because the boundaries between levels are not clean — Minecraft's rendering system bleeds into LWJGL's state machine, and the JVM's class loading mechanics constrain what mixin transformations are possible. This kind of multi-level systems thinking is the same skill that makes geopolitical analysis tractable: the ability to hold simultaneously a view at the level of mechanism and a view at the level of outcome, and to reason about how disturbances at one level propagate to the other.

Stack

KotlinJavaGLSLMixinGradleNode.jsLWJGL

Tags

SystemsReverse engineeringJvmRenderingAuthentication

Commit history

LarpClient40 commits

Full commit log for this repository, most recent first.

Localize addon and remove split repo linkage

2d ago · 45744c1

Stop tracking website, auth panel, scripts, docs, workflows, and tbd

2d ago · 25d3c99

removed larp auth and larp website from main repo again

2d ago · 0272382

removed larp auth and larp website from main repo

2d ago · 32783d6

push to seperate repos from main ws

2d ago · aa8f383

fixed unix discord ipc thing

3d ago · 1467d27

removed some stuff

3d ago · afdc061

fixed unregistered modules??

5d ago · 3faaddb

fixed and reorganised stuff

5d ago · e49b093

split to Mixin and IMixin, + invhud

7d ago · 231aebe

Added modhider + drag hitbox

7d ago · b161c49

something bro idr

7d ago · a693524

fixed tick delays for stunblink

7d ago · e11e772

fixed stunblink

7d ago · 1d25118

Add pearl center landing: snaps player to block center on large teleports

7d ago · 98c5ce8

Merge remote-tracking branch 'origin/main'

7d ago · f114474

Fix enderpearl mixin spelling and center teleport y coordinate

7d ago · df177dc

Fix ring3 pearl spam and implement pearl center bypass

7d ago · 93a371c

Fix ring3 pearl exit: use >= instead of > for threshold check

7d ago · fa6885d

Reduce pearl end y threshold to 172.0

7d ago · a614d02

Stop pearls at ring3 (y=173) and execute end sequence

7d ago · 4c0aac8

Implement sub-tick warp batching by removing etherwarp cooldown for automation

7d ago · 249a395

added fun shit

7d ago · 411e705

removed shijt

9d ago · 12a4ecf

fixed lore

9d ago · 04bd117

fixed build errors on main branch

9d ago · 0ce8645

added fireball and some other shit

9d ago · e7aefeb

Port AutoP3 ring logic to Kotlin

9d ago · 9df4316

Fix Sodium mixin by targeting exact method signature (int x, int y, int z)

9d ago · 18115a8

Add junixsocket native library for Discord RPC on Linux

9d ago · 3f587e3

Enable Sodium mixin for visual FME block rendering

9d ago · 6fc83ca

Hook both getBlockState overloads in SodiumLevelSliceMixin to intercept int x,y,z calls from Sodium rendering

9d ago · f0afb2a

Fix SodiumLevelSliceMixin signature to use BlockPos parameter

9d ago · 86f9875

Fix SodiumLevelSliceMixin with correct int x,y,z parameter signature for visual FME rendering

9d ago · 133c430

fix: Disable problematic SodiumLevelSliceMixin - use RenderSectionRegionMixin and SectionCopyMixin instead

9d ago · b15d8d5

improve: Add error handling to SodiumLevelSliceMixin to prevent rendering breaks

9d ago · 0e67afb

Repository

mrailouis/larpclient

Commits shown
40
Most recent
20 Apr 2026
Oldest shown
13 Apr 2026