mirror of
https://github.com/Shiewk/Widgets.git
synced 2026-04-28 11:34:17 +02:00
TPS widget
This commit is contained in:
@@ -58,5 +58,6 @@ public class WidgetsModClient implements ClientModInitializer {
|
|||||||
WidgetManager.register(new MemoryUsageWidget(Identifier.of(WidgetsMod.MOD_ID, "memory")));
|
WidgetManager.register(new MemoryUsageWidget(Identifier.of(WidgetsMod.MOD_ID, "memory")));
|
||||||
WidgetManager.register(new KeyStrokesWidget(Identifier.of(WidgetsMod.MOD_ID, "keystrokes")));
|
WidgetManager.register(new KeyStrokesWidget(Identifier.of(WidgetsMod.MOD_ID, "keystrokes")));
|
||||||
WidgetManager.register(new PlainTextWidget(Identifier.of(WidgetsMod.MOD_ID, "plaintext")));
|
WidgetManager.register(new PlainTextWidget(Identifier.of(WidgetsMod.MOD_ID, "plaintext")));
|
||||||
|
WidgetManager.register(new TPSWidget(Identifier.of(WidgetsMod.MOD_ID, "tps")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package de.shiewk.widgets.mixin;
|
||||||
|
|
||||||
|
import de.shiewk.widgets.widgets.TPSWidget;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.network.ClientPlayNetworkHandler;
|
||||||
|
import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket;
|
||||||
|
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.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(ClientPlayNetworkHandler.class)
|
||||||
|
public class MixinClientPlayNetworkHandler {
|
||||||
|
|
||||||
|
@Inject(at = @At("HEAD"), method = "onWorldTimeUpdate")
|
||||||
|
public void onWorldTimeUpdate(WorldTimeUpdateS2CPacket packet, CallbackInfo ci){
|
||||||
|
if (MinecraftClient.getInstance().isOnThread()) return; // run this on the networking thread as soon as possible
|
||||||
|
// server sends this packet every 20 ticks
|
||||||
|
TPSWidget.worldTimeUpdated(System.nanoTime());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
package de.shiewk.widgets.widgets;
|
||||||
|
|
||||||
|
import de.shiewk.widgets.WidgetSettings;
|
||||||
|
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.server.ServerTickManager;
|
||||||
|
import net.minecraft.server.integrated.IntegratedServer;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TPSWidget extends BasicTextWidget {
|
||||||
|
public TPSWidget(Identifier id) {
|
||||||
|
super(id, List.of(
|
||||||
|
new ToggleWidgetSetting("dynamic_color", Text.translatable("widgets.widgets.tps.dynamicColor"), true)
|
||||||
|
));
|
||||||
|
getSettings().optionById("textcolor").setShowCondition(() -> !this.dynamicColor);
|
||||||
|
INSTANCE = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static TPSWidget INSTANCE;
|
||||||
|
|
||||||
|
private static final long[] lastUpdates = new long[5];
|
||||||
|
private static int updatePointer = 0;
|
||||||
|
|
||||||
|
private boolean dynamicColor = true;
|
||||||
|
|
||||||
|
public static void worldTimeUpdated(long nanoTime) {
|
||||||
|
MinecraftClient client = MinecraftClient.getInstance();
|
||||||
|
if (client.isInSingleplayer()){
|
||||||
|
IntegratedServer server = client.getServer();
|
||||||
|
if (server != null) {
|
||||||
|
ServerTickManager tickManager = server.getTickManager();
|
||||||
|
float tps = 1000f / server.getAverageTickTime();
|
||||||
|
float targetTickRate = tickManager.getTickRate();
|
||||||
|
if (tickManager.isSprinting()){
|
||||||
|
INSTANCE.updateTPS(tps, targetTickRate);
|
||||||
|
} else {
|
||||||
|
INSTANCE.updateTPS(Math.min(tps, targetTickRate), targetTickRate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lastUpdates[updatePointer] = nanoTime;
|
||||||
|
updatePointer++;
|
||||||
|
if (updatePointer >= lastUpdates.length) updatePointer = 0;
|
||||||
|
|
||||||
|
long totalDifference = 0;
|
||||||
|
for (int i = 0; i < lastUpdates.length-1; i++){
|
||||||
|
long difference = lastUpdates[(updatePointer + i + 1) % lastUpdates.length] - lastUpdates[(updatePointer + i) % lastUpdates.length];
|
||||||
|
totalDifference += difference;
|
||||||
|
}
|
||||||
|
|
||||||
|
long avgDifference = totalDifference / (lastUpdates.length-1); // this is how long 20 ticks took on the server on average
|
||||||
|
float mspt = avgDifference / 20000000f;
|
||||||
|
float ticksPerSecond = 1000f / mspt;
|
||||||
|
|
||||||
|
if (client.world != null) {
|
||||||
|
INSTANCE.updateTPS(ticksPerSecond, client.world.getTickManager().getTickRate());
|
||||||
|
} else {
|
||||||
|
INSTANCE.updateTPS(ticksPerSecond, 20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateTPS(float tps, float targetTickRate) {
|
||||||
|
tps = Math.round(tps * 10f) / 10f;
|
||||||
|
this.renderText = Text.literal(Text.translatable("widgets.widgets.tps.tps", tps).getString());
|
||||||
|
if (dynamicColor){
|
||||||
|
if (tps >= targetTickRate * 0.995){
|
||||||
|
this.textColor = 0x00ff00;
|
||||||
|
} else if (tps >= targetTickRate * 0.745){
|
||||||
|
this.textColor = 0xffff00;
|
||||||
|
} else {
|
||||||
|
this.textColor = 0xff0000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tickWidget() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Text getName() {
|
||||||
|
return Text.translatable("widgets.widgets.tps");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Text getDescription() {
|
||||||
|
return Text.translatable("widgets.widgets.tps.description");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSettingsChanged(WidgetSettings settings) {
|
||||||
|
super.onSettingsChanged(settings);
|
||||||
|
this.dynamicColor = ((ToggleWidgetSetting) settings.optionById("dynamic_color")).getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -87,5 +87,9 @@
|
|||||||
"widgets.widgets.plaintext.description": "Zeigt einen festgelegten Text an",
|
"widgets.widgets.plaintext.description": "Zeigt einen festgelegten Text an",
|
||||||
"widgets.widgets.plaintext.text": "Text",
|
"widgets.widgets.plaintext.text": "Text",
|
||||||
"widgets.widgets.plaintext.initial": "Ändere dies in den Widget-Einstellungen",
|
"widgets.widgets.plaintext.initial": "Ändere dies in den Widget-Einstellungen",
|
||||||
"widgets.widgets.plaintext.placeholder": "Gib hier deinen Text ein..."
|
"widgets.widgets.plaintext.placeholder": "Gib hier deinen Text ein...",
|
||||||
|
"widgets.widgets.tps.tps": "%s TPS",
|
||||||
|
"widgets.widgets.tps.dynamicColor": "Farbe dynamisch anzeigen",
|
||||||
|
"widgets.widgets.tps": "TPS",
|
||||||
|
"widgets.widgets.tps.description": "Zeigt die TPS im Einzelspielermodus an oder schätzt die TPS im Mehrspielermodus"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,5 +87,9 @@
|
|||||||
"widgets.widgets.plaintext.description": "Input a text to display on screen",
|
"widgets.widgets.plaintext.description": "Input a text to display on screen",
|
||||||
"widgets.widgets.plaintext.text": "Text",
|
"widgets.widgets.plaintext.text": "Text",
|
||||||
"widgets.widgets.plaintext.initial": "Change this in the widget settings",
|
"widgets.widgets.plaintext.initial": "Change this in the widget settings",
|
||||||
"widgets.widgets.plaintext.placeholder": "Type your text here..."
|
"widgets.widgets.plaintext.placeholder": "Type your text here...",
|
||||||
|
"widgets.widgets.tps.tps": "%s TPS",
|
||||||
|
"widgets.widgets.tps.dynamicColor": "Dynamic Color",
|
||||||
|
"widgets.widgets.tps": "TPS",
|
||||||
|
"widgets.widgets.tps.description": "Shows the current TPS when in singleplayer or estimates server TPS when in multiplayer"
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
"mixins": [
|
"mixins": [
|
||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
|
"MixinClientPlayNetworkHandler",
|
||||||
"MixinMouse"
|
"MixinMouse"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
|
|||||||
Reference in New Issue
Block a user