diff --git a/README.md b/README.md index b6adfffa..38da27d6 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,7 @@ All changes are toggleable via config files. * **Remove Realms Button:** Removes the redundant Minecraft Realms button from the main menu * **Remove Recipe Book:** Removes the recipe book button from GUIs * **Remove Snooper:** Forcefully turns off the snooper and hides the snooper settings button from the options menu +* **Sapling Behavior:** Allows customization of sapling behavior while utilizing an optimized method * **Sea Level:** Sets the default height of the overworld's sea level * **Selected Item Tooltip Height:** Sets the Y value of the selected item tooltip, displayed when held items are changed * **Shield Parry:** Allows parrying of projectiles with shields diff --git a/gradle.properties b/gradle.properties index 16c43434..8d2d566b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.jvmargs = -Xmx3G maven_group = mod.acgaming mod_id = universaltweaks mod_name = Universal Tweaks -mod_version = 1.9.0 +mod_version = 1.9.1 archives_base_name = UniversalTweaks-1.12.2 # If any properties changes below this line, run `gradlew setupDecompWorkspace` and refresh gradle again to ensure everything is working correctly. diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigTweaks.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigTweaks.java index 0be18a34..1ac5b9e2 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigTweaks.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigTweaks.java @@ -78,6 +78,10 @@ public static class BlocksCategory @Config.Name("Finite Water") public final FiniteWaterCategory FINITE_WATER = new FiniteWaterCategory(); + @Config.LangKey("cfg.universaltweaks.tweaks.blocks.sapling") + @Config.Name("Sapling Behavior") + public final SaplingBehaviorCategory SAPLING_BEHAVIOR = new SaplingBehaviorCategory(); + @Config.RequiresMcRestart @Config.Name("Bed Obstruction Replacement") @Config.Comment("Replaces bed obstruction checks with an improved version") @@ -221,6 +225,27 @@ public static class FiniteWaterCategory @Config.Comment("Inclusive maximum altitude at which water is infinite") public int utFiniteWaterInfMax = 63; } + + public static class SaplingBehaviorCategory + { + @Config.RequiresMcRestart + @Config.Name("[1] Sapling Behavior Toggle") + @Config.Comment("Allows customization of sapling behavior while utilizing an optimized method") + public boolean utSaplingBehaviorToggle = true; + + @Config.Name("[2] Minimum Light Level") + @Config.Comment("Inclusive minimum light level at which saplings grow into trees") + public int utSaplingLightLevel = 9; + + @Config.Name("[3] Growth Chance") + @Config.Comment + ({ + "Chance per update tick at which saplings grow into trees", + "Note: General growth rate is still affected by the random tick speed" + }) + @Config.RangeDouble(min = 0.0D, max = 1.0D) + public double utSaplingGrowthChance = 0.125D; + } } public static class EntitiesCategory diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java b/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java index 1fbf4cd9..ba6ef718 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java @@ -181,6 +181,7 @@ public List getMixinConfigs() configs.add("mixins.tweaks.blocks.hitdelay.json"); configs.add("mixins.tweaks.blocks.leafdecay.json"); configs.add("mixins.tweaks.blocks.lenientpaths.json"); + configs.add("mixins.tweaks.blocks.sapling.json"); configs.add("mixins.tweaks.entities.ai.json"); configs.add("mixins.tweaks.entities.ai.saddledwandering.json"); configs.add("mixins.tweaks.entities.ai.wither.json"); @@ -370,6 +371,8 @@ public boolean shouldMixinConfigQueue(String mixinConfig) return UTConfigTweaks.BLOCKS.utLeafDecayToggle; case "mixins.tweaks.blocks.lenientpaths.json": return UTConfigTweaks.BLOCKS.utLenientPathsToggle; + case "mixins.tweaks.blocks.sapling.json": + return UTConfigTweaks.BLOCKS.SAPLING_BEHAVIOR.utSaplingBehaviorToggle; case "mixins.tweaks.entities.ai.json": return UTConfigTweaks.ENTITIES.utAIReplacementToggle; case "mixins.tweaks.entities.ai.saddledwandering.json": diff --git a/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/sapling/mixin/UTSaplingMixin.java b/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/sapling/mixin/UTSaplingMixin.java new file mode 100644 index 00000000..7f0874c6 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/sapling/mixin/UTSaplingMixin.java @@ -0,0 +1,36 @@ +package mod.acgaming.universaltweaks.tweaks.blocks.sapling.mixin; + +import java.util.Random; + +import net.minecraft.block.BlockBush; +import net.minecraft.block.BlockSapling; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import mod.acgaming.universaltweaks.config.UTConfigTweaks; +import mod.acgaming.universaltweaks.util.UTRandomUtil; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(BlockSapling.class) +public abstract class UTSaplingMixin extends BlockBush +{ + @Shadow + public abstract void grow(World worldIn, BlockPos pos, IBlockState state, Random rand); + + /** + * @author ACGaming + * @reason Optimized + customizable sapling update tick + */ + @Overwrite + public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) + { + if (!worldIn.isRemote) + { + super.updateTick(worldIn, pos, state, rand); + if (worldIn.getLightFromNeighbors(pos.up()) >= UTConfigTweaks.BLOCKS.SAPLING_BEHAVIOR.utSaplingLightLevel && UTRandomUtil.chance(UTConfigTweaks.BLOCKS.SAPLING_BEHAVIOR.utSaplingGrowthChance) && worldIn.isAreaLoaded(pos, 1)) this.grow(worldIn, pos, state, rand); + } + } +} \ No newline at end of file diff --git a/src/main/java/mod/acgaming/universaltweaks/util/UTRandomUtil.java b/src/main/java/mod/acgaming/universaltweaks/util/UTRandomUtil.java index d30c2660..e939dc8a 100644 --- a/src/main/java/mod/acgaming/universaltweaks/util/UTRandomUtil.java +++ b/src/main/java/mod/acgaming/universaltweaks/util/UTRandomUtil.java @@ -5,6 +5,8 @@ // Courtesy of UeberallGebannt public class UTRandomUtil { + public static final Random RANDOM = new Random(); + /** * Returns true with a certain chance * @@ -26,6 +28,6 @@ public static boolean chance(double chance, Random random) */ public static boolean chance(double chance) { - return chance(chance, new Random()); + return chance(chance, RANDOM); } } \ No newline at end of file diff --git a/src/main/resources/assets/universaltweaks/lang/en_us.lang b/src/main/resources/assets/universaltweaks/lang/en_us.lang index 3c5b5fc7..c1da9f80 100644 --- a/src/main/resources/assets/universaltweaks/lang/en_us.lang +++ b/src/main/resources/assets/universaltweaks/lang/en_us.lang @@ -83,6 +83,7 @@ cfg.universaltweaks.tweaks.blocks.betterplacement=Better Placement cfg.universaltweaks.tweaks.blocks.blockdispenser=Block Dispenser cfg.universaltweaks.tweaks.blocks.breakablebedrock=Breakable Bedrock cfg.universaltweaks.tweaks.blocks.finitewater=Finite Water +cfg.universaltweaks.tweaks.blocks.sapling=Sapling Behavior cfg.universaltweaks.tweaks.entities.attributes=Attributes cfg.universaltweaks.tweaks.entities.betterburning=Better Burning cfg.universaltweaks.tweaks.entities.collisiondamage=Collision Damage diff --git a/src/main/resources/mixins.tweaks.blocks.sapling.json b/src/main/resources/mixins.tweaks.blocks.sapling.json new file mode 100644 index 00000000..2646989a --- /dev/null +++ b/src/main/resources/mixins.tweaks.blocks.sapling.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.tweaks.blocks.sapling.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTSaplingMixin"] +} \ No newline at end of file