Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
95 changes: 95 additions & 0 deletions TODO-26.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Farmer's Delight 26.2 Port TODO

Current state observed on 2026-07-27:

- `./gradlew.bat compileJava` succeeds with the core source tree and JEI included.
- `./gradlew.bat build` succeeds with the core source tree, JEI compile API, AppleSkin compile API, and the current temporary integration excludes.
- `./gradlew.bat runClientData` succeeds through scoped generated `data` preservation, the fully re-ported 26.2 `BlockStates` provider, the 26.2 `ItemModels` provider, and `SoundDefinitions`.
- `./gradlew.bat runServerData` succeeds through scoped generated `assets` preservation after changing cooking-pot tag ingredients to serialize unresolved tag references and adding canvas wall-sign loot tables.
- `./gradlew.bat runGameTestServer` succeeds in the dev environment.
- `./gradlew.bat runServer` reaches the dedicated server `Done` state in the dev environment after removing a common-load dependency on client-only `RecipeUtils` from `RegistryAliases`.
- `./gradlew.bat runClient` reaches client resource startup with only Farmer's Delight installed; the latest smoke reaches OpenAL and block-atlas creation with no Farmer's Delight item-model parse errors or Farmer's Delight missing-texture warnings.
- `./gradlew.bat runServer -Pfd.serverWorld=fd_only_smoke` creates a fresh dedicated server world with only Farmer's Delight installed and reaches the server `Done` state.
- The built jar is `build/libs/FarmersDelight-26.2-1.3.2.jar`; jar inspection confirms generated resource cache files are excluded.
- CurseForge `Test 26.2` world-load failure from `latest.log` was traced to `FoodServingRecipe` failing NeoForge recipe-content sync; fixed the stateless custom recipe stream codecs for `FoodServingRecipe` and `DoughRecipe`, rebuilt, and copied the jar into the test instance for retesting.
- Canvas sign block models now use 26.2-style square block textures instead of the old 64x32 sign entity sheets, fixing misplaced/stretched placed-sign textures.
- `build.gradle` currently excludes only `vectorwing/farmersdelight/integration/emi/**` and `vectorwing/farmersdelight/integration/crafttweaker/**`, because the checked Maven coordinates do not provide usable 26.2-compatible APIs yet.
- AppleSkin was updated to `squeek.appleskin:appleskin-neoforge:mc26.2-3.0.10`; its API resolves for compilation, and its dev runtime is opt-in with `-Pfd.includeAppleSkinRuntime=true` so default smoke runs stay Farmer's Delight-only.
- Old EMI/CraftTweaker coordinates are opt-in with `-Pfd.includeUnavailableIntegrations=true` for future port work; default builds no longer resolve 1.21-era optional integration APIs.

## Must Fix Before Release

