From dd9f421972c282407eb0ee828455b748032c6212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB?= Date: Tue, 12 Jul 2022 18:46:32 -0700 Subject: [PATCH] Growing --- .../terra/fabric/FabricASMEntryPoint.java | 17 ---- .../terra/fabric/util/FabricLoaderUtil.java | 18 ----- .../fabric/src/main/resources/fabric.mod.json | 3 - .../java/com/dfsek/terra/mod/ModPlatform.java | 4 +- .../terra/mod/config/FertilizableConfig.java | 51 ++++++++++++ .../mod/config/VanillaBiomeProperties.java | 6 +- ...lsUnsynchronizedRandomAccessFixMixin.java} | 2 +- ...ava => NetherFossilOptimizationMixin.java} | 2 +- .../mod/mixin/gameplay/BoneMealItemMixin.java | 32 ++++++++ .../mod/mixin/gameplay/BoneMealTaskMixin.java | 57 +++++++++++++ .../mod/mixin/gameplay/ServerWorldMixin.java | 32 ++++++++ .../com/dfsek/terra/mod/util/BiomeUtil.java | 5 +- .../terra/mod/util/FertilizableUtil.java | 50 ++++++++---- .../main/resources/terra.common.mixins.json | 7 +- .../terra/lifecycle/asm/FertilizableASM.java | 79 ------------------- .../dfsek/terra/lifecycle/util/ASMUtil.java | 56 ------------- .../dfsek/terra/quilt/QuiltASMEntryPoint.java | 17 ---- .../terra/quilt/util/QuiltLoaderUtil.java | 18 ----- .../quilt/src/main/resources/quilt.mod.json | 3 - 19 files changed, 221 insertions(+), 238 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricASMEntryPoint.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricLoaderUtil.java create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/FertilizableConfig.java rename platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/{BeeMoveGoalsUnsynchronizedRandomAccessFix.java => BeeMoveGoalsUnsynchronizedRandomAccessFixMixin.java} (94%) rename platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/{NetherFossilOptimization.java => NetherFossilOptimizationMixin.java} (96%) create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealItemMixin.java create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealTaskMixin.java create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/ServerWorldMixin.java delete mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/asm/FertilizableASM.java delete mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/ASMUtil.java delete mode 100644 platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltASMEntryPoint.java delete mode 100644 platforms/quilt/src/main/java/com/dfsek/terra/quilt/util/QuiltLoaderUtil.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricASMEntryPoint.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricASMEntryPoint.java deleted file mode 100644 index 60dcde0d1..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricASMEntryPoint.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.fabric; - -import net.gudenau.minecraft.asm.api.v1.AsmInitializer; -import net.gudenau.minecraft.asm.api.v1.AsmRegistry; - -import com.dfsek.terra.fabric.util.FabricLoaderUtil; -import com.dfsek.terra.lifecycle.asm.FertilizableASM; -import com.dfsek.terra.lifecycle.util.LoaderUtil; - - -public class FabricASMEntryPoint implements AsmInitializer { - @Override - public void onInitializeAsm() { - LoaderUtil.INSTANCE = new FabricLoaderUtil(); - AsmRegistry.getInstance().registerTransformer(new FertilizableASM()); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricLoaderUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricLoaderUtil.java deleted file mode 100644 index a9813edbf..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricLoaderUtil.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.fabric.util; - -import com.dfsek.terra.lifecycle.util.LoaderUtil; - -import net.fabricmc.loader.api.FabricLoader; - - -public class FabricLoaderUtil extends LoaderUtil { - @Override - public String mapClassName(String namespace, String className) { - return FabricLoader.getInstance().getMappingResolver().mapClassName(namespace, className); - } - - @Override - public String mapMethodName(String namespace, String owner, String name, String descriptor) { - return FabricLoader.getInstance().getMappingResolver().mapMethodName(namespace, owner, name, descriptor); - } -} diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index 4647d6933..e71bcfeac 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -18,9 +18,6 @@ "entrypoints": { "main": [ "com.dfsek.terra.fabric.FabricEntryPoint" - ], - "gud_asm": [ - "com.dfsek.terra.fabric.FabricASMEntryPoint" ] }, "mixins": [ diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java index 5d2565794..03d7e179c 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java @@ -37,6 +37,7 @@ import com.dfsek.terra.mod.config.BiomeAdditionsSoundTemplate; import com.dfsek.terra.mod.config.BiomeMoodSoundTemplate; import com.dfsek.terra.mod.config.BiomeParticleConfigTemplate; import com.dfsek.terra.mod.config.EntityTypeTemplate; +import com.dfsek.terra.mod.config.FertilizableConfig; import com.dfsek.terra.mod.config.MusicSoundTemplate; import com.dfsek.terra.mod.config.ProtoPlatformBiome; import com.dfsek.terra.mod.config.SoundEventTemplate; @@ -95,7 +96,8 @@ public abstract class ModPlatform extends AbstractPlatform { .registerLoader(SpawnEntry.class, SpawnEntryTemplate::new) .registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new) .registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new) - .registerLoader(VillagerType.class, VillagerTypeTemplate::new); + .registerLoader(VillagerType.class, VillagerTypeTemplate::new) + .registerLoader(FertilizableConfig.class, FertilizableConfig::new); } private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/FertilizableConfig.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/FertilizableConfig.java new file mode 100644 index 000000000..d1fe3f92d --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/FertilizableConfig.java @@ -0,0 +1,51 @@ +package com.dfsek.terra.mod.config; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minecraft.util.Identifier; + +import java.util.Map; + +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; +import com.dfsek.terra.api.util.collection.ProbabilityCollection; + + +public class FertilizableConfig implements ObjectTemplate { + @Value("strucutres") + @Default + private ProbabilityCollection structures = null; + + @Value("cooldowns") + @Default + private Map cooldowns = null; + + @Value("can-grow") + @Default + private ConfiguredStructure canGrow = null; + + @Value("villager-fertilizable") + @Default + private Boolean villagerFertilizable = null; + + public ProbabilityCollection getStructures() { + return structures; + } + + public Map getCooldowns() { + return cooldowns; + } + + public ConfiguredStructure getCanGrow() { + return canGrow; + } + + public Boolean isVillagerFertilizable() { + return villagerFertilizable; + } + + @Override + public FertilizableConfig get() { + return this; + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java index f996b31b5..5c852d68a 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java @@ -20,15 +20,13 @@ import java.util.List; import java.util.Map; import com.dfsek.terra.api.properties.Properties; -import com.dfsek.terra.api.structure.configured.ConfiguredStructure; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; public class VanillaBiomeProperties implements ConfigTemplate, Properties { @Value("minecraft.fertilizables") @Default - private Map> fertilizables = Collections.emptyMap(); + private Map fertilizables = Collections.emptyMap(); @Value("minecraft.tags") @Default @@ -106,7 +104,7 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { @Default private VillagerType villagerType = null; - public Map> getFertilizables() { + public Map getFertilizables() { return fertilizables; } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFix.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFixMixin.java similarity index 94% rename from platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFix.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFixMixin.java index f29e6d259..6ef0478df 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFix.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFixMixin.java @@ -19,7 +19,7 @@ import com.dfsek.terra.mod.CommonPlatform; MoveToHiveGoal.class, MoveToFlowerGoal.class }) -public class BeeMoveGoalsUnsynchronizedRandomAccessFix { +public class BeeMoveGoalsUnsynchronizedRandomAccessFixMixin { @Redirect(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/world/World;random:Lnet/minecraft/util/math/random/Random;")) public Random redirectRandomAccess(World instance) { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimization.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimizationMixin.java similarity index 96% rename from platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimization.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimizationMixin.java index f2ab4956a..c3c199629 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimization.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimizationMixin.java @@ -20,7 +20,7 @@ import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; * nether. */ @Mixin(NetherFossilStructure.class) -public class NetherFossilOptimization { +public class NetherFossilOptimizationMixin { @Inject(method = "getStructurePosition", at = @At("HEAD"), cancellable = true) public void injectFossilPositions(Context context, CallbackInfoReturnable> cir) { if(context.chunkGenerator() instanceof MinecraftChunkGeneratorWrapper) { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealItemMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealItemMixin.java new file mode 100644 index 000000000..22fac5a71 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealItemMixin.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.mod.mixin.gameplay; + + +import net.minecraft.item.BoneMealItem; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.dfsek.terra.mod.util.FertilizableUtil; + + +@Mixin(BoneMealItem.class) +public class BoneMealItemMixin { + private static final Identifier cooldownId = new Identifier("terra", "bone_meal_cooldown"); + + @Inject(method = "useOnFertilizable", at = @At("HEAD"), cancellable = true) + private static void injectUseOnFertilizable(ItemStack stack, World world, BlockPos pos, CallbackInfoReturnable cir) { + if(world instanceof ServerWorld) { + Boolean value = FertilizableUtil.grow((ServerWorld) world, pos, world.getBlockState(pos), cooldownId); + stack.decrement(1); + if(value != null) { + cir.setReturnValue(value); + } + } + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealTaskMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealTaskMixin.java new file mode 100644 index 000000000..90e93b656 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealTaskMixin.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.mod.mixin.gameplay; + + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.ai.brain.task.BoneMealTask; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.Registry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Map; +import java.util.Random; + +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; +import com.dfsek.terra.api.util.Rotation; +import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.terra.api.world.WritableWorld; +import com.dfsek.terra.mod.config.FertilizableConfig; +import com.dfsek.terra.mod.util.BiomeUtil; + + +@Mixin(BoneMealTask.class) +public class BoneMealTaskMixin { + + @Inject(method = "canBoneMeal", at = @At("HEAD"), cancellable = true) + public void injectCanBoneMeal(BlockPos pos, ServerWorld world, CallbackInfoReturnable cir) { + Map map = BiomeUtil.TERRA_BIOME_FERTILIZABLE_MAP.get(world.getBiome(pos)); + if(map != null) { + BlockState blockState = world.getBlockState(pos); + Block block = blockState.getBlock(); + FertilizableConfig config = map.get(Registry.BLOCK.getId(block)); + if(config != null) { + Boolean villagerFertilizable = config.isVillagerFertilizable(); + if(villagerFertilizable != null) { + if(villagerFertilizable) { + ConfiguredStructure canGrow = config.getCanGrow(); + if(canGrow != null) { + Random random = (Random) world.getRandom(); + cir.setReturnValue(canGrow.getStructure().get(random).generate( + Vector3Int.of(pos.getX(), pos.getY(), pos.getZ()), (WritableWorld) world, random, Rotation.NONE)); + return; + } + cir.setReturnValue(true); + return; + } + cir.setReturnValue(false); + return; + } + } + } + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/ServerWorldMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/ServerWorldMixin.java new file mode 100644 index 000000000..0081db33d --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/ServerWorldMixin.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.mod.mixin.gameplay; + + +import net.minecraft.block.BlockState; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.random.Random; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import com.dfsek.terra.mod.util.FertilizableUtil; + + +@Mixin(ServerWorld.class) +public class ServerWorldMixin { + private static final Identifier cooldownId = new Identifier("terra", "random_cooldown"); + + @Redirect(method = "tickChunk", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/block/BlockState;randomTick(Lnet/minecraft/server/world/ServerWorld;" + + "Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/random/Random;)V")) + public void injectTickChunk(BlockState instance, ServerWorld serverWorld, BlockPos blockPos, Random random) { + Boolean value = FertilizableUtil.grow(serverWorld, blockPos, instance, cooldownId); + if(value != null) { + if(!value) { + instance.randomTick(serverWorld, blockPos, random); + } + } + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java index 9da187845..e6a3546fe 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java @@ -17,10 +17,9 @@ import java.util.Map; import java.util.Objects; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.structure.configured.ConfiguredStructure; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.mod.CommonPlatform; +import com.dfsek.terra.mod.config.FertilizableConfig; import com.dfsek.terra.mod.config.ProtoPlatformBiome; import com.dfsek.terra.mod.config.VanillaBiomeProperties; import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor; @@ -29,7 +28,7 @@ import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor; public class BiomeUtil { private static final Logger logger = LoggerFactory.getLogger(BiomeUtil.class); - public static final Map, Map>> + public static final Map, Map> TERRA_BIOME_FERTILIZABLE_MAP = new HashMap<>(); public static final Map, List> diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/FertilizableUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/FertilizableUtil.java index 67a17e96b..7ee320b75 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/FertilizableUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/FertilizableUtil.java @@ -1,34 +1,54 @@ package com.dfsek.terra.mod.util; -import com.dfsek.terra.api.util.Rotation; -import com.dfsek.terra.api.util.vector.Vector3Int; - -import com.dfsek.terra.api.world.WritableWorld; - +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; import net.minecraft.util.registry.Registry; import java.util.Map; +import java.util.Random; import com.dfsek.terra.api.structure.configured.ConfiguredStructure; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; +import com.dfsek.terra.api.util.Rotation; +import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.terra.api.world.WritableWorld; +import com.dfsek.terra.mod.config.FertilizableConfig; public class FertilizableUtil { - public static boolean grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - Map> fertilizables = BiomeUtil.TERRA_BIOME_FERTILIZABLE_MAP.get(world.getBiome(pos)); - if (fertilizables != null) { - ProbabilityCollection probabilityCollection = fertilizables.get(Registry.BLOCK.getId(state.getBlock())); - if (probabilityCollection != null) { - ConfiguredStructure structure = probabilityCollection.get((java.util.Random) random); - structure.getStructure().get((java.util.Random) random).generate(Vector3Int.of(pos.getX(), pos.getY(), pos.getZ()), (WritableWorld) world, (java.util.Random) random, Rotation.NONE); + + private static final Random mojankRandom = new Random(); + + public static Boolean grow(ServerWorld world, BlockPos pos, BlockState state, Identifier cooldownId) { + return grow(world, mojankRandom, pos, state, cooldownId); + } + + public static Boolean grow(ServerWorld world, Random random, BlockPos pos, BlockState state, Identifier cooldownId) { + Map map = BiomeUtil.TERRA_BIOME_FERTILIZABLE_MAP.get(world.getBiome(pos)); + if(map != null) { + Block block = state.getBlock(); + FertilizableConfig config = map.get(Registry.BLOCK.getId(block)); + if(config != null) { + ConfiguredStructure canGrow = config.getCanGrow(); + if(canGrow != null) { + if(!canGrow.getStructure().get(random).generate( + Vector3Int.of(pos.getX(), pos.getY(), pos.getZ()), (WritableWorld) world, random, Rotation.NONE)) { + return false; + } + } + Double cooldown = config.getCooldowns().get(cooldownId); + if(cooldown != null) { + if(random.nextFloat() > cooldown) { + return true; + } + } + config.getStructures().get(random).getStructure().get(random).generate( + Vector3Int.of(pos.getX(), pos.getY(), pos.getZ()), (WritableWorld) world, random, Rotation.NONE); return true; } } - return false; + return null; } } diff --git a/platforms/mixin-common/src/main/resources/terra.common.mixins.json b/platforms/mixin-common/src/main/resources/terra.common.mixins.json index d4402241c..c8ebae978 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -9,8 +9,11 @@ "access.StateAccessor", "access.StructureAccessorAccessor", "access.VillagerTypeAccessor", - "fix.BeeMoveGoalsUnsynchronizedRandomAccessFix", - "fix.NetherFossilOptimization", + "fix.BeeMoveGoalsUnsynchronizedRandomAccessFixMixin", + "fix.NetherFossilOptimizationMixin", + "gameplay.BoneMealItemMixin", + "gameplay.BoneMealTaskMixin", + "gameplay.ServerWorldMixin", "implementations.compat.GenerationSettingsFloraFeaturesMixin", "implementations.terra.BiomeMixin", "implementations.terra.HandleImplementationMixin", diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/asm/FertilizableASM.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/asm/FertilizableASM.java deleted file mode 100644 index 09cfa0272..000000000 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/asm/FertilizableASM.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.dfsek.terra.lifecycle.asm; - -import net.gudenau.minecraft.asm.api.v1.Identifier; -import net.gudenau.minecraft.asm.api.v1.Transformer; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.InsnList; -import org.objectweb.asm.tree.InsnNode; -import org.objectweb.asm.tree.JumpInsnNode; -import org.objectweb.asm.tree.LabelNode; -import org.objectweb.asm.tree.MethodInsnNode; -import org.objectweb.asm.tree.MethodNode; -import org.objectweb.asm.tree.VarInsnNode; - -import java.io.IOException; - -import com.dfsek.terra.lifecycle.util.ASMUtil; -import com.dfsek.terra.lifecycle.util.LoaderUtil; -import com.dfsek.terra.mod.util.FertilizableUtil; - -import static org.objectweb.asm.Opcodes.ACC_STATIC; - - -public class FertilizableASM implements Transformer { - - private static String fertilizableClassName = LoaderUtil.INSTANCE.mapClassName("intermediary", "net.minecraft.class_2256"); - - private static String fertilizableGrowMethodSignatureBase = String.format("(L%1$s;L%2$s;L%3$s;L%4$s;)", - LoaderUtil.INSTANCE.mapClassName("intermediary", "net.minecraft.class_3218").replace(".", "/"), - LoaderUtil.INSTANCE.mapClassName("intermediary", "net.minecraft.class_5819").replace(".", "/"), - LoaderUtil.INSTANCE.mapClassName("intermediary", "net.minecraft.class_2338").replace(".", "/"), - LoaderUtil.INSTANCE.mapClassName("intermediary", "net.minecraft.class_2680").replace(".", "/")); - - private static String fertilizableGrowMethodSignature = fertilizableGrowMethodSignatureBase + "V"; - - private static String fertilizableGrowMethodName = LoaderUtil.INSTANCE.mapMethodName("intermediary", "net.minecraft.class_2256", "method_9652", "(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V"); - - @Override - public Identifier getName() { - return new Identifier("terra", "asm_test"); - } - - @Override - public boolean handlesClass(String name, String transformedName) { - return true; - } - - @Override - public boolean transform(ClassNode classNode, Flags flags) { - try { - if (ASMUtil.inheritsFrom(classNode, fertilizableClassName.replace(".", "/"))) { - for (MethodNode method : classNode.methods) { - if (method.name.equals(fertilizableGrowMethodName)) { - if ((method.access & ACC_STATIC) == 0) { - if(method.desc.equals(fertilizableGrowMethodSignature)) { - InsnList list = new InsnList(); - list.add(new VarInsnNode(Opcodes.ALOAD, 1)); - list.add(new VarInsnNode(Opcodes.ALOAD, 2)); - list.add(new VarInsnNode(Opcodes.ALOAD, 3)); - list.add(new VarInsnNode(Opcodes.ALOAD, 4)); - list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, FertilizableUtil.class.getName().replace(".", "/"), "grow", fertilizableGrowMethodSignatureBase + "Z", false)); - LabelNode jmp = new LabelNode(); - list.add(new JumpInsnNode(Opcodes.IFNE, jmp)); - list.add(new InsnNode(Opcodes.RETURN)); - list.add(jmp); - method.instructions.insertBefore(method.instructions.getFirst(), list); - flags.requestFrames(); - return true; - } - } - } - } - } - } catch(IOException e) { - throw new RuntimeException(e); - } - return false; - } -} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/ASMUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/ASMUtil.java deleted file mode 100644 index 918c398b1..000000000 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/ASMUtil.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.dfsek.terra.lifecycle.util; - -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.tree.ClassNode; - -import java.io.IOException; -import java.util.WeakHashMap; - -import static org.objectweb.asm.ClassReader.SKIP_CODE; -import static org.objectweb.asm.ClassReader.SKIP_DEBUG; -import static org.objectweb.asm.ClassReader.SKIP_FRAMES; - - -public class ASMUtil { - static final ThreadLocal>> INHERITANCE_CACHE = new ThreadLocal<>(); - - public static boolean inheritsFrom(ClassNode classNode, String interfaceName) throws IOException { - if (INHERITANCE_CACHE.get() == null) { - INHERITANCE_CACHE.set(new WeakHashMap<>()); - } - return inheritsFromInternal(classNode, interfaceName); - } - - protected static boolean inheritsFromInternal(ClassNode classNode, String interfaceName) throws IOException { - if (INHERITANCE_CACHE.get().containsKey(classNode.name)) { - if (INHERITANCE_CACHE.get().get(classNode.name).containsKey(interfaceName)) { - return INHERITANCE_CACHE.get().get(classNode.name).get(interfaceName); - } - } - for (String parent : classNode.interfaces) { - if (checkClass(parent, interfaceName)) { - return true; - } - } - if (checkClass(classNode.superName, interfaceName)) { - return true; - } - INHERITANCE_CACHE.get().getOrDefault(classNode.name, new WeakHashMap<>()).put(interfaceName, false); - return false; - } - - protected static boolean checkClass(String name, String interfaceName) throws IOException { - if (name.startsWith("java/")) { - return false; - } - - boolean isClass = name.equals(interfaceName); - INHERITANCE_CACHE.get().getOrDefault(name, new WeakHashMap<>()).put(interfaceName, isClass); - if (isClass) { - return true; - } - ClassNode node = new ClassNode(); - new ClassReader(name).accept(node, SKIP_CODE | SKIP_DEBUG | SKIP_FRAMES); - return inheritsFromInternal(node, interfaceName); - } -} diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltASMEntryPoint.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltASMEntryPoint.java deleted file mode 100644 index 4ecd2b7d7..000000000 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltASMEntryPoint.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.quilt; - -import net.gudenau.minecraft.asm.api.v1.AsmInitializer; -import net.gudenau.minecraft.asm.api.v1.AsmRegistry; - -import com.dfsek.terra.lifecycle.asm.FertilizableASM; -import com.dfsek.terra.lifecycle.util.LoaderUtil; -import com.dfsek.terra.quilt.util.QuiltLoaderUtil; - - -public class QuiltASMEntryPoint implements AsmInitializer { - @Override - public void onInitializeAsm() { - LoaderUtil.INSTANCE = new QuiltLoaderUtil(); - AsmRegistry.getInstance().registerTransformer(new FertilizableASM()); - } -} diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/util/QuiltLoaderUtil.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/util/QuiltLoaderUtil.java deleted file mode 100644 index 19a3f4bf3..000000000 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/util/QuiltLoaderUtil.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.quilt.util; - -import com.dfsek.terra.lifecycle.util.LoaderUtil; - -import org.quiltmc.loader.api.QuiltLoader; - - -public class QuiltLoaderUtil extends LoaderUtil { - @Override - public String mapClassName(String namespace, String className) { - return QuiltLoader.getMappingResolver().mapClassName(namespace, className); - } - - @Override - public String mapMethodName(String namespace, String owner, String name, String descriptor) { - return QuiltLoader.getMappingResolver().mapMethodName(namespace, owner, name, descriptor); - } -} diff --git a/platforms/quilt/src/main/resources/quilt.mod.json b/platforms/quilt/src/main/resources/quilt.mod.json index e2151593d..0f53988ec 100644 --- a/platforms/quilt/src/main/resources/quilt.mod.json +++ b/platforms/quilt/src/main/resources/quilt.mod.json @@ -26,9 +26,6 @@ ], "pre_launch": [ "com.dfsek.terra.quilt.QuiltPreLaunchEntryPoint" - ], - "gud_asm": [ - "com.dfsek.terra.quilt.QuiltASMEntryPoint" ] }, "depends": [