From fc293b7f42e48bcfbed02c012d672ac18182bc1c Mon Sep 17 00:00:00 2001 From: Unease Date: Thu, 26 Mar 2026 15:31:21 -0700 Subject: [PATCH 1/2] Ported tickrate rendering from LoTAS --- .../com/minecrafttas/tasmod/TASmodClient.java | 1 + .../mixin/tickrate/MixinAudioPitch.java | 24 ++++ .../mixin/tickrate/MixinEnchantmentGlimm.java | 28 +++++ .../tasmod/mixin/tickrate/MixinGuiToast.java | 105 ++++++++++++++++++ .../mixin/tickrate/MixinSoundManager.java | 31 ++++++ .../tasmod/mixin/tickrate/MixinSubtitle.java | 55 +++++++++ .../mixin/tickrate/MixinSubtitleOverlay.java | 33 ++++++ .../mixin/tickrate/MixinWorldborder.java | 19 ++++ .../TickrateChangerClient.java | 45 +++++++- .../com/minecrafttas/tasmod/util/Ducks.java | 5 + src/main/resources/tasmod.accesswidener | 3 +- src/main/resources/tasmod.mixin.json | 11 +- 12 files changed, 355 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinAudioPitch.java create mode 100644 src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinEnchantmentGlimm.java create mode 100644 src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinGuiToast.java create mode 100644 src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSoundManager.java create mode 100644 src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitle.java create mode 100644 src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitleOverlay.java create mode 100644 src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinWorldborder.java diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index 7bdc1279..8dc8ec4c 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -203,6 +203,7 @@ private void registerEventListeners() { EventListenerRegistry.register(savestateHandlerClient); EventListenerRegistry.register(virtual.interpolationHandler); + EventListenerRegistry.register(tickratechanger); } @Override diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinAudioPitch.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinAudioPitch.java new file mode 100644 index 00000000..d8c6e741 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinAudioPitch.java @@ -0,0 +1,24 @@ +package com.minecrafttas.tasmod.mixin.tickrate; + +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.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.minecrafttas.tasmod.TASmodClient; + +import paulscode.sound.Source; + +@Mixin(Source.class) +public abstract class MixinAudioPitch { + + @Shadow(remap = false) + public float pitch; + + @Inject(method = "setPitch", at = @At(value = "RETURN"), remap = false) + public void redosetPitch(float value, CallbackInfo ci) { + pitch = value * (TASmodClient.tickratechanger.ticksPerSecond / 20F); + } + +} diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinEnchantmentGlimm.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinEnchantmentGlimm.java new file mode 100644 index 00000000..4588ddc9 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinEnchantmentGlimm.java @@ -0,0 +1,28 @@ +package com.minecrafttas.tasmod.mixin.tickrate; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import com.minecrafttas.tasmod.TASmodClient; + +//#if MC>=10900 +import net.minecraft.client.renderer.RenderItem; +//#else +//$$ import net.minecraft.client.renderer.entity.RenderItem; +//#endif + +@Mixin(RenderItem.class) +public abstract class MixinEnchantmentGlimm { + + @ModifyVariable(method = "renderEffect", at = @At("STORE"), index = 2, ordinal = 0) + public float modifyrenderEffect1(float f) { + return (TASmodClient.tickratechanger.getMilliseconds() % 3000L) / 3000.0F / 8F; + } + + @ModifyVariable(method = "renderEffect", at = @At("STORE"), index = 3, ordinal = 1) + public float modifyrenderEffect2(float f) { + return (TASmodClient.tickratechanger.getMilliseconds() % 4873L) / 4873.0F / 8F; + } + +} diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinGuiToast.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinGuiToast.java new file mode 100644 index 00000000..db89b8bd --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinGuiToast.java @@ -0,0 +1,105 @@ +package com.minecrafttas.tasmod.mixin.tickrate; + +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; + +import com.minecrafttas.tasmod.TASmodClient; + +import net.minecraft.client.Minecraft; + +/** + * This mixin tries to make the animation of the advancement toasts dependent on the tickrate while keeping the code as vanilla as possible
+ *
+ * While I spent a long amount of time watching this code, I still don't quite fully understand the math behind this...
+ *
+ * Here's what I could find out: Toasts have 2 different states represented in visibility in the ToastInstance.
+ * And if it's set to SHOW the fly in animation and sound will play, the same goes with HIDE where it flies out after a certain amount of time
+ * After a lot of trial and error I found out that animationTimer, which was originally "i", is the way to go...
+ *
+ * So just as RenderItem and GuiSubtitleOverlay, things are done with an offset for tickrate 0 and simple multiplication
+ * Also I used a copy of the vanilla ToastInstance-class to make it work for every subtitle on screen... If you seek to make it work for only 1, at the end is a commented code that shows you how to use @ModyfyVarable
+ *
+ * There is one compromise I had to make... When you change the tickrate while a toast is showing, it will stay at the old tickrate until it's done...
+ * Maybe I still fix this and get into this mess once more, but for now this will do and don't make the subtitles stuck in a loop until you change to the old tickrate
+ * Am I doing this right with commenting code? I hope so...
+ *
+ * Update 02.03.21:
+ * Well, it's been roughly a year since I have touched this code and I am finally back with updating this. And while I am at it, I removed that compromise mentioned earlier.
+ * + * Update 26.03.26 Unease
+ * Reusing 5 year old code for legacy... how fitting + * + * @author Scribble + * @author Unease + */ +@Mixin(targets = "net/minecraft/client/gui/toasts/GuiToast$ToastInstance") +public abstract class MixinGuiToast{ + + /** + * Vanilla, current time in ms when the animationBegan. The delta between animationTimer and animation time shows the progress + */ + @Shadow + private long animationTime; + /** + * Vanilla, the time the animation is visible. Used in the toast instances (e.g. AdvancementToast) to time their animation. Also used to set the visibility to HIDE and make the toast go away + */ + @Shadow + private long visibleTime; + + /** + * When entering tickrate 0, store is the (ms) time when tickrate 0 was activated. This time replaces the "animationTimer" during tickrate 0 + */ + private long store=0L; + /** + * Makes sure the code runs only once when switching between tickrate 0 and not tickrate 0... I have yet to find a more elegant solution... + */ + private boolean once=false; + /** + * The offset of the ms time when using tickrate 0. This is used to "resume" the animation without any jumps, after exiting tickrate 0 + */ + private long offset=0L; + /** + * When changing the tickrate while a toast is on screen, the {@link #animationTime} is not correct. The correct animationTime can be optained by subtracting the current time from this delta
+ */ + private long animationDelta=0L; + /** + * When changing the tickrate while a toast is on screen, the {@link #visibleTime} is not correct. The correct visibleTime can be optained by subtracting the current time from this delta
+ */ + private long visibleDelta=0L; + /** + * Used to detect a change in the tickrate and to run the code on. + */ + private float ticksave=TASmodClient.tickratechanger.ticksPerSecond; + + @ModifyVariable(method = "render(II)Z", at = @At(value = "STORE", ordinal=0)) + public long modifyAnimationTime(long animationTimer) { + //===========TICKRATE OTHER THAN 0=========== + if(TASmodClient.tickratechanger.ticksPerSecond!=0) { + if(once) { + once=false; + offset=Minecraft.getSystemTime()-store; + } + + animationTimer= (long)((Minecraft.getSystemTime()-offset)*(TASmodClient.tickratechanger.ticksPerSecond/20)); + + if(ticksave!=TASmodClient.tickratechanger.ticksPerSecond) { + ticksave=TASmodClient.tickratechanger.ticksPerSecond; + animationTime=animationTimer-animationDelta; + visibleTime=animationTimer-visibleDelta; + } + animationDelta=animationTimer - animationTime; + visibleDelta=animationTimer-visibleTime; + //===========TICKRATE 0=========== + }else{ + if(!once) { + once=true; + store=(long) ((Minecraft.getSystemTime()-offset)); + } + animationTimer=(long) (store*(TASmodClient.tickratechanger.tickrateSaved/20)); + } + return animationTimer; + } +} + diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSoundManager.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSoundManager.java new file mode 100644 index 00000000..8a274fa0 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSoundManager.java @@ -0,0 +1,31 @@ +package com.minecrafttas.tasmod.mixin.tickrate; + +import java.util.Map; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.client.audio.ISound; +import net.minecraft.client.audio.SoundManager; + +@Mixin(SoundManager.class) +public class MixinSoundManager implements com.minecrafttas.tasmod.util.Ducks.SoundManagerDuck{ + + @Shadow + private boolean loaded; + @Shadow + private Map playingSounds; + @Shadow + private SoundManager.SoundSystemStarterThread sndSystem; + + @Override + public void updatePitch() { + if (this.loaded) + { + playingSounds.forEach((sourceName, sound)->{ + sndSystem.setPitch(sourceName, sound.getPitch()); + }); + } + } + +} diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitle.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitle.java new file mode 100644 index 00000000..494276a1 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitle.java @@ -0,0 +1,55 @@ +package com.minecrafttas.tasmod.mixin.tickrate; + +import org.spongepowered.asm.mixin.Mixin; +//#if MC>=10900 +import org.spongepowered.asm.mixin.Shadow; +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; + +import com.minecrafttas.tasmod.TASmodClient; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiSubtitleOverlay; +@Mixin(GuiSubtitleOverlay.Subtitle.class) +public class MixinSubtitle { + + @Shadow + private long startTime; + + private long offset=0; + private long store=0; + + private boolean once=false; + + @Inject(method = "getStartTime", at = @At(value = "HEAD"), cancellable = true) + public void redoGetStartTime(CallbackInfoReturnable ci) { + if(TASmodClient.tickratechanger.ticksPerSecond==0) { + if(!once) { + once=true; + store=Minecraft.getSystemTime()-offset; + } + offset=Minecraft.getSystemTime()-store; + }else { + if(once) { + once=false; + } + } + ci.setReturnValue(this.startTime+offset); + ci.cancel(); + } + + @Inject(method = "refresh", at = @At(value = "HEAD")) + public void resetOnRefresh(CallbackInfo ci) { + offset=0; + store=0; + once=false; + } +} +//#else +//$$ @Mixin(Minecraft.class) +//$$ public class MixinSubtitle { +//$$ +//$$ } +//#endif \ No newline at end of file diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitleOverlay.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitleOverlay.java new file mode 100644 index 00000000..1b9ab3cc --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitleOverlay.java @@ -0,0 +1,33 @@ +package com.minecrafttas.tasmod.mixin.tickrate; + +import org.spongepowered.asm.mixin.Mixin; +//#if MC>=10900 +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +import com.minecrafttas.tasmod.TASmodClient; + +import net.minecraft.client.gui.GuiSubtitleOverlay; +@Mixin(GuiSubtitleOverlay.class) +public abstract class MixinSubtitleOverlay { + + @ModifyConstant(method = "renderSubtitles", constant = @Constant(longValue = 3000L)) + public long applyTickrate(long threethousand) { + float multiplier = TASmodClient.tickratechanger.ticksPerSecond == 0 ? 20F / TASmodClient.tickratechanger.tickrateSaved : 20F / TASmodClient.tickratechanger.ticksPerSecond; + return (long) (threethousand * multiplier); + } + + @ModifyConstant(method = "renderSubtitles", constant = @Constant(floatValue = 3000F)) + public float applyTickrate2(float threethousand) { + float multiplier = TASmodClient.tickratechanger.ticksPerSecond == 0 ? 20F / TASmodClient.tickratechanger.tickrateSaved : 20F / TASmodClient.tickratechanger.ticksPerSecond; + return threethousand * multiplier; + } + +} +//#else +//$$ import net.minecraft.client.Minecraft; +//$$ @Mixin(Minecraft.class) +//$$ public abstract class MixinSubtitleOverlay { +//$$ +//$$ } +//#endif \ No newline at end of file diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinWorldborder.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinWorldborder.java new file mode 100644 index 00000000..cce98bd7 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinWorldborder.java @@ -0,0 +1,19 @@ +package com.minecrafttas.tasmod.mixin.tickrate; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import com.minecrafttas.tasmod.TASmodClient; + +import net.minecraft.client.renderer.RenderGlobal; + +@Mixin(RenderGlobal.class) +public class MixinWorldborder { + + @ModifyVariable(method = "renderWorldBorder", at = @At(value = "STORE"), index = 20, ordinal = 4) + public float injectf3(float f) { + return (TASmodClient.tickratechanger.getMilliseconds() % 3000L) / 3000.0F; + } + +} diff --git a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java index c32ffff4..62b45556 100644 --- a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java @@ -4,6 +4,7 @@ import java.nio.ByteBuffer; +import com.minecrafttas.mctcommon.events.EventClient.EventClientGameLoop; import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.mctcommon.networking.Client.Side; import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; @@ -11,6 +12,7 @@ import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.TASmodClient; +import com.minecrafttas.tasmod.events.EventClient.EventClientTickPost; import com.minecrafttas.tasmod.events.EventTickratechanger; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.registries.TASmodPackets; @@ -25,7 +27,7 @@ * @author Scribble * */ -public class TickrateChangerClient implements ClientPacketHandler { +public class TickrateChangerClient implements ClientPacketHandler, EventClientGameLoop{ /** * The current tickrate of the client */ @@ -46,6 +48,26 @@ public class TickrateChangerClient implements ClientPacketHandler { * How many milliseconds should pass in a tick. */ public long millisecondsPerTick = 50L; + + /** + * Timestamp when the last tickrate change was initiated + */ + public long timestampSinceLastTickRateChange = System.currentTimeMillis(); + + /** + * Time since the last tickrate change was initiated without being affected by tickrate + */ + public long fakeTimeSinceTickRateChange = System.currentTimeMillis(); + + /** + * Timestamp since last game loop and only updated when the tickrate is 0 + */ + private long timestampSinceLastGameLoop; + + /** + * Counts the milliseconds when the tickrate is 0 + */ + private float timeOffset = 0L; /** * The tickrate steps that can be set via {@link #increaseTickrate()} and {@link #decreaseTickrate()} @@ -55,7 +77,7 @@ public class TickrateChangerClient implements ClientPacketHandler { * The current index of the {@link #rates} */ private short rateIndex = 7; // Defaults to tickrate 20 - + /** *

Creates a new Tickratechanger that is intended to run solely on the client side *

The initial tickrate will be set to 20 ticks/s @@ -142,6 +164,15 @@ public void changeServerTickrate(float tickrate) { } } + /** + * @return Milliseconds affected by tickrate + */ + public long getMilliseconds() { + long time = (long) (System.currentTimeMillis() - timestampSinceLastTickRateChange - timeOffset); + time *= (ticksPerSecond / 20F); + return (long) (fakeTimeSinceTickRateChange + time); + } + /** *

Toggles between tickrate 0 and tickrate > 0 */ @@ -246,7 +277,7 @@ public void decreaseTickrate() { rateIndex = (short) clamp(rateIndex, 0, rates.length - 1); changeTickrate(rates[rateIndex]); } - + public void joinServer() { changeServerTickrate(ticksPerSecond); } @@ -342,4 +373,12 @@ private static int clamp(long value, int min, int max) { } return (int) Math.min(max, Math.max(value, min)); } + + @Override + public void onRunClientGameLoop(Minecraft mc) { + if (ticksPerSecond == 0) { + timeOffset += System.currentTimeMillis() - timestampSinceLastGameLoop; + timestampSinceLastGameLoop = System.currentTimeMillis(); + } + } } diff --git a/src/main/java/com/minecrafttas/tasmod/util/Ducks.java b/src/main/java/com/minecrafttas/tasmod/util/Ducks.java index bd13bd34..6342c9db 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/Ducks.java +++ b/src/main/java/com/minecrafttas/tasmod/util/Ducks.java @@ -142,4 +142,9 @@ public static interface PlayerChunkMapDuck { */ public void forceTick(); } + + public static interface SoundManagerDuck { + + public void updatePitch(); + } } diff --git a/src/main/resources/tasmod.accesswidener b/src/main/resources/tasmod.accesswidener index 8c6948d2..26ac94a2 100644 --- a/src/main/resources/tasmod.accesswidener +++ b/src/main/resources/tasmod.accesswidener @@ -15,4 +15,5 @@ accessible field net/minecraft/client/settings/KeyBinding CATEGORY_ORDER Ljava/u accessible method net/minecraft/server/MinecraftServer saveAllWorlds (Z)V accessible method net/minecraft/server/MinecraftServer convertMapIfNeeded (Ljava/lang/String;)V -accessible method net/minecraft/server/MinecraftServer setResourcePackFromWorld (Ljava/lang/String;Lnet/minecraft/world/storage/ISaveHandler;)V \ No newline at end of file +accessible method net/minecraft/server/MinecraftServer setResourcePackFromWorld (Ljava/lang/String;Lnet/minecraft/world/storage/ISaveHandler;)V +accessible class net/minecraft/client/audio/SoundManager$SoundSystemStarterThread \ No newline at end of file diff --git a/src/main/resources/tasmod.mixin.json b/src/main/resources/tasmod.mixin.json index b500e7d6..284f5019 100644 --- a/src/main/resources/tasmod.mixin.json +++ b/src/main/resources/tasmod.mixin.json @@ -68,6 +68,15 @@ // Fixes "fixes.MixinMinecraftFullscreen", "fixes.MixinNetworkManager", - "fixes.MixinMouseHelper" + "fixes.MixinMouseHelper", + + // Tickrate Rendering + "tickrate.MixinAudioPitch", + "tickrate.MixinEnchantmentGlimm", + "tickrate.MixinGuiToast", + "tickrate.MixinSoundManager", + "tickrate.MixinSubtitle", + "tickrate.MixinSubtitleOverlay", + "tickrate.MixinWorldborder" ] } \ No newline at end of file From 62e9c06ce59fb1c057b5ad8bfb9a900f20d3f31a Mon Sep 17 00:00:00 2001 From: Unease Date: Thu, 26 Mar 2026 15:45:49 -0700 Subject: [PATCH 2/2] Fixed Formatting --- .../mixin/tickrate/MixinAudioPitch.java | 6 +- .../mixin/tickrate/MixinEnchantmentGlimm.java | 7 +-- .../tasmod/mixin/tickrate/MixinGuiToast.java | 63 +++++++++---------- .../mixin/tickrate/MixinSoundManager.java | 17 +++-- .../tasmod/mixin/tickrate/MixinSubtitle.java | 34 +++++----- .../mixin/tickrate/MixinSubtitleOverlay.java | 4 +- .../mixin/tickrate/MixinWorldborder.java | 4 +- .../TickrateChangerClient.java | 24 +++---- .../com/minecrafttas/tasmod/util/Ducks.java | 4 +- 9 files changed, 80 insertions(+), 83 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinAudioPitch.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinAudioPitch.java index d8c6e741..b931b1c5 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinAudioPitch.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinAudioPitch.java @@ -12,13 +12,13 @@ @Mixin(Source.class) public abstract class MixinAudioPitch { - + @Shadow(remap = false) public float pitch; - + @Inject(method = "setPitch", at = @At(value = "RETURN"), remap = false) public void redosetPitch(float value, CallbackInfo ci) { pitch = value * (TASmodClient.tickratechanger.ticksPerSecond / 20F); } - + } diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinEnchantmentGlimm.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinEnchantmentGlimm.java index 4588ddc9..0a299426 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinEnchantmentGlimm.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinEnchantmentGlimm.java @@ -6,7 +6,6 @@ import com.minecrafttas.tasmod.TASmodClient; -//#if MC>=10900 import net.minecraft.client.renderer.RenderItem; //#else //$$ import net.minecraft.client.renderer.entity.RenderItem; @@ -14,15 +13,15 @@ @Mixin(RenderItem.class) public abstract class MixinEnchantmentGlimm { - + @ModifyVariable(method = "renderEffect", at = @At("STORE"), index = 2, ordinal = 0) public float modifyrenderEffect1(float f) { return (TASmodClient.tickratechanger.getMilliseconds() % 3000L) / 3000.0F / 8F; } - + @ModifyVariable(method = "renderEffect", at = @At("STORE"), index = 3, ordinal = 1) public float modifyrenderEffect2(float f) { return (TASmodClient.tickratechanger.getMilliseconds() % 4873L) / 4873.0F / 8F; } - + } diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinGuiToast.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinGuiToast.java index db89b8bd..a9d69a97 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinGuiToast.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinGuiToast.java @@ -35,8 +35,8 @@ * @author Unease */ @Mixin(targets = "net/minecraft/client/gui/toasts/GuiToast$ToastInstance") -public abstract class MixinGuiToast{ - +public abstract class MixinGuiToast { + /** * Vanilla, current time in ms when the animationBegan. The delta between animationTimer and animation time shows the progress */ @@ -46,60 +46,59 @@ public abstract class MixinGuiToast{ * Vanilla, the time the animation is visible. Used in the toast instances (e.g. AdvancementToast) to time their animation. Also used to set the visibility to HIDE and make the toast go away */ @Shadow - private long visibleTime; - + private long visibleTime; + /** * When entering tickrate 0, store is the (ms) time when tickrate 0 was activated. This time replaces the "animationTimer" during tickrate 0 */ - private long store=0L; + private long store = 0L; /** * Makes sure the code runs only once when switching between tickrate 0 and not tickrate 0... I have yet to find a more elegant solution... */ - private boolean once=false; + private boolean once = false; /** * The offset of the ms time when using tickrate 0. This is used to "resume" the animation without any jumps, after exiting tickrate 0 */ - private long offset=0L; + private long offset = 0L; /** * When changing the tickrate while a toast is on screen, the {@link #animationTime} is not correct. The correct animationTime can be optained by subtracting the current time from this delta
*/ - private long animationDelta=0L; + private long animationDelta = 0L; /** * When changing the tickrate while a toast is on screen, the {@link #visibleTime} is not correct. The correct visibleTime can be optained by subtracting the current time from this delta
*/ - private long visibleDelta=0L; + private long visibleDelta = 0L; /** * Used to detect a change in the tickrate and to run the code on. */ - private float ticksave=TASmodClient.tickratechanger.ticksPerSecond; - - @ModifyVariable(method = "render(II)Z", at = @At(value = "STORE", ordinal=0)) + private float ticksave = TASmodClient.tickratechanger.ticksPerSecond; + + @ModifyVariable(method = "render(II)Z", at = @At(value = "STORE", ordinal = 0)) public long modifyAnimationTime(long animationTimer) { //===========TICKRATE OTHER THAN 0=========== - if(TASmodClient.tickratechanger.ticksPerSecond!=0) { - if(once) { - once=false; - offset=Minecraft.getSystemTime()-store; + if (TASmodClient.tickratechanger.ticksPerSecond != 0) { + if (once) { + once = false; + offset = Minecraft.getSystemTime() - store; } - - animationTimer= (long)((Minecraft.getSystemTime()-offset)*(TASmodClient.tickratechanger.ticksPerSecond/20)); - - if(ticksave!=TASmodClient.tickratechanger.ticksPerSecond) { - ticksave=TASmodClient.tickratechanger.ticksPerSecond; - animationTime=animationTimer-animationDelta; - visibleTime=animationTimer-visibleDelta; + + animationTimer = (long) ((Minecraft.getSystemTime() - offset) * (TASmodClient.tickratechanger.ticksPerSecond / 20)); + + if (ticksave != TASmodClient.tickratechanger.ticksPerSecond) { + ticksave = TASmodClient.tickratechanger.ticksPerSecond; + animationTime = animationTimer - animationDelta; + visibleTime = animationTimer - visibleDelta; } - animationDelta=animationTimer - animationTime; - visibleDelta=animationTimer-visibleTime; - //===========TICKRATE 0=========== - }else{ - if(!once) { - once=true; - store=(long) ((Minecraft.getSystemTime()-offset)); + animationDelta = animationTimer - animationTime; + visibleDelta = animationTimer - visibleTime; + //===========TICKRATE 0=========== + } else { + if (!once) { + once = true; + store = (long) ((Minecraft.getSystemTime() - offset)); } - animationTimer=(long) (store*(TASmodClient.tickratechanger.tickrateSaved/20)); + animationTimer = (long) (store * (TASmodClient.tickratechanger.tickrateSaved / 20)); } return animationTimer; } } - diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSoundManager.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSoundManager.java index 8a274fa0..070b4689 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSoundManager.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSoundManager.java @@ -9,8 +9,8 @@ import net.minecraft.client.audio.SoundManager; @Mixin(SoundManager.class) -public class MixinSoundManager implements com.minecrafttas.tasmod.util.Ducks.SoundManagerDuck{ - +public class MixinSoundManager implements com.minecrafttas.tasmod.util.Ducks.SoundManagerDuck { + @Shadow private boolean loaded; @Shadow @@ -20,12 +20,11 @@ public class MixinSoundManager implements com.minecrafttas.tasmod.util.Ducks.Sou @Override public void updatePitch() { - if (this.loaded) - { - playingSounds.forEach((sourceName, sound)->{ - sndSystem.setPitch(sourceName, sound.getPitch()); - }); - } + if (this.loaded) { + playingSounds.forEach((sourceName, sound) -> { + sndSystem.setPitch(sourceName, sound.getPitch()); + }); + } } - + } diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitle.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitle.java index 494276a1..62a37e82 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitle.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitle.java @@ -1,7 +1,6 @@ package com.minecrafttas.tasmod.mixin.tickrate; import org.spongepowered.asm.mixin.Mixin; -//#if MC>=10900 import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -12,39 +11,40 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiSubtitleOverlay; + @Mixin(GuiSubtitleOverlay.Subtitle.class) public class MixinSubtitle { @Shadow private long startTime; - private long offset=0; - private long store=0; + private long offset = 0; + private long store = 0; - private boolean once=false; + private boolean once = false; @Inject(method = "getStartTime", at = @At(value = "HEAD"), cancellable = true) public void redoGetStartTime(CallbackInfoReturnable ci) { - if(TASmodClient.tickratechanger.ticksPerSecond==0) { - if(!once) { - once=true; - store=Minecraft.getSystemTime()-offset; + if (TASmodClient.tickratechanger.ticksPerSecond == 0) { + if (!once) { + once = true; + store = Minecraft.getSystemTime() - offset; } - offset=Minecraft.getSystemTime()-store; - }else { - if(once) { - once=false; + offset = Minecraft.getSystemTime() - store; + } else { + if (once) { + once = false; } } - ci.setReturnValue(this.startTime+offset); + ci.setReturnValue(this.startTime + offset); ci.cancel(); } @Inject(method = "refresh", at = @At(value = "HEAD")) public void resetOnRefresh(CallbackInfo ci) { - offset=0; - store=0; - once=false; + offset = 0; + store = 0; + once = false; } } //#else @@ -52,4 +52,4 @@ public void resetOnRefresh(CallbackInfo ci) { //$$ public class MixinSubtitle { //$$ //$$ } -//#endif \ No newline at end of file +//#endif diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitleOverlay.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitleOverlay.java index 1b9ab3cc..521bbc86 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitleOverlay.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinSubtitleOverlay.java @@ -1,13 +1,13 @@ package com.minecrafttas.tasmod.mixin.tickrate; import org.spongepowered.asm.mixin.Mixin; -//#if MC>=10900 import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; import com.minecrafttas.tasmod.TASmodClient; import net.minecraft.client.gui.GuiSubtitleOverlay; + @Mixin(GuiSubtitleOverlay.class) public abstract class MixinSubtitleOverlay { @@ -30,4 +30,4 @@ public float applyTickrate2(float threethousand) { //$$ public abstract class MixinSubtitleOverlay { //$$ //$$ } -//#endif \ No newline at end of file +//#endif diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinWorldborder.java b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinWorldborder.java index cce98bd7..7da3be0b 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinWorldborder.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/tickrate/MixinWorldborder.java @@ -10,10 +10,10 @@ @Mixin(RenderGlobal.class) public class MixinWorldborder { - + @ModifyVariable(method = "renderWorldBorder", at = @At(value = "STORE"), index = 20, ordinal = 4) public float injectf3(float f) { return (TASmodClient.tickratechanger.getMilliseconds() % 3000L) / 3000.0F; } - + } diff --git a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java index 62b45556..2c65f96f 100644 --- a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java @@ -27,7 +27,7 @@ * @author Scribble * */ -public class TickrateChangerClient implements ClientPacketHandler, EventClientGameLoop{ +public class TickrateChangerClient implements ClientPacketHandler, EventClientGameLoop { /** * The current tickrate of the client */ @@ -48,22 +48,22 @@ public class TickrateChangerClient implements ClientPacketHandler, EventClientGa * How many milliseconds should pass in a tick. */ public long millisecondsPerTick = 50L; - + /** * Timestamp when the last tickrate change was initiated */ public long timestampSinceLastTickRateChange = System.currentTimeMillis(); - + /** * Time since the last tickrate change was initiated without being affected by tickrate */ public long fakeTimeSinceTickRateChange = System.currentTimeMillis(); - + /** * Timestamp since last game loop and only updated when the tickrate is 0 */ private long timestampSinceLastGameLoop; - + /** * Counts the milliseconds when the tickrate is 0 */ @@ -77,7 +77,7 @@ public class TickrateChangerClient implements ClientPacketHandler, EventClientGa * The current index of the {@link #rates} */ private short rateIndex = 7; // Defaults to tickrate 20 - + /** *

Creates a new Tickratechanger that is intended to run solely on the client side *

The initial tickrate will be set to 20 ticks/s @@ -172,7 +172,7 @@ public long getMilliseconds() { time *= (ticksPerSecond / 20F); return (long) (fakeTimeSinceTickRateChange + time); } - + /** *

Toggles between tickrate 0 and tickrate > 0 */ @@ -277,7 +277,7 @@ public void decreaseTickrate() { rateIndex = (short) clamp(rateIndex, 0, rates.length - 1); changeTickrate(rates[rateIndex]); } - + public void joinServer() { changeServerTickrate(ticksPerSecond); } @@ -376,9 +376,9 @@ private static int clamp(long value, int min, int max) { @Override public void onRunClientGameLoop(Minecraft mc) { - if (ticksPerSecond == 0) { - timeOffset += System.currentTimeMillis() - timestampSinceLastGameLoop; - timestampSinceLastGameLoop = System.currentTimeMillis(); - } + if (ticksPerSecond == 0) { + timeOffset += System.currentTimeMillis() - timestampSinceLastGameLoop; + timestampSinceLastGameLoop = System.currentTimeMillis(); + } } } diff --git a/src/main/java/com/minecrafttas/tasmod/util/Ducks.java b/src/main/java/com/minecrafttas/tasmod/util/Ducks.java index 6342c9db..bfd513f2 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/Ducks.java +++ b/src/main/java/com/minecrafttas/tasmod/util/Ducks.java @@ -142,9 +142,9 @@ public static interface PlayerChunkMapDuck { */ public void forceTick(); } - + public static interface SoundManagerDuck { - + public void updatePitch(); } }