Add nether coordinate calculator

This commit is contained in:
Surya 2021-11-26 00:12:05 +05:30 committed by Surya Prakash
parent 509ede5424
commit 8d12a99fd7
9 changed files with 146 additions and 26 deletions

View File

@ -12,8 +12,16 @@ public interface IDimensionAware {
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();

View File

@ -0,0 +1,7 @@
package me.bionicbeanie.mods.savecoords;
import me.bionicbeanie.mods.savecoords.model.PlayerRawPosition;
public interface INetherCalculator {
PlayerRawPosition convert(PlayerRawPosition position);
}

View File

@ -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;

View File

@ -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<Screen> modMenuScreenFactory;
private static CurrentPositionPingOperation pingPositionOperation;
private static IDimensionAware dimensionAware;
private static INetherCalculator netherCalculator;
public static IModGui getModGui() {
initialize();
@ -59,7 +61,7 @@ public class DIContainer {
return () -> {
try {
pingPositionOperation.call();
}catch (Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
};
@ -79,7 +81,9 @@ 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());
}

View File

@ -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<Void> {
private Consumer<PlayerPosition> onDelete;
private Consumer<PlayerPosition> onEdit;
private Consumer<PlayerRawPosition> onPing;
private INetherCalculator netherCalculator;
public ListViewHandler(IFileStore fileStore, Consumer<PlayerPosition> onDelete, Consumer<PlayerPosition> onEdit,
Consumer<PlayerRawPosition> onPing) {
Consumer<PlayerRawPosition> 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<Void> {
}
private WListPanel<PlayerPosition, CoordinatesListItemPanel> createListPanel(List<PlayerPosition> positions) {
BiConsumer<PlayerPosition, CoordinatesListItemPanel> configurator = (pos, p) -> p.setPosition(pos, fileStore);
BiConsumer<PlayerPosition, CoordinatesListItemPanel> configurator = (pos, p) -> p.setPosition(pos);
WListPanel<PlayerPosition, CoordinatesListItemPanel> panel = createListPanel(positions, configurator);
panel.setListItemHeight(2 * 18);
@ -74,7 +77,7 @@ class ListViewHandler extends ViewHandlerBase<Void> {
}
private CoordinatesListItemPanel createListPanel() {
return new CoordinatesListItemPanel(onDelete, onEdit, onPing);
return new CoordinatesListItemPanel(onDelete, onEdit, onPing, netherCalculator);
}
private List<PlayerPosition> getPositions(IFileStore fileStore) {
@ -101,27 +104,31 @@ class ListViewHandler extends ViewHandlerBase<Void> {
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<PlayerRawPosition> onPing;
private Consumer<PlayerPosition> onEdit;
private Consumer<PlayerPosition> onDelete;
private INetherCalculator netherCalculator;
CoordinatesListItemPanel(Consumer<PlayerPosition> onDelete, Consumer<PlayerPosition> onEdit,
Consumer<PlayerRawPosition> onPing) {
Consumer<PlayerRawPosition> 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<Void> {
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,8 +160,7 @@ class ListViewHandler extends ViewHandlerBase<Void> {
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) {
@ -161,11 +168,19 @@ class ListViewHandler extends ViewHandlerBase<Void> {
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)));
}
}
}

View File

@ -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<Void> CreateListViewHandler() {
ListViewHandler handler = new ListViewHandler(fileStore, this::onDeletePosition, this::onEditPosition,
this::pingPosition);
this::pingPosition, netherCalculator);
handler.onBackButtonClick(() -> showDefaultView(null));

View File

@ -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<Dimension> allDimensions;
private List<IDimension> 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<Dimension> 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
@ -54,14 +57,31 @@ 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;
}
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}