# 1.17.X-1.18.X(Fabric)

Issue #5 wanted to add support for 1.17

Made the mod work for 1.17.1-1.18.2 for Fabric, and 1.17.1 for Forge

Lot of changes due to API differences have resulted in changes to nearly all files and a comprehensive list would just list everything, so if you're interested you can look through things

This version is a backport of 6.2.4/6.2.3 to Minecraft 1.17 this includes
- Resourcepack
- Color
- Location
- And more
This commit is contained in:
2025-04-05 19:30:49 +02:00
parent 4b2a150a30
commit b81dd019ea
19 changed files with 401 additions and 122 deletions

View File

@@ -1,20 +1,21 @@
package me.zacharias.speedometer;
import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.architectury.event.events.client.ClientGuiEvent;
import dev.architectury.event.events.client.ClientTickEvent;
import dev.architectury.platform.Platform;
import dev.architectury.registry.client.keymappings.KeyMappingRegistry;
import net.minecraft.ChatFormatting;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.Gui;
import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.TextColor;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.vehicle.Boat;
import net.minecraft.world.phys.Vec3;
import net.minecraft.network.chat.Component;
import java.awt.*;
import java.awt.image.BufferedImage;
@@ -40,8 +41,8 @@ public class Client {
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") || Platform.isModLoaded("cloth-config2");
if(isClothLoaded) {
Platform.getMod(MOD_ID).registerConfigurationScreen(parent -> ConfigMenu.getConfig(parent).build());
@@ -59,20 +60,21 @@ public class Client {
}
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());
Minecraft.getInstance().player.displayClientMessage(
new TranslatableComponent("speedometer.error.missing_cloth")
.withStyle(style -> style.withColor(ChatFormatting.RED))
.append(
new TranslatableComponent("speedometer.error.missing_cloth.open_config")
.withStyle(style -> style
.withColor(ChatFormatting.DARK_RED)
.withUnderlined(true)
.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, Config.getConfigPath()))))
, false);
LOGGER.warn(new TranslatableComponent("speedometer.error.missing_cloth").getString());
}
else
{
LOGGER.warn(Component.translatable("speedometer.error.missing_cloth").getString());
LOGGER.warn(new TranslatableComponent("speedometer.error.missing_cloth").getString());
}
}
});
@@ -92,7 +94,7 @@ public class Client {
LOGGER.info("Finished loading speedometer");
}
private static void render(GuiGraphics graphics, DeltaTracker deltaTracker) {
private static void render(PoseStack poseStack, float delta) {
if(Minecraft.getInstance().player == null) return;
if(Minecraft.getInstance().options.hideGui) return;
Entity entity = Minecraft.getInstance().player.getRootVehicle();
@@ -112,7 +114,7 @@ public class Client {
double lSpeed = speed;
if (speeds.size() >= 30) {
speeds.removeFirst();
speeds.remove(0);
}
speeds.add(speed);
speed = 0;
@@ -144,8 +146,8 @@ public class Client {
default -> 0;
};
int yPos = getPosImp(graphics, width, Config.getYPosition(), false);
int xPos = getPosImp(graphics, width, Config.getXPosition(), true);
int yPos = getPosImp(poseStack, width, Config.getYPosition(), false);
int xPos = getPosImp(poseStack, width, Config.getXPosition(), true);
int lineHeight = Minecraft.getInstance().font.lineHeight;
@@ -163,8 +165,8 @@ public class Client {
int rgb = img.getRGB(x1, y1);
if(new Color(rgb).equals(Color.black)) continue;
graphics.fill(x2, y2, x2+1, y2+1, rgb);
Gui.fill(poseStack, x2, y2, x2+1, y2+1, rgb);
}
}
@@ -172,13 +174,13 @@ public class Client {
// i -> x
// j -> y
// k -> color RGB int
graphics.drawString(
Minecraft.getInstance().font,
speedString,
xPos - width,
yPos - lineHeight,
Config.getColor().getRGB()
);
drawString(
poseStack,
xPos - width,
yPos - lineHeight,
speedString,
Config.getColor().getRGB()
);
}
if(Config.isDebug()){
@@ -200,20 +202,24 @@ public class Client {
"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");
(Config.getVisualSpeedometer()?"Visual Size: "+Config.getImageSize():"Textual display") + "\n" +
"Pos: ("+xPos+", "+yPos+") \n" +
"Width: "+Minecraft.getInstance().getWindow().getGuiScaledWidth() + "\n" +
"Height: "+Minecraft.getInstance().getWindow().getGuiScaledHeight();
Color color = new Color(255, 255, 255);
int y = 0;
for(String s : debugData.split("\n")){
drawString(graphics,0, y, s, color.getRGB());
drawString(poseStack,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(
private static void drawString(PoseStack poseStack, int x, int y, String text, int colorRGB){
Gui.drawString(
poseStack,
Minecraft.getInstance().font,
text,
x,
@@ -222,11 +228,14 @@ public class Client {
);
}
private static int getPosImp(GuiGraphics event, int width, String input, boolean isXPosition){
private static int getPosImp(PoseStack poseStack, int width, String input, boolean isXPosition){
int width1 = Minecraft.getInstance().getWindow().getGuiScaledWidth();
int height1 = Minecraft.getInstance().getWindow().getGuiScaledHeight();
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("(W+)|(H+)", String.valueOf(isXPosition? width1 : height1))
.replaceAll("(w+)|(h+)", String.valueOf(isXPosition? width1/2 : height1/2))
.replaceAll("(S+)|(s+)", String.valueOf(width));
if((Config.isDebug()) && Config.getCounter() < 2) {
//String speedDisplayType = SpeedTypes.getName(Config.getSpeedType()).getString();
@@ -235,10 +244,14 @@ public class Client {
LOGGER.info("Selected speed type(DEBUG): {}\n{}\n\n\n", isXPosition, input);
Config.addCounter();
}
return getPos(event, width, input, isXPosition);
return getPos(poseStack, width, input, isXPosition);
}
private static int getPos(GuiGraphics event, int width, String input, boolean isXPosition) {
private static int getPos(PoseStack event, int width, String input, boolean isXPosition) {
int width1 = Minecraft.getInstance().getWindow().getGuiScaledWidth();
int height1 = Minecraft.getInstance().getWindow().getGuiScaledHeight();
ArrayList<String> passerPose = new ArrayList<>();
final char[] s = input.toCharArray();
@@ -246,12 +259,12 @@ public class Client {
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()));
if(isXPosition) passerPose.add(String.valueOf(width1));
else passerPose.add(String.valueOf(height1));
}
else if(c == 'h' || c == 'w'){
if(isXPosition) passerPose.add(String.valueOf(event.guiWidth() / 2));
else passerPose.add(String.valueOf(event.guiHeight() / 2));
if(isXPosition) passerPose.add(String.valueOf(width1 / 2));
else passerPose.add(String.valueOf(height1 / 2));
}
else if(c == 'S' || c == 's'){
passerPose.add(String.valueOf(width));
@@ -264,8 +277,8 @@ public class Client {
}
else if(Character.isDigit(c)){
int lastIndex = i - 1;
if(lastIndex > 0 && passerPose.get(lastIndex).matches("^[0-9]+$")) {
passerPose.add(passerPose.removeLast() + c);
if(lastIndex >= 0 && passerPose.get(passerPose.size()-1).matches("^[0-9]+$")) {
passerPose.add(passerPose.remove(passerPose.size()-1) + c);
}
else
{
@@ -285,11 +298,11 @@ public class Client {
int position;
try{
position = Integer.parseInt(passerPose.getFirst());
position = Integer.parseInt(passerPose.get(0));
}catch (NumberFormatException e){
passerPose.clear();
defaultValues(event, isXPosition, passerPose);
position = Integer.parseInt(passerPose.getFirst());
position = Integer.parseInt(passerPose.get(0));
}
for(int i = 1; i < passerPose.size(); i++){
@@ -322,16 +335,16 @@ public class Client {
return position;
}
private static void defaultValues(GuiGraphics event, boolean isXPosition, ArrayList<String> passerPose) {
private static void defaultValues(PoseStack event, boolean isXPosition, ArrayList<String> passerPose) {
if(isXPosition)
{
passerPose.add(String.valueOf(event.guiWidth()));
passerPose.add(String.valueOf(Minecraft.getInstance().getWindow().getGuiScaledWidth()));
passerPose.add("-");
passerPose.add("3");
}
else
{
passerPose.add(String.valueOf(event.guiHeight()));
passerPose.add(String.valueOf(Minecraft.getInstance().getWindow().getGuiScaledHeight()));
passerPose.add("-");
passerPose.add("3");
}

View File

@@ -2,7 +2,7 @@ package me.zacharias.speedometer;
import me.shedaniel.clothconfig2.api.*;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
import java.util.Optional;
@@ -10,33 +10,34 @@ public class ConfigMenu {
public static ConfigBuilder getConfig(Screen parent) {
ConfigBuilder builder = ConfigBuilder.create()
.setParentScreen(parent)
.setTitle(Component.translatable("speedometer.config.name"));
.setTitle(new TranslatableComponent("speedometer.config.name"));
ConfigCategory category = builder.getOrCreateCategory(Component.translatable("speedometer.config.category.name"));
ConfigCategory category = builder.getOrCreateCategory(new TranslatableComponent("speedometer.config.category.name"));
ConfigEntryBuilder entryBuilder = builder.entryBuilder();
category.addEntry(entryBuilder.startEnumSelector(Component.translatable("speedometer.config.speed"), SpeedTypes.class, me.zacharias.speedometer.Config.getSpeedType())
category.addEntry(entryBuilder.startEnumSelector(new TranslatableComponent("speedometer.config.speed"), SpeedTypes.class, me.zacharias.speedometer.Config.getSpeedType())
.setEnumNameProvider(SpeedTypes::getName)
.setSaveConsumer(me.zacharias.speedometer.Config::setSpeedType)
//.setDefaultValue(SpeedTypes.BlockPS)
.build()
);
category.addEntry(entryBuilder.startColorField(Component.translatable("speedometer.config.color"), me.zacharias.speedometer.Config.getColorRGB())
category.addEntry(entryBuilder.startColorField(new TranslatableComponent("speedometer.config.color"), me.zacharias.speedometer.Config.getColorRGB())
.setSaveConsumer2(color -> Config.setColor(color.getRed(), color.getGreen(), color.getBlue()))
.build()
);
category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.knot"), me.zacharias.speedometer.Config.getUseKnot())
category.addEntry(entryBuilder.startBooleanToggle(new TranslatableComponent("speedometer.config.knot"), me.zacharias.speedometer.Config.getUseKnot())
.setSaveConsumer(me.zacharias.speedometer.Config::setUseKnot)
.setYesNoTextSupplier(useKnot -> Component.translatable("speedometer.useKnot."+useKnot))
.setYesNoTextSupplier(useKnot -> new TranslatableComponent("speedometer.useKnot."+useKnot))
.build()
);
category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.visualSpeedometer"), me.zacharias.speedometer.Config.getVisualSpeedometer())
category.addEntry(entryBuilder.startBooleanToggle(new TranslatableComponent("speedometer.config.visualSpeedometer"), me.zacharias.speedometer.Config.getVisualSpeedometer())
.setSaveConsumer(me.zacharias.speedometer.Config::setVisualSpeedometer)
.setYesNoTextSupplier((visualSpeedometer -> Component.translatable("speedometer.visualSpeedometer."+visualSpeedometer)))
.setRequirement(Requirement.isFalse(Config::isDisableVisualSpeedometer))
.setYesNoTextSupplier((visualSpeedometer -> new TranslatableComponent("speedometer.visualSpeedometer."+visualSpeedometer)))
//.setRequirement(Requirement.isFalse(Config::isDisableVisualSpeedometer))
.build()
);
@@ -45,50 +46,50 @@ public class ConfigMenu {
String xRegex = "W*w*S*s*\\+*-*\\**/*[0-9]*";
String yRegex = "H*h*S*s*\\+*-*\\**/*[0-9]*";
category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.xPosition"), Config.getXPosition())
category.addEntry(entryBuilder.startStringDropdownMenu(new TranslatableComponent("speedometer.config.xPosition"), Config.getXPosition())
.setSaveConsumer(Config::setXPosition)
.setErrorSupplier(xPosition -> {
if(xPosition.matches(xRegex)){
return Optional.empty();
}else{
return Optional.of(Component.translatable("speedometer.invalid"));
return Optional.of(new TranslatableComponent("speedometer.invalid"));
}
})
.setTooltip(
Component.translatable("speedometer.config.tooltip.xPosition.line1"),
Component.translatable("speedometer.config.tooltip.xPosition.line2"),
Component.translatable("speedometer.config.tooltip.xPosition.line3")
new TranslatableComponent("speedometer.config.tooltip.xPosition.line1"),
new TranslatableComponent("speedometer.config.tooltip.xPosition.line2"),
new TranslatableComponent("speedometer.config.tooltip.xPosition.line3")
)
.build()
);
category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.yPosition"), Config.getYPosition())
category.addEntry(entryBuilder.startStringDropdownMenu(new TranslatableComponent("speedometer.config.yPosition"), Config.getYPosition())
.setSaveConsumer(Config::setYPosition)
.setErrorSupplier(yPosition -> {
if(yPosition.matches(yRegex)){
return Optional.empty();
}else{
return Optional.of(Component.translatable("speedometer.invalid"));
return Optional.of(new TranslatableComponent("speedometer.invalid"));
}
})
.setTooltip(
Component.translatable("speedometer.config.tooltip.yPosition.line1"),
Component.translatable("speedometer.config.tooltip.yPosition.line2"),
Component.translatable("speedometer.config.tooltip.yPosition.line3")
new TranslatableComponent("speedometer.config.tooltip.yPosition.line1"),
new TranslatableComponent("speedometer.config.tooltip.yPosition.line2"),
new TranslatableComponent("speedometer.config.tooltip.yPosition.line3")
)
.build()
);
// Size of visual image
category.addEntry(entryBuilder.startIntField(Component.translatable("speedometer.config.imageSize"), Config.getImageSize())
category.addEntry(entryBuilder.startIntField(new TranslatableComponent("speedometer.config.imageSize"), Config.getImageSize())
.setSaveConsumer(Config::setImageSize)
.setTooltip(Component.translatable("speedometer.config.tooltip.imageSize"))
.setTooltip(new TranslatableComponent("speedometer.config.tooltip.imageSize"))
.setErrorSupplier(size -> {
if(size > 300 || size < 10)
{
return Optional.of(Component.translatable("speedometer.config.error.size_outofbounds"));
return Optional.of(new TranslatableComponent("speedometer.config.error.size_outofbounds"));
}
else {
return Optional.empty();
@@ -99,26 +100,26 @@ public class ConfigMenu {
// Show visual speed type
category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.showSpeedType"), Config.getShowSpeedType())
category.addEntry(entryBuilder.startBooleanToggle(new TranslatableComponent("speedometer.config.showSpeedType"), Config.getShowSpeedType())
.setSaveConsumer(Config::setShowSpeedType)
.setYesNoTextSupplier(showSpeedType -> Component.translatable("speedometer."+(showSpeedType?"show":"hide")))
.setTooltip(Component.translatable("speedometer.config.tooltip.showSpeedType.line1"))
.setYesNoTextSupplier(showSpeedType -> new TranslatableComponent("speedometer."+(showSpeedType?"show":"hide")))
.setTooltip(new TranslatableComponent("speedometer.config.tooltip.showSpeedType.line1"))
.build()
);
category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.override_color"), Config.isOverrideColor())
category.addEntry(entryBuilder.startBooleanToggle(new TranslatableComponent("speedometer.config.override_color"), Config.isOverrideColor())
.setSaveConsumer(Config::setOverrideColor)
.setTooltip(
Component.translatable("speedometer.config.tooltip.override_color.line1"),
Component.translatable("speedometer.config.tooltip.override_color.line2")
new TranslatableComponent("speedometer.config.tooltip.override_color.line1"),
new TranslatableComponent("speedometer.config.tooltip.override_color.line2")
)
.build()
);
category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.debug"),Config.isDebug())
category.addEntry(entryBuilder.startBooleanToggle(new TranslatableComponent("speedometer.config.debug"),Config.isDebug())
.setSaveConsumer(Config::setDebug)
.setYesNoTextSupplier(isDebug -> Component.translatable("speedometer.debug."+isDebug))
.setTooltip(Component.translatable("speedometer.config.tooltip.debug"))
.setYesNoTextSupplier(isDebug -> new TranslatableComponent("speedometer.debug."+isDebug))
.setTooltip(new TranslatableComponent("speedometer.config.tooltip.debug"))
.build()
);

View File

@@ -1,6 +1,7 @@
package me.zacharias.speedometer;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
public enum SpeedTypes {
MPH,
@@ -11,7 +12,7 @@ public enum SpeedTypes {
public static Component getName(Enum anEnum) {
if(anEnum instanceof SpeedTypes speedType) {
return Component.translatable("speedometer.speed." + switch (speedType) {
return new TranslatableComponent("speedometer.speed." + switch (speedType) {
case MPH -> "mph";
case MPS -> "mps";
case KMPH -> "kmph";
@@ -19,7 +20,7 @@ public enum SpeedTypes {
case KNOT -> "knot";
});
}else {
return Component.translatable("speedometer.speed.error");
return new TranslatableComponent("speedometer.speed.error");
}
}
}

View File

@@ -12,6 +12,8 @@ import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
@@ -51,10 +53,9 @@ public class Speedometer
Client.init();
}
public static void loadSpeedometers(ResourceManager resourceManager)
{
public static void loadSpeedometers(ResourceManager resourceManager) throws IOException {
//List< Resource > resource = Minecraft.getInstance().getResourceManager().getResourceStack(ResourceLocation.fromNamespaceAndPath(MOD_ID, "models/speedometer.json"));
Optional< Resource > resource = resourceManager.getResource(ResourceLocation.fromNamespaceAndPath(MOD_ID, "models/speedometer.json"));
Optional<Resource> resource = Optional.of(resourceManager.getResource(new ResourceLocation(MOD_ID, "models/speedometer.json")));
if(resource.isEmpty())
{
@@ -63,7 +64,7 @@ public class Speedometer
return;
}
try(BufferedReader stream = resource.get().openAsReader()) {
try(BufferedReader stream = new BufferedReader(new InputStreamReader(resource.get().getInputStream()))/*.openAsReader()*/) {
String tmp;
StringBuilder builder = new StringBuilder();
while ((tmp = stream.readLine()) != null) {
@@ -72,7 +73,7 @@ public class Speedometer
JSONObject data = new JSONObject(builder.toString());
if(Config.isDebug())
{
LOGGER.info("Loaded speedometer from {}, with speedometer name: {}", resource.get().source().packId(), data.get("name"));
LOGGER.info("Loaded speedometer from {}, with speedometer name: {}", resource.get().getSourceName(), data.get("name"));
}
ICON = new SpeedometerIcon(data, resourceManager);
}
@@ -82,7 +83,7 @@ public class Speedometer
return;
}
LOGGER.info("Successfully loaded speedometer config from {}", resource.get().source().packId());
LOGGER.info("Successfully loaded speedometer config from {}", resource.get().getSourceName());
}
public static String formatMillisToDHMS(long millis) {

View File

@@ -1,9 +1,11 @@
package me.zacharias.speedometer;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
//import org.joml.Vector2i;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.Resource;
import net.minecraft.server.packs.resources.ResourceManager;
import org.joml.Vector2i;
import org.json.JSONException;
import org.json.JSONObject;
@@ -25,8 +27,7 @@ public class SpeedometerIcon {
private boolean overflow;
private boolean g = false;
public SpeedometerIcon(JSONObject config, ResourceManager resourceManager) throws MissingPropertyException, IOException, JSONException
{
public SpeedometerIcon(JSONObject config, ResourceManager resourceManager) throws MissingPropertyException, IOException, JSONException, CommandSyntaxException {
if(!config.has("background")) throw new MissingPropertyException("background");
String background = config.getString("background");
@@ -40,10 +41,10 @@ public class SpeedometerIcon {
background = "textures/"+background;
}
Optional<Resource> speedometerIcon = resourceManager.getResource(ResourceLocation.read(background).getOrThrow(s -> new MissingPropertyException("background")));
Optional<Resource> speedometerIcon = Optional.of(resourceManager.getResource(ResourceLocation.read(new StringReader(background))));//.getOrThrow(s -> new MissingPropertyException("background")));
if(speedometerIcon.isEmpty()) throw new MissingPropertyException("background");
InputStream stream = speedometerIcon.get().open();
InputStream stream = speedometerIcon.get().getInputStream();
this.speedometerIcon = ImageIO.read(stream);
stream.close();
@@ -83,8 +84,7 @@ class Pointer
private int length;
private boolean g = false;
public Pointer(JSONObject pointer, ResourceManager resourceManager, Vector2i size) throws MissingPropertyException, IOException, JSONException
{
public Pointer(JSONObject pointer, ResourceManager resourceManager, Vector2i size) throws MissingPropertyException, IOException, JSONException, CommandSyntaxException {
if(!pointer.has("start")) throw new MissingPropertyException("pointer/start");
if(pointer.get("start") instanceof JSONObject jsonObject)
{
@@ -122,10 +122,10 @@ class Pointer
imageResourceLocation = "textures/"+imageResourceLocation;
}
Optional<Resource> image = resourceManager.getResource(ResourceLocation.read(imageResourceLocation).getOrThrow(s -> new MissingPropertyException("pointer/image")));
Optional<Resource> image = Optional.of(resourceManager.getResource(ResourceLocation.read(new StringReader(imageResourceLocation))));//.getOrThrow(s -> new MissingPropertyException("pointer/image")));
if(image.isEmpty()) throw new MissingPropertyException("pointer/image");
InputStream stream = image.get().open();
InputStream stream = image.get().getInputStream();//.open();
this.image = ImageHandler.scale(ImageIO.read(stream), size.x, size.y);
stream.close();
}

View File

@@ -0,0 +1,17 @@
package me.zacharias.speedometer;
public class Vector2i {
int x, y;
public Vector2i(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}