diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java index ebc1d2f4..1c8c4bab 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java @@ -8,6 +8,8 @@ import net.onelitefeather.cygnus.common.map.GameMap; import net.onelitefeather.cygnus.common.map.GameMapBuilder; import net.onelitefeather.cygnus.common.util.GsonHelper; +import net.onelitefeather.cygnus.setup.inventory.view.GeneralMapOverviewInventory; +import net.onelitefeather.cygnus.setup.inventory.view.SurvivorViewInventory; import net.theevilreaper.aves.file.FileHandler; import net.theevilreaper.aves.map.BaseMapBuilder; import net.theevilreaper.aves.map.MapEntry; @@ -19,8 +21,8 @@ public class GameData extends InstanceSetupData { private final FileHandler fileHandler; - //TODO: Implement inventory - private Object inventory; + private final GeneralMapOverviewInventory inventory; + private final SurvivorViewInventory survivorInventory; private GameMapBuilder gameMapBuilder; private boolean areaMode; @@ -39,6 +41,9 @@ public GameData(UUID uuid, MapEntry mapEntry, FileHandler fileHandler) { if (player == null) { throw new IllegalArgumentException("Player with UUID " + uuid + " is not online."); } + + this.inventory = new GeneralMapOverviewInventory(player, this.gameMapBuilder); + this.survivorInventory = new SurvivorViewInventory(player, this.gameMapBuilder); } /** @@ -52,16 +57,28 @@ public void swapAreaMode() { * {@inheritDoc} */ @Override - public void openInventory(Player player) { - //player.openInventory(this.inventory.getInventory()); + public void openInventory(InventoryTarget target) { + switch (target) { + case GENERAL -> this.inventory.open(); + case SURVIVOR -> this.survivorInventory.open(); + case PAGE -> { + + } + } } /** * {@inheritDoc} */ @Override - public void triggerUpdate() { - // this.inventory.invalidateDataLayout(); + public void triggerUpdate(InventoryTarget target) { + switch (target) { + case GENERAL -> this.inventory.invalidateDataLayout(); + case SURVIVOR -> this.survivorInventory.invalidateDataLayout(); + case PAGE -> { + // Nothing to do here + } + } } /** @@ -90,6 +107,8 @@ public void teleport(Player player) { @Override public void reset() { super.reset(); + this.survivorInventory.unregister(); + this.inventory.unregister(); // this.inventory.unregister(); } diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java index a288d183..29529643 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java @@ -72,14 +72,13 @@ public void teleport(Player player) { /** * Opens the setup inventory for the given player. * - * @param player target player */ - public abstract void openInventory(Player player); + public abstract void openInventory(InventoryTarget target); /** * Triggers an update of the setup state and related visual feedback. */ - public abstract void triggerUpdate(); + public abstract void triggerUpdate(InventoryTarget target); /** * Checks whether a map file is available for this setup. @@ -115,4 +114,12 @@ public UUID getId() { * @return associated map builder */ public abstract BaseMapBuilder getMapBuilder(); + + public enum InventoryTarget { + + GENERAL, + SURVIVOR, + PAGE + + } } \ No newline at end of file diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java index 1afd89c3..1e20fcdc 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java @@ -5,20 +5,21 @@ import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Player; import net.minestom.server.instance.anvil.AnvilLoader; +import net.onelitefeather.cygnus.setup.inventory.view.GeneralMapOverviewInventory; import net.theevilreaper.aves.file.FileHandler; +import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; import net.theevilreaper.aves.map.BaseMap; import net.theevilreaper.aves.map.BaseMapBuilder; import net.theevilreaper.aves.map.MapEntry; import java.nio.file.Files; -import java.util.Objects; import java.util.Optional; import java.util.UUID; public final class LobbyData extends InstanceSetupData { private final FileHandler fileHandler; - private Objects viewInventory; + private final PersonalInventoryBuilder viewInventory; private BaseMapBuilder mapBuilder; public LobbyData(UUID uuid, MapEntry mapEntry, FileHandler fileHandler) { @@ -30,16 +31,18 @@ public LobbyData(UUID uuid, MapEntry mapEntry, FileHandler fileHandler) { if (player == null) { throw new IllegalArgumentException("Player with UUID " + uuid + " is not online."); } + + this.viewInventory = new GeneralMapOverviewInventory(player, this.mapBuilder); } @Override - public void openInventory(Player player) { - //player.openInventory(this.viewInventory.getInventory()); + public void openInventory(InventoryTarget target) { + this.viewInventory.open(); } @Override - public void triggerUpdate() { - // this.viewInventory.invalidateDataLayout(); + public void triggerUpdate(InventoryTarget target) { + this.viewInventory.invalidateDataLayout(); } @Override @@ -62,7 +65,7 @@ public void teleport(Player player) { @Override public void reset() { super.reset(); - //this.viewInventory.unregister(); + this.viewInventory.unregister(); } @Override @@ -77,8 +80,6 @@ public void loadData() { }, () -> this.mapBuilder = BaseMap.builder()); } - //this.viewInventory = new LobbyViewInventory(this.mapBuilder); - this.instance = MinecraftServer.getInstanceManager().createInstanceContainer(); AnvilLoader anvilLoader = new AnvilLoader(this.mapEntry.getDirectoryRoot()); this.instance.setChunkLoader(anvilLoader); diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogTarget.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogTarget.java index 7fe855d0..0e41ac28 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogTarget.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogTarget.java @@ -10,9 +10,9 @@ public enum DialogTarget { CREATE_NAME, + CREATE_AUTHORS, UPDATE_NAME, DELETE_NAME, - CREATE_SPAWN, DELETE_SPAWN, DELETE_SLENDER, DELETE_PAGE_FACE, diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/AbstractDataSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/AbstractDataSlot.java new file mode 100644 index 00000000..05e31e87 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/AbstractDataSlot.java @@ -0,0 +1,44 @@ +package net.onelitefeather.cygnus.setup.inventory.slot; + +import net.minestom.server.component.DataComponents; +import net.minestom.server.entity.Player; +import net.minestom.server.inventory.click.Click; +import net.minestom.server.item.ItemStack; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.click.ClickHolder; +import net.theevilreaper.aves.inventory.slot.Slot; + +import java.util.function.Consumer; + +public abstract class AbstractDataSlot extends Slot { + + protected final MapDataCategory type; + + protected AbstractDataSlot(MapDataCategory type) { + this.type = type; + this.setClick(this::click); + } + + protected abstract void click( + Player player, + int slot, + Click clickType, + ItemStack stack, + Consumer result + ); + + /** + * Converts the given ItemStack to a builder, allowing for modifications + * without altering the original stack. + * + * @param stack the ItemStack to convert + * @return a new ItemStack.Builder with the same material and custom name + */ + protected ItemStack.Builder asBuilder(ItemStack stack) { + ItemStack.Builder builder = ItemStack.builder(stack.material()); + if (stack.has(DataComponents.CUSTOM_NAME)) { + builder.customName(stack.get(DataComponents.CUSTOM_NAME)); + } + return builder; + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java new file mode 100644 index 00000000..b31b7df7 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java @@ -0,0 +1,64 @@ +package net.onelitefeather.cygnus.setup.inventory.slot; + +import net.kyori.adventure.text.Component; +import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; +import net.minestom.server.inventory.click.Click; +import net.minestom.server.item.ItemStack; +import net.onelitefeather.cygnus.setup.event.dialog.DialogRequestEvent; +import net.onelitefeather.cygnus.setup.event.dialog.DialogTarget; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.click.ClickHolder; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Consumer; + +import static net.onelitefeather.cygnus.setup.util.SetupMessages.DELETE_CLICK; +import static net.onelitefeather.cygnus.setup.util.SetupMessages.NO_SPACE_SEPARATOR; + +public class MultiStringSlot extends AbstractDataSlot { + + private final List data; + + public MultiStringSlot(MapDataCategory category, List data) { + super(category); + this.data = data; + } + + public MultiStringSlot(MapDataCategory category) { + super(category); + this.data = List.of(); + } + + @Override + public ItemStack getItem() { + ItemStack overviewItem = MapDataCategory.getDefaultItem(type); + + if (data == null || data.isEmpty()) { + return overviewItem; + } + return asBuilder(overviewItem).lore( + Component.empty(), + NO_SPACE_SEPARATOR.append(Component.space()).append(Component.text(String.join(", ", data), type.getColor())), + Component.empty(), + DELETE_CLICK, + Component.empty() + ) + .build(); + } + + @Override + protected void click(Player player, int slot, Click click, ItemStack stack, Consumer result) { + result.accept(ClickHolder.cancelClick()); + + if (data.isEmpty()) { + EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.CREATE_AUTHORS)); + return; + } + + if (click instanceof Click.Right) { + // EventDispatcher.call(new PlayerDeletePromptEvent(player, type)); + } + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PositionSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PositionSlot.java new file mode 100644 index 00000000..e6700ee8 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PositionSlot.java @@ -0,0 +1,75 @@ +package net.onelitefeather.cygnus.setup.inventory.slot; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; +import net.minestom.server.inventory.click.Click; +import net.minestom.server.item.ItemStack; +import net.onelitefeather.cygnus.setup.event.dialog.DialogContext; +import net.onelitefeather.cygnus.setup.event.dialog.DialogRequestEvent; +import net.onelitefeather.cygnus.setup.event.dialog.DialogTarget; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.click.ClickHolder; +import net.theevilreaper.aves.util.Components; +import org.jetbrains.annotations.Nullable; + +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.function.Consumer; + +import static net.onelitefeather.cygnus.setup.util.SetupMessages.DELETE_CLICK; +import static net.onelitefeather.cygnus.setup.util.SetupMessages.TELEPORT_CLICK; + +public class PositionSlot extends AbstractDataSlot { + + private static final DecimalFormat DECIMAL_FORMAT; + + static { + DECIMAL_FORMAT = new DecimalFormat("#.##"); + DECIMAL_FORMAT.setRoundingMode(RoundingMode.CEILING); + DECIMAL_FORMAT.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ROOT)); + } + + private final @Nullable Pos position; + + public PositionSlot(MapDataCategory category, @Nullable Pos position) { + super(category); + this.position = position; + } + + @Override + public ItemStack getItem() { + ItemStack overviewItem = MapDataCategory.getDefaultItem(type); + + if (position == null) { + return overviewItem; + } + List lore = new ArrayList<>(); + lore.add(Component.empty()); + lore.addAll(Components.pointToLore(MiniMessage.miniMessage(), position, DECIMAL_FORMAT)); + lore.add(Component.empty()); + lore.add(TELEPORT_CLICK); + lore.add(DELETE_CLICK); + lore.add(Component.empty()); + + return asBuilder(overviewItem).lore(lore).build(); + } + + @Override + protected void click(Player player, int slot, Click click, ItemStack stack, Consumer result) { + result.accept(ClickHolder.cancelClick()); + if ((!(click instanceof Click.Left || click instanceof Click.Right)) || position == null) return; + if (click instanceof Click.Left) { + player.closeInventory(); + player.teleport(position); + return; + } + EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.DELETE_SPAWN, new DialogContext.PositionContent(position))); + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/StringSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/StringSlot.java new file mode 100644 index 00000000..b4d26df1 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/StringSlot.java @@ -0,0 +1,58 @@ +package net.onelitefeather.cygnus.setup.inventory.slot; + +import net.kyori.adventure.text.Component; +import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; +import net.minestom.server.inventory.click.Click; +import net.minestom.server.item.ItemStack; +import net.onelitefeather.cygnus.setup.event.dialog.DialogRequestEvent; +import net.onelitefeather.cygnus.setup.event.dialog.DialogTarget; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.click.ClickHolder; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +import static net.onelitefeather.cygnus.setup.util.SetupMessages.DELETE_CLICK; +import static net.onelitefeather.cygnus.setup.util.SetupMessages.NO_SPACE_SEPARATOR; + +public class StringSlot extends AbstractDataSlot { + + private final String data; + + public StringSlot(MapDataCategory category, @Nullable String data) { + super(category); + this.data = data; + } + + @Override + public ItemStack getItem() { + ItemStack overviewItem = MapDataCategory.getDefaultItem(type); + + if (data == null) { + return overviewItem; + } + return asBuilder(overviewItem).lore( + Component.empty(), + NO_SPACE_SEPARATOR.append(Component.space()).append(Component.text(data, type.getColor())), + Component.empty(), + DELETE_CLICK, + Component.empty() + ) + .build(); + } + + @Override + protected void click(Player player, int slot, Click click, ItemStack stack, Consumer result) { + result.accept(ClickHolder.cancelClick()); + + if (data == null || data.isEmpty()) { + EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.CREATE_NAME)); + return; + } + + if (click instanceof Click.Right) { + EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.DELETE_NAME)); + } + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/package-info.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/package-info.java new file mode 100644 index 00000000..5d442d68 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package net.onelitefeather.cygnus.setup.inventory.slot; + +import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/GeneralMapOverviewInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/GeneralMapOverviewInventory.java new file mode 100644 index 00000000..906a6f9d --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/GeneralMapOverviewInventory.java @@ -0,0 +1,62 @@ +package net.onelitefeather.cygnus.setup.inventory.view; + +import net.kyori.adventure.text.Component; +import net.minestom.server.entity.Player; +import net.minestom.server.inventory.InventoryType; +import net.onelitefeather.cygnus.setup.inventory.slot.MultiStringSlot; +import net.onelitefeather.cygnus.setup.inventory.slot.PositionSlot; +import net.onelitefeather.cygnus.setup.inventory.slot.StringSlot; +import net.onelitefeather.cygnus.setup.item.SetupItems; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.InventoryLayout; +import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; +import net.theevilreaper.aves.inventory.slot.ISlot; +import net.theevilreaper.aves.inventory.util.LayoutCalculator; +import net.theevilreaper.aves.map.BaseMapBuilder; + +public class GeneralMapOverviewInventory extends PersonalInventoryBuilder { + + private static final int[] DATA_SLOT = LayoutCalculator.from(10, 12, 14); + private final BaseMapBuilder mapBuilder; + + public GeneralMapOverviewInventory(Player player, BaseMapBuilder builder) { + super(Component.text("Lobby data"), InventoryType.CHEST_3_ROW, player); + this.mapBuilder = builder; + + InventoryLayout backGround = InventoryLayout.fromType(getType()); + + backGround.setItems(LayoutCalculator.quad(0, getType().getSize() - 1), SetupItems.DECORATION_PANE); + + setLayout(backGround); + + this.setDataLayoutFunction(dataLayoutFunction -> { + InventoryLayout dataLayout = dataLayoutFunction == null ? InventoryLayout.fromType(getType()) : dataLayoutFunction; + dataLayout.blank(DATA_SLOT); + + MapDataCategory[] categories = MapDataCategory.getValues(); + + for (int i = 0; i < categories.length && i < DATA_SLOT.length; i++) { + MapDataCategory currentType = categories[i]; + dataLayout.setItem(DATA_SLOT[i], getDataSlot(currentType)); + } + return dataLayout; + }); + + register(); + } + + /** + * Returns the slot for the given category. + * + * @param category to get the slot for + * @return the slot for the given category + */ + private ISlot getDataSlot(MapDataCategory category) { + return switch (category) { + case NAME -> new StringSlot(MapDataCategory.NAME, mapBuilder.getName()); + case AUTHOR -> new MultiStringSlot(MapDataCategory.AUTHOR, mapBuilder.getBuilders()); + case SPAWN -> new PositionSlot(MapDataCategory.SPAWN, mapBuilder.getSpawn()); + default -> throw new IllegalStateException("Unknown category: " + category); + }; + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java new file mode 100644 index 00000000..04b1a9cd --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java @@ -0,0 +1,53 @@ +package net.onelitefeather.cygnus.setup.inventory.view; + +import net.kyori.adventure.text.Component; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.entity.Player; +import net.minestom.server.inventory.InventoryType; +import net.onelitefeather.cygnus.common.map.GameMapBuilder; +import net.onelitefeather.cygnus.setup.inventory.slot.PositionSlot; +import net.onelitefeather.cygnus.setup.item.SetupItems; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.InventoryLayout; +import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; +import net.theevilreaper.aves.inventory.util.LayoutCalculator; + +import java.util.Iterator; + +public class SurvivorViewInventory extends PersonalInventoryBuilder { + + private static final int[] SLOTS = LayoutCalculator.quad(InventoryType.CHEST_1_ROW.getSize() + 1, InventoryType.CHEST_5_ROW.getSize()); + private final GameMapBuilder mapBuilder; + + /** + * Creates a new instance from the {@link PersonalInventoryBuilder} with the given values. + * + * @param player The player who owns the inventory + */ + public SurvivorViewInventory(Player player, GameMapBuilder mapBuilder) { + super(Component.text("Survivor positions"), InventoryType.CHEST_6_ROW, player); + this.mapBuilder = mapBuilder; + + InventoryLayout layout = InventoryLayout.fromType(getType()); + layout.setItems(LayoutCalculator.fillRow(InventoryType.CHEST_1_ROW), SetupItems.DECORATION_PANE); + layout.setItems(LayoutCalculator.fillRow(getType()), SetupItems.DECORATION_PANE); + + setLayout(layout); + + this.setDataLayoutFunction(dataLayout -> { + dataLayout = dataLayout != null ? dataLayout : InventoryLayout.fromType(getType()); + + if (this.mapBuilder.getSurvivorSpawns().isEmpty()) return dataLayout; + + Iterator iterator = mapBuilder.getSurvivorSpawns().iterator(); + + for (int i = 0; i < SLOTS.length && iterator.hasNext(); i++) { + Pos pos = iterator.next(); + dataLayout.setItem(SLOTS[i], new PositionSlot(MapDataCategory.SPAWN, pos)); + } + return dataLayout; + }); + + register(); + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/package-info.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/package-info.java new file mode 100644 index 00000000..62ee9177 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package net.onelitefeather.cygnus.setup.inventory.view; + +import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItems.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItems.java index 99bbce95..e16e0fea 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItems.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItems.java @@ -18,6 +18,7 @@ @SuppressWarnings("java:S3252") public final class SetupItems { + public static final ItemStack DECORATION_PANE; public static final byte ZERO_INDEX = (byte) 0x00; public static final byte FOURTH_INDEX = (byte) 0x04; @@ -26,6 +27,7 @@ public final class SetupItems { private static final HotBarLayout pageLayout; static { + DECORATION_PANE = ItemStack.builder(Material.BLACK_STAINED_GLASS_PANE).customName(Component.empty()).build(); selectionLayout = new HotBarLayout(); selectionLayout.set(FOURTH_INDEX, ItemStack.builder(Material.CHEST) .customName(Component.text("Map selection", NamedTextColor.GREEN)) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java index 45f75e2a..e8229fc9 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java @@ -1,12 +1,61 @@ package net.onelitefeather.cygnus.setup.map; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.onelitefeather.cygnus.setup.util.SetupTags; + +import java.util.EnumMap; +import java.util.Map; + public enum MapDataCategory { - NAME, - AUTHOR, - SPAWN, - SLENDER, - SURVIVOR, - PAGE - ; + NAME("Name", Material.ACACIA_SIGN, NamedTextColor.YELLOW), + AUTHOR("Builder", Material.DARK_OAK_DOOR, NamedTextColor.AQUA), + SPAWN("Spawn", Material.COMPASS, NamedTextColor.RED), + SLENDER("Slender", Material.ENDER_EYE, NamedTextColor.DARK_PURPLE), + SURVIVOR("Surivior", Material.CLOCK, NamedTextColor.GREEN), + PAGE("Page", Material.PAPER, NamedTextColor.WHITE); + + private static final MapDataCategory[] VALUES = values(); + private static final Map DEFAULT_CACHE = new EnumMap<>(MapDataCategory.class); + + private final String name; + private final Material material; + private final NamedTextColor color; + + MapDataCategory(String name, Material material, NamedTextColor color) { + this.name = name; + this.material = material; + this.color = color; + } + + public String getName() { + return name; + } + + public Material getMaterial() { + return material; + } + + public NamedTextColor getColor() { + return color; + } + + public static MapDataCategory[] getValues() { + return VALUES; + } + + /** + * Returns a default {@link ItemStack} with lore when no data is given. + * + * @param category to get the pre-cached item + * @return the cached item + */ + public static ItemStack getDefaultItem(MapDataCategory category) { + return DEFAULT_CACHE.computeIfPresent(category, (mapDataCategory, _) -> + ItemStack.builder(mapDataCategory.getMaterial()) + .set(SetupTags.MAP_DATA_CATEGORY_TAG, category) + .build()); + } } diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupMessages.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupMessages.java index 134a1b2d..fce4ac4b 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupMessages.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupMessages.java @@ -15,12 +15,35 @@ public final class SetupMessages { public static final Component MISSING_MAP_SELECTION; public static final Component DISABLED_PAGE_MODE; - + public static final Component NO_SPACE_SEPARATOR; + public static final Component TELEPORT_CLICK; + public static final Component DELETE_CLICK; public static final Component PAGE_MODE_ENABLED; public static final Component PAGE_MODE_DISABLED; public static final Component PAGE_MODE_INFORM; static { + NO_SPACE_SEPARATOR = Component.text("ยป", NamedTextColor.GRAY); + + TELEPORT_CLICK = NO_SPACE_SEPARATOR + .append(Component.space()) + .append(Component.text("Left", NamedTextColor.GREEN)) + .append(Component.space()) + .append(Component.text("click", NamedTextColor.GRAY)) + .append(Component.space()) + .append(Component.text("->", NamedTextColor.GRAY)) + .append(Component.space()) + .append(Component.text("teleport", NamedTextColor.GREEN)); + + DELETE_CLICK = NO_SPACE_SEPARATOR + .append(Component.space()) + .append(Component.text("Right", NamedTextColor.RED)) + .append(Component.space()) + .append(Component.text("click", NamedTextColor.GRAY)) + .append(Component.space()) + .append(Component.text("->", NamedTextColor.GRAY)) + .append(Component.space()) + .append(Component.text("delete", NamedTextColor.RED)); EMPTY_NAME = Messages.withPrefix(Component.text("An empty name is not allowed", NamedTextColor.RED)); MISSING_MAP_SELECTION = Messages.withPrefix( Component.text("Please select a map to setup and try the command again", NamedTextColor.RED)