diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/IDimensionAware.java b/src/main/java/me/bionicbeanie/mods/savecoords/IDimensionAware.java index 57cee27..514e4e1 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/IDimensionAware.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/IDimensionAware.java @@ -11,9 +11,17 @@ public interface IDimensionAware { IDimension getCurrentDimension(); IDimension getDimension(String dimensionKey); + + boolean isOverworld(IDimension dimension); + + boolean isNether(IDimension dimension); + + boolean isEnd(IDimension dimension); public interface IDimension { + public int getId(); + public String getName(); public Identifier getSpriteIdentifier(); diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/INetherCalculator.java b/src/main/java/me/bionicbeanie/mods/savecoords/INetherCalculator.java new file mode 100644 index 0000000..7ac2e6c --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/savecoords/INetherCalculator.java @@ -0,0 +1,7 @@ +package me.bionicbeanie.mods.savecoords; + +import me.bionicbeanie.mods.savecoords.model.PlayerRawPosition; + +public interface INetherCalculator { + PlayerRawPosition convert(PlayerRawPosition position); +} diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/SaveCoordinatesClient.java b/src/main/java/me/bionicbeanie/mods/savecoords/SaveCoordinatesClient.java index ab9e4a2..0ed616e 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/SaveCoordinatesClient.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/SaveCoordinatesClient.java @@ -5,6 +5,8 @@ import me.bionicbeanie.mods.savecoords.gui.impl.DIContainer; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.Font; +import net.minecraft.client.font.TextRenderer; import net.minecraft.text.TranslatableText; public class SaveCoordinatesClient implements ClientModInitializer { @@ -24,6 +26,7 @@ public class SaveCoordinatesClient implements ClientModInitializer { while(pingLockBinding.wasPressed()) { boolean enabled = DIContainer.togglePingBehavior(); + // TODO : Abstract to a tooltip queue String translationKey = TranslationKeys.TOOLTIP_PING_DISABLED; if(enabled) { translationKey = TranslationKeys.TOOLTIP_PING_ENABLED; diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DIContainer.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DIContainer.java index 3005249..c9fe35c 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DIContainer.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DIContainer.java @@ -6,6 +6,7 @@ import me.bionicbeanie.mods.savecoords.IDimensionAware; import me.bionicbeanie.mods.savecoords.IFileStore; import me.bionicbeanie.mods.savecoords.IKeyBinds; import me.bionicbeanie.mods.savecoords.IModGui; +import me.bionicbeanie.mods.savecoords.INetherCalculator; import me.bionicbeanie.mods.savecoords.IPlayerLocator; import me.bionicbeanie.mods.savecoords.impl.Factory; import net.minecraft.client.MinecraftClient; @@ -23,6 +24,7 @@ public class DIContainer { private static ConfigScreenFactory modMenuScreenFactory; private static CurrentPositionPingOperation pingPositionOperation; private static IDimensionAware dimensionAware; + private static INetherCalculator netherCalculator; public static IModGui getModGui() { initialize(); @@ -53,18 +55,18 @@ public class DIContainer { } return modMenuScreenFactory; } - + public static Runnable getPingPositionOperation() { initialize(); return () -> { try { pingPositionOperation.call(); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } }; } - + public static boolean togglePingBehavior() { return pingPositionOperation.toggleEnabled(); } @@ -79,8 +81,10 @@ public class DIContainer { playerLocator = Factory.CreatePlayerLocator(minecraftClient); keyBinds = Factory.CreateKeyBinds(fileStore); dimensionAware = Factory.CreateDimensionAware(minecraftClient); - modGui = new SaveCoordinatesGui(fileStore, playerLocator, dimensionAware, keyBinds, guiController); - + netherCalculator = Factory.CreateNetherCalculator(dimensionAware); + modGui = new SaveCoordinatesGui(fileStore, playerLocator, dimensionAware, keyBinds, guiController, + netherCalculator); + pingPositionOperation = new CurrentPositionPingOperation(fileStore, () -> playerLocator.locate()); } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ListViewHandler.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ListViewHandler.java index c214975..1d55572 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ListViewHandler.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ListViewHandler.java @@ -13,6 +13,7 @@ import io.github.cottonmc.cotton.gui.widget.WListPanel; import io.github.cottonmc.cotton.gui.widget.WPlainPanel; import io.github.cottonmc.cotton.gui.widget.WSprite; import me.bionicbeanie.mods.savecoords.IFileStore; +import me.bionicbeanie.mods.savecoords.INetherCalculator; import me.bionicbeanie.mods.savecoords.TranslationKeys; import me.bionicbeanie.mods.savecoords.gui.IRootPanel; import me.bionicbeanie.mods.savecoords.model.PlayerPosition; @@ -29,14 +30,16 @@ class ListViewHandler extends ViewHandlerBase { private Consumer onDelete; private Consumer onEdit; private Consumer onPing; + private INetherCalculator netherCalculator; public ListViewHandler(IFileStore fileStore, Consumer onDelete, Consumer onEdit, - Consumer onPing) { + Consumer onPing, INetherCalculator netherCalculator) { this.fileStore = fileStore; this.backButton = createBackButton(); this.onDelete = onDelete; this.onEdit = onEdit; this.onPing = onPing; + this.netherCalculator = netherCalculator; } @Override @@ -60,7 +63,7 @@ class ListViewHandler extends ViewHandlerBase { } private WListPanel createListPanel(List positions) { - BiConsumer configurator = (pos, p) -> p.setPosition(pos, fileStore); + BiConsumer configurator = (pos, p) -> p.setPosition(pos); WListPanel panel = createListPanel(positions, configurator); panel.setListItemHeight(2 * 18); @@ -74,7 +77,7 @@ class ListViewHandler extends ViewHandlerBase { } private CoordinatesListItemPanel createListPanel() { - return new CoordinatesListItemPanel(onDelete, onEdit, onPing); + return new CoordinatesListItemPanel(onDelete, onEdit, onPing, netherCalculator); } private List getPositions(IFileStore fileStore) { @@ -101,27 +104,31 @@ class ListViewHandler extends ViewHandlerBase { private WLabel location; private WSprite icon; private WButton deleteButton; - private WButton pingButton; private WButton detailButton; + private WButton pingButton; + private WButton convertButton; private WLabel world; private Consumer onPing; private Consumer onEdit; private Consumer onDelete; + private INetherCalculator netherCalculator; CoordinatesListItemPanel(Consumer onDelete, Consumer onEdit, - Consumer onPing) { + Consumer onPing, INetherCalculator netherCalculator) { this.onDelete = onDelete; this.onEdit = onEdit; this.onPing = onPing; + this.netherCalculator = netherCalculator; this.coordinates = new WLabel("Foo"); this.location = new WLabel("Foo"); this.world = new WLabel("Foo"); this.icon = new WSprite(new Identifier("minecraft:textures/item/ender_eye.png")); this.deleteButton = createDeleteButton(); - this.pingButton = new WButton(new LiteralText("")); this.detailButton = new WButton(new LiteralText("")); + this.pingButton = new WButton(new LiteralText("")); + this.convertButton = new WButton(new LiteralText("")); this.pingButton.setIcon(ResourceUtils.createPingIcon()); this.detailButton.setIcon(ResourceUtils.createDetailsIcon()); @@ -131,8 +138,9 @@ class ListViewHandler extends ViewHandlerBase { this.add(location, 4 * 18, 0, 4 * 18, 1 * 18); this.add(coordinates, 3 * 18, 1 * 18, 9 * 18, 1 * 18); this.add(deleteButton, 13 * 18, 0, 1 * 18, 1 * 18); - this.add(pingButton, 11 * 18 - 2, 0, 1 * 18, 1 * 18); this.add(detailButton, 12 * 18 - 1, 0, 1 * 18, 1 * 18); + this.add(pingButton, 11 * 18 - 2, 0, 1 * 18, 1 * 18); + this.add(convertButton, 10 * 18 - 3, 0, 1 * 18, 1 * 18); this.icon.setSize(1 * 15, 1 * 15); this.world.setSize(3 * 18, 1 * 18); @@ -152,20 +160,27 @@ class ListViewHandler extends ViewHandlerBase { return button; } - void setPosition(PlayerPosition position, IFileStore fileStore) { - this.icon.setImage(ResourceUtils.getIdentifier(position.getWorldDimension())); + void setPosition(PlayerPosition position) { this.location.setText(new LiteralText(position.getLocationName())); this.location.setColor(0x3939ac); if (position.getPositionMetadata() != null) { this.world.setText(new LiteralText("[" + position.getPositionMetadata().getWorldName() + "]")); this.world.setColor(0xb80000); } - - this.coordinates - .setText(new LiteralText(position.getX() + ", " + position.getY() + ", " + position.getZ())); + + setRawPosition(position); + this.deleteButton.setOnClick(() -> onDelete.accept(position)); this.pingButton.setOnClick(() -> onPing.accept(position)); this.detailButton.setOnClick(() -> onEdit.accept(position)); + this.convertButton.setOnClick(() -> setRawPosition(netherCalculator.convert(position))); + } + + private void setRawPosition(PlayerRawPosition position) { + this.icon.setImage(ResourceUtils.getIdentifier(position.getWorldDimension())); + this.coordinates + .setText(new LiteralText(position.getX() + ", " + position.getY() + ", " + position.getZ())); + this.convertButton.setOnClick(() -> setRawPosition(netherCalculator.convert(position))); } } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveCoordinatesGui.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveCoordinatesGui.java index 1b01d6f..f99e61f 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveCoordinatesGui.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveCoordinatesGui.java @@ -7,6 +7,7 @@ import me.bionicbeanie.mods.savecoords.IFileStore; import me.bionicbeanie.mods.savecoords.IKeyBinds; import me.bionicbeanie.mods.savecoords.IKeyBinds.IKeyBinding; import me.bionicbeanie.mods.savecoords.IModGui; +import me.bionicbeanie.mods.savecoords.INetherCalculator; import me.bionicbeanie.mods.savecoords.IPlayerLocator; import me.bionicbeanie.mods.savecoords.gui.IGuiController; import me.bionicbeanie.mods.savecoords.gui.IViewHandler; @@ -24,14 +25,16 @@ public class SaveCoordinatesGui implements IModGui { private IPlayerLocator locator; private IDimensionAware dimensionAware; private IKeyBinds keyBinds; + private INetherCalculator netherCalculator; SaveCoordinatesGui(IFileStore fileStore, IPlayerLocator locator, IDimensionAware dimensionAware, IKeyBinds binds, - IGuiController screenController) { + IGuiController screenController, INetherCalculator netherCalculator) { this.screenController = screenController; this.fileStore = fileStore; this.keyBinds = binds; this.locator = locator; this.dimensionAware = dimensionAware; + this.netherCalculator = netherCalculator; this.defaultHandler = CreateDefaultViewHandler(); this.listHandler = CreateListViewHandler(); @@ -57,7 +60,7 @@ public class SaveCoordinatesGui implements IModGui { private IViewHandler CreateListViewHandler() { ListViewHandler handler = new ListViewHandler(fileStore, this::onDeletePosition, this::onEditPosition, - this::pingPosition); + this::pingPosition, netherCalculator); handler.onBackButtonClick(() -> showDefaultView(null)); diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/impl/DimensionAware.java b/src/main/java/me/bionicbeanie/mods/savecoords/impl/DimensionAware.java index 3238aa9..652245a 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/impl/DimensionAware.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/impl/DimensionAware.java @@ -9,12 +9,15 @@ import me.bionicbeanie.mods.savecoords.util.ResourceUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.util.Identifier; -public class DimensionAware implements IDimensionAware { +class DimensionAware implements IDimensionAware { private List allDimensions; private List allDimensionsReadOnly; - private IDimension UNKNOWN = new Dimension("Unknown", ResourceUtils.getIdentifier("unknown")); + private IDimension UNKNOWN = new Dimension("Unknown", ResourceUtils.getIdentifier("unknown"), 0); private MinecraftClient minecraftClient; + private int DIM_OVERWORLD = 1; + private int DIM_NETHER = 2; + private int DIM_END = 4; public DimensionAware(MinecraftClient minecraftClient) { this.minecraftClient = minecraftClient; @@ -27,9 +30,9 @@ public class DimensionAware implements IDimensionAware { // TODO: Provide a hook for other mods to add in their dimension info private void initialize(List dimensions) { - dimensions.add(new Dimension("Overworld", ResourceUtils.getIdentifier("overworld"))); - dimensions.add(new Dimension("Nether", ResourceUtils.getIdentifier("nether"))); - dimensions.add(new Dimension("End", ResourceUtils.getIdentifier("end"))); + dimensions.add(new Dimension("Overworld", ResourceUtils.getIdentifier("overworld"), DIM_OVERWORLD)); + dimensions.add(new Dimension("Nether", ResourceUtils.getIdentifier("nether"), DIM_NETHER)); + dimensions.add(new Dimension("End", ResourceUtils.getIdentifier("end"), DIM_END)); } @Override @@ -53,15 +56,32 @@ public class DimensionAware implements IDimensionAware { return UNKNOWN; } + + @Override + public boolean isOverworld(IDimension dimension) { + return dimension.getId() == DIM_OVERWORLD; + } + @Override + public boolean isNether(IDimension dimension) { + return dimension.getId() == DIM_NETHER; + } + + @Override + public boolean isEnd(IDimension dimension) { + return dimension.getId() == DIM_END; + } + static class Dimension implements IDimension { private String name; private Identifier spriteIdentifier; + private int dimensionId; - Dimension(String name, Identifier spriteIdentifier) { + Dimension(String name, Identifier spriteIdentifier, int dimensionId) { this.name = name; this.spriteIdentifier = spriteIdentifier; + this.dimensionId = dimensionId; } @Override @@ -77,7 +97,15 @@ public class DimensionAware implements IDimensionAware { boolean isDimension(String registryKey) { return (registryKey != null && registryKey.toLowerCase().contains(this.name.toLowerCase())); } + + int getDimensionId() { + return this.dimensionId; + } + + @Override + public int getId() { + return this.dimensionId; + } } - } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/impl/Factory.java b/src/main/java/me/bionicbeanie/mods/savecoords/impl/Factory.java index bcb480d..beb1efa 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/impl/Factory.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/impl/Factory.java @@ -3,6 +3,7 @@ package me.bionicbeanie.mods.savecoords.impl; import me.bionicbeanie.mods.savecoords.IDimensionAware; import me.bionicbeanie.mods.savecoords.IFileStore; import me.bionicbeanie.mods.savecoords.IKeyBinds; +import me.bionicbeanie.mods.savecoords.INetherCalculator; import me.bionicbeanie.mods.savecoords.IPlayerLocator; import net.minecraft.client.MinecraftClient; @@ -23,4 +24,8 @@ public class Factory { public static IDimensionAware CreateDimensionAware(MinecraftClient client) { return new DimensionAware(client); } + + public static INetherCalculator CreateNetherCalculator(IDimensionAware dimensionAware) { + return new NetherCalculator(dimensionAware); + } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/impl/NetherCalculator.java b/src/main/java/me/bionicbeanie/mods/savecoords/impl/NetherCalculator.java new file mode 100644 index 0000000..ecc6c5e --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/savecoords/impl/NetherCalculator.java @@ -0,0 +1,47 @@ +package me.bionicbeanie.mods.savecoords.impl; + +import me.bionicbeanie.mods.savecoords.IDimensionAware; +import me.bionicbeanie.mods.savecoords.IDimensionAware.IDimension; +import me.bionicbeanie.mods.savecoords.INetherCalculator; +import me.bionicbeanie.mods.savecoords.model.PlayerRawPosition; + +class NetherCalculator implements INetherCalculator { + + private int MULTIPLIER = 8; + private IDimensionAware dimensionAware; + private IDimension overworld; + private IDimension nether; + + public NetherCalculator(IDimensionAware dimensionAware) { + this.dimensionAware = dimensionAware; + + for (IDimension dimension : dimensionAware.getDimensions()) { + if (dimensionAware.isOverworld(dimension)) { + overworld = dimension; + continue; + } + + if (dimensionAware.isNether(dimension)) { + nether = dimension; + } + } + } + + @Override + public PlayerRawPosition convert(PlayerRawPosition position) { + IDimension dimension = dimensionAware.getDimension(position.getWorldDimension()); + + if (dimensionAware.isOverworld(dimension)) { + return new PlayerRawPosition(position.getX() / MULTIPLIER, position.getY(), position.getZ() / MULTIPLIER, + nether.getName()); + } + + if (dimensionAware.isNether(dimension)) { + return new PlayerRawPosition(position.getX() * MULTIPLIER, position.getY(), position.getZ() * MULTIPLIER, + overworld.getName()); + } + + return position; + } + +}