From e54dac47a8e5cd0a2bc5c06c628d72dc61491136 Mon Sep 17 00:00:00 2001 From: CammiePone Date: Mon, 20 Jan 2025 01:31:13 -0800 Subject: [PATCH] we have working localized time dilation :3 --- .../client/AbstractClientPlayerMixin.java | 30 ------ .../mixin/client/TimerMixin.java | 33 ++++++ .../mixin/common/EntityMixin.java | 11 +- .../mixin/common/ServerLevelMixin.java | 3 +- .../resources/arcanuscontinuum.mixins.json | 102 +++++++++--------- 5 files changed, 95 insertions(+), 84 deletions(-) delete mode 100644 src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/client/AbstractClientPlayerMixin.java create mode 100644 src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/client/TimerMixin.java diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/client/AbstractClientPlayerMixin.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/client/AbstractClientPlayerMixin.java deleted file mode 100644 index c3cf2d7b..00000000 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/client/AbstractClientPlayerMixin.java +++ /dev/null @@ -1,30 +0,0 @@ -package dev.cammiescorner.arcanuscontinuum.mixin.client; - -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import com.mojang.authlib.GameProfile; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(AbstractClientPlayer.class) -public abstract class AbstractClientPlayerMixin extends Player { - public AbstractClientPlayerMixin(Level level, BlockPos pos, float yRot, GameProfile gameProfile) { super(level, pos, yRot, gameProfile); } - - @WrapWithCondition(method = "tick", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/entity/player/Player;tick()V" - )) - private boolean timeSlow(Player instance) { - // TODO figure out how to smooth this & tie it to being in a time dilation field - if(level().getGameTime() % 2 == 0) { - setOldPosAndRot(); - tickCount++; - return false; - } - - return true; - } -} diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/client/TimerMixin.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/client/TimerMixin.java new file mode 100644 index 00000000..fd7768ff --- /dev/null +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/client/TimerMixin.java @@ -0,0 +1,33 @@ +package dev.cammiescorner.arcanuscontinuum.mixin.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.Timer; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(Timer.class) +public abstract class TimerMixin { + @Shadow @Final @Mutable private float msPerTick; + @Unique float ticksPerSecond; + + @Inject(method = "", at = @At("TAIL")) + private void captureTickRate(float ticksPerSecond, long lastMs, CallbackInfo info) { + this.ticksPerSecond = ticksPerSecond; + } + + @Inject(method = "advanceTime", at = @At("HEAD")) + private void slowDownTicks(long gameTime, CallbackInfoReturnable info) { + LocalPlayer player = Minecraft.getInstance().player; + + // TODO tie to being in a time dilation entity + if(player != null && player.position().distanceTo(new Vec3(0, 146, 0)) < 16) + msPerTick = 1000f / (ticksPerSecond / 2f); + else + msPerTick = 1000f / ticksPerSecond; + } +} diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/EntityMixin.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/EntityMixin.java index 0bf3c694..4da4d05c 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/EntityMixin.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/EntityMixin.java @@ -1,14 +1,21 @@ package dev.cammiescorner.arcanuscontinuum.mixin.common; import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(Entity.class) -public class EntityMixin { +public abstract class EntityMixin { + @Shadow public abstract Vec3 position(); + @ModifyVariable(method = "playSound(Lnet/minecraft/sounds/SoundEvent;FF)V", at = @At("HEAD"), argsOnly = true, ordinal = 1) private float pitchDown(float pitch) { - return pitch * 0.5f; // TODO tie to being in a time dilation entity + if(position().distanceTo(new Vec3(0, 146, 0)) < 16) + return pitch * 0.5f; // TODO tie to being in a time dilation entity + + return pitch; } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/ServerLevelMixin.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/ServerLevelMixin.java index 4c321876..b05259ec 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/ServerLevelMixin.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/ServerLevelMixin.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.storage.WritableLevelData; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -26,7 +27,7 @@ public abstract class ServerLevelMixin extends Level { )) private boolean slowTime(ServerLevel instance, Consumer consumer, Entity entity) { // TODO tie to being in a time dilation entity - if(getGameTime() % 2 == 0) { + if(entity.position().distanceTo(new Vec3(0, 146, 0)) < 16 && getGameTime() % 2 == 0) { entity.setOldPosAndRot(); entity.tickCount++; return false; diff --git a/src/main/resources/arcanuscontinuum.mixins.json b/src/main/resources/arcanuscontinuum.mixins.json index 12d06e83..7b4ec5f6 100644 --- a/src/main/resources/arcanuscontinuum.mixins.json +++ b/src/main/resources/arcanuscontinuum.mixins.json @@ -1,54 +1,54 @@ { - "required": true, - "minVersion": "0.8", - "package": "dev.cammiescorner.arcanuscontinuum.mixin", - "plugin": "dev.cammiescorner.arcanuscontinuum.ArcanusMixinConfig", - "compatibilityLevel": "JAVA_${java_version}", - "mixins": [ - "common.AbstractArrowMixin", - "common.ArmorStandMixin", - "common.BlockStateBaseMixin", - "common.EnderDragonPartMixin", - "common.EntityGetterMixin", - "common.EntityMixin", - "common.ExplosionMixin", - "common.FallingBlockMixin", - "common.FoodDataMixin", - "common.ItemEntityMixin", - "common.ItemStackMixin", - "common.LecternBlockEntityMixin", - "common.LevelMixin", - "common.LivingEntityMixin", - "common.MenuTypeMixin", - "common.MilkBucketItemMixin", - "common.MobMixin", - "common.PistonBaseBlockMixin", - "common.PlayerListMixin", - "common.PlayerMixin", - "common.ServerLevelMixin", - "common.ThrowableProjectileMixin", - "compat.pehkui.LivingEntityMixin", - "datagen.AdvancementBuilderMixin", - "datagen.FabricDynamicRegistryProviderEntriesMixin", - "datagen.RegistrySetBuilderMixin" - ], - "client": [ - "client.AbstractClientPlayerMixin", - "client.ClientLevelMixin", - "client.CraftingScreenMixin", - "client.GuiMixin", - "client.HumanoidModelMixin", - "client.ItemInHandLayerMixin", - "client.ItemInHandRendererMixin", - "client.ItemRendererMixin", - "client.LevelRendererMixin", - "client.LivingEntityRendererMixin", - "client.MinecraftMixin", - "client.MouseHandlerMixin", - "client.PlayerRendererMixin", - "client.RenderTargetMixin" - ], - "injectors": { - "defaultRequire": 1 + "required": true, + "minVersion": "0.8", + "package": "dev.cammiescorner.arcanuscontinuum.mixin", + "plugin": "dev.cammiescorner.arcanuscontinuum.ArcanusMixinConfig", + "compatibilityLevel": "JAVA_${java_version}", + "mixins": [ + "common.AbstractArrowMixin", + "common.ArmorStandMixin", + "common.BlockStateBaseMixin", + "common.EnderDragonPartMixin", + "common.EntityGetterMixin", + "common.EntityMixin", + "common.ExplosionMixin", + "common.FallingBlockMixin", + "common.FoodDataMixin", + "common.ItemEntityMixin", + "common.ItemStackMixin", + "common.LecternBlockEntityMixin", + "common.LevelMixin", + "common.LivingEntityMixin", + "common.MenuTypeMixin", + "common.MilkBucketItemMixin", + "common.MobMixin", + "common.PistonBaseBlockMixin", + "common.PlayerListMixin", + "common.PlayerMixin", + "common.ServerLevelMixin", + "common.ThrowableProjectileMixin", + "compat.pehkui.LivingEntityMixin", + "datagen.AdvancementBuilderMixin", + "datagen.FabricDynamicRegistryProviderEntriesMixin", + "datagen.RegistrySetBuilderMixin" + ], + "client": [ + "client.ClientLevelMixin", + "client.CraftingScreenMixin", + "client.GuiMixin", + "client.HumanoidModelMixin", + "client.ItemInHandLayerMixin", + "client.ItemInHandRendererMixin", + "client.ItemRendererMixin", + "client.LevelRendererMixin", + "client.LivingEntityRendererMixin", + "client.MinecraftMixin", + "client.MouseHandlerMixin", + "client.PlayerRendererMixin", + "client.RenderTargetMixin", + "client.TimerMixin" + ], + "injectors": { + "defaultRequire": 1 } }