Watch
1
0
Fork
You've already forked trollbricks
0
No description
  • Python 57.1%
  • Lua 41%
  • Shell 1.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
kieroid fc539d97aa
fix: stop respawning everybody twice
Players.CharacterAutoLoads defaults to true, so the engine already reloads a
dead player after about five seconds. The keeper added on top reloaded them a
second time, somewhere else, well after they had got up: measured at 5s for the
engine and 26s for ours, three times running.

The 26s is its own lesson. RESPAWN_FRAMES was 300, meant as five seconds at
60fps, but the headless host renders in software at about twelve, so every
frame-counted duration on the server ran five times long.
2026-08-13 01:07:47 -05:00
corescripts fix: make every control a key, since GUI gets no mouse input 2026-08-13 00:59:04 -05:00
deploy/openrc rebase: add trollbricks 2026-08-12 23:38:48 -05:00
docs fix: stop respawning everybody twice 2026-08-13 01:07:47 -05:00
templates fix: stop respawning everybody twice 2026-08-13 01:07:47 -05:00
trollbricks rebase: add trollbricks 2026-08-12 23:38:48 -05:00
.gitignore chore: restore .gitignore 2026-08-12 23:49:22 -05:00
README.md rebase: add trollbricks 2026-08-12 23:38:48 -05:00

trollbricks

Run a 2013 Roblox client on Linux, under Wine, against your own backend. CLI only, no GUI.

Not a Novetus port. Novetus is a Windows WinForms app whose value is the per-version knowledge behind it, not its code. This reimplements the same facts for Linux, with no GUI and no Windows launcher. The only Windows code that runs is the Roblox binaries.

Status

Working. Two players connect to a host, spawn apart, see each other move, chat, and use tools. The host runs headless and can be on another machine.

Targets build version-1112937d32504d8c: PE32 i386, VS2012 runtime, branch Trunk2012, binaries dated 2013-01-01. Wine 11 staging (WoW64), WineD3D over OpenGL, tested on Intel HD 4000 with Mesa.

Verified end to end, including a host 100 miles away reached over Yggdrasil. Not done: accounts, persistence, more than one place per host.

Requirements

  • wine 11+ with USE="wow64", and a win64 prefix
  • openssl on PATH
  • Python 3.11+, no third-party packages

Quick start

python3 -m trollbricks init
python3 -m trollbricks keys gen
python3 -m trollbricks prefix init --players 2

# client files go in clients/2013/, places in places/<id>.rbxl
python3 -m trollbricks patch clients/2013/RobloxPlayerBeta.exe
python3 -m trollbricks configure

The client only talks to a hostname ending in .roblox.com, on port 80. Add to /etc/hosts:

127.0.0.1	trollbricks.roblox.com

and let the backend bind 80 without root:

sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80

Then check and play:

python3 -m trollbricks doctor
python3 -m trollbricks up --place-id 1 --players 2

up runs the backend, starts the host, waits for it to bind, and launches the players. Closing a player shuts it all down.

Docs

page what is in it
running setup, layout, commands, headless hosting
remote LAN, IPv6 and Yggdrasil, running as a service
interface playerlist, chat, backpack, keys, appearance
binary what the exe told us, and why there is no RCCService
replication SimulationRadius, and why players froze
debugging logs, tracing, signature problems

Scope

Personal, local, single machine. No accounts, no persistence, no public server.

Roblox client binaries, places and assets are Roblox Corporation copyright and are not in this repository. .gitignore excludes them on purpose. Source them yourself into clients/, places/ and assets/, and keep them out of git.

Remaining work

  • One place per host; switching means a restart
  • No accounts, persistence or place list
  • Studio (clients/2013-studio/) is wired but never launched. Qt4, and a different Wine risk from the player

Credit

Client version metadata and the general shape of this approach are informed by Novetus (MIT). No Novetus code is used here, only facts, which are not copyrightable.