Added who is the author.

Added visual speedometer
Added configruble location
This commit is contained in:
2023-06-26 22:11:23 +02:00
parent 1f9cf04c73
commit abd080437b
14 changed files with 498 additions and 154 deletions

View File

@@ -1,11 +1,8 @@
package me.zacharias.speedometer;
import dev.architectury.platform.Platform;
import net.minecraft.world.phys.Vec3;
import org.joml.Vector3i;
import org.json.JSONObject;
import javax.swing.plaf.ColorUIResource;
import java.io.*;
import me.shedaniel.math.Color;
@@ -14,6 +11,7 @@ import static me.zacharias.speedometer.Speedometer.MOD_ID;
public class Config {
private static JSONObject Config;
public static final int configVersion = 2;
public static void initialize(){
if(Config != null) throw new RuntimeException("Already Initialized");
@@ -27,30 +25,79 @@ public class Config {
}
Config = new JSONObject();
Config.put("speed", SpeedTypes.BlockPS);
Config.put("useKnot", false);
Config.put("color", new JSONObject()
.put("r", 16)
.put("g", 146)
.put("b", 158)
);
Config.put("debug", false);
defualt();
}else {
try {
BufferedReader in = new BufferedReader(new FileReader(config));
String tmp = "";
String tmp;
StringBuilder builder = new StringBuilder();
while((tmp = in.readLine()) != null){
builder.append(tmp);
}
Config = new JSONObject(builder.toString());
if(Config.has("version")){
if(Config.getInt("version")!=configVersion){
if(Config.getInt("version") > configVersion){
defualt();
save();
}else if(Config.getInt("version") < configVersion){
Config = new JSONObject();
defualt();
save();
}
}
}else{
Config = new JSONObject();
defualt();
save();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
private static void defualt() {
if(!Config.has("speed")) {
Config.put("speed", SpeedTypes.BlockPS);
}
if(!Config.has("useKnot")) {
Config.put("useKnot", false);
}
if(!Config.has("color")) {
Config.put("color", new JSONObject()
.put("r", 16)
.put("g", 146)
.put("b", 158)
);
}
if(!Config.has("visualSpeedometer")) {
Config.put("visualSpeedometer", false);
}
if(!Config.has("xPositionVisual")) {
Config.put("xPositionVisual", "W-23");
}
if(!Config.has("yPositionVisual")) {
Config.put("yPositionVisual", "H-23");
}
if(!Config.has("xPositionText")) {
Config.put("xPositionText", "W-70");
}
if(!Config.has("yPositionText")) {
Config.put("yPositionText", "H-15");
}
if(!Config.has("debug")) {
Config.put("debug", false);
}
if(!Config.has("version")) {
Config.put("version", configVersion);
}
}
public static void save(){
File config = new File(Platform.getConfigFolder().toString()+"/"+MOD_ID+"/config.json");
if(!config.exists()){
@@ -100,7 +147,7 @@ public class Config {
}
}
public static boolean getIsDebug() {
public static boolean isDebug() {
if(Config.has("debug")){
return Config.getBoolean("debug");
}else{
@@ -108,6 +155,45 @@ public class Config {
}
}
public static boolean getVisualSpeedometer(){
if(Config.has("visualSpeedometer")){
return Config.getBoolean("visualSpeedometer");
}else {
return false;
}
}
public static String getXPositionVisual(){
if(Config.has("xPositionVisual")) {
return Config.getString("xPositionVisual");
}else{
return "W-23";
}
}
public static String getYPositionVisual() {
if (Config.has("yPositionVisual")) {
return Config.getString("yPositionVisual");
} else {
return "H-23";
}
}
public static String getXPositionText(){
if(Config.has("xPositionText")) {
return Config.getString("xPositionText");
}else{
return "W-70";
}
}
public static String getYPositionText(){
if(Config.has("yPositionText")) {
return Config.getString("yPositionText");
}else{
return "H-15";
}
}
public static void setColor(Color color){
Config.put("color", new JSONObject()
.put("r", color.getRed())
@@ -123,4 +209,28 @@ public class Config {
public static void setSpeedType(SpeedTypes speedType) {
Config.put("speed", speedType);
}
public static void setVisualSpeedometer(boolean visualSpeedometer){
Config.put("visualSpeedometer", visualSpeedometer);
}
public static void setXPositionVisual(String xPositionVisual){
Config.put("xPositionVisual", xPositionVisual);
}
public static void setYPositionVisual(String yPositionVisual){
Config.put("yPositionVisual", yPositionVisual);
}
public static void setXPositionText(String xPositionText){
Config.put("xPositionText", xPositionText);
}
public static void setYPositionText(String yPositionText){
Config.put("yPositionText", yPositionText);
}
public static void setDebug(boolean debug){
Config.put("debug", debug);
}
}

View File

@@ -3,11 +3,17 @@ package me.zacharias.speedometer;
import net.minecraft.network.chat.Component;
public enum SpeedTypes {
MPH,
KMPH,
MPS,
BlockPS,
KNOT;
MPH(20),
KMPH(200),
MPS(10),
BlockPS(10),
KNOT(20);
private final int maxVisual;
SpeedTypes(int maxVisual){
this.maxVisual = maxVisual;
}
public static Component getName(Enum anEnum) {
if(anEnum instanceof SpeedTypes speedType) {
@@ -17,10 +23,13 @@ public enum SpeedTypes {
case KMPH -> "kmph";
case BlockPS -> "bps";
case KNOT -> "knot";
default -> "error";
});
}else {
return Component.translatable("speedometer.speed.error");
}
}
public int gatMaxVisual() {
return maxVisual;
}
}

View File

@@ -1,68 +1,61 @@
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.entity.vehicle.Minecart;
import net.minecraft.world.phys.Vec3;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.swing.plaf.ColorUIResource;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.File;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.UUID;
import java.util.function.Function;
import java.util.*;
public class Speedometer
{
public static final String MOD_ID = "speedometer";
public static final Supplier<RegistrarManager> 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",
"speedometer.key.configKey",
InputConstants.Type.KEYSYM,
InputConstants.KEY_O,
"speedometer.key.catagory"
"speedometer.key.category"
);
public static final KeyMapping DEBUG_KEY = new KeyMapping(
"speedometer.key.debugKey",
InputConstants.Type.KEYSYM,
InputConstants.KEY_F6,
"speedometer.key.category"
);
private static final ArrayList<Double> speeds = new ArrayList<>();
private static boolean speedometerVisualDisplayFailed = false;
public static BufferedImage img = null;
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");
}
LOGGER.info("Loading speedometer by Allen");
if(Platform.getEnvironment() != Env.CLIENT) return;
@@ -73,168 +66,277 @@ public class Speedometer
}
});
KeyMappingRegistry.register(DEBUG_KEY);
ClientTickEvent.CLIENT_POST.register(minecraft -> {
if(DEBUG_KEY.consumeClick()){
Config.setDebug(!Config.isDebug());
}
});
Config.initialize();
Config.save();
// TODO add cloth config for abstract config system
ClientGuiEvent.RENDER_HUD.register(Speedometer::render);
ArrayList<Double> speeds = new ArrayList<>();
try {
img = ImageIO.read(Objects.requireNonNull(Speedometer.class.getResourceAsStream("/assets/speedometer/meter/meter.png")));
}catch (NullPointerException | IOException e){
LOGGER.warn("Can't load speedometer icon. speedometer visual display is disabled");
speedometerVisualDisplayFailed = true;
}
ClientGuiEvent.RENDER_HUD.register((graphics, tick) -> {
if(Minecraft.getInstance().player == null) return;
Entity entity = Minecraft.getInstance().player.getRootVehicle();
LOGGER.info("Finished loading speedometer");
}
Level world = entity.level();
double x = entity.position().x;
double y = entity.position().y;
double z = entity.position().z;
private static void render(GuiGraphics graphics, float tick) {
if(Minecraft.getInstance().player == null) return;
Entity entity = Minecraft.getInstance().player.getRootVehicle();
Vec3 vec = entity.getDeltaMovement();
Vec3 vec = entity.getDeltaMovement();
double yOffset = 0.0784000015258789D;
double xOffset = 0D;
double zOffset = 0D;
double vOffset = 0D;
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) {
if (entity instanceof Player e) {
if (!e.onGround() && e.isCreative()) {
yOffset = 0;
} else if (e.isInWater()) {
yOffset = 0;
}
} else if (entity instanceof Boat || entity instanceof Minecart) {
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;
double speed = (Math.sqrt(Math.pow(vec.x + xOffset, 2) + Math.pow(vec.y + yOffset, 2) + Math.pow(vec.z + zOffset, 2)) * 20)+vOffset;
double lSpeed = speed;
if (speeds.size() >= 30) {
speeds.remove(0);
}
speeds.add(speed);
speed = 0;
for (Double aDouble : speeds) {
speed += aDouble;
}
speed = speed / speeds.size();
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;
double speedTypeSpeed = 0D;
SpeedTypes speedType = Config.getSpeedType();
if (speedType == SpeedTypes.KNOT || (entity instanceof Boat && Config.getUseKnot())) {
speedTypeSpeed = speed * 1.94384449;
}else if (speedType == SpeedTypes.KMPH) {
speedTypeSpeed = speed * 3.6;
} else if (speedType == SpeedTypes.MPH) {
speedTypeSpeed = speed * 2.23693629;
}else {
speedTypeSpeed = speed;
}
String format = String.format("%.2f", speedTypeSpeed);
//double v = (Math.pow(1.0233435, speedTypeSpeed)-1)/100;
double v = switch (speedType){
case KMPH -> Math.pow(speedTypeSpeed,0.87)-1;
case BlockPS, MPS -> Math.pow(speedTypeSpeed,1.25);
case MPH -> speedTypeSpeed;
case KNOT -> Math.pow(speedTypeSpeed,1.05);
}/100;
double i = (v *(316-45))+45;
if(Config.getVisualSpeedometer() && !speedometerVisualDisplayFailed){
//double v = speedTypeSpeed / speedType.gatMaxVisual();
int x3 = (int) Math.round(7*Math.cos(Math.toRadians(i+90)))+(img.getWidth()/2);
int y3 = (int) Math.round(7*Math.sin(Math.toRadians(i+90)))+(img.getWidth()/2);
BufferedImage img = new BufferedImage(Speedometer.img.getWidth(), Speedometer.img.getHeight(), Speedometer.img.getType());
Graphics2D g2d = img.createGraphics();
for(int x1 = 0; x1 < img.getWidth(); x1++) {
for (int y1 = 0; y1 < img.getHeight(); y1++) {
g2d.setColor(new Color(Speedometer.img.getRGB(x1,y1)));
g2d.fillRect(x1,y1,1,1);
}
}
String format = String.format("%.2f", speed);
g2d.setColor(new Color(138, 0, 0));
g2d.drawLine(x3,y3,img.getWidth()/2,img.getHeight()/2);
int xPos = getPos(graphics, Config.getXPositionVisual(), 0, false, img.getWidth());
int yPos = getPos(graphics, Config.getYPositionVisual(), 1, true, img.getHeight());
for(int x1 = 0; x1 < img.getWidth(); x1++){
for(int y1 = 0; y1 < img.getHeight(); y1++){
int x2 = x1 + xPos;
int y2 = y1 + yPos;
int rgb = img.getRGB(x1, y1);
if(new Color(rgb).equals(Color.black)) continue;
graphics.fill(x2, y2, x2+1, y2+1, rgb);
}
}
if(i >= 360+45){
String string = "x" + (int)Math.floor(i/(365+45));
graphics.drawString(
Minecraft.getInstance().font,
string,
xPos-Minecraft.getInstance().font.width(string),
yPos+6,
new Color(138, 0, 0).getRGB()
);
}
}else {
// i -> x
// j -> y
// k -> color RGB int
String speedString = format + " " + SpeedTypes.getName(speedType).getString();
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());
});
speedString,
getPos(graphics, Config.getXPositionText(), 0, false, Minecraft.getInstance().font.width(speedString)),
getPos(graphics, Config.getYPositionText(), 1, true, Minecraft.getInstance().font.lineHeight),
Config.getColor().getColor()
);
}
if(Config.isDebug()){
String debugData = "Velocity raw:" + "\n" +
" X: " + vec.x + "\n" +
" Y: " + vec.y + "\n" +
" Z: " + vec.z + "\n" +
"Offsets:" + "\n" +
" X: " + xOffset + "\n" +
" Y: " + yOffset + "\n" +
" Z: " + zOffset + "\n" +
" Total: " + vOffset + "\n" +
"Velocity modified:" + "\n" +
" X: " + (vec.x + xOffset) + "\n" +
" Y: " + (vec.y + yOffset) + "\n" +
" Z: " + (vec.z + zOffset) + "\n" +
" Total: " + lSpeed + "\n" +
"Velocity total average: " + speed + "\n" +
"Velocity total in " + speedType.name() + ": " + speedTypeSpeed + "\n" +
"Percentage point of visual speedometer: " + v + "\n" +
"Degree end point: " + (i+45);
Color color = new Color(255, 255, 255);
int y = 0;
for(String s : debugData.split("\n")){
drawString(graphics,0, y, s, color.getRGB());
y+=Minecraft.getInstance().font.lineHeight+1;
}
}
}
private static void drawString(GuiGraphics graphics, int x, int y, String text, int colorRGB){
graphics.drawString(
Minecraft.getInstance().font,
text,
x,
y,
colorRGB
);
}
static boolean flag = true;
private static int getPos(GuiGraphics event, String input, int type, boolean changeFlag) {
ArrayList<String> paserdPos = new ArrayList<String>();
private static int getPos(GuiGraphics event, String input, int type, boolean changeFlag, int Size) {
ArrayList<String> passerPose = new ArrayList<>();
final char[] s = input.toCharArray();
try{
for(int i = 0; i <s.length; i++){
if(s[i] == 'W' || s[i] == 'H'){
if(type == 0) paserdPos.add(event.guiWidth()+"");
else if(type == 1) paserdPos.add(event.guiHeight()+"");
if(type == 0) passerPose.add(String.valueOf(event.guiWidth()));
else if(type == 1) passerPose.add(String.valueOf(event.guiHeight()));
}else if(s[i] == 'h' || s[i] == 'w'){
if(type == 0) paserdPos.add(((int)(event.guiWidth()/2))+"");
else if(type == 1) paserdPos.add(((int)(event.guiHeight()/2))+"");
if(type == 0) passerPose.add(String.valueOf(event.guiWidth() / 2));
else if(type == 1) passerPose.add(String.valueOf(event.guiHeight() / 2));
}else if(s[i] == '+'){
paserdPos.add("+");
passerPose.add("+");
}else if(s[i] == '-'){
paserdPos.add("-");
passerPose.add("-");
}else if(s[i] == '*'){
paserdPos.add("/");
passerPose.add("/");
}else if(s[i] == '/'){
paserdPos.add("/");
passerPose.add("/");
}else if(testIfInt(s[i])){
try{
Integer.parseInt(paserdPos.get(i-1));
paserdPos.add(i-1,paserdPos.get(i-1)+s[i]);
Integer.parseInt(passerPose.get(i-1));
passerPose.add(i-1,passerPose.get(i-1)+s[i]);
}catch (NumberFormatException e){
paserdPos.add(Character.toString(s[i]));
passerPose.add(Character.toString(s[i]));
}
}else if(s[i] == 'S' || s[i] == 's'){
passerPose.add(String.valueOf(Size));
}else{
throw new Exception();
}
}
}catch (Exception e){
paserdPos.clear();
if(type == 0){
paserdPos.add(event.guiWidth()+"");
paserdPos.add("-");
paserdPos.add("70");
}else if(type == 1){
paserdPos.add(event.guiHeight()+"");
paserdPos.add("-");
paserdPos.add("15");
}
passerPose.clear();
defaultValues(event, type, passerPose);
}
int xPos = 0;
int xPos;
try{
xPos = Integer.parseInt(paserdPos.get(0));
xPos = Integer.parseInt(passerPose.get(0));
}catch (NumberFormatException e){
if(type == 0){
paserdPos.add(event.guiWidth()+"");
paserdPos.add("-");
paserdPos.add("70");
}else if(type == 1){
paserdPos.add(event.guiHeight()+"");
paserdPos.add("-");
paserdPos.add("15");
}
xPos = Integer.parseInt(paserdPos.get(0));
defaultValues(event, type, passerPose);
xPos = Integer.parseInt(passerPose.get(0));
}
for(int i = 1; i < paserdPos.size(); i++){
boolean first = i == 0;
String s1 = paserdPos.get(i);
for(int i = 1; i < passerPose.size(); i++){
boolean first = false;
String s1 = passerPose.get(i);
String s2 = "";
try{
s2 = paserdPos.get(i+1);
s2 = passerPose.get(i+1);
}catch (Exception e){
first = true;
}
if(s1 == "+" && !first){
if(Objects.equals(s1, "+") && !first){
xPos += Integer.parseInt(s2);
}else if(s1 == "-" && !first){
}else if(Objects.equals(s1, "-") && !first){
xPos -= Integer.parseInt(s2);
}else if(s1 == "*" && !first){
}else if(Objects.equals(s1, "*") && !first){
xPos *= Integer.parseInt(s2);
}else if(s1 == "/" && !first){
}else if(Objects.equals(s1, "/") && !first){
xPos /= Integer.parseInt(s2);
}
}
if((Platform.isDevelopmentEnvironment() || Config.getIsDebug()) && flag) {
if((Platform.isDevelopmentEnvironment() || Config.isDebug()) && flag) {
LOGGER.info("Selected speed type: "+SpeedTypes.getName(Config.getSpeedType()).getString()+"\n"+
Arrays.toString(paserdPos.toArray())+"\n\n"+
Arrays.toString(passerPose.toArray())+"\n\n"+
xPos);
flag = !changeFlag;
}
return xPos;
}
private static void defaultValues(GuiGraphics event, int type, ArrayList<String> passerPose) {
if(type == 0){
passerPose.add(String.valueOf(event.guiWidth()));
passerPose.add("-");
passerPose.add("70");
}else if(type == 1){
passerPose.add(String.valueOf(event.guiHeight()));
passerPose.add("-");
passerPose.add("15");
}
}
private static boolean testIfInt(char c) {
int i = Integer.parseInt(Character.toString(c));
return (i == 0 || i == 1 || i == 2 ||
@@ -260,10 +362,102 @@ public class Speedometer
category.addEntry(entryBuilder.startColorField(Component.translatable("speedometer.config.color"), me.zacharias.speedometer.Config.getColor())
.setSaveConsumer2(me.zacharias.speedometer.Config::setColor)
.build());
.build()
);
category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.knot"), me.zacharias.speedometer.Config.getUseKnot())
.setSaveConsumer(me.zacharias.speedometer.Config::setUseKnot)
.setYesNoTextSupplier(useKnot -> Component.translatable("speedometer.useKnot."+useKnot))
.build()
);
category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.visualSpeedometer"), me.zacharias.speedometer.Config.getVisualSpeedometer())
.setSaveConsumer(me.zacharias.speedometer.Config::setVisualSpeedometer)
.setYesNoTextSupplier((visualSpeedometer -> Component.translatable("speedometer.visualSpeedometer."+visualSpeedometer)))
.build()
);
// Regex
String xRegex = "W*w*S*s*\\+*-*\\**/*[0-9]*";
String yRegex = "H*h*S*s*\\+*-*\\**/*[0-9]*";
// Text Placement
category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.xPosition.text"), Config.getXPositionText())
.setSaveConsumer(Config::setXPositionText)
.setErrorSupplier(xPosition -> {
if(xPosition.matches(xRegex)){
return Optional.empty();
}else{
return Optional.of(Component.translatable("speedometer.invalid"));
}
})
.setTooltip(
Component.translatable("speedometer.config.tooltip.xPosition.line1"),
Component.translatable("speedometer.config.tooltip.xPosition.line2"),
Component.translatable("speedometer.config.tooltip.xPosition.line3")
)
.build()
);
category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.yPosition.text"), Config.getYPositionText())
.setSaveConsumer(Config::setYPositionText)
.setErrorSupplier(yPosition -> {
if(yPosition.matches(yRegex)){
return Optional.empty();
}else{
return Optional.of(Component.translatable("speedometer.invalid"));
}
})
.setTooltip(
Component.translatable("speedometer.config.tooltip.yPosition.line1"),
Component.translatable("speedometer.config.tooltip.yPosition.line2"),
Component.translatable("speedometer.config.tooltip.yPosition.line3")
)
.build()
);
// Visual location
category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.xPosition.visual"), Config.getXPositionVisual())
.setSaveConsumer(Config::setXPositionVisual)
.setErrorSupplier(xPosition -> {
if(xPosition.matches(xRegex)){
return Optional.empty();
}else{
return Optional.of(Component.translatable("speedometer.invalid"));
}
})
.setTooltip(
Component.translatable("speedometer.config.tooltip.xPosition.line1"),
Component.translatable("speedometer.config.tooltip.xPosition.line2"),
Component.translatable("speedometer.config.tooltip.xPosition.line3")
)
.build()
);
category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.yPosition.visual"), Config.getYPositionVisual())
.setSaveConsumer(Config::setYPositionVisual)
.setErrorSupplier(yPosition -> {
if(yPosition.matches(yRegex)){
return Optional.empty();
}else{
return Optional.of(Component.translatable("speedometer.invalid"));
}
})
.setTooltip(
Component.translatable("speedometer.config.tooltip.yPosition.line1"),
Component.translatable("speedometer.config.tooltip.yPosition.line2"),
Component.translatable("speedometer.config.tooltip.yPosition.line3")
)
.build()
);
category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.debug"),Config.isDebug())
.setSaveConsumer(Config::setDebug)
.setYesNoTextSupplier(isDebug -> Component.translatable("speedometer.debug."+isDebug))
.setTooltip(Component.translatable("speedometer.config.tooltip.debug"))
.build()
);