- [ ] Remove the remaining temporary Java source excludes from `build.gradle` and make EMI/CraftTweaker compile once usable 26.2 APIs exist.
- [x] Replace `ExistingGeneratedResources` with real datagen coverage; client/server datagen now only preserve the opposite generated pack while sharing `src/generated/resources`.
- [x] Re-port the rest of `BlockStates` to the 26.2/NeoForge client model datagen APIs.
- [x] Re-port simple opaque block families with byte-stable generated output: rice bag, rice bale, crop crates, straw bale, rich soil, rich soil farmland, and organic compost.
- [x] Re-port existing-model and horizontal/orientable block families with byte-stable generated output: safety net, canvas rug, baskets, cutting board, half tatami mat, cabinets, cooking pot, skillet, and stove.
- [x] Re-port pie and feast blockstates/models with byte-stable generated output.
- [x] Re-port crop, mushroom colony, wild crop, and double-plant blockstates/models with byte-stable generated output.
- [x] Re-port rope, rope fence, rope fence gate, tatami, and full tatami mat blockstates/models with byte-stable generated output.
- [x] Re-port canvas sign and hanging canvas sign blockstates/models to the 26.2 `ModelProvider` API.
- [x] Add a `minecraft:blocks` atlas contribution for Farmer's Delight canvas sign entity textures so generated sign block models resolve cleanly.
- [x] Re-port `ItemModels` to the 26.2 item model/datagen APIs for non-skillet generated item definitions and item models.
- [x] Re-port the skillet's 26.2 item definition/model behavior once its special item renderer and cooking predicate are restored.
- [x] Fix server datagen lookup inputs so `runServerData` can emit common tags such as `c:drinks/milk`.
- [x] Add generated loot tables for canvas wall signs and hanging canvas wall signs.
- [x] Regenerate data and assets with `runClientData` and `runServerData`.
- [x] Review the remaining generated resource diff for stale 1.21 formats and bridge-preserved files.
- The current generated-resource diff removes stale block-item indirection models now covered by 26.2 item definitions, drops obsolete tag/global-loot manifest paths, and rewrites configured-feature JSON through the 26.2 registry provider.
- [x] Re-port cooking pot recipe book support:
- [x] Replace the placeholder `RecipeCategories` implementation with the 26.2 recipe book registry model.
- [x] Replace the placeholder `CookingPotRecipeBookComponent`.
- [x] Stop falling back to `RecipeBookType.FURNACE` and `RecipeBookCategories.FURNACE_FOOD` where Farmer's Delight needs its own cooking pot categories.
- [x] Verify `META-INF/enumextensions.json` is still the right way to register `FARMERSDELIGHT_COOKING`, or replace it with the 26.2-native registry path.
- Cooking pot recipes now publish recipe displays, route into registered `farmersdelight:cooking_*` recipe-book categories, use the `FARMERSDELIGHT_COOKING` recipe book type, and register a NeoForge search category for the client recipe book.
- [x] Re-port HUD overlays for Nourishment and Comfort in `HUDOverlays`.
- [x] Re-port the skillet client item behavior in `ClientSetupEvents` and `SkilletItemRenderer`.
- [x] Re-port canvas rug block-breaking texture suppression in `HideBlockBreakProgressMixin` and re-add it to `farmersdelight.mixins.json` only after it targets the 26.2 renderer pipeline correctly.
- [x] Revisit mixins removed from `farmersdelight.mixins.json`:
- [x] Decide whether `datafix.V3818_3Mixin` is obsolete or needs a 26.2 equivalent.
- [x] Decide whether `KeepRichSoilGiantTreeMixin` is obsolete or needs a 26.2 equivalent.
- [x] Implement block/entity item transfer support for 26.2:
- [x] Basket capability/transfer registration.
- [x] Cabinet capability/transfer registration.
- [x] Cooking Pot sided input/output transfer registration.
- [x] Cutting Board single-slot transfer registration.
- [x] Skillet and stove inventory transfer behavior audit.
- [x] Update utility APIs that still expose `IItemHandler` if NeoForge transfer is now the supported integration surface.
- [x] Replace the old villager-trade config toggles with a data-driven 26.2-compatible mechanism, or intentionally remove the toggles and document the behavior change.
- Farmer's Delight villager and wandering trader offers now live in `data/farmersdelight/villager_trade`, and vanilla trade tags are extended under `data/minecraft/tags/villager_trade`. The old runtime config toggles were removed because 26.2 villager trades are datapack-driven.
- [ ] Re-enable and port optional integrations:
- [x] JEI recipe population; built-in Farmer's Delight cooking/cutting recipes are decoded from packaged recipe resources for JEI registration, with the dough-from-water synthetic recipe restored.
- [ ] EMI; official `dev.emi:emi-neoforge` metadata still targets 1.21.1-era Minecraft versions.
- [x] AppleSkin runtime/dev setup; compile API uses `squeek.appleskin:appleskin-neoforge:mc26.2-3.0.10`, and dev runtime can be enabled with `-Pfd.includeAppleSkinRuntime=true`.
- [ ] CraftTweaker recipe managers, docs, and scripts; `CraftTweaker-neoforge-26.2` is not published on BlameJared Maven as of 2026-07-27.
- Checked Maven metadata on 2026-07-27: official EMI still has no 26.2 artifact, `CraftTweaker-neoforge-26.2` returns 404, and the latest available CraftTweaker NeoForge artifact is still `CraftTweaker-neoforge-1.21.1:21.0.38`.
- [x] Update optional dependency handling in `build.gradle`; JEI and AppleSkin use 26.2 artifacts by default, while old EMI/CraftTweaker coordinates are gated behind `-Pfd.includeUnavailableIntegrations=true` until 26.2 APIs exist.
- [x] Update `neoforge.mods.toml` optional dependency ranges; the stale CraftTweaker optional dependency block is removed until a 26.2-compatible CraftTweaker artifact exists.

## Functional QA

