diff --git a/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java b/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java index 9210e524..6f16b965 100644 --- a/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java +++ b/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java @@ -29,6 +29,9 @@ public class UnicopiaMixinPlugin implements IMixinConfigPlugin { if (mixinClassName.indexOf("trinkets") != -1) { return FabricLoader.getInstance().isModLoaded("trinkets"); } + if (mixinClassName.indexOf("seasons") != -1) { + return FabricLoader.getInstance().isModLoaded("seasons"); + } } return true; } diff --git a/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java b/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java index 3c9b8973..aed621ae 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.ability.EarthPonyKickAbility.Buckable; +import com.minelittlepony.unicopia.seasons.FertilizableUtil; import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; import net.minecraft.block.*; @@ -71,40 +72,42 @@ public class FruitBearingBlock extends LeavesBlock implements TintedBlock, Bucka if (world.isDay()) { BlockSoundGroup group = getSoundGroup(state); - - if (state.get(STAGE) == Stage.FRUITING) { - state = state.cycle(AGE); - if (state.get(AGE) > 20) { + int steps = FertilizableUtil.getGrowthSteps(world, pos, state, random); + while (steps-- > 0) { + if (state.get(STAGE) == Stage.FRUITING) { + state = state.cycle(AGE); + if (state.get(AGE) > 20) { + state = state.with(AGE, 0).cycle(STAGE); + } + } else { state = state.with(AGE, 0).cycle(STAGE); } - } else { - state = state.with(AGE, 0).cycle(STAGE); - } - world.setBlockState(pos, state, Block.NOTIFY_ALL); - BlockPos fruitPosition = pos.down(); + world.setBlockState(pos, state, Block.NOTIFY_ALL); + BlockPos fruitPosition = pos.down(); - Stage stage = state.get(STAGE); + Stage stage = state.get(STAGE); - if (stage == Stage.FRUITING && isPositionValidForFruit(state, pos)) { - if (world.isAir(fruitPosition)) { - world.setBlockState(fruitPosition, fruit.get().getDefaultState(), Block.NOTIFY_ALL); - } - } - - BlockState fruitState = world.getBlockState(fruitPosition); - - if (stage == Stage.WITHERING && fruitState.isOf(fruit.get())) { - if (world.random.nextInt(2) == 0) { - Block.dropStack(world, fruitPosition, rottenFruitSupplier.get()); - } else { - Block.dropStacks(fruitState, world, fruitPosition, fruitState.hasBlockEntity() ? world.getBlockEntity(fruitPosition) : null, null, ItemStack.EMPTY); + if (stage == Stage.FRUITING && isPositionValidForFruit(state, pos)) { + if (world.isAir(fruitPosition)) { + world.setBlockState(fruitPosition, fruit.get().getDefaultState(), Block.NOTIFY_ALL); + } } - if (world.removeBlock(fruitPosition, false)) { - world.emitGameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Emitter.of(fruitState)); - } + BlockState fruitState = world.getBlockState(fruitPosition); - world.playSound(null, pos, USounds.ITEM_APPLE_ROT, SoundCategory.BLOCKS, group.getVolume(), group.getPitch()); + if (stage == Stage.WITHERING && fruitState.isOf(fruit.get())) { + if (world.random.nextInt(2) == 0) { + Block.dropStack(world, fruitPosition, rottenFruitSupplier.get()); + } else { + Block.dropStacks(fruitState, world, fruitPosition, fruitState.hasBlockEntity() ? world.getBlockEntity(fruitPosition) : null, null, ItemStack.EMPTY); + } + + if (world.removeBlock(fruitPosition, false)) { + world.emitGameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Emitter.of(fruitState)); + } + + world.playSound(null, pos, USounds.ITEM_APPLE_ROT, SoundCategory.BLOCKS, group.getVolume(), group.getPitch()); + } } } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/seasons/MixinFertilizableUtil.java b/src/main/java/com/minelittlepony/unicopia/mixin/seasons/MixinFertilizableUtil.java new file mode 100644 index 00000000..cdf1f954 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/seasons/MixinFertilizableUtil.java @@ -0,0 +1,20 @@ +package com.minelittlepony.unicopia.mixin.seasons; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.gen.Invoker; +import net.minecraft.block.BlockState; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; + +@Pseudo +@Mixin( + targets = { "io.github.lucaargolo.seasons.utils.FertilizableUtil" }, + remap = false +) +public interface MixinFertilizableUtil { + @Invoker("getMultiplier") + static float getMultiplier(ServerWorld world, BlockPos pos, BlockState state) { + return 0; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/seasons/FertilizableUtil.java b/src/main/java/com/minelittlepony/unicopia/seasons/FertilizableUtil.java new file mode 100644 index 00000000..b3c9600c --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/seasons/FertilizableUtil.java @@ -0,0 +1,34 @@ +package com.minelittlepony.unicopia.seasons; + +import com.minelittlepony.unicopia.mixin.seasons.MixinFertilizableUtil; + +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.block.BlockState; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.random.Random; + +public interface FertilizableUtil { + boolean MOD_LOADED = FabricLoader.getInstance().isModLoaded("seasons"); + + static float getMultiplier(ServerWorld world, BlockPos pos, BlockState state) { + if (MOD_LOADED) { + return MixinFertilizableUtil.getMultiplier(world, pos, state); + } + return 0; + } + + static int getGrowthSteps(ServerWorld world, BlockPos pos, BlockState state, Random random) { + float multiplier = 1 + FertilizableUtil.getMultiplier(world, pos, state); + int steps = 0; + + while (multiplier > 0) { + if (multiplier >= random.nextFloat()) { + multiplier -= 1; + steps++; + } + } + + return steps; + } +} diff --git a/src/main/resources/data/unicopia/seasons/crop/green_apple_leaves.json b/src/main/resources/data/unicopia/seasons/crop/green_apple_leaves.json new file mode 100644 index 00000000..7c87009a --- /dev/null +++ b/src/main/resources/data/unicopia/seasons/crop/green_apple_leaves.json @@ -0,0 +1,6 @@ +{ + "spring": 0.5, + "summer": 0.6, + "fall": 1.0, + "winter": 0 +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/seasons/crop/green_apple_sapling.json b/src/main/resources/data/unicopia/seasons/crop/green_apple_sapling.json new file mode 100644 index 00000000..7c87009a --- /dev/null +++ b/src/main/resources/data/unicopia/seasons/crop/green_apple_sapling.json @@ -0,0 +1,6 @@ +{ + "spring": 0.5, + "summer": 0.6, + "fall": 1.0, + "winter": 0 +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/seasons/crop/mango_leaves.json b/src/main/resources/data/unicopia/seasons/crop/mango_leaves.json new file mode 100644 index 00000000..0197bee9 --- /dev/null +++ b/src/main/resources/data/unicopia/seasons/crop/mango_leaves.json @@ -0,0 +1,6 @@ +{ + "spring": 1.0, + "summer": 1.6, + "fall": 0.5, + "winter": 0 +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/seasons/crop/mango_sapling.json b/src/main/resources/data/unicopia/seasons/crop/mango_sapling.json new file mode 100644 index 00000000..0197bee9 --- /dev/null +++ b/src/main/resources/data/unicopia/seasons/crop/mango_sapling.json @@ -0,0 +1,6 @@ +{ + "spring": 1.0, + "summer": 1.6, + "fall": 0.5, + "winter": 0 +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/seasons/crop/sour_apple_leaves.json b/src/main/resources/data/unicopia/seasons/crop/sour_apple_leaves.json new file mode 100644 index 00000000..8b9d321a --- /dev/null +++ b/src/main/resources/data/unicopia/seasons/crop/sour_apple_leaves.json @@ -0,0 +1,6 @@ +{ + "spring": 0.25, + "summer": 0.5, + "fall": 1.0, + "winter": 0.5 +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/seasons/crop/sour_apple_sapling.json b/src/main/resources/data/unicopia/seasons/crop/sour_apple_sapling.json new file mode 100644 index 00000000..8b9d321a --- /dev/null +++ b/src/main/resources/data/unicopia/seasons/crop/sour_apple_sapling.json @@ -0,0 +1,6 @@ +{ + "spring": 0.25, + "summer": 0.5, + "fall": 1.0, + "winter": 0.5 +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/seasons/crop/sweet_apple_leaves.json b/src/main/resources/data/unicopia/seasons/crop/sweet_apple_leaves.json new file mode 100644 index 00000000..06ea5e21 --- /dev/null +++ b/src/main/resources/data/unicopia/seasons/crop/sweet_apple_leaves.json @@ -0,0 +1,6 @@ +{ + "spring": 1.0, + "summer": 1.0, + "fall": 0.6, + "winter": 0 +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/seasons/crop/sweet_apple_sapling.json b/src/main/resources/data/unicopia/seasons/crop/sweet_apple_sapling.json new file mode 100644 index 00000000..06ea5e21 --- /dev/null +++ b/src/main/resources/data/unicopia/seasons/crop/sweet_apple_sapling.json @@ -0,0 +1,6 @@ +{ + "spring": 1.0, + "summer": 1.0, + "fall": 0.6, + "winter": 0 +} \ No newline at end of file diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 6d6cb13f..2ad8314e 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -48,7 +48,8 @@ "trinkets.MixinTrinketSurvivalSlot", "trinkets.MixinTrinketItem", "trinkets.MixinTrinketInventory", - "trinkets.MixinScreenHandler" + "trinkets.MixinScreenHandler", + "seasons.MixinFertilizableUtil" ], "client": [ "client.MixinAnimalModel",