NeoForge mod for Minecraft 1.21.1 that runs libretro cores inside the game. Place a console block in the world, pick a game from the built-in library UI, and play on an in-world TV screen or in a fullscreen viewer.
Version: 0.1.0 (early release — expect rough edges)
Pre-built JAR: GitHub Releases → retroconsole-0.1.0.jar
Requirements: Minecraft 1.21.1, NeoForge 21.1.x, Java 21. The mod does not include libretro cores, BIOS, or ROMs.
- In-world Retro Console block with a game library UI (favorites, search, per-system tabs)
- Screen multiblock walls — console must touch the wall (CC:Tweaked-style floor/ceiling placement)
- Fullscreen TV viewer with volume slider and quick save/load
- Server-side emulation with video/audio streaming to nearby players
- Per-player saves, play-time stats, PS2 memory-card sync
- In-game config UI (paths, streaming distances, session limits, video presets)
- HW-render cores (PS2, PSP, Dreamcast) via bundled headless OpenGL helper
Screenshots coming soon.
| Component | Version |
|---|---|
| Minecraft | 1.21.1 |
| NeoForge | 21.1.x (tested with 21.1.215) |
| Java | 21 |
| Host OS | Windows or Linux (64-bit) |
macOS is not supported.
- Install NeoForge 1.21.1 and drop
retroconsole-0.1.0.jarinto themodsfolder. - Start the game. On first launch the mod creates
config/retroconsole/under your game directory. - Download libretro cores (
.dllon Windows,.soon Linux) from the libretro buildbot and place them inconfig/retroconsole/cores/. - Add your legally obtained ROMs under
config/retroconsole/roms/, preferably in subfolders (nes/,gba/,ps2/, …). - Craft a Retro Console and Screen blocks (or take them from the Retro Console creative tab):
Retro Console Screen ×2
I I I G G G
I R I G R G
I G I I I I
I = iron ingot, R = redstone, G = glass pane
- Place the console, then place screens so the console touches the wall. Right-click the console → the game library opens. Select a game and press Launch.
- While a game is running, right-click again to open the fullscreen TV view.
Place Screen blocks so that the Retro Console touches any block of the screen wall (face-adjacent, 6-neighbour). Linking is physical contact only — there is no radius search.
- Adjacent screens with the same facing/orientation form one rectangular wall (L-shapes split into separate rectangles).
- Look straight ahead to place a wall screen; look sharply down/up to place on the floor/ceiling (like CC:Tweaked monitors).
- Breaking change (0.1.0): older worlds that relied on “within 16 blocks” auto-link need the console moved flush against the wall (or the wall rebuilt).
-
Clone the repo and open it as a Gradle project (IntelliJ IDEA recommended):
git clone https://github.com/Gaigen/retroconsole.git
-
Use Java 21.
-
Run the
runClientGradle task, or:./gradlew runClient
On Windows:
gradlew.bat runClient
Dev paths are under runs/client/config/retroconsole/ (single-player) or runs/server/config/retroconsole/ (dedicated server).
All paths are relative to the game directory (client folder in SP, server folder on a dedicated server). Defaults can be changed in config/retroconsole-common.toml.
config/retroconsole/
├── cores/ # libretro cores (*_libretro.dll / *_libretro.so)
├── roms/ # ROMs and disc images (use subfolders per system)
│ ├── nes/
│ ├── gba/
│ ├── ps2/
│ └── dreamcast/
├── system/ # BIOS and core system files (not shipped with the mod)
│ ├── pcsx2/bios/ # PS2 BIOS (e.g. scph70000.bin) — see BIOS section
│ ├── pcsx2/memcards/ # PS2 memory cards (LRPS2)
│ └── dc/ # Dreamcast BIOS / VMU (Flycast)
├── art/ # Optional menu cover art: art/<folder>.png
├── systems.json # Optional custom system definitions (local SP only)
└── saves/ # Battery saves, save states, per-player data
└── players/<uuid>/ # Per-player saves and play-time stats (multiplayer)
The mod auto-creates default roms/ subfolders for built-in systems (nes, snes, gb, gba, genesis, sms, ps1, ps2, psp, dreamcast, segacd, saturn).
- File name (without extension) is the core id used internally, e.g.
nestopia_libretro.dll→ core idnestopia_libretro. - Download matching builds for your OS from the libretro buildbot.
- A bundled headless OpenGL helper (
.libheadless_gl.dll/.libheadless_gl.so) is extracted intocores/automatically for HW-render cores (PS2, Dreamcast, etc.).
- Put files in the matching
roms/<folder>/subfolder. The folder name becomes a tab in the library UI. - Disc-based systems accept common formats (
.iso,.bin,.cue,.chd,.gdi,.cdi, …) — detection is extension-based. - You are responsible for only using ROMs and BIOS files you have the legal right to use. This mod does not include or endorse piracy.
| System | Path | Notes |
|---|---|---|
| PlayStation 2 | system/pcsx2/bios/ |
Valid PS2 BIOS dump (4–8 MB). scph70000.bin is preferred if present. Required for LRPS2 / PCSX2 cores. |
| Dreamcast | system/dc/ |
Flycast BIOS / VMU files as required by the core. |
| Other | system/ |
Depends on the core (PS1, Saturn, etc.). Consult the core's libretro documentation. |
The library UI recognizes these folders and suggests matching core name patterns. Compatibility depends on the specific core you install — the table is a hint, not a guarantee.
| Tab folder | Console | Common extensions | Core name hints |
|---|---|---|---|
nes |
NES / Famicom | .nes |
fceumm, nestopia, mesen |
snes |
Super Nintendo | .sfc, .smc |
snes9x, bsnes |
gb |
Game Boy / Color | .gb, .gbc |
gambatte, sameboy |
gba |
Game Boy Advance | .gba |
mgba, vba |
genesis |
Genesis / Mega Drive | .gen, .md |
genesis_plus_gx, picodrive |
sms |
Master System | .sms, .gg |
smsplus, genesis_plus_gx |
ps1 |
PlayStation | .bin, .cue, .pbp, … |
swanstation, pcsx_rearmed, beetle_psx |
ps2 |
PlayStation 2 | .iso, .bin, .chd, … |
pcsx2, lrps2 |
psp |
PSP | .iso, .cso |
ppsspp |
dreamcast |
Dreamcast | .cdi, .gdi, .chd |
flycast |
segacd |
Sega CD | disc images | genesis_plus_gx, picodrive |
saturn |
Saturn | disc images | mednafen_saturn, beetle_saturn, kronos |
Custom tabs can be added via systems.json (on the machine that serves the library — your client in single-player, the server in multiplayer).
Smoke-tested during development on Windows 11 (NeoForge 21.1.215). Linux has matching native helpers; treat HW cores there as “should work”, not as a full matrix.
| Core file (libretro) | System | Notes |
|---|---|---|
nestopia_libretro |
NES | Software render |
snes9x_libretro |
SNES | Software render |
mgba_libretro |
GBA | Software render |
genesis_plus_gx_libretro |
Genesis / Mega Drive | Software render |
pcsx_rearmed_libretro |
PS1 | Software render |
pcsx2_libretro (LRPS2) |
PS2 | HW OpenGL via headless_gl; needs BIOS under system/pcsx2/bios/; multi-console OK |
ppsspp_libretro |
PSP | HW OpenGL via headless_gl; multi-console OK |
flycast_libretro |
Dreamcast | HW OpenGL via headless_gl; needs DC BIOS under system/dc/; multi-console OK |
Other cores from the catalog table above may work, but were not part of the 0.1.0 smoke set.
Settings open in-game:
- Open the console library → ⚙ button (top right), or
- Main menu → Mods → RetroConsole → Config
Two files (created on first launch / world load):
| File | When editable in UI | Contents |
|---|---|---|
config/retroconsole-common.toml |
Always | Paths to cores/ROMs/system/saves |
<world>/serverconfig/retroconsole-server.toml (SP) or server config/ |
Singleplayer / LAN host only | Streaming, limits, video quality |
On a dedicated server, edit the server’s toml (or ask the host) — clients cannot change server streaming/video from the UI.
| Key | Default | Description |
|---|---|---|
videoDistance |
48 | Max distance (blocks) to receive video frames |
audioDistance |
32 | Max distance for emulator audio |
viewSubscribeDistance |
64 | Fullscreen TV subscribe radius |
controlDistance |
8 | Max distance to send controller input |
notifyDistance |
48 | Radius for “console stopped” notifications |
worldMaxWidth |
0 | Cap in-world frame width (0 = no cap) |
| Key | Default | Description |
|---|---|---|
maxCoreSlots |
0 | Max simultaneous copies of the same core DLL (0 = unlimited). On Windows each active console needs its own slot. |
maxPcsx2Sessions |
8 | Max parallel PS2 sessions (separate system dirs + memcards) |
maxScreenCluster |
256 | Max blocks in one linked screen wall |
batteryAutosaveSeconds |
120 | Interval for battery-save flush to disk |
When a limit is hit, the owner gets a chat message (e.g. core slot cap, PS2 session cap, missing BIOS) instead of a generic load failure.
| Key | Default | Description |
|---|---|---|
preset |
balanced |
performance, balanced, or quality |
flycastInternalResolution |
(preset) | Override Flycast internal res |
flycastTexUpscale |
(preset) | Override texture upscale |
flycastAnisotropic |
(preset) | Override anisotropic filtering |
ppssppInternalResolution |
(preset) | Override PPSSPP internal res |
ppssppTextureScaling |
(preset) | Override PPSSPP texture scaling |
pcsx2UpscaleMultiplier |
(preset) | Override PCSX2 upscale (e.g. "2", "3") |
pcsx2Anisotropic |
(preset) | Override PCSX2 anisotropic filtering |
Video overrides apply the next time you launch a game. Leave override strings empty to keep the preset value.
On a dedicated server, the game library is built from the server's config/retroconsole/ (ROMs, cores, systems.json, art/). Clients do not scan their local roms/ folder in multiplayer.
| Data | Where it lives in multiplayer |
|---|---|
| ROM / core list | Server disk |
| Emulator execution | Server |
| Play time & launch count | Server (saves/players/<uuid>/) |
| Favorites, volume, core overrides | Client-local |
| Save states & battery saves | Server (saves/players/<uuid>/) |
Distances for control / video / audio come from the server's [streaming] section (defaults: control 8, video 48, audio 32).
Important: ROM and core files must exist on the server at the same relative paths the client shows in the library.
Default keyboard bindings (rebindable in Options → Controls → Retro Console):
| Key | Action |
|---|---|
| Arrow keys | D-Pad |
| Z | A |
| X | B |
| C | X |
| V | Y |
| Q | L1 |
| W | R1 |
| E | L2 |
| R | R2 |
| N | L3 (left stick click) |
| M | R3 (right stick click) |
| Enter | Start |
| Right Shift | Select |
| I / K / J / L | Left analog stick |
| T / G / F / H | Right analog stick |
In the TV fullscreen view:
| Key | Action |
|---|---|
| F1 | Toggle control help overlay |
| F5 | Quick save (slot 0) |
| F6 | Quick load (slot 0) |
| Esc | Exit TV view (autosave runs on exit) |
In the library UI: arrow keys navigate, Enter launches, right-click toggles favorite, click the ? button for help.
./gradlew buildOutput: build/libs/retroconsole-0.1.0.jar
To rebuild the bundled headless GL native library (developers only):
./gradlew buildHeadlessGL copyHeadlessGLToResourcesLinux builds produce .so; Windows builds produce .dll. Ship both in src/main/resources/natives/ before cross-platform releases.
LibretroCore (JNA) → LibretroRuntime → ThreadedEmulatorRuntime
↓ ↓
ServerConsoles ← FrameSenderThread (~60 Hz) ← RetroFramePacket / RetroAudioPayload
↓
ClientConsoles → DynamicTexture → TvScreen / ScreenBlockEntityRenderer
Emulation runs on the server thread pool (one retro thread per active console). Video and audio stream to nearby clients.
RetroConsole mod source code, Java resources, and the bundled headless_gl native helper are licensed under the GNU General Public License v3.0 (GPL-3.0-or-later).
If you distribute this mod or a modified version, you must provide corresponding source code under the same license. See the LICENSE file for the full text.
This mod implements the libretro API, which is a separate, MIT-licensed specification. RetroConsole is not RetroArch and is not affiliated with the libretro project.
Libretro cores are not included. Each core is its own project with its own license (GPL, LGPL, non-commercial, etc.). Check the license of every core you download:
BIOS files and ROMs are not included. You must obtain them legally. The authors of RetroConsole are not responsible for how you acquire or use copyrighted game software.
| Component | License |
|---|---|
| JNA | LGPL-2.1 / Apache-2.0 (dual) |
| NeoForge / Minecraft | See their respective terms |
When distributing a build of this mod, include the LICENSE file and respect the licenses of any cores and assets you bundle alongside it.