Jacobwasbeast f5805fc740 Fix mod item names by injecting strings directly into game's StringTable
CMinecraftApp::GetString is inlined by the MSVC linker at call sites like
Item::getHoverName, so the MinHook-based GetString hook never fires for
item name lookups. The game's StringTable::getString(int) does a simple
vector index lookup, and mod IDs (10000+) are beyond the vector size,
returning empty strings.

Fix: parse the GetString function's x64 machine code before hooking to
locate the RIP-relative reference to app.m_stringTable, then after mods
register their strings, resize m_stringsVec and inject mod strings at the
correct indices. Also adds GetString fallback to CConsoleMinecraftApp
variant and diagnostic logging.
2026-03-06 23:20:31 -06:00

LegacyForge

An SKSE-style mod loader for Minecraft Legacy Edition. LegacyForge injects into the game process at runtime, hooks key engine functions, and hosts the .NET runtime to load C# mods. Zero game source modifications required.

How It Works

  1. LegacyForge.exe launches the game in a suspended state and injects LegacyForgeRuntime.dll
  2. The runtime DLL uses PDB debug symbols to locate game functions (MinecraftWorld_RunStaticCtors, Minecraft::tick, etc.)
  3. MinHook detours those functions to insert mod lifecycle callbacks
  4. The .NET CoreCLR runtime is hosted inside the game process via hostfxr
  5. LegacyForge.Core discovers and loads C# mod assemblies from the mods/ folder
  6. Mods use the LegacyForge.API to register blocks, items, entities, and subscribe to game events using Fabric-style namespaced string IDs

Project Structure

ModLoader/
├── LegacyForge.Launcher/       C# launcher (the exe users run)
├── LegacyForgeRuntime/          C++ DLL (injected into game process)
├── LegacyForge.Core/            C# mod management (loaded inside game)
├── LegacyForge.API/             C# mod API (what mod authors reference)
└── ExampleMod/                  Sample mod for reference

Building

Prerequisites

  • Visual Studio 2022 or later (with C++ and .NET workloads)
  • .NET 8.0 SDK or later
  • CMake 3.24 or later
  • The game must be compiled with PDB generation

Build Steps

C++ Runtime DLL:

cd LegacyForgeRuntime
cmake -B build -A x64
cmake --build build --config Release

C# Projects:

dotnet build LegacyForge.sln

Usage

  1. Build LegacyForge (see above)
  2. Copy the output files to a folder:
    • LegacyForge.exe
    • LegacyForgeRuntime.dll
    • LegacyForge.Core.dll
    • LegacyForge.API.dll
  3. Create a mods/ folder and drop mod DLLs in it
  4. Run LegacyForge.exe -- it will ask for the game exe path on first launch
  5. The game starts with mods loaded

Writing a Mod

Create a new .NET 8 class library and reference LegacyForge.API:

using LegacyForge.API;

[Mod("mymod", Name = "My Mod", Version = "1.0.0", Author = "You")]
public class MyMod : IMod
{
    public void OnInitialize()
    {
        var myBlock = Registry.Block.Register("mymod:cool_block",
            new BlockProperties()
                .Material(MaterialType.Stone)
                .Hardness(2.0f)
                .Resistance(10f));

        Logger.Info("My Mod loaded!");
    }
}

Build it, copy the DLL to mods/, and launch via LegacyForge.

License

MIT

Description
A mod loader for the Minecraft Legacy Console Edition.
Readme MIT 767 KiB
Languages
C++ 72.6%
C# 26.8%
CMake 0.6%