- [x] Launch a 26.2 client with only Farmer's Delight installed.
- [x] Launch a 26.2 dedicated server with only Farmer's Delight installed.
- [ ] Place, break, rotate, waterlog, and render every block family.
- [ ] Test all crops: planting, growth, bonemeal, harvesting, wild crop generation, rich soil behavior, and villager crop targeting.
- [ ] Test Cooking Pot input, cooking progress, output serving, shift-clicking, recipe unlocks, recipe book UI, XP, custom name, block-item meal storage, and comparator output.
- [ ] Test Cutting Board manual use, dispenser use, fortune outputs, invalid tool feedback, and item carving.
- [ ] Test Skillet held cooking, placed cooking, flipping, custom renderer/model, sounds, combat, and drops.
- [ ] Test Basket/Cabinet automation with vanilla hoppers and common item-transfer mods once integrations are available.
- [ ] Test all loot modifiers: structure loot, mob scavenging, grass/straw drops, and pastry slicing.
- [ ] Test datafix/migration paths with old worlds/items containing Farmer's Delight block entities and componentized item data.
- [ ] Test all network payloads on a real client-server connection.
- [ ] Test translations after the 26.2 item/block translation-key alias changes.

## Release Cleanup

- [x] Remove or resolve all source/build `TODO 26.2` placeholders.
- [ ] Remove temporary build exclusions once EMI/CraftTweaker publish 26.2-compatible APIs; commented-out runtime dependency placeholders have been removed.
- [x] Confirm `./gradlew.bat clean build` succeeds.
- [x] Confirm `./gradlew.bat runClient` reaches client resource startup with only Farmer's Delight installed and without Farmer's Delight item-model parse errors or missing-texture warnings.
- [ ] Confirm `./gradlew.bat runClientData` and `./gradlew.bat runServerData` both succeed from a clean checkout.
- [x] Confirm the generated resource diff is intentional and reproducible.
- Re-ran `runServerData` followed by `runClientData` on 2026-07-27 and confirmed the generated-resource diff name list stayed stable.
- [x] Update README, changelog, supported Minecraft/NeoForge version ranges, and release metadata.
- [x] Build the release jar and smoke-test it outside the dev workspace.
- Built and installed `FarmersDelight-26.2-1.3.2.jar` into the CurseForge `Test 26.2` instance after the recipe-sync fix; manual jar retest passed on 2026-08-01.
60 changes: 33 additions & 27 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ plugins {
id 'eclipse'
id 'idea'
id 'maven-publish'
id 'net.neoforged.moddev' version '1.0.0'
id 'net.neoforged.moddev' version '2.0.142'
}

