Mod Fabric para Minecraft Java Edition 26.2 que adiciona uma televisão CRT low-poly capaz de executar WADs por meio de um processo LZDoom 4.14.4 isolado da JVM.
Este repositório contém:
- código-fonte Java completo do mod;
- recursos, modelos, texturas e receita;
- fonte original do LZDoom 4.14.4 fornecida pelo solicitante;
- patch C++ completo do bridge DoomCraft;
- ferramentas para preparar e compilar a engine nativa;
- GLB original da televisão como referência artística;
- validações offline e documentação do protocolo.
Não contém:
- WADs comerciais, shareware ou livres;
- executáveis nativos pré-compilados;
gradle-wrapper.jar, que deve ser gerado localmente pelo Gradle 9.5.1.
| Componente | Versão |
|---|---|
| Minecraft Java Edition | 26.2 |
| Java | 25 |
| Fabric Loader | 0.19.3 |
| Fabric API | 0.155.2+26.2 |
| Fabric Loom | 1.17.16 |
| Gradle | 9.5.1 |
| LZDoom | 4.14.4 |
| ZMusic | 1.1.12, mesma versão fixada pelo script oficial do pacote LZDoom fornecido |
Não são usadas versões snapshot, alpha, beta ou release candidate.
F F F
V R V
T T T
F: lingote de ferro;V: vidraça comum, sem cor;R: pó de redstone;T: qualquer item da tag de tábuas.
Quando as três tábuas são do mesmo tipo vanilla reconhecido, o bloco usa a respectiva textura. Tábuas de mods, ou uma mistura de madeiras, produzem a variante padrão de carvalho.
| Distância do jogador mais próximo | Bloco | Processo LZDoom |
|---|---|---|
| 0–4 blocos | active |
executando em tempo real |
| >4–8 blocos | paused |
save automático e pausa |
| >8 blocos | off |
save automático, encerramento e RAM liberada |
A transição usa o sistema de save do próprio LZDoom. Isso preserva o estado jogável da fase, inventário, posição, inimigos e scripts persistidos pelo formato de save. Estado puramente transitório de áudio ou do backend de renderização não é uma fotografia byte a byte da memória do processo.
Somente a televisão mais próxima pode possuir uma sessão nativa no cliente. Essa decisão é deliberada para impedir que dezenas de blocos iniciem dezenas de engines.
Agachar e usar a TV alterna broken. Esse controle é administrativo/teste. No estado quebrado, a tela rachada é renderizada e qualquer sessão ativa é salva e descarregada.
O mod cria automaticamente:
config/doomcraft/wads/
Trinta segundos após cada entrada em um mundo, uma mensagem informa explicitamente que o mod não inclui WADs e mostra o caminho absoluto da pasta.
A seleção segue esta ordem:
- nomes conhecidos de IWAD, como
doom2.wad,doom.wad,freedoom2.wade equivalentes; - os demais arquivos
.wad, em ordem alfabética, são passados como PWADs com-file.
Quando não houver um nome conhecido, o primeiro .wad será tratado como IWAD. Para evitar ambiguidade, mantenha um IWAD reconhecido na pasta.
Use apenas arquivos que você tenha direito legal de executar.
Pressione F8 próximo de uma TV ativa para capturar ou liberar os controles.
| Ação Doom | Tecla padrão |
|---|---|
| avançar/recuar | setas para cima/baixo |
| virar | setas esquerda/direita |
| atacar | Ctrl direito |
| usar/abrir | Enter |
| correr | Shift direito |
| arma anterior/próxima | Page Up/Page Down |
As teclas podem ser alteradas no menu de controles do Minecraft.
O desenho usa:
- uma única engine nativa por cliente;
- framebuffer RGBA de 320×200, aproximadamente 250 KiB;
- máximo de 35 frames por segundo;
- watchdog de RSS em 768 MiB;
- no Linux,
prlimitcom RSS de 768 MiB e espaço de endereçamento de 960 MiB; - descarregamento completo do processo além de 8 blocos;
- áudio e joystick desabilitados por padrão com
-nosounde-nojoy; - backend Softpoly solicitado com
+vid_preferbackend 2, evitando depender do renderer OpenGL para a captura da TV.
O limite se aplica aos recursos atribuíveis ao DoomCraft, não à JVM inteira do Minecraft. No Linux há limite de processo preventivo mais watchdog; no Windows e macOS há watchdog e encerramento quando o limite é detectado. Métricas de RSS e bibliotecas compartilhadas variam por sistema operacional, portanto nenhum processo externo consegue garantir contabilização idêntica em todos os sistemas.
- JDK 25 estável;
- Python 3.11 ou superior;
- Git;
- CMake;
- Ninja;
- compilador C/C++ com suporte a C++17;
- Gradle 9.5.1 para gerar inicialmente o wrapper.
O próprio pacote LZDoom fornecido cita como base nasm, autoconf, libtool, libsystemd-dev, Clang/GCC, libx11-dev, libsdl2-dev e libgtk-3-dev. Uma instalação típica é:
sudo apt update
sudo apt install -y \
git python3 cmake ninja-build build-essential clang nasm autoconf libtool \
libsystemd-dev libx11-dev libsdl2-dev libgtk-3-dev \
libopenal-dev libvpx-dev libbz2-dev zlib1g-dev libjpeg-devA lista exata pode variar conforme a distribuição e as opções do CMake.
O ZIP não distribui binários de wrapper. Com Gradle 9.5.1 instalado:
gradle wrapper --gradle-version 9.5.1Depois disso, use sempre ./gradlew no Linux/macOS ou gradlew.bat no Windows.
./gradlew verifyDoomCraftSource prepareLzDoomO código é extraído em native/work/lzdoom-l4.14.4/ e recebe apenas duas alterações:
- registro de
doomcraft_bridge.cppno CMake; - chamada
DoomCraftBridge::OnFrame(screen)depois descreen->Update().
./gradlew buildNativeA tarefa:
- baixa o ZMusic 1.1.12 do repositório oficial, se necessário;
- compila e instala o ZMusic localmente;
- configura e compila o LZDoom 4.14.4 com o bridge;
- copia executável, PK3s e bibliotecas necessárias para
src/main/resources/natives/<plataforma>/; - gera
native-manifest.txt.
Variáveis opcionais:
export DOOMCRAFT_CMAKE_GENERATOR=Ninja
export DOOMCRAFT_CMAKE_ARGS='-DUMA_OPCAO=VALOR;-DOUTRA_OPCAO=VALOR'
export DOOMCRAFT_ZMUSIC_CMAKE_ARGS='-DUMA_OPCAO=VALOR'Para usar uma instalação de ZMusic já disponível pelo sistema:
export DOOMCRAFT_SKIP_ZMUSIC=1
export DOOMCRAFT_CMAKE_ARGS='-DCMAKE_PREFIX_PATH=/caminho/do/zmusic'
./gradlew buildNative./gradlew clean buildSaída esperada:
build/libs/doomcraft-1.0.0.jar
- instale Fabric Loader 0.19.3 para Minecraft 26.2;
- coloque Fabric API 0.155.2+26.2 na pasta
mods; - coloque
doomcraft-1.0.0.jarna pastamods; - inicie o jogo uma vez;
- coloque o IWAD e eventuais PWADs em
config/doomcraft/wads/.
Executáveis nativos não são portáveis. Execute buildNative em cada sistema/arquitetura desejado:
linux-x86_64;linux-arm64;windows-x86_64;windows-arm64;macos-x86_64;macos-arm64.
Copie os diretórios produzidos para src/main/resources/natives/ e só então gere o JAR final. O carregador escolhe exclusivamente o diretório correspondente à plataforma atual.
Minecraft/Fabric
└─ DoomClientRuntime
├─ proximidade e estados
├─ DoomSession: processo nativo único
├─ arquivo de comandos atômico
├─ framebuffer RGBA atômico
└─ DynamicTexture + BlockEntityRenderer
LZDoom modificado
└─ DoomCraftBridge
├─ captura GetScreenshotBuffer()
├─ escala para 320×200
├─ SAVE/LOAD/PAUSE/RESUME/QUIT
└─ comandos de controle permitidos por allowlist
Não há JNI. Uma falha nativa não corrompe diretamente a heap da JVM.
reference/minedoom_lowpoly_crt_tv.glb é preservado como referência. O runtime usa um modelo JSON cuboidal significativamente mais leve e um quad dinâmico separado para a tela. O pipeline padrão de modelos de blocos do Minecraft/Fabric não consome GLB diretamente.
O projeto e a modificação da engine são distribuídos sob GPL-3.0-only. Consulte LICENSE e THIRD_PARTY_NOTICES.md.