Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
e5ac3d74c4
|
|||
|
66d63b03ea
|
|||
|
6f8b024bcc
|
|||
|
9c05791a20
|
|||
|
|
7be0ea014c | ||
|
|
0fdab6874c | ||
|
4f6bf01581
|
|||
|
ea3cd92c33
|
|||
|
|
2c88f99140 | ||
|
4b2a150a30
|
|||
|
bd205b5ae6
|
2
.github/ISSUE_TEMPLATE/bug-report.md
vendored
2
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@@ -27,7 +27,7 @@ assignees: zaze06
|
|||||||
|
|
||||||
**Config**
|
**Config**
|
||||||
*If needed*
|
*If needed*
|
||||||
*Use [GitHub Gist](gist.gihub.com) to upload your speedometer config, located in *
|
*Use [GitHub Gist](gist.gihub.com) to upload your speedometer config, located in `<minecraft>/config/speedometer/config.json`*
|
||||||
|
|
||||||
**Logs**
|
**Logs**
|
||||||
*If needed(Most of the times)*
|
*If needed(Most of the times)*
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"description": "A different speedometer",
|
"description": "A different speedometer",
|
||||||
"supported_formats": {
|
"supported_formats": {
|
||||||
"min_inclusive": 34,
|
"min_inclusive": 34,
|
||||||
"max_inclusive": 57
|
"max_inclusive": 80
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,7 @@ import dev.architectury.event.events.client.ClientTickEvent;
|
|||||||
import dev.architectury.platform.Platform;
|
import dev.architectury.platform.Platform;
|
||||||
import dev.architectury.registry.client.keymappings.KeyMappingRegistry;
|
import dev.architectury.registry.client.keymappings.KeyMappingRegistry;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
|
import net.minecraft.CrashReport;
|
||||||
import net.minecraft.client.DeltaTracker;
|
import net.minecraft.client.DeltaTracker;
|
||||||
import net.minecraft.client.KeyMapping;
|
import net.minecraft.client.KeyMapping;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
@@ -23,318 +24,312 @@ import java.util.*;
|
|||||||
import static me.zacharias.speedometer.Speedometer.*;
|
import static me.zacharias.speedometer.Speedometer.*;
|
||||||
|
|
||||||
public class Client {
|
public class Client {
|
||||||
public static final KeyMapping CONFIG_KEY = new KeyMapping(
|
public static final KeyMapping CONFIG_KEY = new KeyMapping(
|
||||||
"speedometer.key.configKey",
|
"speedometer.key.configKey",
|
||||||
InputConstants.Type.KEYSYM,
|
InputConstants.Type.KEYSYM,
|
||||||
InputConstants.KEY_O,
|
InputConstants.KEY_O,
|
||||||
"speedometer.key.category"
|
"speedometer.key.category"
|
||||||
);
|
);
|
||||||
public static final KeyMapping DEBUG_KEY = new KeyMapping(
|
public static final KeyMapping DEBUG_KEY = new KeyMapping(
|
||||||
"speedometer.key.debugKey",
|
"speedometer.key.debugKey",
|
||||||
InputConstants.Type.KEYSYM,
|
InputConstants.Type.KEYSYM,
|
||||||
InputConstants.KEY_F6,
|
InputConstants.KEY_F6,
|
||||||
"speedometer.key.category"
|
"speedometer.key.category"
|
||||||
);
|
);
|
||||||
|
|
||||||
private static final ArrayList<Double> speeds = new ArrayList<>();
|
private static final ArrayList<Double> speeds = new ArrayList<>();
|
||||||
|
|
||||||
|
|
||||||
public static void init(){
|
public static void init(){
|
||||||
|
|
||||||
final boolean isClothLoaded = Platform.isModLoaded("cloth_config") || Platform.isModLoaded("cloth-config");
|
final boolean isClothLoaded = Platform.isModLoaded("cloth_config") || Platform.isModLoaded("cloth-config");
|
||||||
|
|
||||||
if(isClothLoaded) {
|
|
||||||
Platform.getMod(MOD_ID).registerConfigurationScreen(parent -> ConfigMenu.getConfig(parent).build());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOGGER.warn("Missing Cloth Config API, In game config menu will not be available");
|
|
||||||
}
|
|
||||||
|
|
||||||
KeyMappingRegistry.register(CONFIG_KEY);
|
|
||||||
ClientTickEvent.CLIENT_POST.register(minecraft -> {
|
|
||||||
if(CONFIG_KEY.consumeClick()){
|
|
||||||
if(isClothLoaded) {
|
if(isClothLoaded) {
|
||||||
Minecraft.getInstance().setScreen(ConfigMenu.getConfig(Minecraft.getInstance().screen).build());
|
Platform.getMod(MOD_ID).registerConfigurationScreen(parent -> ConfigMenu.getConfig(parent).build());
|
||||||
}
|
|
||||||
else if(Minecraft.getInstance().player != null)
|
|
||||||
{
|
|
||||||
Minecraft.getInstance().player.displayClientMessage(
|
|
||||||
Component
|
|
||||||
.translatable("speedometer.error.missing_cloth")
|
|
||||||
.withColor(new Color(190, 0, 0).getRGB())
|
|
||||||
.append(" ")
|
|
||||||
.append(Component
|
|
||||||
.literal("Open Config")
|
|
||||||
.withStyle(ChatFormatting.UNDERLINE)
|
|
||||||
.withStyle((style) -> style.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, Config.getConfigPath())))
|
|
||||||
), false);
|
|
||||||
LOGGER.warn(Component.translatable("speedometer.error.missing_cloth").getString());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOGGER.warn(Component.translatable("speedometer.error.missing_cloth").getString());
|
LOGGER.warn("Missing Cloth Config API, In game config menu will not be available");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
KeyMappingRegistry.register(DEBUG_KEY);
|
KeyMappingRegistry.register(CONFIG_KEY);
|
||||||
ClientTickEvent.CLIENT_POST.register(minecraft -> {
|
ClientTickEvent.CLIENT_POST.register(minecraft -> {
|
||||||
if(DEBUG_KEY.consumeClick()){
|
if(CONFIG_KEY.consumeClick()){
|
||||||
Config.setDebug(!Config.isDebug());
|
if(isClothLoaded) {
|
||||||
}
|
Minecraft.getInstance().setScreen(ConfigMenu.getConfig(Minecraft.getInstance().screen).build());
|
||||||
});
|
}
|
||||||
|
else if(Minecraft.getInstance().player != null)
|
||||||
|
{
|
||||||
|
Minecraft.getInstance().player.displayClientMessage(
|
||||||
|
Component
|
||||||
|
.translatable("speedometer.error.missing_cloth")
|
||||||
|
.withColor(new Color(190, 0, 0).getRGB())
|
||||||
|
.append(Component
|
||||||
|
.translatable("speedometer.error.missing_cloth.open_config")
|
||||||
|
.withStyle(ChatFormatting.UNDERLINE)
|
||||||
|
.withStyle((style) -> style.withClickEvent(new ClickEvent.OpenFile(Config.getConfigPath())))
|
||||||
|
), false);
|
||||||
|
LOGGER.warn(Component.translatable("speedometer.error.missing_cloth").getString());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOGGER.warn(Component.translatable("speedometer.error.missing_cloth").getString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Config.initialize();
|
KeyMappingRegistry.register(DEBUG_KEY);
|
||||||
Config.save();
|
ClientTickEvent.CLIENT_POST.register(minecraft -> {
|
||||||
|
if(DEBUG_KEY.consumeClick()){
|
||||||
|
Config.setDebug(!Config.isDebug());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
ClientGuiEvent.RENDER_HUD.register(Client::render);
|
Config.initialize();
|
||||||
|
Config.save();
|
||||||
|
|
||||||
LOGGER.info("Finished loading speedometer");
|
ClientGuiEvent.RENDER_HUD.register(Client::render);
|
||||||
}
|
|
||||||
|
|
||||||
private static void render(GuiGraphics graphics, DeltaTracker deltaTracker) {
|
LOGGER.info("Finished loading speedometer");
|
||||||
if(Minecraft.getInstance().player == null) return;
|
|
||||||
if(Minecraft.getInstance().options.hideGui) return;
|
|
||||||
Entity entity = Minecraft.getInstance().player.getRootVehicle();
|
|
||||||
|
|
||||||
Vec3 vec = new Vec3(
|
|
||||||
entity.getX() - entity.xOld,
|
|
||||||
entity.getY() - entity.yOld,
|
|
||||||
entity.getZ() - entity.zOld
|
|
||||||
);
|
|
||||||
|
|
||||||
double yOffset = 0D;
|
|
||||||
double xOffset = 0D;
|
|
||||||
double zOffset = 0D;
|
|
||||||
double vOffset = 0D;
|
|
||||||
|
|
||||||
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.removeFirst();
|
|
||||||
}
|
|
||||||
speeds.add(speed);
|
|
||||||
speed = 0;
|
|
||||||
for (Double aDouble : speeds) {
|
|
||||||
speed += aDouble;
|
|
||||||
}
|
|
||||||
speed = speed / speeds.size();
|
|
||||||
|
|
||||||
double speedTypeSpeed;
|
|
||||||
|
|
||||||
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);
|
private static void render(GuiGraphics graphics, DeltaTracker deltaTracker) {
|
||||||
|
if(Minecraft.getInstance().player == null) return;
|
||||||
String speedString = format + " " + SpeedTypes.getName(speedType).getString();
|
if(Minecraft.getInstance().options.hideGui) return;
|
||||||
|
Entity entity = Minecraft.getInstance().player.getRootVehicle();
|
||||||
int width = switch ((Config.getVisualSpeedometer() && !Config.isDisableVisualSpeedometer()) ? 1 : 0){
|
|
||||||
case 1 -> Config.getImageSize();
|
|
||||||
case 0 -> Minecraft.getInstance().font.width(speedString);
|
|
||||||
default -> 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
int yPos = getPosImp(graphics, width, Config.getYPosition(), false);
|
Vec3 vec = new Vec3(
|
||||||
int xPos = getPosImp(graphics, width, Config.getXPosition(), true);
|
entity.getX() - entity.xOld,
|
||||||
|
entity.getY() - entity.yOld,
|
||||||
|
entity.getZ() - entity.zOld
|
||||||
|
);
|
||||||
|
|
||||||
int lineHeight = Minecraft.getInstance().font.lineHeight;
|
double yOffset = 0D;
|
||||||
|
double xOffset = 0D;
|
||||||
|
double zOffset = 0D;
|
||||||
|
double vOffset = 0D;
|
||||||
|
|
||||||
if(Config.getVisualSpeedometer() && !Config.isDisableVisualSpeedometer()){
|
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;
|
||||||
|
|
||||||
//double v = speedTypeSpeed / speedType.gatMaxVisual();
|
if (speeds.size() >= 30) {
|
||||||
|
speeds.removeFirst();
|
||||||
BufferedImage img = ImageHandler.scale(ICON.getSpeedometerIcon(speedTypeSpeed), Config.getImageSize(), Config.getImageSize());
|
|
||||||
|
|
||||||
for(int x1 = 0; x1 < img.getWidth(); x1++){
|
|
||||||
for(int y1 = 0; y1 < img.getHeight(); y1++){
|
|
||||||
int x2 = x1 + xPos - img.getWidth();
|
|
||||||
int y2 = y1 + yPos - img.getHeight();
|
|
||||||
|
|
||||||
int rgb = img.getRGB(x1, y1);
|
|
||||||
|
|
||||||
if(new Color(rgb).equals(Color.black)) continue;
|
|
||||||
|
|
||||||
graphics.fill(x2, y2, x2+1, y2+1, rgb);
|
|
||||||
}
|
}
|
||||||
}
|
speeds.add(speed);
|
||||||
|
speed = 0;
|
||||||
}else {
|
for (Double aDouble : speeds) {
|
||||||
// i -> x
|
speed += aDouble;
|
||||||
// j -> y
|
|
||||||
// k -> color RGB int
|
|
||||||
graphics.drawString(
|
|
||||||
Minecraft.getInstance().font,
|
|
||||||
speedString,
|
|
||||||
xPos - width,
|
|
||||||
yPos - lineHeight,
|
|
||||||
Config.getColor().getRGB()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
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" +
|
|
||||||
"Endpoint position: (" + Debugger.x + ", " + Debugger.y + ")\n" +
|
|
||||||
"Percentage point of visual speedometer: " + Debugger.angle + "\n" +
|
|
||||||
(Config.getVisualSpeedometer()?"Visual Size: "+Config.getImageSize():"Textual display");
|
|
||||||
|
|
||||||
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
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getPosImp(GuiGraphics event, int width, String input, boolean isXPosition){
|
|
||||||
input = input.trim();
|
|
||||||
input = input
|
|
||||||
.replaceAll("(W+)|(H+)", String.valueOf(isXPosition?event.guiWidth():event.guiHeight()))
|
|
||||||
.replaceAll("(w+)|(h+)", String.valueOf(isXPosition?event.guiWidth()/2:event.guiHeight()/2))
|
|
||||||
.replaceAll("(S+)|(s+)", String.valueOf(width));
|
|
||||||
if((Config.isDebug()) && Config.getCounter() < 2) {
|
|
||||||
//String speedDisplayType = SpeedTypes.getName(Config.getSpeedType()).getString();
|
|
||||||
//String splitRawSpeedPosition = Arrays.toString(passerPose.toArray());
|
|
||||||
//String rawSpeedPosition = isXPosition ? Config.getXPosition() : Config.getYPosition();
|
|
||||||
LOGGER.info("Selected speed type(DEBUG): {}\n{}\n\n\n", isXPosition, input);
|
|
||||||
Config.addCounter();
|
|
||||||
}
|
|
||||||
return getPos(event, width, input, isXPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getPos(GuiGraphics event, int width, String input, boolean isXPosition) {
|
|
||||||
ArrayList<String> passerPose = new ArrayList<>();
|
|
||||||
final char[] s = input.toCharArray();
|
|
||||||
|
|
||||||
try{
|
|
||||||
for(int i = 0; i <s.length; i++){
|
|
||||||
char c = s[i];
|
|
||||||
if(c == 'W' || c == 'H'){
|
|
||||||
if(isXPosition) passerPose.add(String.valueOf(event.guiWidth()));
|
|
||||||
else passerPose.add(String.valueOf(event.guiHeight()));
|
|
||||||
}
|
}
|
||||||
else if(c == 'h' || c == 'w'){
|
speed = speed / speeds.size();
|
||||||
if(isXPosition) passerPose.add(String.valueOf(event.guiWidth() / 2));
|
|
||||||
else passerPose.add(String.valueOf(event.guiHeight() / 2));
|
double speedTypeSpeed;
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
else if(c == 'S' || c == 's'){
|
|
||||||
passerPose.add(String.valueOf(width));
|
String format = String.format("%.2f", speedTypeSpeed);
|
||||||
|
|
||||||
|
String speedString = format + " " + SpeedTypes.getName(speedType).getString();
|
||||||
|
|
||||||
|
int width = switch ((Config.getVisualSpeedometer() && !Config.isDisableVisualSpeedometer()) ? 1 : 0){
|
||||||
|
case 1 -> Config.getImageSize();
|
||||||
|
case 0 -> Minecraft.getInstance().font.width(speedString);
|
||||||
|
default -> 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
int yPos = getPosImp(graphics, width, Config.getYPosition(), false);
|
||||||
|
int xPos = getPosImp(graphics, width, Config.getXPosition(), true);
|
||||||
|
|
||||||
|
int lineHeight = Minecraft.getInstance().font.lineHeight;
|
||||||
|
|
||||||
|
if(Config.getVisualSpeedometer() && !Config.isDisableVisualSpeedometer()){
|
||||||
|
|
||||||
|
//double v = speedTypeSpeed / speedType.gatMaxVisual();
|
||||||
|
|
||||||
|
BufferedImage img = ImageHandler.scale(ICON.getSpeedometerIcon(speedTypeSpeed), Config.getImageSize(), Config.getImageSize());
|
||||||
|
|
||||||
|
for(int x1 = 0; x1 < img.getWidth(); x1++){
|
||||||
|
for(int y1 = 0; y1 < img.getHeight(); y1++){
|
||||||
|
int x2 = x1 + xPos - img.getWidth();
|
||||||
|
int y2 = y1 + yPos - img.getHeight();
|
||||||
|
|
||||||
|
int rgb = img.getRGB(x1, y1);
|
||||||
|
|
||||||
|
if(new Color(rgb).equals(Color.black)) continue;
|
||||||
|
|
||||||
|
graphics.fill(x2, y2, x2+1, y2+1, rgb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}else {
|
||||||
|
// i -> x
|
||||||
|
// j -> y
|
||||||
|
// k -> color RGB int
|
||||||
|
graphics.drawString(
|
||||||
|
Minecraft.getInstance().font,
|
||||||
|
speedString,
|
||||||
|
xPos - width,
|
||||||
|
yPos - lineHeight,
|
||||||
|
Config.getColor().getRGB()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else if(c == '+' ||
|
|
||||||
c == '-' ||
|
if(Config.isDebug()){
|
||||||
c == '*' ||
|
String debugData = "Speedometer: "+VERSION+"\n"+
|
||||||
c == '/'){
|
"Velocity raw:" + "\n" +
|
||||||
passerPose.add(Character.toString(c));
|
" 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" +
|
||||||
|
"Endpoint position: (" + Debugger.x + ", " + Debugger.y + ")\n" +
|
||||||
|
"Percentage point of visual speedometer: " + Debugger.angle + "\n" +
|
||||||
|
(Config.getVisualSpeedometer()?"Visual Size: "+Config.getImageSize():"Textual display");
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(Character.isDigit(c)){
|
|
||||||
int lastIndex = i - 1;
|
|
||||||
if(lastIndex > 0 && passerPose.get(lastIndex).matches("^[0-9]+$")) {
|
|
||||||
passerPose.add(passerPose.removeLast() + c);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
passerPose.add(Character.toString(c));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}catch (Exception e){
|
|
||||||
passerPose.clear();
|
|
||||||
defaultValues(event, isXPosition, passerPose);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
private static void drawString(GuiGraphics graphics, int x, int y, String text, int colorRGB){
|
||||||
|
graphics.drawString(
|
||||||
int position;
|
Minecraft.getInstance().font,
|
||||||
try{
|
text,
|
||||||
position = Integer.parseInt(passerPose.getFirst());
|
x,
|
||||||
}catch (NumberFormatException e){
|
y,
|
||||||
passerPose.clear();
|
colorRGB
|
||||||
defaultValues(event, isXPosition, passerPose);
|
);
|
||||||
position = Integer.parseInt(passerPose.getFirst());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 1; i < passerPose.size(); i++){
|
private static int getPosImp(GuiGraphics event, int width, String input, boolean isXPosition){
|
||||||
boolean first = false;
|
input = input.trim();
|
||||||
String s1 = passerPose.get(i);
|
input = input
|
||||||
String s2 = "";
|
.replaceAll("(W+)|(H+)", String.valueOf(isXPosition?event.guiWidth():event.guiHeight()))
|
||||||
try{
|
.replaceAll("(w+)|(h+)", String.valueOf(isXPosition?event.guiWidth()/2:event.guiHeight()/2))
|
||||||
s2 = passerPose.get(i+1);
|
.replaceAll("(S+)|(s+)", String.valueOf(width));
|
||||||
}catch (Exception e){
|
if((Config.isDebug()) && Config.getCounter() < 2) {
|
||||||
first = true;
|
//String speedDisplayType = SpeedTypes.getName(Config.getSpeedType()).getString();
|
||||||
}
|
//String splitRawSpeedPosition = Arrays.toString(passerPose.toArray());
|
||||||
|
//String rawSpeedPosition = isXPosition ? Config.getXPosition() : Config.getYPosition();
|
||||||
|
LOGGER.info("Selected speed type(DEBUG): {}\n{}\n\n\n", isXPosition, input);
|
||||||
|
Config.addCounter();
|
||||||
|
}
|
||||||
|
return getPos(event, width, input, isXPosition);
|
||||||
|
}
|
||||||
|
|
||||||
if(Objects.equals(s1, "+") && !first){
|
private static int getPos(GuiGraphics event, int width, String input, boolean isXPosition) {
|
||||||
position += Integer.parseInt(s2);
|
ArrayList<String> tokens = new ArrayList<>();
|
||||||
}else if(Objects.equals(s1, "-") && !first){
|
final char[] s = input.toCharArray();
|
||||||
position -= Integer.parseInt(s2);
|
|
||||||
}else if(Objects.equals(s1, "*") && !first){
|
|
||||||
position *= Integer.parseInt(s2);
|
|
||||||
}else if(Objects.equals(s1, "/") && !first){
|
|
||||||
position /= Integer.parseInt(s2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if((Config.isDebug()) && Config.getCounter() < 2) {
|
|
||||||
String speedDisplayType = SpeedTypes.getName(Config.getSpeedType()).getString();
|
|
||||||
String splitRawSpeedPosition = Arrays.toString(passerPose.toArray());
|
|
||||||
String rawSpeedPosition = isXPosition ? Config.getXPosition() : Config.getYPosition();
|
|
||||||
LOGGER.info("Selected speed type: {}\n{}\n\n{}\n\n{}", speedDisplayType, splitRawSpeedPosition, position, rawSpeedPosition);
|
|
||||||
Config.addCounter();
|
|
||||||
}
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void defaultValues(GuiGraphics event, boolean isXPosition, ArrayList<String> passerPose) {
|
try{
|
||||||
if(isXPosition)
|
for(int i = 0; i <s.length; i++){
|
||||||
{
|
char c = s[i];
|
||||||
passerPose.add(String.valueOf(event.guiWidth()));
|
if(c == '+' ||
|
||||||
passerPose.add("-");
|
c == '-' ||
|
||||||
passerPose.add("3");
|
c == '*' ||
|
||||||
|
c == '/'){
|
||||||
|
tokens.add(Character.toString(c));
|
||||||
|
}
|
||||||
|
else if(Character.isDigit(c)){
|
||||||
|
int lastIndex = i - 1;
|
||||||
|
if(lastIndex >= 0 && tokens.get(lastIndex).matches("^[0-9]+$")) {
|
||||||
|
tokens.set(tokens.size() - 1, tokens.get(tokens.size() - 1) + c);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tokens.add(Character.toString(c));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
throw new IllegalArgumentException("Invalid character in input string: " + c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
tokens.clear();
|
||||||
|
defaultValues(event, isXPosition, tokens);
|
||||||
|
}
|
||||||
|
|
||||||
|
int position;
|
||||||
|
try{
|
||||||
|
position = Integer.parseInt(tokens.getFirst());
|
||||||
|
}catch (NumberFormatException e){
|
||||||
|
tokens.clear();
|
||||||
|
defaultValues(event, isXPosition, tokens);
|
||||||
|
position = Integer.parseInt(tokens.getFirst());
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 1; i < tokens.size(); i+=2){
|
||||||
|
String operator = tokens.get(i);
|
||||||
|
if(i + 1 >= tokens.size()) {
|
||||||
|
LOGGER.error("Invalid expression: missing operand after operator '{}'", operator);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
String operand = tokens.get(i + 1);
|
||||||
|
int value;
|
||||||
|
try {
|
||||||
|
value = Integer.parseInt(operand);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e) {
|
||||||
|
LOGGER.error("Invalid operand: '{}'. Using default value. REPORT THIS! https://github.com/zaze06/Speedometer/issues/new/choose", operand);
|
||||||
|
Minecraft.getInstance().emergencySaveAndCrash(new CrashReport("Invalid operand in speedometer position calculation. REPORT THIS! https://github.com/zaze06/Speedometer/issues/new/choose", e));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (operator) {
|
||||||
|
case "+" -> position += value;
|
||||||
|
case "-" -> position -= value;
|
||||||
|
case "*" -> position *= value;
|
||||||
|
case "/" -> position /= value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Config.isDebug() && Config.getCounter() < 2) {
|
||||||
|
LOGGER.info("Selected speed type: {}\n{}\n\n{}\n\n{}",
|
||||||
|
SpeedTypes.getName(Config.getSpeedType()).getString(),
|
||||||
|
Arrays.toString(tokens.toArray()),
|
||||||
|
position,
|
||||||
|
isXPosition ? Config.getXPosition() : Config.getYPosition());
|
||||||
|
Config.addCounter();
|
||||||
|
}
|
||||||
|
|
||||||
|
return position;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
private static void defaultValues(GuiGraphics event, boolean isXPosition, ArrayList<String> passerPose) {
|
||||||
passerPose.add(String.valueOf(event.guiHeight()));
|
if(isXPosition)
|
||||||
passerPose.add("-");
|
{
|
||||||
passerPose.add("3");
|
passerPose.add(String.valueOf(event.guiWidth()));
|
||||||
|
passerPose.add("-");
|
||||||
|
passerPose.add("3");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
passerPose.add(String.valueOf(event.guiHeight()));
|
||||||
|
passerPose.add("-");
|
||||||
|
passerPose.add("3");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,8 @@
|
|||||||
|
|
||||||
"speedometer.config.error.size_outofbounds": "The size is out of bounds 10<=size<=300",
|
"speedometer.config.error.size_outofbounds": "The size is out of bounds 10<=size<=300",
|
||||||
|
|
||||||
"speedometer.error.missing_cloth": "Missing Cloth Config API for Config Screen",
|
"speedometer.error.missing_cloth": "Missing Cloth Config API for Config Screen, ",
|
||||||
|
"speedometer.error.missing_cloth.open_config": "Open Config",
|
||||||
|
|
||||||
"resourcepack.speedometer.quarter_circle_speedometer": "Quarter circle Speedometer"
|
"resourcepack.speedometer.quarter_circle_speedometer": "Quarter circle Speedometer"
|
||||||
}
|
}
|
||||||
@@ -68,7 +68,8 @@
|
|||||||
|
|
||||||
"speedometer.config.error.size_outofbounds": "Stolekten är felakting 10<=stolek<=300",
|
"speedometer.config.error.size_outofbounds": "Stolekten är felakting 10<=stolek<=300",
|
||||||
|
|
||||||
"speedometer.error.missing_cloth": "Saknar Cloth Config API för konfigurationsskärmen",
|
"speedometer.error.missing_cloth": "Saknar Cloth Config API för konfigurationsskärmen, ",
|
||||||
|
"speedometer.error.missing_cloth.open_config": "Öppna Config",
|
||||||
|
|
||||||
"resourcepack.speedometer.quarter_circle_speedometer": "Quarter circle Speedometer"
|
"resourcepack.speedometer.quarter_circle_speedometer": "Quarter circle Speedometer"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
{
|
{
|
||||||
"homepage": "https://modrinth.com/mod/speedometer/versions",
|
"homepage": "https://modrinth.com/mod/speedometer/versions",
|
||||||
|
"1.17.1": {
|
||||||
|
"6.2.4": "Backport by request from issue #3"
|
||||||
|
},
|
||||||
"1.20.6": {
|
"1.20.6": {
|
||||||
"1.0": "First version",
|
"1.0": "First version",
|
||||||
"2.0": "Made the speedometer text movable, added debug data display, added visual speedometer",
|
"2.0": "Made the speedometer text movable, added debug data display, added visual speedometer",
|
||||||
@@ -104,6 +107,9 @@
|
|||||||
"1.20.1-recommended": "5.2",
|
"1.20.1-recommended": "5.2",
|
||||||
|
|
||||||
"1.20-latest": "5.2",
|
"1.20-latest": "5.2",
|
||||||
"1.20-recommended": "5.2"
|
"1.20-recommended": "5.2",
|
||||||
|
|
||||||
|
"1.17.1-latest": "6.2.4",
|
||||||
|
"1.17.1-recommended": "6.2.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
org.gradle.jvmargs=-Xmx8G
|
org.gradle.jvmargs=-Xmx8G
|
||||||
|
|
||||||
minecraft_version=1.21.4
|
minecraft_version=1.21.6
|
||||||
|
|
||||||
archives_base_name=speedometer
|
archives_base_name=speedometer
|
||||||
mod_version=6.2.3
|
mod_version=6.3.0
|
||||||
maven_group=me.zacharias
|
maven_group=me.zacharias
|
||||||
|
|
||||||
# https://modrinth.com/mod/architectury-api/versions
|
# https://modrinth.com/mod/architectury-api/versions
|
||||||
architectury_version=15.0.3
|
architectury_version=17.0.6
|
||||||
|
|
||||||
# https://modrinth.com/mod/cloth-config/versions
|
# https://modrinth.com/mod/cloth-config/versions
|
||||||
cloth_config_version = 17.0.144
|
cloth_config_version = 19.0.147
|
||||||
|
|
||||||
# NeoForged Only
|
# NeoForged Only
|
||||||
# https://neoforged.net/
|
# https://neoforged.net/
|
||||||
neoforge_version = 21.4.123
|
neoforge_version = 21.6.12-beta
|
||||||
|
|
||||||
# Fabric Only
|
# Fabric Only
|
||||||
# https://fabricmc.net/develop/
|
# https://fabricmc.net/develop/
|
||||||
fabric_loader_version=0.16.10
|
fabric_loader_version=0.16.14
|
||||||
fabric_api_version=0.119.2
|
fabric_api_version=0.127.1
|
||||||
|
|
||||||
# Fabric Only
|
# Fabric Only
|
||||||
# https://modrinth.com/mod/modmenu/versions
|
# https://modrinth.com/mod/modmenu/versions
|
||||||
modmenu_version = 13.0.3
|
modmenu_version = 15.0.0-beta.3
|
||||||
|
|
||||||
# Version of the org.json json library
|
# Version of the org.json json library
|
||||||
json_version = 20240303
|
json_version = 20240303
|
||||||
@@ -27,7 +27,7 @@ public class SpeedometerNeoForge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventBusSubscriber(modid = MOD_ID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
|
@EventBusSubscriber(modid = MOD_ID,/* bus = EventBusSubscriber.Bus.MOD, */value = Dist.CLIENT)
|
||||||
class EventHandler
|
class EventHandler
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -5,10 +5,23 @@
|
|||||||
"6.0.1": "Small bug fix in Parser",
|
"6.0.1": "Small bug fix in Parser",
|
||||||
"6.1": "Small bug fix in Parser",
|
"6.1": "Small bug fix in Parser",
|
||||||
"6.2": "Making speedometer and pointer resource pack based",
|
"6.2": "Making speedometer and pointer resource pack based",
|
||||||
"6.2.1": "Fixed issue #3"
|
"6.2.1": "Fixed issue #3",
|
||||||
|
"6.2.2": "Fixed issue with multi digit position in the parser",
|
||||||
|
"6.2.3": "Fixed crash issue from 6.2.2 when playing in 1.21.4",
|
||||||
|
"6.2.4": "updated to 1.21.5",
|
||||||
|
"6.3.0": "updated to 1.21.6, Fixed bug in tokenizer"
|
||||||
},
|
},
|
||||||
"promos": {
|
"promos": {
|
||||||
"1.21-latest": "6.2.1",
|
"1.21-latest": "6.2.2",
|
||||||
"1.21-recommended": "6.2.1"
|
"1.21-recommended": "6.2.2",
|
||||||
|
|
||||||
|
"1.21.4-latest": "6.2.3",
|
||||||
|
"1.21.4-recommended": "6.2.3",
|
||||||
|
|
||||||
|
"1.21.5-latest": "6.2.4",
|
||||||
|
"1.21.5-recommended": "6.2.4",
|
||||||
|
|
||||||
|
"1.21.6-latest": "6.3.0",
|
||||||
|
"1.21.6-recommended": "6.3.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,8 @@ This is a simple mod for Forge, Fabric, and NeoForged that displays your current
|
|||||||
3. Run `gradlew build`(Windows cmd) or `./gradlew build`(Linux, MacOS, Windows powershell)
|
3. Run `gradlew build`(Windows cmd) or `./gradlew build`(Linux, MacOS, Windows powershell)
|
||||||
4. the compiled version will be in
|
4. the compiled version will be in
|
||||||
* Fabic: `fabric/build/libs`
|
* Fabic: `fabric/build/libs`
|
||||||
* Forge: `neoforged/build/libs`
|
* NeoForge: `neoforged/build/libs`
|
||||||
|
* Forge: `forge/build/libs`
|
||||||
|
|
||||||
## Forge Support Transition
|
## Forge Support Transition
|
||||||
As of version 1.21 I chose to no longer support Forge in fevour of NeoForged
|
As of version 1.21 I chose to no longer support Forge in fevour of NeoForged
|
||||||
|
|||||||
Reference in New Issue
Block a user