add tps monitor
This commit is contained in:
parent
2de44e792c
commit
f5c7e8532a
@ -16,13 +16,15 @@ public abstract class Addon implements EventListener {
|
|||||||
this.name = name;
|
this.name = name;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.category = category;
|
this.category = category;
|
||||||
|
this.enabled = true;
|
||||||
|
|
||||||
EventManager.registerListener(this);
|
EventManager.registerListener(this);
|
||||||
onEnable();
|
onEnable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum Category {
|
public enum Category {
|
||||||
CHAT
|
CHAT,
|
||||||
|
UI
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cc.fascinated.wildaddons.addon;
|
package cc.fascinated.wildaddons.addon;
|
||||||
|
|
||||||
import cc.fascinated.wildaddons.addon.impl.chat.AutoWelcomer;
|
import cc.fascinated.wildaddons.addon.impl.chat.AutoWelcomerAddon;
|
||||||
|
import cc.fascinated.wildaddons.addon.impl.ui.OverlayAddon;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -13,7 +14,8 @@ public class AddonManager {
|
|||||||
public static final Set<Addon> ADDONS = new HashSet<>();
|
public static final Set<Addon> ADDONS = new HashSet<>();
|
||||||
|
|
||||||
public AddonManager() {
|
public AddonManager() {
|
||||||
registerAddon(new AutoWelcomer());
|
registerAddon(new AutoWelcomerAddon());
|
||||||
|
registerAddon(new OverlayAddon());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,9 +8,9 @@ import cc.fascinated.wildaddons.utils.PlayerUtils;
|
|||||||
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
public class AutoWelcomer extends Addon {
|
public class AutoWelcomerAddon extends Addon {
|
||||||
|
|
||||||
public AutoWelcomer() {
|
public AutoWelcomerAddon() {
|
||||||
super("Auto Welcomer",
|
super("Auto Welcomer",
|
||||||
"Automatically sends the welcome command when a new player joins.",
|
"Automatically sends the welcome command when a new player joins.",
|
||||||
Category.CHAT
|
Category.CHAT
|
||||||
@ -19,6 +19,9 @@ public class AutoWelcomer extends Addon {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChat(String message, String messageStripped) {
|
public void onChat(String message, String messageStripped) {
|
||||||
|
if (!this.isEnabled()) { // This addon is disabled
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!PlayerListener.isMoving()) { // To prevent bans lol
|
if (!PlayerListener.isMoving()) { // To prevent bans lol
|
||||||
return;
|
return;
|
||||||
}
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package cc.fascinated.wildaddons.addon.impl.ui;
|
||||||
|
|
||||||
|
import cc.fascinated.wildaddons.Main;
|
||||||
|
import cc.fascinated.wildaddons.addon.Addon;
|
||||||
|
import cc.fascinated.wildaddons.tpsmonitor.TpsMonitor;
|
||||||
|
import cc.fascinated.wildaddons.utils.NumberUtils;
|
||||||
|
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.font.TextRenderer;
|
||||||
|
import net.minecraft.network.Packet;
|
||||||
|
import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket;
|
||||||
|
|
||||||
|
public class OverlayAddon extends Addon {
|
||||||
|
|
||||||
|
public OverlayAddon() {
|
||||||
|
super("Overlay", "Adds basic client and server info to the overlay", Category.UI);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
HudRenderCallback.EVENT.register((matrixStack, somefloatidkwhatitdoes) -> {
|
||||||
|
if (!this.isEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MinecraftClient minecraftClient = Main.getMinecraftClient();
|
||||||
|
TextRenderer renderer = minecraftClient.textRenderer;
|
||||||
|
renderer.drawWithShadow(matrixStack, "FPS: " + minecraftClient.getCurrentFps(), 5, 5, 0xffffff);
|
||||||
|
renderer.drawWithShadow(matrixStack, "TPS: " + TpsMonitor.getFormattedTPS(), 5, 16, 0xffffff);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,7 @@ package cc.fascinated.wildaddons.client;
|
|||||||
import cc.fascinated.wildaddons.addon.AddonManager;
|
import cc.fascinated.wildaddons.addon.AddonManager;
|
||||||
import cc.fascinated.wildaddons.event.EventManager;
|
import cc.fascinated.wildaddons.event.EventManager;
|
||||||
import cc.fascinated.wildaddons.listener.PlayerListener;
|
import cc.fascinated.wildaddons.listener.PlayerListener;
|
||||||
|
import cc.fascinated.wildaddons.tpsmonitor.TpsMonitor;
|
||||||
import net.fabricmc.api.ClientModInitializer;
|
import net.fabricmc.api.ClientModInitializer;
|
||||||
|
|
||||||
public class WildAddonsClient implements ClientModInitializer {
|
public class WildAddonsClient implements ClientModInitializer {
|
||||||
@ -15,5 +16,6 @@ public class WildAddonsClient implements ClientModInitializer {
|
|||||||
new AddonManager();
|
new AddonManager();
|
||||||
|
|
||||||
EventManager.registerListener(new PlayerListener());
|
EventManager.registerListener(new PlayerListener());
|
||||||
|
EventManager.registerListener(new TpsMonitor());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package cc.fascinated.wildaddons.event;
|
package cc.fascinated.wildaddons.event;
|
||||||
|
|
||||||
|
import net.minecraft.network.Packet;
|
||||||
|
|
||||||
public interface EventListener {
|
public interface EventListener {
|
||||||
|
|
||||||
default void onTick() {}
|
default void onTick() {}
|
||||||
@ -11,4 +13,18 @@ public interface EventListener {
|
|||||||
* @param messageStripped the message without colors
|
* @param messageStripped the message without colors
|
||||||
*/
|
*/
|
||||||
default void onChat(String message, String messageStripped) {}
|
default void onChat(String message, String messageStripped) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets called when the client receives a packet.
|
||||||
|
*
|
||||||
|
* @param packet the packet
|
||||||
|
*/
|
||||||
|
default void onPacketReceive(Packet<?> packet) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets called when the client sends a packet.
|
||||||
|
*
|
||||||
|
* @param packet the packet
|
||||||
|
*/
|
||||||
|
default void onPacketSend(Packet<?> packet) {}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
|||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(ChatHud.class)
|
@Mixin(ChatHud.class)
|
||||||
public class PlayerMixin {
|
public class ChatHudMixin {
|
||||||
|
|
||||||
@Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At("HEAD"))
|
@Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At("HEAD"))
|
||||||
public void onChat(Text text, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci) {
|
public void onChat(Text text, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci) {
|
@ -0,0 +1,29 @@
|
|||||||
|
package cc.fascinated.wildaddons.mixin;
|
||||||
|
|
||||||
|
import cc.fascinated.wildaddons.event.EventListener;
|
||||||
|
import cc.fascinated.wildaddons.event.EventManager;
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import net.minecraft.network.ClientConnection;
|
||||||
|
import net.minecraft.network.Packet;
|
||||||
|
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(ClientConnection.class)
|
||||||
|
public class ClientConnectionMixin {
|
||||||
|
|
||||||
|
@Inject(method = "send(Lnet/minecraft/network/Packet;)V", at = @At("HEAD"))
|
||||||
|
public void send(Packet<?> packet, CallbackInfo ci) {
|
||||||
|
for (EventListener listener : EventManager.getListeners()) {
|
||||||
|
listener.onPacketSend(packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "channelRead0(Lio/netty/channel/ChannelHandlerContext;Lnet/minecraft/network/Packet;)V", at = @At("HEAD"))
|
||||||
|
public void channelRead0(ChannelHandlerContext channelHandlerContext, Packet<?> packet, CallbackInfo ci) {
|
||||||
|
for (EventListener listener : EventManager.getListeners()) {
|
||||||
|
listener.onPacketReceive(packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@ import cc.fascinated.wildaddons.event.EventListener;
|
|||||||
import cc.fascinated.wildaddons.event.EventManager;
|
import cc.fascinated.wildaddons.event.EventManager;
|
||||||
import cc.fascinated.wildaddons.utils.PlayerUtils;
|
import cc.fascinated.wildaddons.utils.PlayerUtils;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.network.ClientPlayNetworkHandler;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
@ -0,0 +1,57 @@
|
|||||||
|
package cc.fascinated.wildaddons.tpsmonitor;
|
||||||
|
|
||||||
|
import cc.fascinated.wildaddons.event.EventListener;
|
||||||
|
import cc.fascinated.wildaddons.utils.NumberUtils;
|
||||||
|
import com.google.common.collect.EvictingQueue;
|
||||||
|
import lombok.Getter;
|
||||||
|
import net.minecraft.network.Packet;
|
||||||
|
import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket;
|
||||||
|
|
||||||
|
public class TpsMonitor implements EventListener {
|
||||||
|
|
||||||
|
private static final EvictingQueue<Float> serverTPS = EvictingQueue.create(3);
|
||||||
|
private static long systemTime = 0;
|
||||||
|
private static long worldTicks = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPacketReceive(Packet<?> packet) {
|
||||||
|
if (!(packet instanceof WorldTimeUpdateS2CPacket)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WorldTimeUpdateS2CPacket updatePacket = (WorldTimeUpdateS2CPacket) packet;
|
||||||
|
long currentWorldTicks = updatePacket.getTime();
|
||||||
|
|
||||||
|
if (systemTime == 0) {
|
||||||
|
systemTime = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
long currentSystemTime = System.currentTimeMillis();
|
||||||
|
serverTPS.add((((float) (currentWorldTicks - worldTicks)) / (((float) (currentSystemTime - systemTime)) / 50.0f)) * 20.0f);
|
||||||
|
systemTime = System.currentTimeMillis();
|
||||||
|
worldTicks = currentWorldTicks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the average server TPS
|
||||||
|
* of the last 3 seconds.
|
||||||
|
*
|
||||||
|
* @return the tps
|
||||||
|
*/
|
||||||
|
public static float calculateServerTPS() {
|
||||||
|
float sum = 0.0f;
|
||||||
|
for (Float f : serverTPS) {
|
||||||
|
sum += f;
|
||||||
|
}
|
||||||
|
return sum / (float) serverTPS.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the TPS formatted
|
||||||
|
*
|
||||||
|
* @return the formatted tps
|
||||||
|
*/
|
||||||
|
public static String getFormattedTPS() {
|
||||||
|
float tps = calculateServerTPS();
|
||||||
|
|
||||||
|
return tps > 20.00 ? "20.00*" : NumberUtils.format(tps);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package cc.fascinated.wildaddons.utils;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
|
||||||
|
public class NumberUtils {
|
||||||
|
|
||||||
|
private static final DecimalFormat formatter = new DecimalFormat("##.##");
|
||||||
|
static {
|
||||||
|
formatter.setMinimumFractionDigits(2);
|
||||||
|
formatter.setMaximumFractionDigits(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats the given number.
|
||||||
|
*
|
||||||
|
* @param number the number to format
|
||||||
|
* @return the formatted number
|
||||||
|
*/
|
||||||
|
public static String format(Object number) {
|
||||||
|
return formatter.format(number);
|
||||||
|
}
|
||||||
|
}
|
@ -4,7 +4,8 @@
|
|||||||
"package": "cc.fascinated.wildaddons.mixin",
|
"package": "cc.fascinated.wildaddons.mixin",
|
||||||
"compatibilityLevel": "JAVA_17",
|
"compatibilityLevel": "JAVA_17",
|
||||||
"mixins": [
|
"mixins": [
|
||||||
"PlayerMixin",
|
"ChatHudMixin",
|
||||||
|
"ClientConnectionMixin",
|
||||||
"MinecraftClientMixin"
|
"MinecraftClientMixin"
|
||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
|
Reference in New Issue
Block a user