View File

@@ -3,15 +3,43 @@
"speedometer.config.category.name": "Speedometer Config Category",
"speedometer.config.speed": "Speed Type",
"speedometer.config.color": "Color",
"speedometer.config.knot": "Use knot in boats",
"speedometer.config.knot": "Use Knot in Boats",
"speedometer.config.visualSpeedometer": "Visual Speedometer Display",
"speedometer.config.xPosition.visual": "X Position for Visual Meter",
"speedometer.config.yPosition.visual": "Y Position for Visual Meter",
"speedometer.config.xPosition.text": "X Position for Text Meter",
"speedometer.config.yPosition.text": "Y Position for Text Meter",
"speedometer.config.debug": "Debug",
"speedometer.key.configkey": "Config Key",
"speedometer.key.catagory": "Speedometer",
"speedometer.key.configKey": "Config Key",
"speedometer.key.debugKey": "Debug Key",
"speedometer.key.category": "Speedometer",
"speedometer.speed.mph": "MPH",
"speedometer.speed.mps": "Meters/s",
"speedometer.speed.kmph": "Km/h",
"speedometer.speed.bps": "Blocks/s",
"speedometer.speed.knot": "Knot",
"speedometer.speed.error": "Unknown Speed Type"
"speedometer.speed.error": "Unknown Speed Type",
"speedometer.visualSpeedometer.true": "Visual",
"speedometer.visualSpeedometer.false": "Text",
"speedometer.useKnot.true": "Yes",
"speedometer.useKnot.false": "No",
"speedometer.debug.true": "\u00A74Yes",
"speedometer.debug.false": "\u00A74No",
"speedometer.config.tooltip.xPosition.line1": "W = the width of the screen",
"speedometer.config.tooltip.xPosition.line2": "w = half the width of the screen",
"speedometer.config.tooltip.xPosition.line3": "s = the width of the text or image",
"speedometer.config.tooltip.yPosition.line1": "H = the height of the screen",
"speedometer.config.tooltip.yPosition.line2": "h = half the height of the screen",
"speedometer.config.tooltip.yPosition.line3": "s = the height of the text or image",
"speedometer.config.tooltip.debug": "Debug Information",
"speedometer.invalid": "Invalid String"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

