This file captures migration state so work can continue safely after context compression.
- Added plan document:
PORTING.md - Added migration inventory:
PORTING_MANIFEST.md - Refactored bootstrap into modular registries:
ModBlocksModItemsModBlockEntitiesModCreativeTabs
- Added datagen framework:
- blockstates provider
- item model provider
- language provider
- block tags provider
- recipes provider
- Verified:
./gradlew compileJava -qpasses./gradlew runData --no-daemonpasses
- Registered placeholder legacy content in 1.20.1:
- 97 block IDs
- 99 item IDs
- block-items for all migrated blocks
- Added
LegacyContentRegistryIdsas source-of-truth ID list. - Copied legacy textures:
- 187 block textures into
assets/thaumcraft/textures/block - 215 item textures into
assets/thaumcraft/textures/item
- 187 block textures into
- Datagen now produces:
- 97 blockstates
- 97 block models
- 196 item models
- large language entry set for migrated IDs
- Added texture alias logic in datagen so generated models do not fall back to:
minecraft:block/stoneminecraft:item/paper
- User validated in-game:
- names/items register
- content appears in creative tab
- non-cube blocks still visually incorrect (expected at this stage)
- Added a second block-model parity batch (custom assets moved from generated placeholders to main resources) for:
alembicbellowsbrain_boxcandlecentrifugedioptraessentia_inputessentia_outputeverfull_urnloot_crateloot_urnrecharge_pedestalredstone_relaytubetube_buffertube_filtertube_onewaytube_restricttube_valve
- Added supporting custom block model resources for that batch:
- relay state variants (
redstone_relay_off,redstone_relay_on) - loot rarity variants (
loot_crate_common/uncommon/rare,loot_urn_common/uncommon/rare) - tube component models (
tube_core,tube_side,tube_side_restrict,tube_buffer_core,tube_filter_core,tube_core_valve)
- relay state variants (
- Expanded
ThaumcraftBlockStateProvider.CUSTOM_MODEL_BLOCKSto include those IDs so datagen no longer regenerates cube placeholder blockstates/models/items for this model batch. - Added property-safe blockstates for current placeholder block classes:
- static
variantsfor blocks that do not yet expose legacy state properties (facing,enabled,type) - unconditional
multipartcomposition for tube-family blocks so they render as non-cube fixtures before connectivity-property porting
- static
- Added custom block-item model JSONs for the migrated IDs so inventory/hand renders use block geometry instead of generated flat models.
- Verified after migration:
./gradlew classes -qpasses./gradlew runData --no-daemonpasses
- Added a third block-model migration batch for the remaining placeholder-heavy IDs requested in the latest parity pass:
activator_railarcane_eararcane_workbench_chargercinderpearlgolem_builderlamp_arcanelamp_fertilitylamp_growthleaflevitatormirrormirror_essentianitorpattern_crafterpillarresearch_tablesaplingshimmerleafsmelter_auxsmelter_thaumiumsmelter_ventsmelter_voidspa
- Added and wired legacy model dependencies for that batch:
- copied JSON block models (rails/ears/lamps/levitator/pattern-crafter/research-table/smelters),
- added static-safe cross/leaves/cube wrappers (
cinderpearl,shimmerleaf,sapling,leaf,nitor,mirror,mirror_essentia,spa), - added Forge OBJ model wrappers + copied OBJ/MTL assets for
arcane_workbench_charger,golem_builder,pillar.
- Expanded
ThaumcraftBlockStateProvider.CUSTOM_MODEL_BLOCKSagain so datagen no longer emits generated cube fallback blockstate/model/item files for those IDs. - Added custom main-resource blockstates + item models for the batch and removed generated collisions.
- Verified after third migration:
./gradlew classes -qpasses./gradlew runData --no-daemonpasses
- Immediate model follow-up targets:
- port block classes/properties for dynamic model states (
facing,enabled,type, tube connectivity) and then restore full legacy blockstate logic - complete remaining explicit model backlog IDs (
infernal_furnace,vishroom,smelter_basic,taint_fibre,wand_workbench) - validate runtime OBJ loader behavior for
arcane_workbench_charger,golem_builder, andpillarin-client and tune loader flags/transforms if render mismatches remain - wearable visual parity is still pending: player-worn armor and
gogglescontinue using baseline biped geometry (textures/item models are restored, custom wearable geometry is not yet ported)
- port block classes/properties for dynamic model states (
- Replaced these IDs with
BaseEntityBlockstation blocks:arcane_workbenchresearch_tablecrucibleinfusion_matrix
- Added block entities and registrations:
ArcaneWorkbenchBlockEntityResearchTableBlockEntityCrucibleBlockEntityInfusionMatrixBlockEntity
- Added generic station framework:
StationBlockStationBlockEntityTickingStationBlockEntity
- Added menu/screen stack baseline:
ModMenus+StationMenu(initial shared station container)ThaumcraftClientEvents+StationScreen(initial shared UI)
- Completed Phase 2B menu split:
- replaced shared
stationmenu with per-station menu types:arcane_workbenchresearch_tablecrucibleinfusion_matrix
- added per-station menu classes:
ArcaneWorkbenchMenuResearchTableMenuCrucibleMenuInfusionMatrixMenu
- added shared abstract base:
AbstractStationMenu
- bound each block entity to its own menu creation path
- registered per-menu screens:
ArcaneWorkbenchScreenResearchTableScreenCrucibleScreenInfusionMatrixScreen
- replaced shared
- Added first Phase 2 mechanics slice for Arcane Workbench:
- output slot is now recipe-driven from a 3x3 input grid
- taking result consumes crafting ingredients
- crafting remainders are handled using recipe manager remainder logic
- shift-click into the workbench targets input slots only (not output)
- added vis-gated arcane behavior:
- output is only craftable when chunk aura has enough vis for computed craft cost
- taking output drains vis from
AuraManager - output availability re-checks periodically while menu is open (not only on slot changes)
- added crystal slot + crystal consumption:
- dedicated crystal slot on workbench menu
- required crystal type is derived from dominant ingredient aspects
- craft output is gated by both vis availability and required crystal presence
- one crystal is consumed per successful craft
- added parity-tuning pass for generic crafting behavior:
- vis/crystal costs now apply only when crafted output belongs to
thaumcraftnamespace - non-Thaumcraft crafting no longer hard-requires vis/crystal and behaves as normal 3x3 crafting
- vis/crystal costs now apply only when crafted output belongs to
- restored arcane workbench charger vis behavior baseline:
- when
arcane_workbench_chargeris above the table, available vis now sums surrounding 3x3 chunks - vis drain now distributes across the same 3x3 chunk region instead of draining only the local chunk
- when
- Added Research Table baseline slot rules:
- slot 0 accepts
scribing_toolsonly (single-stack) - slot 1 accepts
paperonly
- slot 0 accepts
- Added Research Table theory-session baseline actions:
- new screen/menu action buttons (
Draft,Complete) routed through menu button click handling - drafting consumes paper + scribing context, spends observation knowledge, and writes persisted note totals per research category
- drafting now consumes inspiration from an active theory session (session is created on first draft with a baseline available-inspiration value)
- completing a spent-inspiration session converts note totals into theory knowledge rewards (plus highest-category bonus), then clears the session
- new screen/menu action buttons (
- Added Research Table menu/session sync baseline:
- dedicated menu data sync now mirrors theory session state to clients (active, inspiration current/start, draft count, category count, completion-ready flag)
- research table screen now gates
Draft/Completebuttons from server-synced session state and renders live session stats
- Added Crucible baseline mechanics:
- heat rises/falls based on heat-source block beneath crucible
- water can be filled by placing a water bucket in the crucible slot
- when hot + filled, input items are consumed and converted into placeholder essentia units
- state is persisted (
heat,water,essentia,cooldown) and exposed through menu activity sync (activity = heat) - crucible slot max stack size is now 1
- Added menu/container localization keys in language provider for the four stations.
- Added infusion matrix baseline structure state:
- scans pedestal layout every second (center + primary/extended ring positions)
- marks structure-ready when baseline altar shape is present
- syncs readiness into menu activity value for immediate in-game debugging
- Extended infusion matrix with pedestal ownership/capture baseline:
- maintains a deterministic owned pedestal set from detected altar layout
- pulls one item from each owned pedestal into internal persisted capture slots
- tracks source
BlockPosper captured slot and returns items to pedestal or drops them if ownership/structure changes
- Added infusion cycle state-machine scaffold:
- cycle start is requested by placing an item in matrix slot (
MATRIX_SLOT) - while active, cycle drains vis periodically from local chunk aura
- low-vis or broken structure aborts the cycle and adds flux penalty
- cycle completion now consumes matrix/captured ingredients and emits a result on the center pedestal (placeholder output baseline)
- cycle start is requested by placing an item in matrix slot (
- Added initial infusion stability hooks:
- stability score is computed from altar layout symmetry and pedestal coverage
- active cycles roll periodic instability failure checks using effective stability
- failed instability checks now spill captured items, add flux, and abort the cycle
- Promoted
pedestalfrom placeholder block to functional block entity:- single-slot persisted inventory (
PedestalBlockEntity) - right-click interaction to place/retrieve one item
- item drops on block break
- single-slot persisted inventory (
- Verified:
./gradlew compileJava -qpasses./gradlew runData --no-daemonpasses
- User validated in-game:
- all four station tile entities open
- shift-click into top slot works
- tick/activity bars are visible and updating
- Added persistent aura chunk data model:
AuraChunkData(base,vis,flux, clamped values)
- Added dimension save integration:
AuraSavedData(ForgeSavedData, per-chunk NBT storage)
- Added aura API facade:
AuraManager(getBase/getVis/getFlux,addVis/addFlux,drainVis/drainFlux)- auto-creates missing chunk aura entries with baseline defaults (
base=200,vis=200,flux=0)
- Added initial aspect scaffolding:
AspectTypeenum for core/practical aspect keysAspectListvalue container with optional NBT read/write helpersAspectRegistrywith exact-item overrides and path/trait fallback heuristics
- Expanded data-driven aspect selector support:
AspectObjectRegistrynow supports strictpath_contains_allmatching in addition to exact item/tag/path-any selectors
- Imported a large parseable subset of legacy
ConfigAspectsinto data:- generated
data/thaumcraft/thaumcraft/aspects/legacy_config_aspects.json - includes 18 exact Thaumcraft item mappings and 80 strict legacy path rules
- removed duplicate broad
path_contains_anyfallback rules frombase.jsonto avoid double-counting with the imported legacy rules
- generated
- Added first Salis Mundus trigger scaffold:
- right-clicking a vanilla crafting table with
salis_mundusconverts it intoarcane_workbench
- right-clicking a vanilla crafting table with
- Expanded Salis Mundus simple triggers with progression gating:
- bookshelf grants
thaumonomiconand unlocks first Salis/knowledge state - crafting table conversion to
arcane_workbenchnow requires unlocked baseline knowledge - cauldron conversion to
cruciblenow requires unlocked baseline knowledge
- bookshelf grants
- Added first-pass Salis Mundus multiblock trigger handling:
infusion_matrix+ stone ring now assembles baseline infusion altar pieces (pillarcorners + centerpedestal)crucible+metalstack now assemblesthaumatorium+thaumatorium_top- infernal furnace blueprint baseline now converts valid lava-core structures into
infernal_furnace - golem press blueprint baseline now converts valid piston-core structures into
golem_builder(with iron bars cap)
- Added player knowledge persistence baseline:
PlayerKnowledgeSavedDatastores per-player unlock flags, scanned blocks, and discovered aspectsPlayerKnowledgeManagerprovides server-side read/write API
- Added first thaumometer scan hook:
- right-click block with thaumometer to record scan and discover aspect tags from scanned block item
- scan usage is currently gated behind Salis Mundus unlock baseline
- Expanded thaumometer scan surfaces:
- added entity scan hook (
EntityInteract) with spawn-egg/fallback aspect derivation - added item scan hook (
RightClickItem) for offhand item scanning while holding thaumometer - extended
PlayerKnowledgeSavedDatato persist unique scanned item/entity IDs in addition to block IDs - added
PlayerKnowledgeManagerAPIs for item/entity scan recording
- added entity scan hook (
- Wired crucible processing into aura:
- each processed crucible input now adds a small amount of chunk flux
- Wired crucible baseline processing into aspects:
- item essentia gain now comes from
AspectRegistrytotal values instead of generic per-item placeholder math
- item essentia gain now comes from
- Notes:
- this is persistence/API scaffolding, not final aura simulation behavior
- legacy aspect coverage is now substantially expanded but not complete; direct vanilla
ItemStack(...)mappings and final parity review still remain - aura generation curves, regen, spread, and flux events are still pending
- Added registered
warp_wardmob effect scaffold:- new effect type + registry (
ModMobEffects,WarpWardMobEffect) - mod bootstrap now registers mob effects during startup
- new effect type + registry (
- Updated purifying fluid behavior toward legacy parity:
- touching purifying fluid now grants
warp_ward - ward duration baseline now scales from permanent warp (
min(32000, 200000 / sqrt(permanent_warp_or_1))) - source block is consumed after ward application
- touching purifying fluid now grants
- Expanded warp debug command tooling:
/thaumcraft debug warp add <pool> <amount>/thaumcraft debug warp set <pool> <value>/thaumcraft debug warp clear [pool]/thaumcraft debug warp counter set|reset- added direct warp setters in player knowledge data/manager for test/debug flows
- Extended baseline warp ticker toward legacy Warp Ward interaction:
- warp ticker now skips event accumulation/rolls while
warp_wardis active - temporary warp now decays by
1every2000ticks when the player is not warded
- warp ticker now skips event accumulation/rolls while
- Extended baseline warp ticker cadence/probability toward legacy
checkWarpEvent:- warp checks now run every
2000ticks (legacy cadence shape) instead of per-second threshold accumulation - event trigger chance now rolls from
sqrt(warp_counter)(0-99 roll), with effective-warp scaling and legacy-shaped counter decay floor (max(5, sqrt(counter) * 2))
- warp checks now run every
- Extended baseline warp ticker with legacy-shaped gear and research-unlock hooks:
- warp event effective total now includes warping gear from main-hand + armor (plus legacy
TC.WARPitem NBT support) - baseline warping values are now wired for
void_*tools/armor,void_robe_*,crimson_blade, andprimal_crusher - warp counter decay now follows legacy-shaped gear pressure (
max(5, sqrt(counter) * 2 - gearWarp * 2)) - player knowledge now persists baseline research keys and warp progression unlocks legacy keys (
!BATHSALTS,ELDRITCHMINOR,ELDRITCHMAJOR) - player-knowledge load now migrates old milestone tags (
bath_salts_hint,eldritch_minor,eldritch_major) into those research keys for compatibility - player knowledge now persists baseline research stage/flag scaffolding (
stage,PAGE/RESEARCH/POPUP) keyed by research id - warp-triggered research unlocks now set baseline legacy-shaped research flags (
RESEARCH, plusPOPUPon!BATHSALTS) /thaumcraft debug warpnow prints gear warp totals and research-key states for validation
- warp event effective total now includes warping gear from main-hand + armor (plus legacy
- Added baseline research debug command tooling:
/thaumcraft debug research/thaumcraft debug research list/thaumcraft debug research unlock|remove <key>/thaumcraft debug research stage <key> [value]/thaumcraft debug research flag set|clear|check <key> <flag>
- Added baseline research knowledge-point scaffolding:
- player knowledge now persists legacy-shaped knowledge totals by type (
THEORY,OBSERVATION,EPIPHANY) with category-aware storage for fielded types - knowledge debug tooling added under
/thaumcraft debug research knowledge(list,get,add,set) with raw + projected points output
- player knowledge now persists legacy-shaped knowledge totals by type (
- Wired first gameplay gain path for research knowledge:
- thaumometer first-time scans now grant baseline observation raw across core research categories (
BASICS,THAUMATURGY,ALCHEMY,ARTIFICE,GOLEMANCY,ELDRITCH) - scan flow now grants baseline epiphany raw when a scan discovers new aspects
- thaumometer first-time scans now grant baseline observation raw across core research categories (
- Added dedicated cultist/crimson warping armor baselines:
crimson_bootsnow maps toCultistBootsItem(warp1, uncommon rarity, iron-ingot repair parity baseline)crimson_robe_chest/crimson_robe_helm/crimson_robe_legsnow map toCultistRobeArmorItem(warp1, uncommon rarity, iron-ingot repair parity baseline)- removed temporary fallback mapping for crimson armor warp in
WarpGearManagernow that dedicated classes exist
- Added vis-discount gear baseline scaffolding and first gear mappings:
- new
VisDiscountGearItem+VisDiscountManagercollect armor vis-discount values (legacy-shaped baseline, armor-only for now) - added dedicated
GogglesItembaseline with vis discount5 - added dedicated
RobeArmorItembaseline and mappedcloth_*to legacy-shaped discounts (boots=2,chest/legs=3) VoidArmorItemnow carries vis-discount value;void_robe_*mapped to discount5whilevoid_*remains0- cultist/crimson armor classes now provide vis-discount
1(boots + robe pieces)
- new
- Extended arcane workbench vis flow toward legacy parity:
- workbench vis spend now applies player-specific vis discount at craft-take time
- workbench preview/result gating now no longer hard-hides output on raw vis shortage; final pickup validation uses discounted vis for the taking player
- Expanded warp debug tooling:
/thaumcraft debug warp gearnow shows per-slot warp breakdown (main hand + armor), which improves parity validation when porting additional warping equipment
- Expanded vis debug tooling:
/thaumcraft debug vis discountnow shows total armor discount and per-slot discount contributions
- Added dedicated
bath_saltsitem class baseline:- dropped entity lifespan now matches legacy quick-expire behavior (
200ticks) - expired bath salts now convert source water blocks and full water cauldrons into
purifying_fluidplaceholders
- dropped entity lifespan now matches legacy quick-expire behavior (
- Promoted
spafrom placeholder block to functional baseline block entity:- accepts water buckets into internal water storage (
5000max) and acceptsbath_saltsas consumable input - every
40ticks (when not redstone-powered), consumesbath_salts+ water (1000) to place/spreadpurifying_fluid - supports first-pass spread behavior around existing purifying-fluid cells in a 5x5 area above the spa
- accepts water buckets into internal water storage (
- Extended spa baseline with initial legacy mix/non-mix behavior:
- shift-right-click with empty hand toggles spa mix mode
- non-mix mode can consume loaded fluid directly (
water,bucket_pure,bucket_death) for placement/spreading - empty bucket extraction now returns the loaded fluid as the corresponding bucket item
- Added quartz-sliver catalyst migration baseline toward nugget parity:
- registered split-ID nugget variants (
nugget_brass,nugget_copper,nugget_iron,nugget_lead,nugget_quartz,nugget_quicksilver,nugget_silver,nugget_thaumium,nugget_tin,nugget_void) - moved quartz catalyst canonical path to
thaumcraft:nugget_quartz - retained
thaumcraft:quartz_slivercompatibility inthaumcraft:catalysts/quartz_slivers - updated quartz conversion recipes so quartz recombination accepts the catalyst tag and added legacy-to-canonical migration recipe (
quartz_sliver->nugget_quartz) - mirrored quartz nugget aspect mapping so catalyst dissolution behavior remains consistent
- registered split-ID nugget variants (
- Restored armor/goggle model asset baseline:
- imported legacy armor render textures into
assets/thaumcraft/textures/models/armor - added explicit armor texture routing per armor family (
thaumium,void,void_robe,cloth_robe,cultist,fortress,traveller,goggles) to replace vanilla-material placeholder renders - added legacy armor/goggle item model JSONs in main resources (including multi-layer robe/void-robe overlays)
- updated item-model datagen to skip custom armor/goggle ids and removed generated duplicates to avoid resource copy collisions
- imported legacy armor render textures into
- Verified:
./gradlew compileJava -qpasses./gradlew classes -qpasses./gradlew runData --no-daemonpasses
- Phase 0: Foundation + migration map (complete)
- Phase 1: Blocks/items in-game textured baseline (complete baseline, visual fidelity still pending)
- Phase 2: Functional block entities + menus/screens for core stations
- Phase 3: Core progression systems (aspects, aura, salis mundus/scanning)
- Phase 4: Alchemy + essentia pipeline
- Phase 5: Infusion system
- Phase 6: Research + Thaumonomicon UX
- Phase 7: Remaining systems + polish
- Continue variant-container parity after quartz catalyst migration:
- design canonical
thaumcraft:nuggetssubtype/data-component model and migration path from split-ID baseline - expand the same split-ID-to-variant strategy to other containers (
ingots,plate,gear) or move directly to unified component-backed containers - retire
thaumcraft:quartz_slivercompatibility item once save/datapack migration handling is in place
- design canonical
- Continue armor visual parity after texture/model-asset pass:
- port custom equipped-geometry layers for robe/fortress/leader/goggles families (1.20.1 equivalents of legacy
ModelRobe/ModelFortressArmor/ModelLeaderArmor) - restore robe/void-robe tint + overlay behavior parity on equipped models (beyond current baseline texture routing)
- port custom equipped-geometry layers for robe/fortress/leader/goggles families (1.20.1 equivalents of legacy
- Finalize bath-salts + spa parity audit against legacy behavior:
- validate exact conversion surfaces (source-water/cauldron expectations) and tune to intended TC6 semantics
- port full spa UI/container interactions and fluid capability parity beyond the current baseline counters model
- Extend Warp Ward integration beyond current baseline:
- add localization/icon/UX polish for
warp_ward - expand current key/stage/flag/knowledge scaffolding into full research progression parity (auto-unlock graph + real theorycraft card draw/aid selection + stage reward consumption)
- expand remaining legacy warp parity (full event table, client FX/audio/sync, and accessory-slot warp sources)
- add localization/icon/UX polish for
- Continue research table parity after session baseline:
- expand client sync from current session counters to full note/card payloads (drawn choices, selected card, aid mutators, blocked categories)
- implement legacy card-choice draw/activate flow and surrounding-aid discovery/selection hooks
- Continue armor parity after cultist warp baseline:
- add remaining non-baseline vis-discount sources (baubles/curios equivalents and any item NBT-driven modifiers)
- port cultist/void/fortress model + texture parity and set/slot behavior
- Continue arcane workbench parity after vis-discount baseline:
- move preview/cost state to per-menu-player context for multi-viewer parity
- refine charger-area drain policy against legacy edge cases (chunk preservation/drain order tuning)
- tune vis/crystal balance and exact recipe parity against legacy arcane recipe definitions
- Finish remaining
ConfigAspectsmigration gaps:- map non-parseable direct vanilla
ItemStack(...)object tags and audit imported rule parity against legacy behavior
- map non-parseable direct vanilla
- Extend Arcane Workbench from vanilla crafting to arcane crafting constraints:
- crystal/vis cost parity tuning against legacy behavior
- Port remaining Salis Mundus trigger parity from legacy dust triggers:
- complete variant/semantic parity (
infusionancient/eldritch material variants and legacy placeholder transformation behavior)
- complete variant/semantic parity (
- Implement infusion recipe resolution:
- add infusion recipe type/serializer and bind cycle outputs to real recipe matching
- expand instability events beyond item spill + flux baseline (effects and broader failure outcomes)
- Expand thaumometer/scanning beyond block-right-click baseline:
- proper scan UI/feedback
- tie discoveries into research unlock graph
- High visual/model fidelity backlog:
infusion_matrix,pedestal,jar_normal,jar_void,jar_brain,alembic,tube*,bellows,dioptra,mirror,thaumatorium_top. - Alchemy chain backlog: crucible recipes, alembic extraction, jar storage semantics, smelter/centrifuge flows, thaumatorium recipe processing.
- Transport/network backlog: tube routing rules, suction/priority logic, input/output node behavior, mirror essentia transfer.
- Progression/data backlog: aspect registry, player knowledge/warp persistence, research tree loading/unlocks, Thaumonomicon pages/navigation.
- This environment may require escalated runs for Gradle wrapper lock access.
- Avoid parallel Gradle tasks; run compile/datagen sequentially.
- Existing legacy textures rarely match direct ID names exactly; alias mapping is required.
- Datagen duplicate file conflicts can occur if same asset exists in both main and generated resources.
- Keep placeholder implementation simple and stable first; fidelity can come after mechanics.
- Forge API event names vary by patchline;
FMLClientSetupEvent+MenuScreens.registerwas compatible here, whileRegisterMenuScreensEventwas not.