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
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..521bbc86
--- /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;
+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
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..7da3be0b
--- /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..2c65f96f 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
*/
@@ -47,6 +49,26 @@ public class TickrateChangerClient implements ClientPacketHandler {
*/
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()}
*/
@@ -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
*/
@@ -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..bfd513f2 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