diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java index c39947497..7f2ad0a7b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java @@ -182,8 +182,10 @@ public final class CraftEngineBlocks { builder.withParameter(LootParameters.PLAYER, serverPlayer); builder.withOptionalParameter(LootParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); } - if (state.behavior() instanceof CropBlockBehavior) { - builder.withParameter(LootParameters.CROP_BLOCK, true); + if (state.behavior() instanceof CropBlockBehavior cropBlockBehavior) { + if (cropBlockBehavior.isMaxAge(state)) { + builder.withParameter(LootParameters.CROP_RIPE, true); + } } for (Item item : state.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index 2e8c2e4af..0bdc7364f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -139,8 +139,10 @@ public class BlockEventListener implements Listener { builder.withParameter(LootParameters.LOCATION, vec3d); builder.withParameter(LootParameters.PLAYER, serverPlayer); builder.withOptionalParameter(LootParameters.TOOL, itemInHand); - if (state.behavior() instanceof CropBlockBehavior) { - builder.withParameter(LootParameters.CROP_BLOCK, true); + if (state.behavior() instanceof CropBlockBehavior cropBlockBehavior) { + if (cropBlockBehavior.isMaxAge(state)) { + builder.withParameter(LootParameters.CROP_RIPE, true); + } } for (Item item : state.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); @@ -300,8 +302,10 @@ public class BlockEventListener implements Listener { if (yield < 1f) { builder.withParameter(LootParameters.EXPLOSION_RADIUS, 1.0f / yield); } - if (state.behavior() instanceof CropBlockBehavior) { - builder.withParameter(LootParameters.CROP_BLOCK, true); + if (state.behavior() instanceof CropBlockBehavior cropBlockBehavior) { + if (cropBlockBehavior.isMaxAge(state)) { + builder.withParameter(LootParameters.CROP_RIPE, true); + } } for (Item item : state.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java index f1ff84512..f5226c5f8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java @@ -71,8 +71,10 @@ public class BushBlockBehavior extends AbstractBlockBehavior { net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); builder.withParameter(LootParameters.LOCATION, vec3d); builder.withParameter(LootParameters.WORLD, world); - if (this instanceof CropBlockBehavior) { - builder.withParameter(LootParameters.CROP_BLOCK, true); + if (this instanceof CropBlockBehavior cropBlockBehavior) { + if (cropBlockBehavior.isMaxAge(state)) { + builder.withParameter(LootParameters.CROP_RIPE, true); + } } for (Item item : previousState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java index f44010e81..4c4c63409 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java @@ -37,6 +37,9 @@ public class CropBlockBehavior extends BushBlockBehavior { public final boolean isMaxAge(Object state) { return this.getAge(state) >= this.ageProperty.max; } + public final boolean isMaxAge(ImmutableBlockState state) { + return this.getAge(state) >= this.ageProperty.max; + } public static ImmutableBlockState getCEBlockState(Object nmsState) { return BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(nmsState)); @@ -45,6 +48,9 @@ public class CropBlockBehavior extends BushBlockBehavior { public final int getAge(Object state) { return getCEBlockState(state).get(ageProperty); } + public final int getAge(ImmutableBlockState state) { + return state.get(ageProperty); + } public Object getStateForAge(Object state, int age) { ImmutableBlockState afterState = getCEBlockState(state).owner().value().defaultState().with(ageProperty, age); @@ -75,8 +81,10 @@ public class CropBlockBehavior extends BushBlockBehavior { Object pos = args[2]; if (getRawBrightness(level, pos) >= minGrowLight) { int age = this.getAge(state); - System.out.println("age: " + age); - if (age < this.ageProperty.max && RandomUtils.generateRandomFloat(0, 1) >= this.growSpeed) { + float randomFloat = RandomUtils.generateRandomFloat(0, 1); + System.out.println("age: " + age + "ageProperty.max: " + this.ageProperty.max + " -> " + (age < this.ageProperty.max)); + System.out.println("randomFloat: " + randomFloat + "growSpeed: " + this.growSpeed + " -> " + (randomFloat < this.growSpeed)); + if (age < this.ageProperty.max && randomFloat >= this.growSpeed) { System.out.println("grow"); Reflections.method$Level$setBlock.invoke(level, pos, getStateForAge(state, age + 1), UpdateOption.UPDATE_NONE.flags()); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/CropRipeCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/CropRipeCondition.java index 05248b2c0..10d30ac74 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/CropRipeCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/CropRipeCondition.java @@ -17,7 +17,7 @@ public class CropRipeCondition implements LootCondition { @Override public boolean test(LootContext lootContext) { - return lootContext.getOptionalParameter(LootParameters.CROP_BLOCK).orElse(false); + return lootContext.getOptionalParameter(LootParameters.CROP_RIPE).orElse(false); } public static class Factory implements LootConditionFactory { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java b/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java index 29b531ea2..35e145b56 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java @@ -18,5 +18,5 @@ public class LootParameters { public static final ContextKey PLAYER = new ContextKey<>(Key.of("craftengine:player")); public static final ContextKey> TOOL = new ContextKey<>(Key.of("craftengine:tool")); public static final ContextKey BLOCK_STATE = new ContextKey<>(Key.of("craftengine:block_state")); - public static final ContextKey CROP_BLOCK = new ContextKey<>(Key.of("craftengine:crop_block")); + public static final ContextKey CROP_RIPE = new ContextKey<>(Key.of("craftengine:crop_ripe")); }