From ba2a947fce7f449a5324cf35793e9f4516f93640 Mon Sep 17 00:00:00 2001 From: Zepalesque <60141811+Zepalesque@users.noreply.github.com> Date: Sat, 1 Jun 2024 21:37:50 -0400 Subject: [PATCH] feat: Quicksoil system --- src/main/java/net/zepalesque/redux/Redux.java | 17 -------- .../zepalesque/redux/block/ReduxBlocks.java | 4 +- .../redux/client/event/hook/KeyHooks.java | 15 +++++++ .../event/listener/ClientMobListener.java | 20 ++++++++++ .../zepalesque/redux/config/ReduxConfig.java | 4 ++ .../net/zepalesque/redux/data/ReduxTags.java | 2 + .../redux/event/hook/QuicksoilHooks.java | 28 +++++++++++++ ...lModifyHooks.java => ToolActionHooks.java} | 2 +- .../redux/event/listener/MobListener.java | 21 ++++++++++ ...yListener.java => ToolActionListener.java} | 6 +-- .../color/AetherColorResolversMixin.java | 1 - .../mixin/mixins/common/QuicksoilMixin.java | 40 +++++++++++++++++++ .../common/accessor/EntityAccessor.java | 12 ++++++ .../common/base/BlockBehaviorMixin.java | 18 +++++++++ src/main/resources/aether_redux.mixins.json | 6 ++- 15 files changed, 171 insertions(+), 25 deletions(-) create mode 100644 src/main/java/net/zepalesque/redux/client/event/hook/KeyHooks.java create mode 100644 src/main/java/net/zepalesque/redux/client/event/listener/ClientMobListener.java create mode 100644 src/main/java/net/zepalesque/redux/event/hook/QuicksoilHooks.java rename src/main/java/net/zepalesque/redux/event/hook/{ToolModifyHooks.java => ToolActionHooks.java} (97%) create mode 100644 src/main/java/net/zepalesque/redux/event/listener/MobListener.java rename src/main/java/net/zepalesque/redux/event/listener/{ToolModifyListener.java => ToolActionListener.java} (86%) create mode 100644 src/main/java/net/zepalesque/redux/mixin/mixins/common/QuicksoilMixin.java create mode 100644 src/main/java/net/zepalesque/redux/mixin/mixins/common/accessor/EntityAccessor.java create mode 100644 src/main/java/net/zepalesque/redux/mixin/mixins/common/base/BlockBehaviorMixin.java diff --git a/src/main/java/net/zepalesque/redux/Redux.java b/src/main/java/net/zepalesque/redux/Redux.java index 1737e5131..23c140dcd 100644 --- a/src/main/java/net/zepalesque/redux/Redux.java +++ b/src/main/java/net/zepalesque/redux/Redux.java @@ -1,8 +1,6 @@ package net.zepalesque.redux; import com.aetherteam.aether.Aether; -import com.aetherteam.aether.data.AetherData; -import com.aetherteam.aether.data.generators.AetherRegistrySets; import com.mojang.logging.LogUtils; import net.minecraft.DetectedVersion; import net.minecraft.SharedConstants; @@ -23,11 +21,8 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; -import net.neoforged.fml.DistExecutor; import net.neoforged.fml.ModList; -import net.neoforged.fml.ModLoadingContext; import net.neoforged.fml.common.Mod; -import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; @@ -41,9 +36,7 @@ import net.zepalesque.redux.client.ReduxColors; import net.zepalesque.redux.config.ReduxConfig; import net.zepalesque.redux.config.ReduxConfigHandler; -import net.zepalesque.redux.data.ReduxDataMaps; import net.zepalesque.redux.data.gen.ReduxBlockStateGen; -import net.zepalesque.redux.data.gen.ReduxDataMapGen; import net.zepalesque.redux.data.gen.ReduxItemModelGen; import net.zepalesque.redux.data.gen.ReduxLanguageGen; import net.zepalesque.redux.data.gen.ReduxLootGen; @@ -57,18 +50,8 @@ import net.zepalesque.redux.tile.ReduxTiles; import net.zepalesque.redux.world.biome.tint.ReduxBiomeTints; import net.zepalesque.redux.world.feature.gen.ReduxFeatures; -import net.zepalesque.zenith.api.biometint.BiomeTints; import net.zepalesque.zenith.api.blockset.AbstractStoneSet; import net.zepalesque.zenith.api.blockset.AbstractWoodSet; -import net.zepalesque.zenith.api.condition.ConditionElements; -import net.zepalesque.zenith.api.condition.ConfigCondition; -import net.zepalesque.zenith.api.condition.config.ConfigSerializer; -import net.zepalesque.zenith.loot.condition.ZenithLootConditions; -import net.zepalesque.zenith.recipe.condition.ZenithRecipeConditions; -import net.zepalesque.zenith.world.density.ZenithDensityFunctions; -import net.zepalesque.zenith.world.feature.gen.ZenithFeatures; -import net.zepalesque.zenith.world.feature.placement.ZenithPlacementModifiers; -import net.zepalesque.zenith.world.state.ZenithStateProviders; import org.slf4j.Logger; import java.nio.file.Path; diff --git a/src/main/java/net/zepalesque/redux/block/ReduxBlocks.java b/src/main/java/net/zepalesque/redux/block/ReduxBlocks.java index d34617f48..d42121c04 100644 --- a/src/main/java/net/zepalesque/redux/block/ReduxBlocks.java +++ b/src/main/java/net/zepalesque/redux/block/ReduxBlocks.java @@ -10,7 +10,7 @@ import net.neoforged.neoforge.registries.DeferredRegister; import net.zepalesque.redux.Redux; import net.zepalesque.redux.block.natural.AetherShortGrassBlock; -import net.zepalesque.redux.event.hook.ToolModifyHooks; +import net.zepalesque.redux.event.hook.ToolActionHooks; import net.zepalesque.redux.item.ReduxItems; import net.zepalesque.zenith.mixin.mixins.common.accessor.FireAccessor; @@ -43,6 +43,6 @@ public static void registerFlammability() { } public static void registerToolConversions() { - Redux.WOOD_SETS.forEach(set -> set.setupStrippables(ToolModifyHooks.STRIPPABLES)); + Redux.WOOD_SETS.forEach(set -> set.setupStrippables(ToolActionHooks.STRIPPABLES)); } } diff --git a/src/main/java/net/zepalesque/redux/client/event/hook/KeyHooks.java b/src/main/java/net/zepalesque/redux/client/event/hook/KeyHooks.java new file mode 100644 index 000000000..542acd936 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/client/event/hook/KeyHooks.java @@ -0,0 +1,15 @@ +package net.zepalesque.redux.client.event.hook; + +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.ToggleKeyMapping; +import net.minecraft.world.entity.LivingEntity; + +public class KeyHooks { + + public static void cancelKey(final LivingEntity entity, KeyMapping key) { + if (entity == Minecraft.getInstance().player) { + ToggleKeyMapping.set(key.getKey(), false); + } + } +} diff --git a/src/main/java/net/zepalesque/redux/client/event/listener/ClientMobListener.java b/src/main/java/net/zepalesque/redux/client/event/listener/ClientMobListener.java new file mode 100644 index 000000000..fe98080b4 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/client/event/listener/ClientMobListener.java @@ -0,0 +1,20 @@ +package net.zepalesque.redux.client.event.listener; + +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.LivingEntity; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.entity.living.LivingEvent; +import net.zepalesque.redux.client.event.hook.KeyHooks; +import net.zepalesque.redux.config.ReduxConfig; +import net.zepalesque.redux.event.hook.QuicksoilHooks; + +public class ClientMobListener { + + @SubscribeEvent + public static void cancelSneak(LivingEvent.LivingTickEvent event) { + final LivingEntity entity = event.getEntity(); + if (ReduxConfig.SERVER.revamped_quicksoil_movement.get() && QuicksoilHooks.shouldAlterMovement(entity)) { + KeyHooks.cancelKey(entity, Minecraft.getInstance().options.keyShift); + } + } +} diff --git a/src/main/java/net/zepalesque/redux/config/ReduxConfig.java b/src/main/java/net/zepalesque/redux/config/ReduxConfig.java index 72f54cb40..76a404649 100644 --- a/src/main/java/net/zepalesque/redux/config/ReduxConfig.java +++ b/src/main/java/net/zepalesque/redux/config/ReduxConfig.java @@ -10,6 +10,7 @@ public static class Server extends DataSerializableConfig { public final ModConfigSpec.ConfigValue redux_sky_colors; public final ModConfigSpec.ConfigValue cloudbed; + public final ModConfigSpec.ConfigValue revamped_quicksoil_movement; public Server(ModConfigSpec.Builder builder) { super(() -> SERVER_SPEC, "redux_server"); @@ -20,6 +21,9 @@ public Server(ModConfigSpec.Builder builder) { cloudbed = builder .comment("Replace the Aether's large Aercloud features with a noise-based cloudbed") .define("Cloudbed", true); + revamped_quicksoil_movement = builder + .comment("Changes quicksoil to make it use a better movement system, based on the way it worked in the Aether II: Highlands in 1.12") + .define("Revamped Quicksoil Movement", true); builder.pop(); } } diff --git a/src/main/java/net/zepalesque/redux/data/ReduxTags.java b/src/main/java/net/zepalesque/redux/data/ReduxTags.java index dd107ced3..892da1824 100644 --- a/src/main/java/net/zepalesque/redux/data/ReduxTags.java +++ b/src/main/java/net/zepalesque/redux/data/ReduxTags.java @@ -21,6 +21,8 @@ public static class Blocks { public static final TagKey BLIGHT_GRASS_BLOCKS = tag("blight_grass_blocks"); // Blocks that should make Short Aether Grass use its enchanted state public static final TagKey ENCHANTED_GRASS_BLOCKS = tag("enchanted_grass_blocks"); + // Blocks that should use the Highlands quicksoil system + public static final TagKey QUICKSOIL_BEHAVIOR = tag("quicksoil_behavior"); public static TagKey tag(String name) { return TagKey.create(Registries.BLOCK, Redux.loc(name)); diff --git a/src/main/java/net/zepalesque/redux/event/hook/QuicksoilHooks.java b/src/main/java/net/zepalesque/redux/event/hook/QuicksoilHooks.java new file mode 100644 index 000000000..00c8ef9ba --- /dev/null +++ b/src/main/java/net/zepalesque/redux/event/hook/QuicksoilHooks.java @@ -0,0 +1,28 @@ +package net.zepalesque.redux.event.hook; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.zepalesque.redux.data.ReduxTags; +import net.zepalesque.redux.mixin.mixins.common.accessor.EntityAccessor; + +public class QuicksoilHooks { + + public static boolean shouldAlterMovement(final LivingEntity entity) { + return entity.onGround() && + !entity.isInWater() && + !(Math.abs(entity.getDeltaMovement().x + entity.getDeltaMovement().y + entity.getDeltaMovement().z) < 0.001D) && + !entity.isSpectator() + && entity.level().getBlockState(((EntityAccessor) entity).callGetBlockPosBelowThatAffectsMyMovement()).is(ReduxTags.Blocks.QUICKSOIL_BEHAVIOR); + } + + public static void alterMovement(final LivingEntity entity) { + entity.setDeltaMovement(entity.getDeltaMovement().multiply(1.7D, 1D, 1.7D)); + final double maxMotion = 1D; + double x; + double z; + + x = Mth.clamp(entity.getDeltaMovement().x, -maxMotion, maxMotion); + z = Mth.clamp(entity.getDeltaMovement().z, -maxMotion, maxMotion); + entity.setDeltaMovement(x, entity.getDeltaMovement().y, z); + } +} diff --git a/src/main/java/net/zepalesque/redux/event/hook/ToolModifyHooks.java b/src/main/java/net/zepalesque/redux/event/hook/ToolActionHooks.java similarity index 97% rename from src/main/java/net/zepalesque/redux/event/hook/ToolModifyHooks.java rename to src/main/java/net/zepalesque/redux/event/hook/ToolActionHooks.java index 757db58e1..ccd8b5167 100644 --- a/src/main/java/net/zepalesque/redux/event/hook/ToolModifyHooks.java +++ b/src/main/java/net/zepalesque/redux/event/hook/ToolActionHooks.java @@ -10,7 +10,7 @@ import java.util.HashMap; import java.util.Map; -public class ToolModifyHooks { +public class ToolActionHooks { public static final Map STRIPPABLES = new HashMap<>(); diff --git a/src/main/java/net/zepalesque/redux/event/listener/MobListener.java b/src/main/java/net/zepalesque/redux/event/listener/MobListener.java new file mode 100644 index 000000000..642ec412d --- /dev/null +++ b/src/main/java/net/zepalesque/redux/event/listener/MobListener.java @@ -0,0 +1,21 @@ +package net.zepalesque.redux.event.listener; + +import net.minecraft.world.entity.LivingEntity; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.living.LivingEvent; +import net.zepalesque.redux.Redux; +import net.zepalesque.redux.config.ReduxConfig; +import net.zepalesque.redux.event.hook.QuicksoilHooks; + +@Mod.EventBusSubscriber(modid = Redux.MODID) +public class MobListener { + + @SubscribeEvent + public static void handleQuicksoilMovement(LivingEvent.LivingTickEvent event) { + final LivingEntity entity = event.getEntity(); + if (ReduxConfig.SERVER.revamped_quicksoil_movement.get() && QuicksoilHooks.shouldAlterMovement(entity)) { + QuicksoilHooks.alterMovement(entity); + } + } +} diff --git a/src/main/java/net/zepalesque/redux/event/listener/ToolModifyListener.java b/src/main/java/net/zepalesque/redux/event/listener/ToolActionListener.java similarity index 86% rename from src/main/java/net/zepalesque/redux/event/listener/ToolModifyListener.java rename to src/main/java/net/zepalesque/redux/event/listener/ToolActionListener.java index 2912023e9..2b80fb791 100644 --- a/src/main/java/net/zepalesque/redux/event/listener/ToolModifyListener.java +++ b/src/main/java/net/zepalesque/redux/event/listener/ToolActionListener.java @@ -8,10 +8,10 @@ import net.neoforged.neoforge.common.ToolAction; import net.neoforged.neoforge.event.level.BlockEvent; import net.zepalesque.redux.Redux; -import net.zepalesque.redux.event.hook.ToolModifyHooks; +import net.zepalesque.redux.event.hook.ToolActionHooks; @Mod.EventBusSubscriber(modid = Redux.MODID) -public class ToolModifyListener { +public class ToolActionListener { @SubscribeEvent public static void setupToolModifications(BlockEvent.BlockToolModificationEvent event) { @@ -19,7 +19,7 @@ public static void setupToolModifications(BlockEvent.BlockToolModificationEvent BlockPos pos = event.getPos(); BlockState oldState = event.getState(); ToolAction toolAction = event.getToolAction(); - BlockState newState = ToolModifyHooks.setupToolActions(levelAccessor, pos, oldState, toolAction); + BlockState newState = ToolActionHooks.setupToolActions(levelAccessor, pos, oldState, toolAction); if (newState != oldState && !event.isSimulated() && !event.isCanceled()) { event.setFinalState(newState); } diff --git a/src/main/java/net/zepalesque/redux/mixin/mixins/client/color/AetherColorResolversMixin.java b/src/main/java/net/zepalesque/redux/mixin/mixins/client/color/AetherColorResolversMixin.java index 30503a9ae..8242e9ee8 100644 --- a/src/main/java/net/zepalesque/redux/mixin/mixins/client/color/AetherColorResolversMixin.java +++ b/src/main/java/net/zepalesque/redux/mixin/mixins/client/color/AetherColorResolversMixin.java @@ -2,7 +2,6 @@ import com.aetherteam.aether.client.AetherColorResolvers; -import net.minecraft.client.renderer.entity.ItemRenderer; import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/net/zepalesque/redux/mixin/mixins/common/QuicksoilMixin.java b/src/main/java/net/zepalesque/redux/mixin/mixins/common/QuicksoilMixin.java new file mode 100644 index 000000000..e0cd93dcd --- /dev/null +++ b/src/main/java/net/zepalesque/redux/mixin/mixins/common/QuicksoilMixin.java @@ -0,0 +1,40 @@ +package net.zepalesque.redux.mixin.mixins.common; + +import com.aetherteam.aether.block.natural.QuicksoilBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.zepalesque.redux.config.ReduxConfig; +import net.zepalesque.redux.mixin.mixins.common.base.BlockBehaviorMixin; +import net.zepalesque.redux.mixin.mixins.common.base.BlockMixin; +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; + +@Mixin(QuicksoilBlock.class) +public class QuicksoilMixin extends BlockBehaviorMixin { + + @Override + public void redux$pathFindable(BlockState state, BlockGetter level, BlockPos pos, PathComputationType type, CallbackInfoReturnable cir) { + if (ReduxConfig.SERVER.revamped_quicksoil_movement.get() && type == PathComputationType.LAND) { + cir.setReturnValue(false); + } + } + + + @Inject(method = "getFriction", at = @At("HEAD"), cancellable = true) + public void redux$getFriction(BlockState state, LevelReader level, BlockPos pos, Entity entity, CallbackInfoReturnable cir) { + if (ReduxConfig.SERVER.revamped_quicksoil_movement.get()) { + if (entity instanceof Boat) { + cir.setReturnValue(0.8F); + return; + } + cir.setReturnValue(0.6F); + } + } +} diff --git a/src/main/java/net/zepalesque/redux/mixin/mixins/common/accessor/EntityAccessor.java b/src/main/java/net/zepalesque/redux/mixin/mixins/common/accessor/EntityAccessor.java new file mode 100644 index 000000000..8ff553293 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/mixin/mixins/common/accessor/EntityAccessor.java @@ -0,0 +1,12 @@ +package net.zepalesque.redux.mixin.mixins.common.accessor; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(Entity.class) +public interface EntityAccessor { + @Invoker + BlockPos callGetBlockPosBelowThatAffectsMyMovement(); +} diff --git a/src/main/java/net/zepalesque/redux/mixin/mixins/common/base/BlockBehaviorMixin.java b/src/main/java/net/zepalesque/redux/mixin/mixins/common/base/BlockBehaviorMixin.java new file mode 100644 index 000000000..8cf8d69e7 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/mixin/mixins/common/base/BlockBehaviorMixin.java @@ -0,0 +1,18 @@ +package net.zepalesque.redux.mixin.mixins.common.base; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; +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; + +@Mixin(BlockBehaviour.class) +public class BlockBehaviorMixin { + + @Inject(method = "isPathfindable", at = @At("HEAD"), cancellable = true) + public void redux$pathFindable(BlockState state, BlockGetter level, BlockPos pos, PathComputationType type, CallbackInfoReturnable cir) {} +} diff --git a/src/main/resources/aether_redux.mixins.json b/src/main/resources/aether_redux.mixins.json index af238c6ce..06f6ba312 100644 --- a/src/main/resources/aether_redux.mixins.json +++ b/src/main/resources/aether_redux.mixins.json @@ -6,7 +6,11 @@ "compatibilityLevel": "JAVA_17", "refmap": "aether_redux.refmap.json", "mixins": [ - "common.accessor.WallBlockAccessor" + "common.QuicksoilMixin", + "common.accessor.EntityAccessor", + "common.accessor.WallBlockAccessor", + "common.base.BlockBehaviorMixin", + "common.base.BlockMixin" ], "client": [ "client.color.AetherColorResolversMixin"