View File

@@ -7,8 +7,11 @@ import me.shedaniel.clothconfig2.api.ConfigCategory;
import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
import me.zacharias.speedometer.SpeedTypes;
import me.zacharias.speedometer.Speedometer;
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;
import static me.zacharias.speedometer.Speedometer.LOGGER;
public class Config implements ModMenuApi {
@Override
public ConfigScreenFactory<?> getModConfigScreenFactory() {

View File

@@ -1,17 +1,11 @@
package me.zacharias.speedometer.fabric;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi;
import me.shedaniel.clothconfig2.api.ConfigBuilder;
import me.zacharias.speedometer.Speedometer;
import net.fabricmc.api.ModInitializer;
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;
public class SpeedometerFabric implements ModInitializer {
@Override
public void onInitialize() {
Speedometer.init();
}
}

View File

@@ -5,7 +5,7 @@
"name": "speedometer",
"description": "just displaying your speed",
"authors": [],
"authors": ["Allen"],
"contact": {},
"license": "All Rights Reserved",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 B

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,6 @@
{
"pack": {
"pack_format": 15,
"description": "speedometer resources"
}
}

View File

@@ -31,7 +31,7 @@ logoFile="icon.png" #optional
# A text field displayed in the mod UI
#credits="Thanks for this example mod goes to Java" #optional
# A text field displayed in the mod UI
authors="Zacharias" #optional
authors="Allen" #optional
# Display Test controls the display for your mod in the server connection screen
# MATCH_VERSION means that your mod will cause a red X if the versions on client and server differ. This is the default behaviour and should be what you choose if you have server and client elements to your mod.
# IGNORE_SERVER_VERSION means that your mod will not cause a red X if it's present on the server but not on the client. This is what you should use if you're a server only mod.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 B

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -1,14 +1,14 @@
org.gradle.jvmargs=-Xmx1G
minecraft_version=1.20
minecraft_version=1.20.1
archives_base_name=speedometer
mod_version=1.0
mod_version=2.0
maven_group=me.zacharias
architectury_version=9.0.8
fabric_loader_version=0.14.21
fabric_api_version=0.83.0+1.20
fabric_api_version=0.84.0+1.20.1
forge_version=1.20-46.0.14
forge_version=1.20.1-47.0.19