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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<SoundEvent> 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<SoundEvent> sound = null;
try {
// Farmer's Delight 1.3.0+
Field field = ModSounds.class.getField("BLOCK_TOMATOES_PICK_TOMATOES");
sound = (Supplier<SoundEvent>) 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<SoundEvent>) 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
Expand All @@ -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);
}
}

Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -43,11 +45,27 @@ private static void registerScenes(PonderSceneRegistrationHelper<ResourceLocatio
.addStoryBoard("farmersdelight/organic_compost_catalyze", FDPonderScenes::catalyze, CIFPonderTags.FARMING_APPLIANCES);
}

@SuppressWarnings("unchecked")
private static void registerTags(PonderTagRegistrationHelper<ResourceLocation> helper) {
PonderTagRegistrationHelper<ItemLike> itemHelper = helper.withKeyFunction(
RegisteredObjectsHelper::getKeyOrThrow);

itemHelper.addToTag(ARM_TARGETS)
.add(BASKET.get());
try {
Field basketField = ModBlocks.class.getField("BASKET");
Supplier<Block> basket = (Supplier<Block>) basketField.get(null);
itemHelper.addToTag(ARM_TARGETS).add(basket.get());
} catch (NoSuchFieldException e) {
try {
Supplier<Block> wooden = (Supplier<Block>) ModBlocks.class.getField("WOODEN_BASKET").get(null);
Supplier<Block> bamboo = (Supplier<Block>) 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);
}
}
}