PORTING_MEMORY.mdPORTING.mdPORTING_MANIFEST.md
- Breadth-first first, depth second.
- Keep IDs stable first, then implement behavior.
- Avoid deep rewrites early; get full registry coverage across all systems before polishing internals.
[ ]not started[-]in progress / partial[x]complete
Goal: build a reliable map of everything that must exist in 1.20.1.
Checklist:
- Scan old code structure and main entrypoints.
- Enumerate block and item registrations from code annotations.
- Enumerate fluid, sound, enchantment, entity, and recipe registries.
- Enumerate tile entities, containers, GUIs, and major event handlers.
- Enumerate network/RPC/sync custom registries.
- Enumerate capabilities, commands, advancements, loot injections, villager/game-rule hooks.
- Create and populate
PORTING_MEMORY.md. - Create and populate
PORTING_MANIFEST.md.
Deliverables:
PORTING_MEMORY.mdPORTING_MANIFEST.mdPORTING.md(this file)
Goal: all major registry objects exist in 1.20.1 with canonical IDs, even if behavior is minimal.
Checklist:
- Create/verify central mod bootstrap wiring in current 1.20.1 project.
- Create deferred registers (or equivalent) for:
- Blocks
- Items
- Creative mode tab
- Fluids + fluid type + bucket
- BlockEntityType
- EntityType
- SoundEvent
- Enchantment
- MenuType
- RecipeSerializer (custom recipes)
- Recreate all legacy block IDs (from manifest) as stubs/placeholders where needed.
- Recreate all legacy item IDs (including meta-item strategy replacement plan).
- Recreate all legacy entity IDs as registered entity types.
- Recreate all legacy sound IDs in code/data.
- Establish compatibility mapping plan for old IDs/legacy names.
- Generate asset scaffolding for blockstates/models/lang so registry visibility can be verified quickly.
- Replace placeholder stone/iron assets with legacy texture-backed block/item models for all currently registered IDs.
- Ensure datagen run path works for this project workflow (
./gradlew compileJava runData).
Exit criteria:
- Project compiles with all primary registries present.
- No missing references for canonical IDs in code.
Goal: every registered object has minimum data assets so the game loads cleanly.
Checklist:
- Blockstates for all registered blocks.
- Item models for all registered items.
- Language entries for all objects.
- Sound definitions (
sounds.json) aligned with code registrations. - Basic loot tables where required.
- [-] Basic recipes (or temporary placeholders) for each craftable feature.
- Tags needed for gameplay parity and compatibility.
- Cross-check that each registered block/item ID has matching model/lang assets.
Exit criteria:
- Data generation/resources run without missing-model or missing-lang spam for core objects.
Validation log:
-
./gradlew compileJavasucceeds after registry + asset changes. -
./gradlew compileJava runDatasucceeds (as of 2026-02-08) after isolating datagen runs from optionalextra-mods-1.20.1jars. - Added initial non-full-block render/collision parity pass for legacy-style models (cutout/translucent setup + custom voxel/collision shapes) and revalidated with
./gradlew compileJava runDataon 2026-02-08. - Added datagen wiring and generated 41 self-drop block loot tables under
src/generated/resources/data/open_blocks/loot_tables/blocks(validated with./gradlew compileJavaand./gradlew runDataon 2026-02-08). - Added baseline block tags via datagen (
minecraft:mineable/pickaxe,minecraft:needs_stone_tool, andminecraft:climbablefor ladder/rope_ladder/scaffolding) and revalidated with./gradlew compileJava+./gradlew runDataon 2026-02-08. - Added placeholder JSON definitions for all 7 legacy custom recipes under
src/main/resources/data/open_blocks/recipes(types only; behavior parity still pending) and revalidated with./gradlew compileJava runDataon 2026-02-08. - Added legacy ID compatibility remap hook in
OBMissingMappings(namespace remapopenblocks/OpenBlocks->open_blocks, plus legacy alias paths including camelCase/lowercase variants) and revalidated with./gradlew compileJava runDataon 2026-02-08. - [-] Added a mechanical legacy-recipe conversion baseline: 185 shaped/shapeless legacy recipes from
old-1.12.2/assets/openblocks/recipesnow ported tosrc/main/resources/data/open_blocks/recipes/legacy(metadata collapsed to 1.20-safe item IDs and ore-dict ingredients translated toopen_blocks:legacy_ore_dict/*item tags backed by baseline vanilla values);openmods:enchantingrecipes are now handled by the dedicatedflim_flam_bookcustom serializer path, validated with./gradlew compileJava runDataon 2026-02-08. - Replaced legacy
openmods:enchantingflim-flam recipe family with a 1.20 custom crafting recipe serializer (open_blocks:flim_flam_book) that recreates level scaling from emerald count (1-4), validated with./gradlew compileJava runDataon 2026-02-08. - [-] Added systems skeleton for legacy command IDs (
flimflam,luck,ob_inventory) and custom advancement triggers (open_blocks:brick_dropped,open_blocks:dev_null_stacked) with 1.20 wiring;luckis capability-backed,ob_inventoryhas a file-backed inventory dump pipeline (main + built-in sub targets + death dumps), andflimflamnow executes a breadth-stage effect registry for all 17 legacy IDs, validated with./gradlew compileJava runDataon 2026-02-09. - [-] Added capability skeleton for legacy player capability IDs (
open_blocks:luck,open_blocks:pedometer_state,open_blocks:bowels) with registration + attach + clone-copy persistence, and switched/luckcommand state to capability-backed storage, validated with./gradlew compileJava runDataon 2026-02-09. - Expanded legacy ore-dict compatibility tags in
src/main/resources/data/open_blocks/tags/items/legacy_ore_dictfrom single-item placeholders to broaderforge/minecrafttag membership across 34 files, validated with./gradlew compileJava runDataon 2026-02-09. - [-] Added initial gameplay event hooks for custom triggers/capability bridge in
OBAdvancementHooks(tasty_clayconsume -> bowels +1, brick toss ->brick_droppedwith bowels decrement, periodic dev-null depth approximation ->dev_null_stacked), and updated item properties for parity (tasty_clayedible,dev_null/generic_unstackableunstackable), validated with./gradlew compileJava runDataon 2026-02-09. - [-] Expanded bowels parity hooks with death-drop behavior in
OBAdvancementHooks(LivingDropsEvent: drop up to 16 bricks from stored bowels count, then clear), and updated clone behavior inOBCapabilitiesto not copy bowels on death clones, validated with./gradlew compileJava runDataon 2026-02-09. - [-] Added initial pedometer movement sampling hook:
OBAdvancementHooksnow ticksOBCapabilities.PedometerStateon server player ticks when a pedometer exists in hotbar while tracking is active, andOBItems.PEDOMETERis now unstackable for baseline parity, validated with./gradlew compileJava runDataon 2026-02-09. - [-] Added explicit pedometer item-flow scaffold via new
OBPedometerItem(right-click starts tracking, sneak-right-click resets, right-click while running prints report lines), expandedOBCapabilities.PedometerStatereport math helpers, switched pedometer sampling to run only while state is running, and added legacy pedometer message keys toen_us.json, validated with./gradlew compileJava runDataon 2026-02-09. - [-] Replaced
/ob_inventoryplaceholder responses with a working breadth-stage dump backend (OBInventoryStore):storewrites compressedinventory-*.datfiles under worlddata/,restoreloads main inventory data back to players, andspawndrops stored main inventory stacks (with optional slot), validated with./gradlew compileJava runDataon 2026-02-09. - [-] Replaced
/flimflamplaceholder responses with executable breadth-stage effect actions via newOBFlimFlamEffects(all legacy command effect IDs wired to thin server-side behaviors: inventory shuffle/disarm, potion/sound/entity prank effects, encase/skyblock, etc.), validated with./gradlew compileJava runDataon 2026-02-09. - [-] Expanded
/ob_inventorybreadth parity: dumps now include sub-inventory payloads (armor,offhand,ender_chest) with target-aware spawn/restore handling, and added automatic death-time inventory dump storage viaOBInventoryHooksto command-consumableinventory-*.datfiles, validated with./gradlew compileJava runDataon 2026-02-09. - [-] Added legacy-style inventory subsystem event bridge (
OBInventoryEvent):/ob_inventory storenow captures arbitrary event-provided sub-inventory payloads into dumpSubInventories,/ob_inventory restorenow publishes the decoded payload map back to listeners, and command target suggestions/spawn support now include serialized dynamic subsystem keys, validated with./gradlew compileJava runDataon 2026-02-09. - [-] Added grave gamerule + backup dump breadth skeleton: registered legacy-style gamerule key
openblocks:spawn_graves(OBGameRules), addedOBGraveHooksdrop-time backup dumps (type=grave) gated bykeepInventory+ gamerule state, and extendedOBInventoryStorewith drop-list dump writes, validated with./gradlew compileJava runDataon 2026-02-09. - [-] Deepened grave parity from backup-only to place+claim baseline: added dedicated grave block/entity wiring (
OBGraveBlock,OBGraveBlockEntity), upgradedOBGraveHooksto search/place graves and bind dump IDs on death, and extendedOBInventoryStorewith grave-claim helpers (readDroppedItems,deleteDump); successful grave placement now clears world drops and grave interaction now restores stored loot + removes the grave, validated with./gradlew compileJava runDataon 2026-02-09. - [-] Deepened grave parity with action-filter + interaction pass: added legacy-style
OBGraveDropsEvent(STORE/DROP/DELETE) and wiredOBGraveHooksto post/filter drop actions before storage/placement, plus grave interaction now shows stored death message on normal use and requires shovel-action interaction to claim loot from placed graves, validated with./gradlew compileJava runDataon 2026-02-09. - Fixed client-side fluid texture crash path for
open_blocks:xpjuiceby wiring explicitIClientFluidTypeExtensionsstill/flowing texture keys inOBFluidTypes(prevents null texture lookups in third-party tank item renderers such as Mekanism creative fluid tanks), validated with./gradlew compileJava runDataon 2026-02-09. - [-] Started block-functionality depth sweep for legacy non-GUI blocks:
healnow uses a dedicated ticking block entity aura (OBHealBlock+OBHealBlockEntity) that applies regeneration/saturation to nearby non-creative players every second,pathnow enforces support-below survival and self-drops when support is removed (OBPathBlock), andspongenow performs periodic radius liquid cleanup with lava burn fallback and border-fluid wake-up on removal (OBSpongeBlock), validated with./gradlew compileJava runDataon 2026-02-09. - [-] Continued block-functionality depth sweep for ladder domain:
laddernow enforces north-face support survival (OBLadderBlock), andrope_laddernow supports chain survival (support block or ladder above), auto-extends downward on placement while consuming held stack count in survival, and cascades removal down the chain (OBRopeLadderBlock), validated with./gradlew compileJava runDataon 2026-02-09. - [-] Continued block-functionality depth sweep for elevator domain:
elevatornow has baseline teleport flow (OBElevatorBlock) using right-click for upward travel and sneak-right-click for downward travel with travel/blocker limits and safe destination checks, whileelevator_rotatingnow extends this flow (OBElevatorRotatingBlock) with facing-based arrival yaw alignment; both are wired inOBBlocks, validated with./gradlew compileJava runDataon 2026-02-09.
Goal: recreate cross-cutting systems in thin form before deep feature parity.
Checklist:
- Replace old GUI/container flow with modern menu/screen flow.
- [-] Rebuild capability equivalents (player/entity state).
- Rebuild networking layer for events/RPC replacements.
- [-] Rebuild advancement trigger plumbing.
- [-] Rebuild command registration.
- Rebuild loot injection strategy.
- Rebuild villager/trade registration strategy.
- [-] Rebuild game rule registration strategy.
- [-] Rebuild world data persistence equivalents (map data, grave data dependencies, etc).
Exit criteria:
- Server and client run with all major systems wired (even if behavior is simplified).
Goal: move from "exists" to "works correctly".
Suggested order:
- [-] Transportation/domain: elevators, rope ladder, hang glider, crane/magnet
- [-] Storage/domain: tanks, xp systems, vacuum hopper, donation station
- Utility/domain: block breaker/placer/dropper, auto anvil/enchantment table
- Visual/domain: canvas/paint/stencil/glyph/projector/sky block
- Entity/domain: luggage/cartographer/mini-me/golden eye/etc
- Fun/domain: trophies, flim-flam, dev null, pedometer, sounds/effects
Per-feature checklist template:
- Registration complete
- Data assets complete
- Interaction logic complete
- Networking/state sync complete
- Save/load complete
- Basic test pass complete
Goal: stabilize and protect the port.
Checklist:
- Validate old-world migration behavior where practical.
- Revisit legacy ID mapping/remap behavior.
- Add regression tests for critical gameplay flows.
- Multiplayer sanity pass.
- Performance pass for heavy systems (render/network/tick).
- Cleanup dead stubs and document final architecture.
- Have user run a quick in-game visual sweep (no
runClienton agent side) to confirm the latest transparency/collision changes removed purple-black model regressions and face-culling issues. - Extend recipe coverage beyond custom special recipe placeholders (core craft paths for major blocks/items).
- Deepen
/flimflamparity beyond current breadth-stage action wiring:- reconnect legacy luck/cost/weight and safe/blacklist gating behavior
- tune per-effect details from thin stubs toward legacy-accurate behavior
- Deepen
/ob_inventoryparity beyond current built-in + event-bridge baseline:- add first concrete subsystem consumers/producers for
OBInventoryEventpayloads (legacy-style arbitrary subsystem parity in practice, not just schema support) - reconnect gravestone/inventory-backend integrations to reuse the dump pipeline (grave placement + claim now wired; subsystem-specific restore UX and backend consumers still pending)
- add first concrete subsystem consumers/producers for
- Deepen grave parity from current place+claim skeleton:
- expand
OBGraveDropsEventparity beyond current action filtering (hook concrete listeners/producers and mirror more legacy filtering/consumption flows) - carry richer grave metadata/behavior (owner restrictions, richer death-message formatting, base-placement/facing details) into block/entity state
- harden grave placement edge-cases (destructive fallback policy, cross-dimension guarantees, failure-path UX/messages)
- expand
- Replace capability placeholders with gameplay hooks:
pedometer_state: expand from current explicit start/reset/report baseline to deeper parity (client-side speed property behavior + legacy unit/readout polish)bowels: expand from current tasty-clay + brick-toss + death-drop hooks to full legacy behavior parity (keybound brick-drop path + sound/stat nuances)luck: reconnect full flim-flam cooldown and forced-trigger logic (currently just raw value storage)
- Wire custom advancement triggers into gameplay events:
- replace temporary hooks with legacy-accurate trigger sources (
brick_droppedfrom boo/brick action path,dev_null_stackedfrom nested dev-null inventory depth)
- replace temporary hooks with legacy-accurate trigger sources (
- Finish legacy recipe migration for skipped recipe files:
- revisit metadata-collapsed conversions to restore accurate color/subtype behavior where needed (generic/meta items, paintbrush variants, elevator/flag color outputs, etc.)
- Continue block functionality sweep (depth pass order):
- elevator/elevator_rotating: deepen from current right-click baseline to legacy movement-trigger + color-match parity (jump/sneak trigger path, dye/recolor integration, configurable pass-through/xp-cost rules)
- rope_ladder/scaffolding/ladder: complete orientation/collision parity and scaffolding-specific behavior now that baseline survival/extension is wired
- xp_drain/xp_shower/xp_bottler + tank: fluid/xp transfer behavior and interaction flow
- block_breaker/block_placer/item_dropper + auto_anvil/auto_enchantment_table: tick/work cycles and inventory IO