tasks.named('wrapper', Wrapper).configure {
Expand All @@ -27,24 +27,19 @@ repositories {
maven { url "https://maven.ryanliptak.com/" }
maven {
// EMI
url = "https://maven.terraformersmc.com/"
url = "https://maven.terraformersmc.com/releases/"
}
}

base {
archivesName = 'FarmersDelight'
}

java.toolchain.languageVersion = JavaLanguageVersion.of(21)
java.toolchain.languageVersion = JavaLanguageVersion.of(25)

neoForge {
version = project.neo_version

parchment {
mappingsVersion = project.parchment_mappings_version
minecraftVersion = project.parchment_minecraft_version
}

// This line is optional. Access Transformers are automatically detected
// accessTransformers = project.files('src/main/resources/META-INF/accesstransformer.cfg')

Expand All @@ -59,6 +54,9 @@ neoForge {
server {
server()
// programArgument '--nogui'
providers.gradleProperty('fd.serverWorld').orNull?.with {
programArguments.addAll '--world', it
}
systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
}

Expand All @@ -70,8 +68,8 @@ neoForge {
systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
}

data {
data()
clientData {
clientData()

// example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it
// gameDirectory = project.file('run-data')
Expand All @@ -80,6 +78,13 @@ neoForge {
programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath()
}

serverData {
serverData()

// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath()
}

configureEach {
// Recommended logging data for a userdev environment
// The markers can be added/remove as needed separated by commas.
Expand Down Expand Up @@ -107,27 +112,34 @@ sourceSets.main.resources {
srcDir 'src/generated/resources'
}

sourceSets.main.java {
// Re-enable once EMI and CraftTweaker publish 26.2-compatible NeoForge APIs.
exclude 'vectorwing/farmersdelight/integration/emi/**'
exclude 'vectorwing/farmersdelight/integration/crafttweaker/**'
}

configurations {
runtimeClasspath.extendsFrom localRuntime
}

dependencies {
// JEI
compileOnly "mezz.jei:jei-${jei_minecraft}-common-api:${jei_version}"
compileOnly "mezz.jei:jei-${jei_minecraft}-neoforge-api:${jei_version}"
// localRuntime "mezz.jei:jei-${jei_minecraft}-neoforge:${jei_version}"
compileOnly "mezz.jei:jei-${minecraft_version}-common-api:${jei_version}"
compileOnly "mezz.jei:jei-${minecraft_version}-neoforge-api:${jei_version}"

if (providers.gradleProperty('fd.includeUnavailableIntegrations').map { it.toBoolean() }.orElse(false).get()) {
// EMI and CraftTweaker do not publish usable 26.2 NeoForge APIs yet.
compileOnly "dev.emi:emi-neoforge:${emi_version}:api"

// EMI
compileOnly "dev.emi:emi-neoforge:${emi_version}:api"
runtimeOnly "dev.emi:emi-neoforge:${emi_version}"
def ctDep = "com.blamejared.crafttweaker:CraftTweaker-neoforge-${crafttweaker_minecraft}:${crafttweaker_version}"
compileOnly ctDep
}

// AppleSkin
compileOnly "squeek.appleskin:appleskin-neoforge:${appleskin_version}:api"
runtimeOnly "squeek.appleskin:appleskin-neoforge:${appleskin_version}"

def ctDep = "com.blamejared.crafttweaker:CraftTweaker-neoforge-${crafttweaker_minecraft}:${crafttweaker_version}"
compileOnly ctDep
runtimeOnly ctDep
if (providers.gradleProperty('fd.includeAppleSkinRuntime').map { it.toBoolean() }.orElse(false).get()) {
runtimeOnly "squeek.appleskin:appleskin-neoforge:${appleskin_version}"
}
}

tasks.withType(ProcessResources).configureEach {
Expand Down Expand Up @@ -174,9 +186,3 @@ idea {
downloadJavadoc = true
}
}

////////////////

//compileJava {
// options.compilerArgs << "-Acrafttweaker.processor.document.output_directory=${file('docsOut')}"
//}
8 changes: 8 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

## 1.3.2

### 26.2 Port
- Ported the NeoForge build to Minecraft 26.2 and NeoForge 26.2.
- Reworked generated blockstates, item definitions, loot/data outputs, recipe book support, transfer support, and client render hooks for the 26.2 APIs.
- Repacked canvas sign block textures for Minecraft 26.2's baked sign models.
- Fixed stateless Farmer's Delight custom recipes failing NeoForge recipe-content network sync when joining a world.
- Verified `build`, datagen, GameTest server, FD-only client startup, and FD-only dedicated server startup.
- JEI and AppleSkin compile against 26.2 artifacts. EMI and CraftTweaker integrations are temporarily excluded until usable 26.2-compatible APIs are published.

### Updates
- Fried Rice and Chicken Soup have been nerfed down to the 3-minute tier of meals, due to their ease of cooking;
- Rice Bag has been removed from the `straw_blocks` tag, due to not being actually made with Straw.
Expand Down
19 changes: 7 additions & 12 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,12 @@ org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true

# Parchment
parchment_minecraft_version=1.21
parchment_mappings_version=2024.07.28

# Minecraft
minecraft_version=1.21.1
minecraft_version_range=[1.21.1]
neo_version=21.1.219
neo_version_range=[21.1.219,)
loader_version_range=[4,)
minecraft_version=26.2
minecraft_version_range=[26.2]
neo_version=26.2.0.0-beta
neo_version_range=[26.2.0.0-beta,)
loader_version_range=[11,)

# Mod Info
mod_version=1.3.2
Expand All @@ -25,10 +21,9 @@ mod_authors=vectorwing
mod_description=A cozy farming and cooking expansion for Minecraft!

# Dependency Info
jei_minecraft=1.21
jei_version=19.8.2.99
jei_version=30.14.0.93
emi_version=1.1.22+1.21.1
appleskin_version=mc1.21-3.0.5
appleskin_version=mc26.2-3.0.10
crafttweaker_minecraft=1.21
crafttweaker_version=20.0.21
crafttweaker_ap_version=3.0.0.15
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ pluginManagement {
}

plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
}
Loading