package me.zacharias.speedometer; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.mojang.authlib.minecraft.client.MinecraftClient; import com.mojang.blaze3d.platform.InputConstants; import dev.architectury.event.events.client.ClientGuiEvent; import dev.architectury.event.events.client.ClientTickEvent; import dev.architectury.injectables.targets.ArchitecturyTarget; import dev.architectury.platform.Platform; import dev.architectury.registry.client.keymappings.KeyMappingRegistry; import dev.architectury.registry.registries.RegistrarManager; import dev.architectury.event.EventHandler; import dev.architectury.utils.Env; import dev.architectury.utils.EnvExecutor; import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.font.FontSet; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.vehicle.Boat; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.swing.plaf.ColorUIResource; import java.awt.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.UUID; import java.util.function.Function; public class Speedometer { public static final String MOD_ID = "speedometer"; public static final Supplier MANAGER = Suppliers.memoize(() -> RegistrarManager.get(MOD_ID)); public static final Logger LOGGER = LogManager.getLogger(MOD_ID); public static final KeyMapping CONFIG_KEY = new KeyMapping( "speedometer.key.configkey", InputConstants.Type.KEYSYM, InputConstants.KEY_O, "speedometer.key.catagory" ); public static void init() { if(Platform.isForge()){ LOGGER.info("Hello, Forge! from Architectury"); }else if(Platform.isFabric()){ LOGGER.info("Hello, Fabric! from Architectury"); }else{ LOGGER.info("Hello! from Architectury"); } if(Platform.getEnvironment() != Env.CLIENT) return; KeyMappingRegistry.register(CONFIG_KEY); ClientTickEvent.CLIENT_POST.register(minecraft -> { if(CONFIG_KEY.consumeClick()){ Minecraft.getInstance().setScreen(getConfig(Minecraft.getInstance().screen).build()); } }); Config.initialize(); Config.save(); // TODO add cloth config for abstract config system ArrayList speeds = new ArrayList<>(); ClientGuiEvent.RENDER_HUD.register((graphics, tick) -> { if(Minecraft.getInstance().player == null) return; Entity entity = Minecraft.getInstance().player.getRootVehicle(); Level world = entity.level(); double x = entity.position().x; double y = entity.position().y; double z = entity.position().z; Vec3 vec = entity.getDeltaMovement(); double yOffset = 0.0784000015258789D; double xOffset = 0D; double zOffset = 0D; double vOffset = 0D; if (entity instanceof Player e) { if (!e.onGround() && e.isCreative()) { yOffset = 0; } else if (e.isInWater()) { yOffset = 0; } } else if (entity instanceof Boat) { yOffset = 0; } double speed = (Math.sqrt(Math.pow(vec.x + xOffset, 2) + Math.pow(vec.y + yOffset, 2) + Math.pow(vec.z + zOffset, 2)) * 20)+vOffset; if (speeds.size() >= 30) { speeds.remove(0); } speeds.add(speed); speed = 0; for (Double aDouble : speeds) { speed += aDouble; } speed = speed / speeds.size(); SpeedTypes speedType = Config.getSpeedType(); if (speedType == SpeedTypes.KNOT || (entity instanceof Boat && Config.getUseKnot())) { speed = speed * 1.94384449; }else if (speedType == SpeedTypes.KMPH) { speed = speed * 3.6; } else if (speedType == SpeedTypes.MPH) { speed = speed * 2.23693629; } String format = String.format("%.2f", speed); // i -> x // j -> y // k -> color RGB int graphics.drawString( Minecraft.getInstance().font, format+" "+SpeedTypes.getName(speedType).getString(), getPos(graphics, "W-70", 0, false), getPos(graphics, "H-17", 1, true), Config.getColor().getColor()); }); } static boolean flag = true; private static int getPos(GuiGraphics event, String input, int type, boolean changeFlag) { ArrayList paserdPos = new ArrayList(); final char[] s = input.toCharArray(); try{ for(int i = 0; i