From 90da29f9cc850c90feb40feef2c07c25a3d2cf1f Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 29 Apr 2026 01:46:12 +0800 Subject: [PATCH] [fix]Fix compatibility with Farmer's Delight 1.3.0 and updated gradle.properties --- gradle.properties | 6 +- .../harvest/TomatoHarvestBehaviour.java | 94 +++++++++++++++++-- .../farmersdelight/ponder/FDPonderPlugin.java | 24 ++++- 3 files changed, 108 insertions(+), 16 deletions(-) diff --git a/gradle.properties b/gradle.properties index 10123d4..76be1c4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ mod_id = create_integrated_farming mod_artifact_id = create-integrated-farming mod_name = Create: Integrated Farming mod_license = LGPL-3.0-or-later -mod_version = 1.2.2 +mod_version = 1.2.3 mod_group_id = plus.dragons.createintegratedfarming mod_authors = DragonsPlus mod_description = Integrated farming automation for Create @@ -29,8 +29,8 @@ create_version_range = [6.0.9,) create_dragons_plus_version = 1.9.1 create_dragons_plus_version_range = [1.9.1,) conditional_mixin_version = 0.6.4 -farmers_delight_version = 1.21.1-1.2.11 -farmers_delight_version_range = [1.2.11,) +farmers_delight_version = 1.21.1-1.3.0 +farmers_delight_version_range = [1.3.0,) jei_minecraft_version = 1.21.1 jei_version = 19.21.0.247 curios_minecraft_version = 1.21.1 diff --git a/src/integration/farmersdelight/java/plus/dragons/createintegratedfarming/integration/farmersdelight/farming/harvest/TomatoHarvestBehaviour.java b/src/integration/farmersdelight/java/plus/dragons/createintegratedfarming/integration/farmersdelight/farming/harvest/TomatoHarvestBehaviour.java index 90ac775..87557fc 100644 --- a/src/integration/farmersdelight/java/plus/dragons/createintegratedfarming/integration/farmersdelight/farming/harvest/TomatoHarvestBehaviour.java +++ b/src/integration/farmersdelight/java/plus/dragons/createintegratedfarming/integration/farmersdelight/farming/harvest/TomatoHarvestBehaviour.java @@ -21,33 +21,107 @@ import com.simibubi.create.content.contraptions.actors.harvester.HarvesterMovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.foundation.utility.BlockHelper; +import java.lang.reflect.Field; +import java.util.function.Supplier; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.CropBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import org.jetbrains.annotations.Nullable; import plus.dragons.createintegratedfarming.api.harvester.CustomHarvestBehaviour; import vectorwing.farmersdelight.common.Configuration; -import vectorwing.farmersdelight.common.block.TomatoVineBlock; import vectorwing.farmersdelight.common.registry.ModBlocks; import vectorwing.farmersdelight.common.registry.ModItems; import vectorwing.farmersdelight.common.registry.ModSounds; +@SuppressWarnings("unchecked") public class TomatoHarvestBehaviour implements CustomHarvestBehaviour { - private final TomatoVineBlock tomato; + private static final Class TOMATO_BLOCK_CLASS; + private static final Class TOMATO_VINE_BLOCK_CLASS; + private static final Supplier PICK_TOMATOES_SOUND; + private static final BooleanProperty ROPELOGGED_PROPERTY; - public TomatoHarvestBehaviour(TomatoVineBlock tomato) { + static { + Class tomatoBlockClass = null; + try { + tomatoBlockClass = Class.forName("vectorwing.farmersdelight.common.block.TomatoBlock"); + } catch (ClassNotFoundException e) { + // Old version before 1.3.0, TomatoBlock does not exist + } + TOMATO_BLOCK_CLASS = tomatoBlockClass; + + Class tomatoVineBlockClass = null; + try { + tomatoVineBlockClass = Class.forName("vectorwing.farmersdelight.common.block.TomatoVineBlock"); + } catch (ClassNotFoundException e) { + // Should not happen in supported versions, but handle gracefully + } + TOMATO_VINE_BLOCK_CLASS = tomatoVineBlockClass; + + Supplier sound = null; + try { + // Farmer's Delight 1.3.0+ + Field field = ModSounds.class.getField("BLOCK_TOMATOES_PICK_TOMATOES"); + sound = (Supplier) field.get(null); + } catch (NoSuchFieldException | IllegalAccessException e) { + try { + // Farmer's Delight < 1.3.0 + Field field = ModSounds.class.getField("ITEM_TOMATO_PICK_FROM_BUSH"); + sound = (Supplier) field.get(null); + } catch (NoSuchFieldException | IllegalAccessException ex) { + throw new RuntimeException("Failed to find tomato pick sound in FarmersDelight", ex); + } + } + PICK_TOMATOES_SOUND = sound; + + BooleanProperty ropelogged = null; + if (tomatoBlockClass != null) { + try { + Field field = tomatoBlockClass.getField("ROPELOGGED"); + ropelogged = (BooleanProperty) field.get(null); + } catch (NoSuchFieldException | IllegalAccessException ignored) {} + } + if (ropelogged == null && tomatoVineBlockClass != null) { + try { + Field field = tomatoVineBlockClass.getField("ROPELOGGED"); + ropelogged = (BooleanProperty) field.get(null); + } catch (NoSuchFieldException | IllegalAccessException ignored) {} + } + ROPELOGGED_PROPERTY = ropelogged; + } + + private final CropBlock tomato; + private final IntegerProperty ageProperty; + + public TomatoHarvestBehaviour(CropBlock tomato, IntegerProperty ageProperty) { this.tomato = tomato; + this.ageProperty = ageProperty; } public static @Nullable TomatoHarvestBehaviour create(Block block) { - if (!(block instanceof TomatoVineBlock tomato)) - return null; - return new TomatoHarvestBehaviour(tomato); + if (TOMATO_BLOCK_CLASS != null && TOMATO_BLOCK_CLASS.isInstance(block)) { + return new TomatoHarvestBehaviour((CropBlock) block, getAgeProperty(block)); + } + if (TOMATO_VINE_BLOCK_CLASS != null && TOMATO_VINE_BLOCK_CLASS.isInstance(block)) { + return new TomatoHarvestBehaviour((CropBlock) block, getAgeProperty(block)); + } + return null; + } + + private static IntegerProperty getAgeProperty(Block block) { + try { + return (IntegerProperty) block.getClass().getMethod("getAgeProperty").invoke(block); + } catch (Exception e) { + throw new RuntimeException("Failed to get age property from tomato block: " + block, e); + } } @Override @@ -63,10 +137,10 @@ public void harvest(HarvesterMovementBehaviour behaviour, MovementContext contex } if (mature) { dropTomatoes(level, behaviour, context); - level.playSound(null, pos, ModSounds.ITEM_TOMATO_PICK_FROM_BUSH.get(), SoundSource.BLOCKS, 1.0F, 0.8F + level.random.nextFloat() * 0.4F); - level.setBlock(pos, state.setValue(tomato.getAgeProperty(), 0), 2); + level.playSound(null, pos, PICK_TOMATOES_SOUND.get(), SoundSource.BLOCKS, 1.0F, 0.8F + level.random.nextFloat() * 0.4F); + level.setBlock(pos, state.setValue(ageProperty, 0), 2); } else if (partial) { - level.setBlock(pos, state.setValue(tomato.getAgeProperty(), 0), 2); + level.setBlock(pos, state.setValue(ageProperty, 0), 2); } } @@ -75,7 +149,7 @@ protected void breakTomatoes(Level level, HarvesterMovementBehaviour behaviour, BlockState stateAbove = level.getBlockState(above); if (stateAbove.is(tomato)) breakTomatoes(level, behaviour, context, above, stateAbove); - boolean ropelogged = state.getValue(TomatoVineBlock.ROPELOGGED); + boolean ropelogged = ROPELOGGED_PROPERTY != null && state.hasProperty(ROPELOGGED_PROPERTY) && state.getValue(ROPELOGGED_PROPERTY); BlockHelper.destroyBlockAs( level, pos, diff --git a/src/integration/farmersdelight/java/plus/dragons/createintegratedfarming/integration/farmersdelight/ponder/FDPonderPlugin.java b/src/integration/farmersdelight/java/plus/dragons/createintegratedfarming/integration/farmersdelight/ponder/FDPonderPlugin.java index 2e14a3c..0cc1792 100644 --- a/src/integration/farmersdelight/java/plus/dragons/createintegratedfarming/integration/farmersdelight/ponder/FDPonderPlugin.java +++ b/src/integration/farmersdelight/java/plus/dragons/createintegratedfarming/integration/farmersdelight/ponder/FDPonderPlugin.java @@ -19,15 +19,17 @@ package plus.dragons.createintegratedfarming.integration.farmersdelight.ponder; import static com.simibubi.create.infrastructure.ponder.AllCreatePonderTags.ARM_TARGETS; -import static vectorwing.farmersdelight.common.registry.ModBlocks.BASKET; import com.simibubi.create.AllBlocks; +import java.lang.reflect.Field; +import java.util.function.Supplier; import net.createmod.catnip.registry.RegisteredObjectsHelper; import net.createmod.ponder.api.registration.PonderSceneRegistrationHelper; import net.createmod.ponder.api.registration.PonderTagRegistrationHelper; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; import plus.dragons.createintegratedfarming.client.ponder.CIFPonderPlugin; import plus.dragons.createintegratedfarming.client.ponder.CIFPonderTags; import vectorwing.farmersdelight.common.registry.ModBlocks; @@ -43,11 +45,27 @@ private static void registerScenes(PonderSceneRegistrationHelper helper) { PonderTagRegistrationHelper itemHelper = helper.withKeyFunction( RegisteredObjectsHelper::getKeyOrThrow); - itemHelper.addToTag(ARM_TARGETS) - .add(BASKET.get()); + try { + Field basketField = ModBlocks.class.getField("BASKET"); + Supplier basket = (Supplier) basketField.get(null); + itemHelper.addToTag(ARM_TARGETS).add(basket.get()); + } catch (NoSuchFieldException e) { + try { + Supplier wooden = (Supplier) ModBlocks.class.getField("WOODEN_BASKET").get(null); + Supplier bamboo = (Supplier) ModBlocks.class.getField("BAMBOO_BASKET").get(null); + itemHelper.addToTag(ARM_TARGETS) + .add(wooden.get()) + .add(bamboo.get()); + } catch (NoSuchFieldException | IllegalAccessException ex) { + throw new RuntimeException("Failed to register Farmer's Delight Basket ponder tags", ex); + } + } catch (IllegalAccessException e) { + throw new RuntimeException("Failed to register Farmer's Delight Basket ponder tags", e); + } } }