From c667dbb187a0fc4ba6f40a9818544d0e0c4ef3e1 Mon Sep 17 00:00:00 2001 From: Surya Date: Thu, 20 May 2021 22:43:56 +0530 Subject: [PATCH] Add save and list features --- README.md | 12 +- gradle.properties | 2 +- .../mods/SaveCoordinatesClient.java | 50 +++--- .../mods/api/ICoordinateListHandler.java | 10 ++ .../{core => api}/ICoordinateSaveHandler.java | 2 +- .../mods/{core => api}/IFileStore.java | 4 +- .../mods/api/IPositionCalculator.java | 9 ++ .../me/bionicbeanie/mods/api/IScreen.java | 6 + .../mods/core/IPositionCalculator.java | 9 -- .../mods/gui/CoordinateListItem.java | 37 +++++ .../bionicbeanie/mods/gui/CoordinatesGui.java | 144 ++++++++++++++++++ .../gui/PlayerPositionGuiDescription.java | 76 --------- .../mods/impl/CoordinateListHandler.java | 29 ++++ .../mods/impl/CoordinateSaveHandler.java | 4 +- .../me/bionicbeanie/mods/impl/FileStore.java | 27 ++-- .../mods/impl/PositionCalculator.java | 14 +- .../mods/model/PlayerRawPosition.java | 11 +- .../mods/util/DimensionSpriteUtil.java | 24 +++ src/main/resources/assets/savecoords/icon.png | Bin 453 -> 10663 bytes 19 files changed, 324 insertions(+), 146 deletions(-) create mode 100644 src/main/java/me/bionicbeanie/mods/api/ICoordinateListHandler.java rename src/main/java/me/bionicbeanie/mods/{core => api}/ICoordinateSaveHandler.java (79%) rename src/main/java/me/bionicbeanie/mods/{core => api}/IFileStore.java (74%) create mode 100644 src/main/java/me/bionicbeanie/mods/api/IPositionCalculator.java create mode 100644 src/main/java/me/bionicbeanie/mods/api/IScreen.java delete mode 100644 src/main/java/me/bionicbeanie/mods/core/IPositionCalculator.java create mode 100644 src/main/java/me/bionicbeanie/mods/gui/CoordinateListItem.java create mode 100644 src/main/java/me/bionicbeanie/mods/gui/CoordinatesGui.java delete mode 100644 src/main/java/me/bionicbeanie/mods/gui/PlayerPositionGuiDescription.java create mode 100644 src/main/java/me/bionicbeanie/mods/impl/CoordinateListHandler.java create mode 100644 src/main/java/me/bionicbeanie/mods/util/DimensionSpriteUtil.java diff --git a/README.md b/README.md index 7c3c7f0..28fa9ec 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,13 @@ -# Save Coordinates Fabric MC 1.16.4+ +# Save Coordinates Fabric MC 1.16.5+ ## Usage -`/sc "My House"` +- Press `B` for menu. +- Select `save` to save the coordinate. +- Select `list` to view saved coordinates -`/sc Portal` \ No newline at end of file +## Roadmap + +- Server side support +- More metadata to a coordinate +- Better gui \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index b432913..da59756 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.11.3 # Mod Properties - mod_version = 1.0.0 + mod_version = 0.0.1 maven_group = me.bionicbeanie.mods archives_base_name = save-coordinates diff --git a/src/main/java/me/bionicbeanie/mods/SaveCoordinatesClient.java b/src/main/java/me/bionicbeanie/mods/SaveCoordinatesClient.java index 2f48d9e..80c4d1c 100644 --- a/src/main/java/me/bionicbeanie/mods/SaveCoordinatesClient.java +++ b/src/main/java/me/bionicbeanie/mods/SaveCoordinatesClient.java @@ -2,28 +2,23 @@ package me.bionicbeanie.mods; import org.lwjgl.glfw.GLFW; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; - -import me.bionicbeanie.mods.core.ICoordinateSaveHandler; -import me.bionicbeanie.mods.core.IFileStore; -import me.bionicbeanie.mods.core.IPositionCalculator; +import me.bionicbeanie.mods.api.ICoordinateListHandler; +import me.bionicbeanie.mods.api.ICoordinateSaveHandler; +import me.bionicbeanie.mods.api.IFileStore; +import me.bionicbeanie.mods.api.IPositionCalculator; +import me.bionicbeanie.mods.api.IScreen; +import me.bionicbeanie.mods.gui.CoordinatesGui; import me.bionicbeanie.mods.gui.CoordinatesScreen; -import me.bionicbeanie.mods.gui.PlayerPositionGuiDescription; +import me.bionicbeanie.mods.impl.CoordinateListHandler; import me.bionicbeanie.mods.impl.CoordinateSaveHandler; import me.bionicbeanie.mods.impl.FileStore; import me.bionicbeanie.mods.impl.PositionCalculator; import me.bionicbeanie.mods.model.PlayerRawPosition; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager; -import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.minecraft.client.options.KeyBinding; import net.minecraft.client.util.InputUtil; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; public class SaveCoordinatesClient implements ClientModInitializer { @@ -31,33 +26,26 @@ public class SaveCoordinatesClient implements ClientModInitializer { @Override public void onInitializeClient() { - - ClientCommandManager.DISPATCHER.register(ClientCommandManager.literal("coords").then(ClientCommandManager - .argument("desc", StringArgumentType.string()).executes(SaveCoordinatesClient::printCoordinates))); - + KeyBinding keyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.savecoords.coords", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_H, "category.savecoords.generic")); ClientTickEvents.END_CLIENT_TICK.register(client -> { while (keyBinding.wasPressed()) { - PlayerRawPosition rawPosition = positionCalculator.locate(client.player); + PlayerRawPosition rawPosition = positionCalculator.locate(client); IFileStore fileStore = new FileStore(client.runDirectory.getAbsolutePath()); ICoordinateSaveHandler saveHandler = new CoordinateSaveHandler(fileStore); - client.openScreen(new CoordinatesScreen(new PlayerPositionGuiDescription(rawPosition, saveHandler))); + ICoordinateListHandler listHandler = new CoordinateListHandler(fileStore); + IScreen screen = new IScreen() { + + @Override + public void close() { + client.openScreen(null); + } + }; + client.openScreen( + new CoordinatesScreen(new CoordinatesGui(rawPosition, saveHandler, screen, listHandler))); } }); } - - private static int printCoordinates(CommandContext context) - throws CommandSyntaxException { - FabricClientCommandSource source = context.getSource(); - PlayerRawPosition position = positionCalculator.locate(source.getPlayer()); - - Text text = new LiteralText(" " + position.getWorldDimension() + " at " + " [ " + position.getX() - + " , " + position.getY() + " , " + position.getZ() + " ]"); - - source.getPlayer().sendMessage(text, false); - - return 1; - } } diff --git a/src/main/java/me/bionicbeanie/mods/api/ICoordinateListHandler.java b/src/main/java/me/bionicbeanie/mods/api/ICoordinateListHandler.java new file mode 100644 index 0000000..2c4c2da --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/api/ICoordinateListHandler.java @@ -0,0 +1,10 @@ +package me.bionicbeanie.mods.api; + +import java.util.List; + +import me.bionicbeanie.mods.model.PlayerPosition; + +public interface ICoordinateListHandler { + + List list(); +} diff --git a/src/main/java/me/bionicbeanie/mods/core/ICoordinateSaveHandler.java b/src/main/java/me/bionicbeanie/mods/api/ICoordinateSaveHandler.java similarity index 79% rename from src/main/java/me/bionicbeanie/mods/core/ICoordinateSaveHandler.java rename to src/main/java/me/bionicbeanie/mods/api/ICoordinateSaveHandler.java index 5cb84f0..0434723 100644 --- a/src/main/java/me/bionicbeanie/mods/core/ICoordinateSaveHandler.java +++ b/src/main/java/me/bionicbeanie/mods/api/ICoordinateSaveHandler.java @@ -1,4 +1,4 @@ -package me.bionicbeanie.mods.core; +package me.bionicbeanie.mods.api; import me.bionicbeanie.mods.model.PlayerPosition; diff --git a/src/main/java/me/bionicbeanie/mods/core/IFileStore.java b/src/main/java/me/bionicbeanie/mods/api/IFileStore.java similarity index 74% rename from src/main/java/me/bionicbeanie/mods/core/IFileStore.java rename to src/main/java/me/bionicbeanie/mods/api/IFileStore.java index 6d6e017..9f751f8 100644 --- a/src/main/java/me/bionicbeanie/mods/core/IFileStore.java +++ b/src/main/java/me/bionicbeanie/mods/api/IFileStore.java @@ -1,4 +1,4 @@ -package me.bionicbeanie.mods.core; +package me.bionicbeanie.mods.api; import java.io.IOException; import java.util.List; @@ -10,4 +10,6 @@ public interface IFileStore { public void save(List positions) throws IOException; public void save(PlayerPosition position) throws IOException; + + public List list() throws IOException; } diff --git a/src/main/java/me/bionicbeanie/mods/api/IPositionCalculator.java b/src/main/java/me/bionicbeanie/mods/api/IPositionCalculator.java new file mode 100644 index 0000000..d237f4f --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/api/IPositionCalculator.java @@ -0,0 +1,9 @@ +package me.bionicbeanie.mods.api; + +import me.bionicbeanie.mods.model.PlayerRawPosition; +import net.minecraft.client.MinecraftClient; + +public interface IPositionCalculator { + + public PlayerRawPosition locate(MinecraftClient client); +} diff --git a/src/main/java/me/bionicbeanie/mods/api/IScreen.java b/src/main/java/me/bionicbeanie/mods/api/IScreen.java new file mode 100644 index 0000000..0337741 --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/api/IScreen.java @@ -0,0 +1,6 @@ +package me.bionicbeanie.mods.api; + +public interface IScreen { + + void close(); +} diff --git a/src/main/java/me/bionicbeanie/mods/core/IPositionCalculator.java b/src/main/java/me/bionicbeanie/mods/core/IPositionCalculator.java deleted file mode 100644 index a8be730..0000000 --- a/src/main/java/me/bionicbeanie/mods/core/IPositionCalculator.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.bionicbeanie.mods.core; - -import me.bionicbeanie.mods.model.PlayerRawPosition; -import net.minecraft.client.network.ClientPlayerEntity; - -public interface IPositionCalculator { - - public PlayerRawPosition locate(ClientPlayerEntity player); -} diff --git a/src/main/java/me/bionicbeanie/mods/gui/CoordinateListItem.java b/src/main/java/me/bionicbeanie/mods/gui/CoordinateListItem.java new file mode 100644 index 0000000..477f4bb --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/gui/CoordinateListItem.java @@ -0,0 +1,37 @@ +package me.bionicbeanie.mods.gui; + +import io.github.cottonmc.cotton.gui.widget.WLabel; +import io.github.cottonmc.cotton.gui.widget.WPlainPanel; +import io.github.cottonmc.cotton.gui.widget.WSprite; +import me.bionicbeanie.mods.model.PlayerPosition; +import me.bionicbeanie.mods.util.DimensionSpriteUtil; +import net.minecraft.text.LiteralText; +import net.minecraft.util.Identifier; + +public class CoordinateListItem extends WPlainPanel{ + + private WLabel coordinates; + private WLabel location; + private WSprite icon; + + public CoordinateListItem() { + this.coordinates = new WLabel("Foo"); + this.location = new WLabel("Foo"); + this.icon = new WSprite(new Identifier("minecraft:textures/item/ender_eye.png")); + + this.add(icon, 0, 0, 1*18, 1*18); + this.add(coordinates, 1*18, 0, 2*18, 1*18); + this.add(location, 0, 1*18, 3*18, 1*18); + + this.icon.setSize(1*18, 1*18); + this.coordinates.setSize(2*18, 1*18); + this.location.setSize(3*18, 1*18); + this.setSize(3*18, 2*18); + } + + public void setPosition(PlayerPosition position) { + this.icon.setImage(DimensionSpriteUtil.CreateWorldIconIdentifier(position.getWorldDimension())); + this.location.setText(new LiteralText(position.getLocationName())); + this.coordinates.setText(new LiteralText(position.getX() + "," + position.getY() + "," + position.getZ())); + } +} diff --git a/src/main/java/me/bionicbeanie/mods/gui/CoordinatesGui.java b/src/main/java/me/bionicbeanie/mods/gui/CoordinatesGui.java new file mode 100644 index 0000000..2cbea72 --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/gui/CoordinatesGui.java @@ -0,0 +1,144 @@ +package me.bionicbeanie.mods.gui; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.widget.WButton; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; +import io.github.cottonmc.cotton.gui.widget.WListPanel; +import io.github.cottonmc.cotton.gui.widget.WText; +import io.github.cottonmc.cotton.gui.widget.WTextField; +import io.github.cottonmc.cotton.gui.widget.WWidget; +import me.bionicbeanie.mods.api.ICoordinateListHandler; +import me.bionicbeanie.mods.api.ICoordinateSaveHandler; +import me.bionicbeanie.mods.api.IScreen; +import me.bionicbeanie.mods.model.PlayerPosition; +import me.bionicbeanie.mods.model.PlayerRawPosition; +import me.bionicbeanie.mods.util.DimensionSpriteUtil; +import net.minecraft.text.LiteralText; + +public class CoordinatesGui extends LightweightGuiDescription { + + private WGridPanel root; + private ICoordinateSaveHandler coordinateSaveHandler; + private ICoordinateListHandler coordinateListHandler; + private PlayerRawPosition rawPosition; + private List children; + private IScreen screen; + + public CoordinatesGui(PlayerRawPosition rawPosition, ICoordinateSaveHandler onSave, IScreen screen, + ICoordinateListHandler onList) { + this.root = createRootPanel(); + this.rawPosition = rawPosition; + this.coordinateSaveHandler = onSave; + this.coordinateListHandler = onList; + this.screen = screen; + this.children = new ArrayList<>(); + + reset(); + initializeDefaultView(); + + root.validate(this); + } + + private void initializeDefaultView() { + WWidget xText = CreateWidgetForCoordinate(rawPosition.getX()); + WWidget yText = CreateWidgetForCoordinate(rawPosition.getY()); + WWidget zText = CreateWidgetForCoordinate(rawPosition.getZ()); + + add(xText, 0, 1, 2, 1); + add(yText, 0, 2, 2, 1); + add(zText, 0, 3, 2, 1); + + WWidget icon = DimensionSpriteUtil.CreateWorldIcon(rawPosition.getWorldDimension()); + add(icon, 4, 0, 1, 1); + + WTextField name = CreateNameField(); + add(name, 2, 2, 5, 1); + + WWidget save = CreateSaveButton(coordinateSaveHandler, rawPosition, name); + add(save, 5, 5, 2, 1); + + WWidget list = CreateListButton(); + add(list, 0, 5, 2, 1); + } + + private void initializeListView(List playerPositions) { + BiConsumer configurator = (PlayerPosition position, + CoordinateListItem panel) -> { + panel.setPosition(position); + }; + + WListPanel listPanel = new WListPanel<>(playerPositions, + CoordinateListItem::new, configurator); + + listPanel.setListItemHeight(2 * 18); + + add(listPanel, 0, 0, 7, 7); + + } + + private void add(WWidget widget, int x, int y, int w, int h) { + root.add(widget, x, y, w, h); + children.add(widget); + } + + private void reset() { + children.forEach(root::remove); + children.clear(); + } + + private WGridPanel createRootPanel() { + WGridPanel panel = new WGridPanel(18); + panel.setSize(7 * 18, 7 * 18); + + setRootPanel(panel); + return panel; + } + + private WWidget CreateWidgetForCoordinate(long l) { + return new WText(new LiteralText(String.valueOf(l)), 0x3939ac); + } + + private WTextField CreateNameField() { + return new WTextField(new LiteralText("name")); + } + + private WWidget CreateSaveButton(ICoordinateSaveHandler onSaveHandler, PlayerRawPosition rawPosition, + WTextField textField) { + WButton button = new WButton(new LiteralText("save")); + button.setOnClick(new Runnable() { + @Override + public void run() { + onSaveHandler.save(new PlayerPosition(rawPosition, textField.getText())); + reset(); + screen.close(); + } + }); + return button; + } + + private WWidget CreateListButton() { + + CoordinatesGui gui = this; + WButton button = new WButton(new LiteralText("list")); + + button.setOnClick(new Runnable() { + + @Override + public void run() { + reset(); + root.validate(gui); + + List playerPositions = coordinateListHandler.list(); + initializeListView(playerPositions); + + root.validate(gui); + } + }); + + return button; + } +} diff --git a/src/main/java/me/bionicbeanie/mods/gui/PlayerPositionGuiDescription.java b/src/main/java/me/bionicbeanie/mods/gui/PlayerPositionGuiDescription.java deleted file mode 100644 index 35e61d5..0000000 --- a/src/main/java/me/bionicbeanie/mods/gui/PlayerPositionGuiDescription.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.bionicbeanie.mods.gui; - -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.widget.WButton; -import io.github.cottonmc.cotton.gui.widget.WGridPanel; -import io.github.cottonmc.cotton.gui.widget.WSprite; -import io.github.cottonmc.cotton.gui.widget.WText; -import io.github.cottonmc.cotton.gui.widget.WTextField; -import io.github.cottonmc.cotton.gui.widget.WWidget; -import me.bionicbeanie.mods.core.ICoordinateSaveHandler; -import me.bionicbeanie.mods.model.PlayerPosition; -import me.bionicbeanie.mods.model.PlayerRawPosition; -import net.minecraft.text.LiteralText; -import net.minecraft.util.Identifier; - -public class PlayerPositionGuiDescription extends LightweightGuiDescription { - - public PlayerPositionGuiDescription(PlayerRawPosition rawPosition, ICoordinateSaveHandler onSave) { - WGridPanel root = new WGridPanel(18); - setRootPanel(root); - - // 18 * 18 is the size of 1 item slot. Inset is 7 px - // Dims should be 18 * 3 + 14 by 18 + 14 - root.setSize(70, 34); - - WWidget xText = CreateWidgetForCoordinate(rawPosition.getX()); - WWidget yText = CreateWidgetForCoordinate(rawPosition.getY()); - WWidget zText = CreateWidgetForCoordinate(rawPosition.getZ()); - - root.add(xText, 0, 1, 5, 2); - root.add(yText, 0, 2, 5, 2); - root.add(zText, 0, 3, 5, 2); - - WWidget icon = CreateWorldIcon(rawPosition.getWorldDimension()); - root.add(icon, 3, 0, 1, 1); - - WTextField name = CreateNameField(); - root.add(name, 2, 2, 5, 5); - - WWidget save = CreateSaveButton(onSave, rawPosition, name); - root.add(save, 3, 4, 2, 2); - - root.validate(this); - } - - private WWidget CreateWidgetForCoordinate(long l) { - return new WText(new LiteralText(String.valueOf(l)), 0x3939ac); - } - - private WWidget CreateWorldIcon(String dimension) { - String dimensionItem = "netherite_ingot"; - - if(dimension.contains("overworld")) { - dimensionItem = "diamond"; - } else if(dimension.contains("end")) { - dimensionItem = "ender_eye"; - } - return new WSprite(new Identifier("minecraft:textures/item/" + dimensionItem + ".png")); - } - - private WTextField CreateNameField() { - return new WTextField(new LiteralText("name")); - } - - private WWidget CreateSaveButton(ICoordinateSaveHandler onSaveHandler, PlayerRawPosition rawPosition, WTextField textField) { - WButton button = new WButton(new LiteralText("save")); - button.setOnClick(new Runnable() { - - @Override - public void run() { - onSaveHandler.save(new PlayerPosition(rawPosition, textField.getText())); - } - }); - return button; - } -} diff --git a/src/main/java/me/bionicbeanie/mods/impl/CoordinateListHandler.java b/src/main/java/me/bionicbeanie/mods/impl/CoordinateListHandler.java new file mode 100644 index 0000000..280645e --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/impl/CoordinateListHandler.java @@ -0,0 +1,29 @@ +package me.bionicbeanie.mods.impl; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +import me.bionicbeanie.mods.api.ICoordinateListHandler; +import me.bionicbeanie.mods.api.IFileStore; +import me.bionicbeanie.mods.model.PlayerPosition; + +public class CoordinateListHandler implements ICoordinateListHandler{ + + private IFileStore fileStore; + + public CoordinateListHandler(IFileStore fileStore) { + this.fileStore = fileStore; + } + + @Override + public List list() { + + try { + return fileStore.list(); + } catch (IOException e) { + return Collections.emptyList(); + } + } + +} diff --git a/src/main/java/me/bionicbeanie/mods/impl/CoordinateSaveHandler.java b/src/main/java/me/bionicbeanie/mods/impl/CoordinateSaveHandler.java index 969db85..6ac16a6 100644 --- a/src/main/java/me/bionicbeanie/mods/impl/CoordinateSaveHandler.java +++ b/src/main/java/me/bionicbeanie/mods/impl/CoordinateSaveHandler.java @@ -2,8 +2,8 @@ package me.bionicbeanie.mods.impl; import java.io.IOException; -import me.bionicbeanie.mods.core.ICoordinateSaveHandler; -import me.bionicbeanie.mods.core.IFileStore; +import me.bionicbeanie.mods.api.ICoordinateSaveHandler; +import me.bionicbeanie.mods.api.IFileStore; import me.bionicbeanie.mods.model.PlayerPosition; public class CoordinateSaveHandler implements ICoordinateSaveHandler{ diff --git a/src/main/java/me/bionicbeanie/mods/impl/FileStore.java b/src/main/java/me/bionicbeanie/mods/impl/FileStore.java index dc22b2c..fc7dde4 100644 --- a/src/main/java/me/bionicbeanie/mods/impl/FileStore.java +++ b/src/main/java/me/bionicbeanie/mods/impl/FileStore.java @@ -11,7 +11,7 @@ import java.util.List; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import me.bionicbeanie.mods.core.IFileStore; +import me.bionicbeanie.mods.api.IFileStore; import me.bionicbeanie.mods.model.PlayerPosition; public class FileStore implements IFileStore { @@ -41,23 +41,30 @@ public class FileStore implements IFileStore { // TODO Auto-generated method stub } - + @Override - public void save(PlayerPosition position) throws IOException { + public List list() throws IOException { List lines = Files.readAllLines(saveFilePath); - PlayerPosition[] players = gson.fromJson(String.join("", lines), PlayerPosition[].class); + PlayerPosition[] positions = gson.fromJson(String.join("", lines), PlayerPosition[].class); - List playersList = new LinkedList<>(); + List playerPositionList = new LinkedList<>(); - if(players != null) { - for(int i = 0; i < players.length; ++i) { - playersList.add(players[i]); + if(positions != null) { + for(int i = 0; i < positions.length; ++i) { + playerPositionList.add(positions[i]); } } - playersList.add(position); + return playerPositionList; + } + + @Override + public void save(PlayerPosition position) throws IOException { - String serialized = gson.toJson(playersList.toArray()); + List playerPositions = list(); + playerPositions.add(position); + + String serialized = gson.toJson(playerPositions.toArray()); Files.writeString(saveFilePath, serialized, StandardOpenOption.WRITE); } diff --git a/src/main/java/me/bionicbeanie/mods/impl/PositionCalculator.java b/src/main/java/me/bionicbeanie/mods/impl/PositionCalculator.java index dfdf79c..fe6f33f 100644 --- a/src/main/java/me/bionicbeanie/mods/impl/PositionCalculator.java +++ b/src/main/java/me/bionicbeanie/mods/impl/PositionCalculator.java @@ -1,19 +1,19 @@ package me.bionicbeanie.mods.impl; -import me.bionicbeanie.mods.core.IPositionCalculator; +import me.bionicbeanie.mods.api.IPositionCalculator; import me.bionicbeanie.mods.model.PlayerRawPosition; -import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.Vec3d; -public class PositionCalculator implements IPositionCalculator{ +public class PositionCalculator implements IPositionCalculator { - public PlayerRawPosition locate(ClientPlayerEntity player) { - Vec3d pos = player.getPos(); + public PlayerRawPosition locate(MinecraftClient client) { + Vec3d pos = client.player.getPos(); long x = Math.round(pos.x); long y = Math.round(pos.y); long z = Math.round(pos.z); - String worldDimension = player.world.getRegistryKey().getValue().toString(); - + String worldDimension = client.player.getEntityWorld().getRegistryKey().getValue().toString(); + return new PlayerRawPosition(x, y, z, worldDimension); } } diff --git a/src/main/java/me/bionicbeanie/mods/model/PlayerRawPosition.java b/src/main/java/me/bionicbeanie/mods/model/PlayerRawPosition.java index ea61f2f..ea2eaa3 100644 --- a/src/main/java/me/bionicbeanie/mods/model/PlayerRawPosition.java +++ b/src/main/java/me/bionicbeanie/mods/model/PlayerRawPosition.java @@ -3,27 +3,28 @@ package me.bionicbeanie.mods.model; public class PlayerRawPosition { private long x, y, z; private String worldDimension; - + public PlayerRawPosition(long x, long y, long z, String worldDimension) { this.x = x; this.y = y; this.z = z; this.worldDimension = worldDimension; } - + public long getX() { return x; } - + public long getY() { return y; } - + public long getZ() { return z; } - + public String getWorldDimension() { return worldDimension; } + } diff --git a/src/main/java/me/bionicbeanie/mods/util/DimensionSpriteUtil.java b/src/main/java/me/bionicbeanie/mods/util/DimensionSpriteUtil.java new file mode 100644 index 0000000..a373a63 --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/util/DimensionSpriteUtil.java @@ -0,0 +1,24 @@ +package me.bionicbeanie.mods.util; + +import io.github.cottonmc.cotton.gui.widget.WSprite; +import io.github.cottonmc.cotton.gui.widget.WWidget; +import net.minecraft.util.Identifier; + +public class DimensionSpriteUtil { + + public static WWidget CreateWorldIcon(String dimension) { + return new WSprite(CreateWorldIconIdentifier(dimension)); + } + + public static Identifier CreateWorldIconIdentifier(String dimension) { + String dimensionItem = "netherite_ingot"; + + if (dimension.contains("overworld")) { + dimensionItem = "diamond"; + } else if (dimension.contains("end")) { + dimensionItem = "ender_eye"; + } + + return new Identifier("minecraft:textures/item/" + dimensionItem + ".png"); + } +} diff --git a/src/main/resources/assets/savecoords/icon.png b/src/main/resources/assets/savecoords/icon.png index 047b91f2347de5cf95f23284476fddbe21ba23fe..1cfa11d5e4fad2bd62a02c75d9a81a4a8eed4eba 100644 GIT binary patch literal 10663 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 delta 439 zcmZ1;e3W^DL_H%j0|Ud)51%_27#P?Bd_r6q7#RNl|G)I+{JRVcj8&d4jv*e$uU_7m z8)L}BmcYfO6n-stfoRY!u6&XH0%;FNvB~BaIdmd9e#O4nTRlndni=_k@>D%Q_^YT~?4Cm^ogH{sOl zRHo>2!Y0u#4l##ltMD*p_mbb2Y!yP>4Rp;YKH$63!aLhKt3MJ{q_n6Uo9Qf7vn1I#TtbNCH} zHns5OGkkEb4VoWU!4OpMzMT1$|6&&thM87OQZu(Pnr)cD@MJ<=fQ*8}p&4I~@M~Ro zoY?=JA&<4X!DxYtxj=e_;=IP-2!-FQr?_5;tte|OV@_+_*FPaoL2p91Mh$ZG_I?4mb8cvu%dm3$hZnh0T4v|IH