From 8ecb6e173ff7842ef18a8e4164d79353d676d5f9 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 17 Sep 2023 13:52:58 +0200 Subject: [PATCH] Update Loader usage and add copy Signed-off-by: yoyosource --- BauSystem_Main/src/BauSystem.properties | 36 +- BauSystem_Main/src/BauSystem_de.properties | 36 +- .../bausystem/features/loader/Loader.java | 11 +- .../loader/elements/ElementSettings.java | 39 -- .../elements/LoaderInteractionElement.java | 254 ++++++-- .../loader/elements/LoaderSettingsEnum.java | 44 ++ .../elements/impl/LoaderComparator.java | 154 +++-- .../elements/impl/LoaderDaylightDetector.java | 189 +++--- .../loader/elements/impl/LoaderLectern.java | 544 ++++++++++++++---- .../loader/elements/impl/LoaderLever.java | 151 +++-- .../loader/elements/impl/LoaderMovement.java | 231 +++----- .../loader/elements/impl/LoaderNoteBlock.java | 98 ++-- .../loader/elements/impl/LoaderOpenable.java | 152 +++-- .../loader/elements/impl/LoaderRepeater.java | 213 +++---- .../loader/elements/impl/LoaderTNT.java | 3 +- .../loader/elements/impl/LoaderTicks.java | 145 ++--- 16 files changed, 1291 insertions(+), 1009 deletions(-) delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/ElementSettings.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/LoaderSettingsEnum.java diff --git a/BauSystem_Main/src/BauSystem.properties b/BauSystem_Main/src/BauSystem.properties index c2ae1534..9d941a9a 100644 --- a/BauSystem_Main/src/BauSystem.properties +++ b/BauSystem_Main/src/BauSystem.properties @@ -582,20 +582,22 @@ LOADER_GUI_SHOW_WAITS_SET_BETWEEN_TNT=§7Wait Time between TNT LOADER_GUI_SHOW_WAITS_SET_ALL=§7Wait Time all LOADER_GUI_SHOW_WAITS_TITLE=§7Wait Time LOADER_GUI_SETTINGS_TITLE=Settings +LOADER_GUI_COPY_TITLE=Copy amount LOADER_GUI_SETTINGS_BACK=§8Back +LOADER_GUI_SETTINGS_COPY=§7Copy LOADER_GUI_SETTINGS_DELETE=§cDelete LOADER_GUI_WAIT_TITLE=Settings LOADER_GUI_WAIT_BACK=§8Back -LOADER_GUI_CLICK_TO_EDIT=§7Klicke zum editieren +LOADER_GUI_CLICK_TO_EDIT=§7Click to edit LOADER_GUI_ITEM_NAME=§7{0}§8: §e{1} LOADER_SETTING_NAME=§7{0} -LOADER_SETTING_MODES=§7Modi§8: §e{0} -LOADER_SETTING_POWER=§7Redstone Stärke§8: §e{0} +LOADER_SETTING_MODES=§7Modes§8: §e{0} +LOADER_SETTING_POWER=§7Power§8: §e{0} LOADER_SETTING_TICKS=§7Ticks§8: §e{0} LOADER_SETTING_REPEATER=§7Repeater§8: §e{0} -LOADER_SETTING_WAIT=§7Wartezeit§8: §e{0} Tick(s) -LOADER_SETTING_WAIT_NAME=Wartezeit +LOADER_SETTING_WAIT=§7Wait§8: §e{0} Tick(s) +LOADER_SETTING_WAIT_NAME=Wait LOADER_SETTING_TICKS_NAME=Ticks LOADER_SETTING_TICKS_REMOVE_ONE=§c-1 LOADER_SETTING_TICKS_REMOVE_ONE_SHIFT=§7Shift§8: §c-5 @@ -606,18 +608,18 @@ LOADER_SETTING_TNT_X=§7X§8: §e{0} LOADER_SETTING_TNT_Y=§7Y§8: §e{0} LOADER_SETTING_TNT_Z=§7Z§8: §e{0} LOADER_INTERACTION_NOOP=NOOP -LOADER_INTERACTION_INTERACT=Interagiere -LOADER_INTERACTION_POWERED=Aktiviert -LOADER_INTERACTION_UNPOWERED=Deaktiviert -LOADER_INTERACTION_PAGE_PREV=Vorherige Seite -LOADER_INTERACTION_PAGE_NEXT=Nächste Seite -LOADER_INTERACTION_PAGE=Seite {0} -LOADER_INTERACTION_ACTIVE=Aktiviert -LOADER_INTERACTION_INACTIVE=Deaktiviert -LOADER_INTERACTION_WAIT_FOR=Darauf warten -LOADER_INTERACTION_NO_WAIT_FOR=Nicht darauf warten -LOADER_INTERACTION_OPEN=Geöffnet -LOADER_INTERACTION_CLOSED=Geschlossen +LOADER_INTERACTION_INTERACT=Interact +LOADER_INTERACTION_POWERED=Powered +LOADER_INTERACTION_UNPOWERED=Unpowered +LOADER_INTERACTION_PAGE_PREV=Previous Page +LOADER_INTERACTION_PAGE_NEXT=Next Page +LOADER_INTERACTION_PAGE=Page {0} +LOADER_INTERACTION_ACTIVE=Active +LOADER_INTERACTION_INACTIVE=Inactive +LOADER_INTERACTION_WAIT_FOR=Wait for +LOADER_INTERACTION_NO_WAIT_FOR=No wait for +LOADER_INTERACTION_OPEN=Open +LOADER_INTERACTION_CLOSED=Closed # Loadtimer LOADTIMER_HELP_OVERVIEW=§7Compete with your friends loading your cannon and get information about the cannon diff --git a/BauSystem_Main/src/BauSystem_de.properties b/BauSystem_Main/src/BauSystem_de.properties index be812082..d43aca3b 100644 --- a/BauSystem_Main/src/BauSystem_de.properties +++ b/BauSystem_Main/src/BauSystem_de.properties @@ -550,20 +550,22 @@ LOADER_GUI_SHOW_WAITS_SET_BETWEEN_TNT=§7Wait Time zwischen TNT LOADER_GUI_SHOW_WAITS_SET_ALL=§7Wait Time alle LOADER_GUI_SHOW_WAITS_TITLE=§7Wartezeit LOADER_GUI_SETTINGS_TITLE=Einstellungen +LOADER_GUI_COPY_TITLE=Anzahl Kopien LOADER_GUI_SETTINGS_BACK=§8Zurück +LOADER_GUI_SETTINGS_COPY=§7Kopieren LOADER_GUI_SETTINGS_DELETE=§cLöschen LOADER_GUI_WAIT_TITLE=Wartezeit LOADER_GUI_WAIT_BACK=§8Zurück -LOADER_GUI_CLICK_TO_EDIT=§7Click to edit +LOADER_GUI_CLICK_TO_EDIT=§7Klicke zum editieren LOADER_GUI_ITEM_NAME=§7{0}§8: §e{1} LOADER_SETTING_NAME=§7{0} -LOADER_SETTING_MODES=§7Modes§8: §e{0} -LOADER_SETTING_POWER=§7Power§8: §e{0} +LOADER_SETTING_MODES=§7Modi§8: §e{0} +LOADER_SETTING_POWER=§7Redstone Stärke§8: §e{0} LOADER_SETTING_TICKS=§7Ticks§8: §e{0} LOADER_SETTING_REPEATER=§7Repeater§8: §e{0} -LOADER_SETTING_WAIT=§7Wait§8: §e{0} Tick(s) -LOADER_SETTING_WAIT_NAME=Wait +LOADER_SETTING_WAIT=§7Wartezeit§8: §e{0} Tick(s) +LOADER_SETTING_WAIT_NAME=Wartezeit LOADER_SETTING_TICKS_NAME=Ticks LOADER_SETTING_TICKS_REMOVE_ONE=§c-1 LOADER_SETTING_TICKS_REMOVE_ONE_SHIFT=§7Shift§8: §c-5 @@ -574,18 +576,18 @@ LOADER_SETTING_TNT_X=§7X§8: §e{0} LOADER_SETTING_TNT_Y=§7Y§8: §e{0} LOADER_SETTING_TNT_Z=§7Z§8: §e{0} LOADER_INTERACTION_NOOP=NOOP -LOADER_INTERACTION_INTERACT=Interact -LOADER_INTERACTION_POWERED=Powered -LOADER_INTERACTION_UNPOWERED=Unpowered -LOADER_INTERACTION_PAGE_PREV=Previous Page -LOADER_INTERACTION_PAGE_NEXT=Next Page -LOADER_INTERACTION_PAGE=Page {0} -LOADER_INTERACTION_ACTIVE=Active -LOADER_INTERACTION_INACTIVE=Inactive -LOADER_INTERACTION_WAIT_FOR=Wait for -LOADER_INTERACTION_NO_WAIT_FOR=No wait for -LOADER_INTERACTION_OPEN=Open -LOADER_INTERACTION_CLOSED=Closed +LOADER_INTERACTION_INTERACT=Interagiere +LOADER_INTERACTION_POWERED=Aktiviert +LOADER_INTERACTION_UNPOWERED=Deaktiviert +LOADER_INTERACTION_PAGE_PREV=Vorherige Seite +LOADER_INTERACTION_PAGE_NEXT=Nächste Seite +LOADER_INTERACTION_PAGE=Seite {0} +LOADER_INTERACTION_ACTIVE=Aktiviert +LOADER_INTERACTION_INACTIVE=Deaktiviert +LOADER_INTERACTION_WAIT_FOR=Darauf warten +LOADER_INTERACTION_NO_WAIT_FOR=Nicht darauf warten +LOADER_INTERACTION_OPEN=Geöffnet +LOADER_INTERACTION_CLOSED=Geschlossen # Loadtimer LOADTIMER_HELP_OVERVIEW=§7Messe dich und deine Freunde beim Beladen einer Kanone und bekomme informationen über die Kanone diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/loader/Loader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/loader/Loader.java index 8cea017b..e2bbb9fd 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/loader/Loader.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/loader/Loader.java @@ -72,18 +72,19 @@ public class Loader implements Listener { waitTime--; return; } + if (currentElement >= elements.size()) { + currentElement = 0; + } while (currentElement < elements.size()) { LoaderElement element = elements.get(currentElement); currentElement++; element.execute(delay -> waitTime = delay); if (waitTime > 0) { - break; + if (element instanceof LoaderTNT) currentElement--; + return; } } - if (currentElement >= elements.size()) { - currentElement = 0; - } }, 0, 1); } @@ -221,7 +222,7 @@ public class Loader implements Listener { } public String getProgress() { - return (currentElement + 1) + "§8/§7" + elements.size(); + return Math.max(currentElement, 1) + "§8/§7" + elements.size(); } public enum SettingsSorting { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/ElementSettings.java b/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/ElementSettings.java deleted file mode 100644 index 25b839ff..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/ElementSettings.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2023 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.features.loader.elements; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.inventory.SWItem; -import org.bukkit.entity.Player; - -import java.util.function.Consumer; - -public interface ElementSettings { - SWItem menu(Player player); - void execute(Consumer delay); - void click(Player player, Runnable backAction, Runnable deleteAction); - - default void playerInteract() {} - void noop(); - - default String translateItemName(String name, String mode, Player player, Object... args) { - return BauSystem.MESSAGE.parse("LOADER_GUI_ITEM_NAME", player, BauSystem.MESSAGE.parse(name, player), BauSystem.MESSAGE.parse(mode, player, args)); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/LoaderInteractionElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/LoaderInteractionElement.java index cc00c662..43f56a4f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/LoaderInteractionElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/LoaderInteractionElement.java @@ -21,62 +21,91 @@ package de.steamwar.bausystem.features.loader.elements; import de.steamwar.bausystem.BauSystem; import de.steamwar.inventory.SWAnvilInv; +import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWListInv; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.FaceAttachable; +import org.bukkit.block.data.*; +import org.bukkit.block.data.type.Door; import org.bukkit.block.data.type.Switch; import org.bukkit.entity.Player; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.function.Consumer; -public abstract class LoaderInteractionElement implements LoaderElement { +public abstract class LoaderInteractionElement & LoaderSettingsEnum> implements LoaderElement { protected final Location location; protected int currentShot = 0; + protected T defaultSetting; + protected T newSetting; + protected T[] allSettings; protected List elements = new ArrayList<>(); + protected List extraPower = new ArrayList<>(); + protected List extraTicks = new ArrayList<>(); + protected int settingsGuiSize = 0; - protected LoaderInteractionElement(Location location) { + protected LoaderInteractionElement(Location location, T defaultSetting, T newSetting, T[] allSettings) { this.location = location; - T element = createNewElement(); - element.playerInteract(); - elements.add(element); + this.defaultSetting = defaultSetting; + this.newSetting = newSetting; + this.allSettings = allSettings; + + elements.add(defaultSetting); + extraPower.add(0); + extraTicks.add(0L); + + for (T element : allSettings) { + settingsGuiSize = Math.max(element.getPos(), settingsGuiSize); + } + while (settingsGuiSize % 9 != 0) settingsGuiSize++; + settingsGuiSize += 9; } @Override public void execute(Consumer delay) { if (currentShot >= elements.size()) currentShot = 0; - elements.get(currentShot).execute(delay); + if (checkBlockInWorld()) { + BlockData blockData = location.getBlock().getBlockData(); + elements.get(currentShot).execute(location, blockData, this, extraPower.get(currentShot), extraTicks.get(currentShot), delay); + } currentShot++; if (currentShot >= elements.size()) currentShot = 0; } @Override public void click(Player player, Runnable backAction) { - List> entries = new ArrayList<>(); + List> entries = new ArrayList<>(); Runnable updateRunnable = () -> { entries.clear(); - for (T element : elements) { - entries.add(new SWListInv.SWListEntry<>(element.menu(player), element)); + for (int i = 0; i < elements.size(); i++) { + SWItem swItem = elements.get(i).menu(player, this, extraPower.get(i), extraTicks.get(i)); + swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); + entries.add(new SWListInv.SWListEntry<>(swItem, i)); } }; updateRunnable.run(); - SWListInv listInv = new SWListInv<>(player, "Interaction Settings", false, entries, (clickType, entry) -> {}); + SWListInv listInv = new SWListInv<>(player, "Interaction Settings", false, entries, (clickType, entry) -> {}); listInv.setCallback((clickType, entry) -> { - entry.click(player, () -> { + openIndividualSettingsMenu(player, entry, () -> { updateRunnable.run(); listInv.open(); }, () -> { - if (elements.size() == 1) return; - elements.remove(entry); + elements.remove((int) entry); + extraPower.remove((int) entry); + extraTicks.remove((int) entry); + if (elements.isEmpty()) { + elements.add(newSetting); + extraPower.add(0); + extraTicks.add(1L); + } click(player, backAction); }); }); @@ -84,69 +113,190 @@ public abstract class LoaderInteractionElement implem backAction.run(); })); listInv.setItem(50, new SWItem(Material.GHAST_SPAWN_EGG, "§7Insert another Setting", clickType -> { - T element = createNewElement(); - elements.add(element); - element.click(player, () -> { + elements.add(defaultSetting); + extraPower.add(0); + extraTicks.add(1L); + openIndividualSettingsMenu(player, elements.size() - 1, () -> { updateRunnable.run(); listInv.open(); }, () -> { - if (elements.size() == 1) return; - elements.remove(element); + elements.remove(elements.size() - 1); + extraPower.remove(extraPower.size() - 1); + extraTicks.remove(extraTicks.size() - 1); + if (elements.isEmpty()) { + elements.add(newSetting); + extraPower.add(0); + extraTicks.add(1L); + } click(player, backAction); }); })); - listInv.setItem(51, new SWItem(Material.STRUCTURE_VOID, "§7Insert NOOP's", clickType -> { - SWAnvilInv anvilInv = new SWAnvilInv(player, "§7NOOP Count", "1"); - anvilInv.setCallback(s -> { - try { - int count = Integer.parseInt(s); - for (int i = 0; i < count; i++) { - T element = createNewElement(); - element.noop(); - elements.add(element); - } - updateRunnable.run(); - listInv.open(); - } catch (NumberFormatException e) { - player.sendMessage("§cInvalid Number"); - } - }); - anvilInv.open(); - })); listInv.open(); } + private void openIndividualSettingsMenu(Player player, int index, Runnable back, Runnable delete) { + T currentElement = elements.get(index); + int guiSize = settingsGuiSize; + int powerStart = guiSize - 9; + if (currentElement.hasPower(this)) { + guiSize += 18; + } + int ticksStart = guiSize - 9; + if (currentElement.hasTicks(this)) { + guiSize += 9; + } + + SWInventory swInventory = new SWInventory(player, guiSize, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); + for (int i = guiSize - 9; i < guiSize; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7", clickType -> {})); + swInventory.setItem(guiSize - 9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> back.run()); + swInventory.setItem(guiSize - 5, new SWItem(Material.WOODEN_AXE, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_COPY", player)).getItemStack(), clickType -> { + SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("LOADER_GUI_COPY_TITLE", player), "1"); + swAnvilInv.setCallback(s -> { + try { + int count = Integer.parseInt(s); + if (count < 1) count = 1; + if (count > 65536) count = 65536; + + int power = extraPower.get(index); + long ticks = extraTicks.get(index); + for (int i = 0; i < count; i++) { + elements.add(currentElement); + extraPower.add(power); + extraTicks.add(ticks); + } + + if (count == 1) { + openIndividualSettingsMenu(player, elements.size() - 1, back, delete); + } else { + back.run(); + } + } catch (NumberFormatException e) { + back.run(); + } + }); + swAnvilInv.open(); + }); + swInventory.setItem(guiSize - 1, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> delete.run()); + + for (T element : allSettings) { + SWItem item = element.menu(player, this, extraPower.get(index), extraTicks.get(index)); + if (element == currentElement) { + item.setEnchanted(true); + } + + swInventory.setItem(element.getPos(), item.getItemStack(), clickType -> { + elements.set(index, element); + openIndividualSettingsMenu(player, index, back, delete); + }); + } + + if (currentElement.hasPower(this)) { + for (int power = 0; power < 16; power++) { + int finalPowerPosition = power; + if (power >= 9) finalPowerPosition++; + SWItem powerItem = new SWItem(Material.REDSTONE, BauSystem.MESSAGE.parse("LOADER_SETTING_POWER", player, power), Arrays.asList(), false, clickType -> {}); + powerItem.getItemStack().setAmount(Math.max(power, 1)); + if (extraPower.get(index) == power) powerItem.setEnchanted(true); + + int finalPower = power; + swInventory.setItem(finalPowerPosition + powerStart, powerItem.getItemStack(), clickType -> { + extraPower.set(index, finalPower); + openIndividualSettingsMenu(player, index, back, delete); + }); + } + } + + if (currentElement.hasTicks(this)) { + swInventory.setItem(ticksStart + 3, new SWItem(SWItem.getDye(1), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> { + long ticks = extraTicks.get(index); + ticks -= clickType.isShiftClick() ? 5 : 1; + if (ticks < 1) ticks = 1; + extraTicks.set(index, ticks); + openIndividualSettingsMenu(player, index, back, delete); + }); + + SWItem ticksItem = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS", player, extraTicks.get(index)), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)), false, clickType -> {}); + ticksItem.getItemStack().setAmount((int) Math.min(extraTicks.get(index), 64)); + swInventory.setItem(ticksStart + 4, ticksItem.getItemStack(), clickType -> { + SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_NAME", player), extraTicks.get(index) + ""); + swAnvilInv.setCallback(s -> { + try { + long ticks = Long.parseLong(s); + if (ticks < 1) ticks = 1; + extraTicks.set(index, ticks); + } catch (NumberFormatException ignored) { + } + openIndividualSettingsMenu(player, index, back, delete); + }); + swAnvilInv.open(); + }); + + swInventory.setItem(ticksStart + 5, new SWItem(SWItem.getDye(10), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> { + long ticks = extraTicks.get(index); + ticks += clickType.isShiftClick() ? 5 : 1; + extraTicks.set(index, ticks); + openIndividualSettingsMenu(player, index, back, delete); + }); + } + + swInventory.open(); + } + protected void update(BlockData blockData) { - Material material = blockData.getMaterial(); Block block = location.getBlock(); - if (blockData instanceof Switch) { + if (blockData instanceof Door) { + Door door = (Door) blockData; + block.setBlockData(door); + if (door.getHalf() == Bisected.Half.BOTTOM) { + updateBlock(block.getRelative(BlockFace.UP), door.isOpen() ? 15 : 0); + } else { + updateBlock(block.getRelative(BlockFace.DOWN), door.isOpen() ? 15 : 0); + } + } else if (blockData instanceof Switch) { Switch sw = (Switch) blockData; updateBlock(block, sw); FaceAttachable.AttachedFace face = sw.getAttachedFace(); if (face == FaceAttachable.AttachedFace.FLOOR) { - updateBlock(block.getRelative(BlockFace.DOWN)); + updateBlock(block.getRelative(BlockFace.DOWN), sw.isPowered() ? 15 : 0); } else if (face == FaceAttachable.AttachedFace.CEILING) { - updateBlock(block.getRelative(BlockFace.UP)); + updateBlock(block.getRelative(BlockFace.UP), sw.isPowered() ? 15 : 0); } else { - updateBlock(block.getRelative(sw.getFacing().getOppositeFace())); + updateBlock(block.getRelative(sw.getFacing().getOppositeFace()), sw.isPowered() ? 15 : 0); } - } else if (material == Material.TRIPWIRE) { + } else if (blockData instanceof Powerable) { + updateBlock(block, blockData); + updateBlock(block.getRelative(BlockFace.DOWN), ((Powerable) blockData).isPowered() ? 15 : 0); + } else if (blockData instanceof AnaloguePowerable) { + updateBlock(block, blockData); + updateBlock(block.getRelative(BlockFace.DOWN), ((AnaloguePowerable) blockData).getPower()); + } else { updateBlock(block, blockData); - } else if (material.name().endsWith("_PLATE")) { - updateBlock(block.getRelative(BlockFace.DOWN)); } } - protected void updateBlock(Block block) { - updateBlock(block, block.getBlockData()); + private void updateBlock(Block block, int powered) { + BlockData data = block.getBlockData(); + if (data instanceof Door) { + Door door = (Door) data; + door.setOpen(powered > 0); + block.setBlockData(door); + return; + } else if (data instanceof Powerable) { + Powerable powerable = (Powerable) data; + powerable.setPowered(powered > 0); + } else if (data instanceof AnaloguePowerable) { + AnaloguePowerable analoguePowerable = (AnaloguePowerable) data; + analoguePowerable.setPower(powered); + } + updateBlock(block, data); } - protected void updateBlock(Block block, BlockData data) { - block.setType(Material.BARRIER, true); - block.setBlockData(data, true); + private void updateBlock(Block block, BlockData data) { + block.setType(Material.BARRIER); + block.setBlockData(data); } - public abstract T createNewElement(); + public abstract boolean checkBlockInWorld(); protected final String translateItemName(String name, Player player) { return BauSystem.MESSAGE.parse("LOADER_SETTING_NAME", player, BauSystem.MESSAGE.parse(name, player)); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/LoaderSettingsEnum.java b/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/LoaderSettingsEnum.java new file mode 100644 index 00000000..f1e628d0 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/LoaderSettingsEnum.java @@ -0,0 +1,44 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.features.loader.elements; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.inventory.SWItem; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.function.Consumer; + +public interface LoaderSettingsEnum, E extends Enum & LoaderSettingsEnum> { + int getPos(); + SWItem menu(Player player, P parent, int power, long ticks); + default boolean hasPower(P parent) { + return false; + } + default boolean hasTicks(P parent) { + return false; + } + + void execute(Location location, T blockData, P parent, int power, long ticks, Consumer delay); + + default String translateItemName(String name, String mode, Player player, Object... args) { + return BauSystem.MESSAGE.parse("LOADER_GUI_ITEM_NAME", player, BauSystem.MESSAGE.parse(name, player), BauSystem.MESSAGE.parse(mode, player, args)); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/impl/LoaderComparator.java b/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/impl/LoaderComparator.java index 9e446448..10cb84ca 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/impl/LoaderComparator.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/loader/elements/impl/LoaderComparator.java @@ -19,10 +19,8 @@ package de.steamwar.bausystem.features.loader.elements.impl; -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.loader.elements.ElementSettings; import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement; -import de.steamwar.inventory.SWInventory; +import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum; import de.steamwar.inventory.SWItem; import org.bukkit.Location; import org.bukkit.Material; @@ -30,101 +28,83 @@ import org.bukkit.block.data.type.Comparator; import org.bukkit.entity.Player; import java.util.Arrays; -import java.util.Collections; import java.util.function.Consumer; -public class LoaderComparator extends LoaderInteractionElement { +public class LoaderComparator extends LoaderInteractionElement { public LoaderComparator(Location location) { - super(location); + super(location, ComparatorSettingsEnum.INTERACT, ComparatorSettingsEnum.NOOP, ComparatorSettingsEnum.values()); } - public class ComparatorSettings implements ElementSettings { - - private boolean interact = false; - private Comparator.Mode mode = Comparator.Mode.COMPARE; - - @Override - public SWItem menu(Player player) { - return menu(player, interact, mode); - } - - private SWItem menu(Player player, boolean interact, Comparator.Mode mode) { - SWItem swItem; - if (interact) { - swItem = new SWItem(Material.STICK, "§7Comparator§8: §eInteract"); - } else if (mode == null) { - swItem = new SWItem(Material.STRUCTURE_VOID, "§7Comparator§8: §eNOOP"); - } else { - swItem = new SWItem(Material.COMPARATOR, "§7Comparator§8: §e" + mode.name()); + public enum ComparatorSettingsEnum implements LoaderSettingsEnum { + NOOP { + @Override + public int getPos() { + return 2; } - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - @Override - public void execute(Consumer delay) { - if (location.getBlock().getType() != Material.COMPARATOR) return; - Comparator comparator = (Comparator) location.getBlock().getBlockData(); - if (interact) { - comparator.setMode(comparator.getMode() == Comparator.Mode.COMPARE ? Comparator.Mode.SUBTRACT : Comparator.Mode.COMPARE); - } else if (mode == null) { - return; - } else { - comparator.setMode(mode); + @Override + public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) { + return new SWItem(Material.STRUCTURE_VOID, "§7Comparator§8: §eNOOP"); } - location.getBlock().setBlockData(comparator, true); - } - @Override - public void click(Player player, Runnable backAction, Runnable deleteAction) { - SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); - for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7")); - swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run()); - swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run()); - - swInventory.setItem(2, item(player, false, null).getItemStack(), clickType -> { - interact = false; - mode = null; - click(player, backAction, deleteAction); - }); - swInventory.setItem(3, item(player, true, null).getItemStack(), clickType -> { - interact = true; - click(player, backAction, deleteAction); - }); - swInventory.setItem(5, item(player, false, Comparator.Mode.COMPARE).getItemStack(), clickType -> { - interact = false; - mode = Comparator.Mode.COMPARE; - click(player, backAction, deleteAction); - }); - swInventory.setItem(6, item(player, false, Comparator.Mode.SUBTRACT).getItemStack(), clickType -> { - interact = false; - mode = Comparator.Mode.SUBTRACT; - click(player, backAction, deleteAction); - }); - - swInventory.open(); - } - - private SWItem item(Player player, boolean interact, Comparator.Mode mode) { - SWItem swItem = menu(player, interact, mode); - if (swItem.getItemStack().equals(menu(player, this.interact, this.mode).getItemStack())) { - swItem.setEnchanted(true); + @Override + public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer delay) { } - swItem.setLore(Collections.emptyList()); - return swItem; - } + }, - @Override - public void playerInteract() { - interact = true; - mode = null; - } + INTERACT { + @Override + public int getPos() { + return 3; + } - @Override - public void noop() { - interact = false; - mode = null; + @Override + public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) { + return new SWItem(Material.STICK, "§7Comparator§8: §eInteract"); + } + + @Override + public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer delay) { + blockData.setMode(blockData.getMode() == Comparator.Mode.COMPARE ? Comparator.Mode.SUBTRACT : Comparator.Mode.COMPARE); + parent.update(blockData); + } + }, + + COMPARE { + @Override + public int getPos() { + return 5; + } + + @Override + public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) { + return new SWItem(Material.COMPARATOR, "§7Comparator§8: §eCompare"); + } + + @Override + public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer delay) { + blockData.setMode(Comparator.Mode.COMPARE); + parent.update(blockData); + } + }, + + SUBTRACT { + @Override + public int getPos() { + return 6; + } + + @Override + public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) { + return new SWItem(Material.COMPARATOR, "§7Comparator§8: §eSubtract"); + } + + @Override + public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer delay) { + blockData.setMode(Comparator.Mode.SUBTRACT); + parent.update(blockData); + } } } @@ -136,7 +116,7 @@ public class LoaderComparator extends LoaderInteractionElement { +public class LoaderDaylightDetector extends LoaderInteractionElement { public LoaderDaylightDetector(Location location) { - super(location); + super(location, DaylightSettingsEnum.INTERACT, DaylightSettingsEnum.NOOP, DaylightSettingsEnum.values()); } - public class DaylightDetectorSettings implements ElementSettings { - - private boolean noop = false; - private boolean interact = false; - private boolean inverted = true; - private int power = 0; - - @Override - public SWItem menu(Player player) { - return menu(player, noop, interact, inverted); - } - - private SWItem menu(Player player, boolean noop, boolean interact, boolean powered) { - SWItem swItem; - if (noop) { - swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_NOOP", player)); - } else if (interact) { - swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_INTERACT", player)); - } else { - swItem = new SWItem(Material.DAYLIGHT_DETECTOR, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", powered ? "LOADER_INTERACTION_POWERED": "LOADER_INTERACTION_UNPOWERED", player)); - } - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - - @Override - public void execute(Consumer delay) { - if (location.getBlock().getType() != Material.DAYLIGHT_DETECTOR) return; - DaylightDetector daylightDetector = (DaylightDetector) location.getBlock().getBlockData(); - if (noop) { - return; - } else if (interact) { - daylightDetector.setInverted(!daylightDetector.isInverted()); - } else { - daylightDetector.setInverted(inverted); - } - daylightDetector.setPower(daylightDetector.isInverted() ? 15 - power : power); - location.getBlock().setBlockData(daylightDetector); - updateBlock(location.getBlock().getRelative(0, -1, 0)); - } - - @Override - public void click(Player player, Runnable backAction, Runnable deleteAction) { - SWInventory swInventory = new SWInventory(player, 36, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); - for (int i = 27; i < 35; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7")); - swInventory.setItem(27, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run()); - swInventory.setItem(35, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run()); - - swInventory.setItem(2, item(player, true, false, false).getItemStack(), clickType -> { - noop = true; - click(player, backAction, deleteAction); - }); - swInventory.setItem(3, item(player, false, true, false).getItemStack(), clickType -> { - noop = false; - interact = true; - click(player, backAction, deleteAction); - }); - swInventory.setItem(5, item(player, false, false, false).getItemStack(), clickType -> { - noop = false; - interact = false; - inverted = false; - click(player, backAction, deleteAction); - }); - swInventory.setItem(6, item(player, false, false, true).getItemStack(), clickType -> { - noop = false; - interact = false; - inverted = true; - click(player, backAction, deleteAction); - }); - - for (int i = 0; i < 16; i++) { - int finalI = i; - int finalI2 = i; - if (i >= 9) finalI2++; - swInventory.setItem(finalI2 + 9, item(player, finalI).getItemStack(), clickType -> { - power = finalI; - click(player, backAction, deleteAction); - }); + public enum DaylightSettingsEnum implements LoaderSettingsEnum { + NOOP { + @Override + public int getPos() { + return 2; } - swInventory.open(); - } - - private SWItem item(Player player, boolean noop, boolean interact, boolean inverted) { - SWItem swItem = menu(player, noop, interact, inverted); - if (swItem.getItemStack().equals(menu(player, this.noop, this.interact, this.inverted).getItemStack())) { - swItem.setEnchanted(true); + @Override + public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) { + return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_NOOP", player)); } - swItem.setLore(Collections.emptyList()); - return swItem; - } - private SWItem item(Player player, int power) { - SWItem swItem = new SWItem(power == 0 ? Material.GUNPOWDER : Material.REDSTONE, BauSystem.MESSAGE.parse("LOADER_SETTING_POWER", player, power)); - swItem.getItemStack().setAmount(power == 0 ? 1 : power); - if (!this.noop && this.power == power) swItem.setEnchanted(true); - return swItem; - } + @Override + public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer delay) { + } + }, - @Override - public void playerInteract() { - noop = false; - interact = true; - inverted = false; - } + INTERACT { + @Override + public int getPos() { + return 3; + } - @Override - public void noop() { - noop = true; - interact = false; - inverted = false; + @Override + public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) { + return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_INTERACT", player)); + } + + @Override + public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer delay) { + blockData.setInverted(!blockData.isInverted()); + blockData.setPower(15 - blockData.getPower()); + parent.update(blockData); + } + }, + + DAY_MODE { + @Override + public int getPos() { + return 5; + } + + @Override + public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) { + return new SWItem(Material.DAYLIGHT_DETECTOR, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_UNPOWERED", player)); + } + + @Override + public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer delay) { + if (blockData.isInverted()) { + blockData.setInverted(false); + blockData.setPower(15 - blockData.getPower()); + parent.update(blockData); + } + } + }, + + NIGHT_MODE { + @Override + public int getPos() { + return 6; + } + + @Override + public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) { + return new SWItem(Material.DAYLIGHT_DETECTOR, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_POWERED", player)); + } + + @Override + public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer delay) { + if (!blockData.isInverted()) { + blockData.setInverted(true); + blockData.setPower(15 - blockData.getPower()); + parent.update(blockData); + } + } } } @@ -159,7 +120,7 @@ public class LoaderDaylightDetector extends LoaderInteractionElement { +public class LoaderLectern extends LoaderInteractionElement { public LoaderLectern(Location location) { - super(location); + super(location, LecternSettingsEnum.NEXT_PAGE, LecternSettingsEnum.NOOP, LecternSettingsEnum.values()); } - public class LecternSettings implements ElementSettings { - - private boolean noop = true; - private LecternAction action = LecternAction.PAGE_NEXT; - private int page = 0; - - @Override - public SWItem menu(Player player) { - return menu(player, noop, action, page); - } - - private SWItem menu(Player player, boolean noop, LecternAction action, int page) { - SWItem swItem; - if (noop) { - swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_NOOP", player)); - } else if (action == LecternAction.PAGE_PREV) { - swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_PREV", player)); - } else if (action == LecternAction.PAGE_NEXT) { - swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_NEXT", player)); - } else { - swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, page)); - swItem.getItemStack().setAmount(page); - } - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - - @Override - public void execute(Consumer delay) { - if (location.getBlock().getType() != Material.LECTERN) return; - Lectern lectern = (Lectern) location.getBlock().getState(); - if (!((org.bukkit.block.data.type.Lectern) lectern.getBlockData()).hasBook()) return; - int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); - if (noop) { - return; - } else if (action == LecternAction.PAGE_PREV) { - int page = lectern.getPage(); - if (page > 1) lectern.setPage(page - 1); - } else if (action == LecternAction.PAGE_NEXT) { - int page = lectern.getPage(); - if (page < pages) lectern.setPage(page + 1); - } else if (action == LecternAction.PAGE_SET) { - if (page <= pages) lectern.setPage(page); - } - lectern.update(false, true); - } - - @Override - public void click(Player player, Runnable backAction, Runnable deleteAction) { - SWInventory swInventory = new SWInventory(player, 36, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); - for (int i = 27; i < 35; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7")); - swInventory.setItem(27, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run()); - swInventory.setItem(35, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run()); - - swInventory.setItem(2, item(player, true, LecternAction.PAGE_SET, 0).getItemStack(), clickType -> { - noop = true; - click(player, backAction, deleteAction); - }); - swInventory.setItem(5, item(player, false, LecternAction.PAGE_PREV, 0).getItemStack(), clickType -> { - noop = false; - action = LecternAction.PAGE_PREV; - click(player, backAction, deleteAction); - }); - swInventory.setItem(6, item(player, false, LecternAction.PAGE_NEXT, 0).getItemStack(), clickType -> { - noop = false; - action = LecternAction.PAGE_NEXT; - click(player, backAction, deleteAction); - }); - - for (int i = 0; i < 15; i++) { - int finalI = i; - int finalI2 = i; - if (i >= 9) finalI2++; - if (i >= 12) finalI2++; - swInventory.setItem(finalI2 + 9, item(player, false, LecternAction.PAGE_SET, finalI + 1).getItemStack(), clickType -> { - noop = false; - action = LecternAction.PAGE_SET; - page = finalI + 1; - click(player, backAction, deleteAction); - }); + public enum LecternSettingsEnum implements LoaderSettingsEnum { + NOOP { + @Override + public int getPos() { + return 2; } - swInventory.open(); - } - - private SWItem item(Player player, boolean noop, LecternAction action, int page) { - SWItem swItem = menu(player, noop, action, page); - if (swItem.getItemStack().equals(menu(player, this.noop, this.action, this.page).getItemStack())) { - swItem.setEnchanted(true); + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_NOOP", player)); } - swItem.setLore(Collections.emptyList()); - return swItem; - } - @Override - public void noop() { - noop = true; - } - } + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + } + }, - public enum LecternAction { - PAGE_NEXT, - PAGE_PREV, - PAGE_SET + PREVIOUS_PAGE { + @Override + public int getPos() { + return 5; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_PREV", player)); + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + if (lectern.getPage() > 0) { + lectern.setPage(lectern.getPage() - 1); + parent.update(blockData); + } + } + }, + + NEXT_PAGE { + @Override + public int getPos() { + return 6; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_NEXT", player)); + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (lectern.getPage() < pages) { + lectern.setPage(lectern.getPage() + 1); + parent.update(blockData); + } + } + }, + + PAGE_1 { + @Override + public int getPos() { + return 9; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 1)); + swItem.getItemStack().setAmount(1); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (1 <= pages) { + lectern.setPage(1); + parent.update(blockData); + } + } + }, + + PAGE_2 { + @Override + public int getPos() { + return 10; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 2)); + swItem.getItemStack().setAmount(2); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (2 <= pages) { + lectern.setPage(2); + parent.update(blockData); + } + } + }, + + PAGE_3 { + @Override + public int getPos() { + return 11; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 3)); + swItem.getItemStack().setAmount(3); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (3 <= pages) { + lectern.setPage(3); + parent.update(blockData); + } + } + }, + + PAGE_4 { + @Override + public int getPos() { + return 12; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 4)); + swItem.getItemStack().setAmount(4); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (4 <= pages) { + lectern.setPage(4); + parent.update(blockData); + } + } + }, + + PAGE_5 { + @Override + public int getPos() { + return 13; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 5)); + swItem.getItemStack().setAmount(5); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (5 <= pages) { + lectern.setPage(5); + parent.update(blockData); + } + } + }, + + PAGE_6 { + @Override + public int getPos() { + return 14; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 6)); + swItem.getItemStack().setAmount(6); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (6 <= pages) { + lectern.setPage(6); + parent.update(blockData); + } + } + }, + + PAGE_7 { + @Override + public int getPos() { + return 15; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 7)); + swItem.getItemStack().setAmount(7); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (7 <= pages) { + lectern.setPage(7); + parent.update(blockData); + } + } + }, + + PAGE_8 { + @Override + public int getPos() { + return 16; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 8)); + swItem.getItemStack().setAmount(8); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (8 <= pages) { + lectern.setPage(8); + parent.update(blockData); + } + } + }, + + PAGE_9 { + @Override + public int getPos() { + return 17; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 9)); + swItem.getItemStack().setAmount(9); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (9 <= pages) { + lectern.setPage(9); + parent.update(blockData); + } + } + }, + + PAGE_10 { + @Override + public int getPos() { + return 19; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 10)); + swItem.getItemStack().setAmount(10); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (10 <= pages) { + lectern.setPage(10); + parent.update(blockData); + } + } + }, + + PAGE_11 { + @Override + public int getPos() { + return 20; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 11)); + swItem.getItemStack().setAmount(11); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (11 <= pages) { + lectern.setPage(11); + parent.update(blockData); + } + } + }, + + PAGE_12 { + @Override + public int getPos() { + return 21; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 12)); + swItem.getItemStack().setAmount(12); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (12 <= pages) { + lectern.setPage(12); + parent.update(blockData); + } + } + }, + + PAGE_13 { + @Override + public int getPos() { + return 23; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 13)); + swItem.getItemStack().setAmount(13); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (13 <= pages) { + lectern.setPage(13); + parent.update(blockData); + } + } + }, + + PAGE_14 { + @Override + public int getPos() { + return 24; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 14)); + swItem.getItemStack().setAmount(14); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (14 <= pages) { + lectern.setPage(14); + parent.update(blockData); + } + } + }, + + PAGE_15 { + @Override + public int getPos() { + return 25; + } + + @Override + public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 15)); + swItem.getItemStack().setAmount(15); + return swItem; + } + + @Override + public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer delay) { + if (!blockData.hasBook()) return; + Lectern lectern = (Lectern) location.getBlock().getState(); + int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size(); + if (15 <= pages) { + lectern.setPage(15); + parent.update(blockData); + } + } + } } @Override @@ -153,7 +481,7 @@ public class LoaderLectern extends LoaderInteractionElement { +public class LoaderLever extends LoaderInteractionElement { public LoaderLever(Location location) { - super(location); + super(location, LeverSettingsEnum.INTERACT, LeverSettingsEnum.NOOP, LeverSettingsEnum.values()); } - public class LeverSettings implements ElementSettings { + public enum LeverSettingsEnum implements LoaderSettingsEnum { - private boolean noop = false; - private boolean interact = true; - private boolean power = false; - - @Override - public SWItem menu(Player player) { - return menu(player, noop, interact, power); - } - - private SWItem menu(Player player, boolean noop, boolean interact, boolean power) { - SWItem swItem; - if (noop) { - swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_NOOP", player)); - } else if (interact) { - swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INTERACT", player)); - } else { - swItem = new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", power ? "LOADER_INTERACTION_ACTIVE" : "LOADER_INTERACTION_INACTIVE", player)); + NOOP { + @Override + public int getPos() { + return 2; } - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - @Override - public void execute(Consumer delay) { - if (location.getBlock().getType() != Material.LEVER) return; - if (noop) return; - - Switch lever = (Switch) location.getBlock().getBlockData(); - if (interact) { - lever.setPowered(!lever.isPowered()); - } else { - lever.setPowered(power); + @Override + public SWItem menu(Player player, LoaderLever parent, int power, long ticks) { + return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_NOOP", player)); } - location.getBlock().setBlockData(lever, true); - } - @Override - public void click(Player player, Runnable backAction, Runnable deleteAction) { - SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); - for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7")); - swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run()); - swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run()); - - swInventory.setItem(2, item(player, true, false, false).getItemStack(), clickType -> { - noop = true; - click(player, backAction, deleteAction); - }); - swInventory.setItem(3, item(player, false, true, false).getItemStack(), clickType -> { - noop = false; - interact = true; - click(player, backAction, deleteAction); - }); - swInventory.setItem(5, item(player, false, false, false).getItemStack(), clickType -> { - noop = false; - interact = false; - power = false; - click(player, backAction, deleteAction); - }); - swInventory.setItem(6, item(player, false, false, true).getItemStack(), clickType -> { - noop = false; - interact = false; - power = true; - click(player, backAction, deleteAction); - }); - - swInventory.open(); - } - - private SWItem item(Player player, boolean noop, boolean interact, boolean power) { - SWItem swItem = menu(player, noop, interact, power); - if (swItem.getItemStack().equals(menu(player, this.noop, this.interact, this.power).getItemStack())) { - swItem.setEnchanted(true); + @Override + public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer delay) { } - swItem.setLore(Collections.emptyList()); - return swItem; - } + }, - @Override - public void noop() { - noop = true; + INTERACT { + @Override + public int getPos() { + return 3; + } + + @Override + public SWItem menu(Player player, LoaderLever parent, int power, long ticks) { + return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INTERACT", player)); + } + + @Override + public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer delay) { + blockData.setPowered(!blockData.isPowered()); + parent.update(blockData); + } + }, + + POWER_OFF { + @Override + public int getPos() { + return 5; + } + + @Override + public SWItem menu(Player player, LoaderLever parent, int power, long ticks) { + return new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INACTIVE", player)); + } + + @Override + public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer delay) { + blockData.setPowered(false); + parent.update(blockData); + } + }, + + POWER_ON { + @Override + public int getPos() { + return 6; + } + + @Override + public SWItem menu(Player player, LoaderLever parent, int power, long ticks) { + return new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_ACTIVE", player)); + } + + @Override + public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer delay) { + blockData.setPowered(true); + } } } @@ -130,7 +113,7 @@ public class LoaderLever extends LoaderInteractionElement { +public class LoaderMovement extends LoaderInteractionElement { private String name; private Material material; private boolean analogue; public LoaderMovement(Location location, String name, Material material) { - super(location); + super(location, MovementSettingsEnum.NO_WAIT_FOR, MovementSettingsEnum.NOOP, MovementSettingsEnum.values()); this.name = name; this.material = material; this.analogue = location.getBlock().getBlockData() instanceof AnaloguePowerable; @@ -52,167 +47,108 @@ public class LoaderMovement extends LoaderInteractionElement { - private boolean noop = false; - private boolean waitFor = false; - private int power = 15; - private long ticks = 1; - - @Override - public SWItem menu(Player player) { - return menu(player, noop, waitFor); - } - - private SWItem menu(Player player, boolean noop, boolean waitFor) { - SWItem swItem; - if (noop) { - swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName(name, "LOADER_INTERACTION_NOOP", player)); - } else if (waitFor) { - swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_WAIT_FOR", player)); - swItem.getItemStack().setAmount((int) Math.min(ticks, 64)); - } else { - swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_NO_WAIT_FOR", player)); - swItem.getItemStack().setAmount((int) Math.min(ticks, 64)); - swItem.setEnchanted(true); - } - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - - @Override - public void execute(Consumer delay) { - if (!(material == Material.STRING && location.getBlock().getType() == Material.TRIPWIRE) && location.getBlock().getType() != material) return; - if (noop) return; - - BlockData blockData = location.getBlock().getBlockData(); - if (blockData instanceof AnaloguePowerable) { - AnaloguePowerable analoguePowerable = (AnaloguePowerable) location.getBlock().getBlockData(); - analoguePowerable.setPower(power); - location.getBlock().setBlockData(analoguePowerable, true); - update(analoguePowerable); - } else if (blockData instanceof Powerable) { - Powerable powerable = (Powerable) location.getBlock().getBlockData(); - if (ticks < 0) { - powerable.setPowered(power > 0); - } else { - powerable.setPowered(true); - } - location.getBlock().setBlockData(powerable, true); - update(powerable); + NOOP { + @Override + public int getPos() { + return 2; } - if (ticks >= 0) { - if (waitFor) { - delay.accept(ticks); + @Override + public SWItem menu(Player player, LoaderMovement parent, int power, long ticks) { + return new SWItem(Material.STRUCTURE_VOID, translateItemName(parent.name, "LOADER_INTERACTION_NOOP", player)); + } + + @Override + public void execute(Location location, BlockData blockData, LoaderMovement parent, int power, long ticks, Consumer delay) { + } + }, + + NO_WAIT_FOR { + @Override + public int getPos() { + return 5; + } + + @Override + public SWItem menu(Player player, LoaderMovement parent, int power, long ticks) { + SWItem swItem = new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_WAIT_FOR", player)); + swItem.getItemStack().setAmount((int) Math.min(ticks, 64)); + return swItem; + } + + @Override + public boolean hasPower(LoaderMovement parent) { + return parent.analogue; + } + + @Override + public boolean hasTicks(LoaderMovement parent) { + return true; + } + + @Override + public void execute(Location location, BlockData blockData, LoaderMovement parent, int power, long ticks, Consumer delay) { + if (blockData instanceof AnaloguePowerable) { + AnaloguePowerable analoguePowerable = (AnaloguePowerable) location.getBlock().getBlockData(); + analoguePowerable.setPower(power); + parent.update(analoguePowerable); + } else if (blockData instanceof Powerable) { + Powerable powerable = (Powerable) location.getBlock().getBlockData(); + if (ticks < 0) { + powerable.setPowered(power > 0); + } else { + powerable.setPowered(true); + } + parent.update(powerable); } + BauSystem.runTaskLater(BauSystem.getInstance(), () -> { if (blockData instanceof AnaloguePowerable) { AnaloguePowerable analoguePowerable = (AnaloguePowerable) blockData; analoguePowerable.setPower(0); - location.getBlock().setBlockData(analoguePowerable, true); - update(analoguePowerable); + parent.update(analoguePowerable); } else { Powerable powerable = (Powerable) blockData; powerable.setPowered(false); - location.getBlock().setBlockData(powerable, true); - update(powerable); + parent.update(powerable); } }, ticks); } - } + }, - @Override - public void click(Player player, Runnable backAction, Runnable deleteAction) { - SWInventory swInventory = new SWInventory(player, analogue ? 45 : 27, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); - for (int i = analogue ? 36 : 18; i < (analogue ? 44 : 26); i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7")); - swInventory.setItem(analogue ? 36 : 18, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run()); - swInventory.setItem(analogue ? 44 : 26, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run()); - - swInventory.setItem(2, item(player, true, false).getItemStack(), clickType -> { - noop = true; - click(player, backAction, deleteAction); - }); - if (ticks >= 0) { - swInventory.setItem(5, item(player, false, false).getItemStack(), clickType -> { - noop = false; - waitFor = false; - click(player, backAction, deleteAction); - }); - swInventory.setItem(6, item(player, false, true).getItemStack(), clickType -> { - noop = false; - waitFor = true; - click(player, backAction, deleteAction); - }); + WAIT_FOR { + @Override + public int getPos() { + return 6; } - swInventory.setItem(12, new SWItem(SWItem.getDye(1), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> { - ticks -= clickType.isShiftClick() ? 5 : 1; - if (ticks < 1) ticks = 1; - swInventory.setItem(13, item(player)); - }); - swInventory.setItem(13, item(player).getItemStack(), clickType -> { - SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_NAME", player), ticks + ""); - swAnvilInv.setCallback(s -> { - try { - ticks = Long.parseLong(s); - if (ticks < 1) ticks = 1; - } catch (NumberFormatException ignored) { - } - click(player, backAction, deleteAction); - }); - swAnvilInv.open(); - }); - swInventory.setItem(14, new SWItem(SWItem.getDye(10), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> { - ticks += clickType.isShiftClick() ? 5 : 1; - swInventory.setItem(13, item(player)); - }); - - if (analogue) { - for (int i = 0; i < 16; i++) { - int finalI = i; - int finalI2 = i; - if (i >= 9) finalI2++; - swInventory.setItem(finalI2 + 18, item(player, finalI).getItemStack(), clickType -> { - power = finalI; - click(player, backAction, deleteAction); - }); - } + @Override + public SWItem menu(Player player, LoaderMovement parent, int power, long ticks) { + SWItem swItem = new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_NO_WAIT_FOR", player)); + swItem.getItemStack().setAmount((int) Math.min(ticks, 64)); + return swItem; } - swInventory.open(); - } - - private SWItem item(Player player, boolean noop, boolean waitFor) { - SWItem swItem = menu(player, noop, waitFor); - if (swItem.getItemStack().equals(menu(player, this.noop, this.waitFor).getItemStack())) { - swItem.setEnchanted(true); + @Override + public boolean hasPower(LoaderMovement parent) { + return parent.analogue; } - swItem.setLore(Collections.emptyList()); - return swItem; - } - private SWItem item(Player player, int power) { - SWItem swItem = new SWItem(power == 0 ? Material.GUNPOWDER : Material.REDSTONE, BauSystem.MESSAGE.parse("LOADER_SETTING_POWER", player, power)); - swItem.getItemStack().setAmount(power == 0 ? 1 : power); - if (!this.noop && this.power == power) swItem.setEnchanted(true); - return swItem; - } + @Override + public boolean hasTicks(LoaderMovement parent) { + return true; + } - private SWItem item(Player player) { - SWItem swItem = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS", player, ticks)); - swItem.getItemStack().setAmount((int) Math.min(ticks, 64)); - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - - @Override - public void noop() { - noop = true; - waitFor = false; + @Override + public void execute(Location location, BlockData blockData, LoaderMovement parent, int power, long ticks, Consumer delay) { + NO_WAIT_FOR.execute(location, blockData, parent, power, ticks, delay); + delay.accept(ticks); + } } } @@ -222,7 +158,8 @@ public class LoaderMovement extends LoaderInteractionElement { +public class LoaderNoteBlock extends LoaderInteractionElement { public LoaderNoteBlock(Location location) { - super(location); + super(location, NoteBlockSettingsEnum.INTERACT, NoteBlockSettingsEnum.NOOP, NoteBlockSettingsEnum.values()); } - public class NoteBlockSettings implements ElementSettings { + public enum NoteBlockSettingsEnum implements LoaderSettingsEnum { - private boolean interact = true; - - @Override - public SWItem menu(Player player) { - return menu(player, interact); - } - - private SWItem menu(Player player, boolean interact) { - SWItem swItem; - if (interact) { - swItem = new SWItem(Material.NOTE_BLOCK, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_INTERACT", player)); - } else { - swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_NOOP", player)); + NOOP { + @Override + public int getPos() { + return 2; } - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - @Override - public void execute(Consumer delay) { - if (location.getBlock().getType() != Material.NOTE_BLOCK) return; - NoteBlock noteBlock = (NoteBlock) location.getBlock().getBlockData(); - if (interact) { - if (noteBlock.getInstrument() == Instrument.BANJO) noteBlock.setInstrument(Instrument.BIT); - else noteBlock.setInstrument(Instrument.BANJO); - } else { - return; + @Override + public SWItem menu(Player player, LoaderNoteBlock parent, int power, long ticks) { + return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_NOOP", player)); } - location.getBlock().setBlockData(noteBlock); - } - @Override - public void click(Player player, Runnable backAction, Runnable deleteAction) { - SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); - for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7")); - swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run()); - swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run()); + @Override + public void execute(Location location, NoteBlock blockData, LoaderNoteBlock parent, int power, long ticks, Consumer delay) { - swInventory.setItem(2, item(player, false).getItemStack(), clickType -> { - interact = false; - click(player, backAction, deleteAction); - }); - swInventory.setItem(3, item(player, true).getItemStack(), clickType -> { - interact = true; - click(player, backAction, deleteAction); - }); - - swInventory.open(); - } - - private SWItem item(Player player, boolean interact) { - SWItem swItem = menu(player, interact); - if (swItem.getItemStack().equals(menu(player, this.interact).getItemStack())) { - swItem.setEnchanted(true); } - swItem.setLore(Collections.emptyList()); - return swItem; - } + }, - @Override - public void noop() { - interact = false; + INTERACT { + @Override + public int getPos() { + return 3; + } + + @Override + public SWItem menu(Player player, LoaderNoteBlock parent, int power, long ticks) { + return new SWItem(Material.NOTE_BLOCK, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_INTERACT", player)); + } + + @Override + public void execute(Location location, NoteBlock blockData, LoaderNoteBlock parent, int power, long ticks, Consumer delay) { + if (blockData.getInstrument() == Instrument.BANJO) blockData.setInstrument(Instrument.BIT); + else blockData.setInstrument(Instrument.BANJO); + parent.update(blockData); + } } } @@ -113,7 +81,7 @@ public class LoaderNoteBlock extends LoaderInteractionElement { +public class LoaderOpenable extends LoaderInteractionElement { private String name; private Material material; public LoaderOpenable(Location location, String name, Material material) { - super(location); + super(location, OpenableSettingsEnum.INTERACT, OpenableSettingsEnum.NOOP, OpenableSettingsEnum.values()); this.name = name; this.material = material; } - public class TrapdoorSettings implements ElementSettings { + public enum OpenableSettingsEnum implements LoaderSettingsEnum { - private boolean noop = false; - private boolean interact = true; - private boolean open = false; - - @Override - public SWItem menu(Player player) { - return menu(player, noop, interact, open); - } - - private SWItem menu(Player player, boolean noop, boolean interact, boolean powered) { - SWItem swItem; - if (noop) { - swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName(name, "LOADER_INTERACTION_NOOP", player)); - } else if (interact) { - swItem = new SWItem(Material.STICK, translateItemName(name, "LOADER_INTERACTION_INTERACT", player)); - } else { - swItem = new SWItem(material, translateItemName(name, open ? "LOADER_INTERACTION_OPEN" : "LOADER_INTERACTION_CLOSED", player)); + NOOP { + @Override + public int getPos() { + return 2; } - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - @Override - public void execute(Consumer delay) { - if (location.getBlock().getType() != material) return; - Openable openable = (Openable) location.getBlock().getBlockData(); - if (noop) { - return; - } else if (interact) { - openable.setOpen(!openable.isOpen()); - } else { - openable.setOpen(open); + @Override + public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) { + return new SWItem(Material.STRUCTURE_VOID, translateItemName(parent.name, "LOADER_INTERACTION_NOOP", player)); } - location.getBlock().setBlockData(openable); - } - @Override - public void click(Player player, Runnable backAction, Runnable deleteAction) { - SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); - for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7")); - swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run()); - swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run()); - - swInventory.setItem(2, item(player, true, false, false).getItemStack(), clickType -> { - noop = true; - click(player, backAction, deleteAction); - }); - swInventory.setItem(3, item(player, false, true, false).getItemStack(), clickType -> { - noop = false; - interact = true; - click(player, backAction, deleteAction); - }); - swInventory.setItem(5, item(player, false, false, false).getItemStack(), clickType -> { - noop = false; - interact = false; - open = false; - click(player, backAction, deleteAction); - }); - swInventory.setItem(6, item(player, false, false, true).getItemStack(), clickType -> { - noop = false; - interact = false; - open = true; - click(player, backAction, deleteAction); - }); - - swInventory.open(); - } - - private SWItem item(Player player, boolean noop, boolean interact, boolean open) { - SWItem swItem = menu(player, noop, interact, open); - if (swItem.getItemStack().equals(menu(player, this.noop, this.interact, this.open).getItemStack())) { - swItem.setEnchanted(true); + @Override + public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer delay) { } - swItem.setLore(Collections.emptyList()); - return swItem; - } + }, - @Override - public void noop() { - noop = true; + INTERACT { + @Override + public int getPos() { + return 3; + } + + @Override + public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) { + return new SWItem(Material.STICK, translateItemName(parent.name, "LOADER_INTERACTION_INTERACT", player)); + } + + @Override + public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer delay) { + blockData.setOpen(!blockData.isOpen()); + parent.update(blockData); + } + }, + + CLOSED { + @Override + public int getPos() { + return 5; + } + + @Override + public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) { + return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_CLOSED", player)); + } + + @Override + public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer delay) { + blockData.setOpen(false); + parent.update(blockData); + } + }, + + OPEN { + @Override + public int getPos() { + return 6; + } + + @Override + public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) { + return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_OPEN", player)); + } + + @Override + public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer delay) { + blockData.setOpen(true); + parent.update(blockData); + } } } @@ -135,7 +119,7 @@ public class LoaderOpenable extends LoaderInteractionElement { +public class LoaderRepeater extends LoaderInteractionElement { public LoaderRepeater(Location location) { - super(location); + super(location, RepeaterSettingsEnum.INTERACT, RepeaterSettingsEnum.NOOP, RepeaterSettingsEnum.values()); } - public class RepeaterSettings implements ElementSettings { + public enum RepeaterSettingsEnum implements LoaderSettingsEnum { - private boolean interact = false; - private int delay = 1; - - @Override - public SWItem menu(Player player) { - return menu(player, interact, delay); - } - - private SWItem menu(Player player, boolean interact, int delay) { - SWItem swItem; - if (interact) { - swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_INTERACT", player)); - } else if (delay == 0) { - swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_NOOP", player)); - } else { - swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, delay)); - swItem.getItemStack().setAmount(delay); + NOOP { + @Override + public int getPos() { + return 1; } - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - @Override - public void execute(Consumer __) { - if (location.getBlock().getType() != Material.REPEATER) return; - Repeater repeater = (Repeater) location.getBlock().getBlockData(); - if (interact) { - int delay = repeater.getDelay(); - delay++; - if (delay > 4) delay = 1; - repeater.setDelay(delay); - } else if (delay == 0) { - return; - } else { - repeater.setDelay(delay); + @Override + public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) { + return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_NOOP", player)); } - location.getBlock().setBlockData(repeater, true); - } - @Override - public void click(Player player, Runnable backAction, Runnable deleteAction) { - SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); - for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7")); - swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run()); - swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run()); + @Override + public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer delay) { - swInventory.setItem(1, item(player, false, 0).getItemStack(), clickType -> { - interact = false; - delay = 0; - click(player, backAction, deleteAction); - }); - swInventory.setItem(2, item(player, true, -1).getItemStack(), clickType -> { - interact = true; - click(player, backAction, deleteAction); - }); - swInventory.setItem(4, item(player, false, 1).getItemStack(), clickType -> { - interact = false; - delay = 1; - click(player, backAction, deleteAction); - }); - swInventory.setItem(5, item(player, false, 2).getItemStack(), clickType -> { - interact = false; - delay = 2; - click(player, backAction, deleteAction); - }); - swInventory.setItem(6, item(player, false, 3).getItemStack(), clickType -> { - interact = false; - delay = 3; - click(player, backAction, deleteAction); - }); - swInventory.setItem(7, item(player, false, 4).getItemStack(), clickType -> { - interact = false; - delay = 4; - click(player, backAction, deleteAction); - }); - - swInventory.open(); - } - - private SWItem item(Player player, boolean interact, int delay) { - SWItem swItem = menu(player, interact, delay); - if (swItem.getItemStack().equals(menu(player, this.interact, this.delay).getItemStack())) { - swItem.setEnchanted(true); } - swItem.setLore(Collections.emptyList()); - return swItem; - } + }, - @Override - public void playerInteract() { - interact = true; - delay = 0; - } + INTERACT { + @Override + public int getPos() { + return 2; + } - @Override - public void noop() { - interact = false; - delay = 0; + @Override + public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) { + return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_INTERACT", player)); + } + + @Override + public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer delay) { + int repeaterDelay = blockData.getDelay(); + repeaterDelay++; + if (repeaterDelay > 4) repeaterDelay = 1; + blockData.setDelay(repeaterDelay); + parent.update(blockData); + } + }, + + DELAY_1 { + @Override + public int getPos() { + return 4; + } + + @Override + public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 1)); + swItem.getItemStack().setAmount(1); + return swItem; + } + + @Override + public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer delay) { + blockData.setDelay(1); + parent.update(blockData); + } + }, + + DELAY_2 { + @Override + public int getPos() { + return 5; + } + + @Override + public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 2)); + swItem.getItemStack().setAmount(2); + return swItem; + } + + @Override + public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer delay) { + blockData.setDelay(2); + parent.update(blockData); + } + }, + + DELAY_3 { + @Override + public int getPos() { + return 6; + } + + @Override + public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 3)); + swItem.getItemStack().setAmount(3); + return swItem; + } + + @Override + public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer delay) { + blockData.setDelay(3); + parent.update(blockData); + } + }, + + DELAY_4 { + @Override + public int getPos() { + return 7; + } + + @Override + public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) { + SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 4)); + swItem.getItemStack().setAmount(4); + return swItem; + } + + @Override + public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer delay) { + blockData.setDelay(4); + parent.update(blockData); + } } } @@ -148,7 +163,7 @@ public class LoaderRepeater extends LoaderInteractionElement { +public class LoaderTicks extends LoaderInteractionElement { private String name; private Material material; private int ticks; public LoaderTicks(Location location, String name, Material material, int ticks) { - super(location); + super(location, TicksSettingsEnum.NO_WAIT_FOR, TicksSettingsEnum.NOOP, TicksSettingsEnum.values()); this.name = name; this.material = material; this.ticks = ticks; } - public class TicksSettings implements ElementSettings { + public enum TicksSettingsEnum implements LoaderSettingsEnum { - private boolean noop = false; - private boolean waitFor = false; - - @Override - public SWItem menu(Player player) { - return menu(player, noop, waitFor); - } - - private SWItem menu(Player player, boolean noop, boolean waitFor) { - SWItem swItem; - if (noop) { - swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName(name, "LOADER_INTERACTION_NOOP", player)); - } else if (waitFor) { - swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_WAIT_FOR", player, ticks)); - } else { - swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_NO_WAIT_FOR", player, ticks)); - swItem.setEnchanted(true); - } - swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player))); - return swItem; - } - - @Override - public void execute(Consumer delay) { - if (location.getBlock().getType() != material) { - return; - } - if (noop) { - return; + NOOP { + @Override + public int getPos() { + return 2; } - Powerable powerable = (Powerable) location.getBlock().getBlockData(); - powerable.setPowered(true); - location.getBlock().setBlockData(powerable, true); - update(powerable); - - if (waitFor) { - delay.accept((long) ticks); - } - BauSystem.runTaskLater(BauSystem.getInstance(), () -> { - powerable.setPowered(false); - location.getBlock().setBlockData(powerable, true); - update(powerable); - }, ticks); - } - - @Override - public void click(Player player, Runnable backAction, Runnable deleteAction) { - SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player)); - for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7")); - swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run()); - swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run()); - - swInventory.setItem(2, item(player, true, false).getItemStack(), clickType -> { - noop = true; - click(player, backAction, deleteAction); - }); - if (ticks >= 0) { - swInventory.setItem(5, item(player, false, false).getItemStack(), clickType -> { - noop = false; - waitFor = false; - click(player, backAction, deleteAction); - }); - swInventory.setItem(6, item(player, false, true).getItemStack(), clickType -> { - noop = false; - waitFor = true; - click(player, backAction, deleteAction); - }); + @Override + public SWItem menu(Player player, LoaderTicks parent, int power, long ticks) { + return new SWItem(Material.STRUCTURE_VOID, translateItemName(parent.name, "LOADER_INTERACTION_NOOP", player)); } - swInventory.open(); - } - - private SWItem item(Player player, boolean noop, boolean waitFor) { - SWItem swItem = menu(player, noop, waitFor); - if (swItem.getItemStack().equals(menu(player, this.noop, this.waitFor).getItemStack())) { - swItem.setEnchanted(true); + @Override + public void execute(Location location, Powerable blockData, LoaderTicks parent, int power, long ticks, Consumer delay) { } - swItem.setLore(Collections.emptyList()); - return swItem; - } + }, - @Override - public void noop() { - noop = true; + NO_WAIT_FOR { + @Override + public int getPos() { + return 5; + } + + @Override + public SWItem menu(Player player, LoaderTicks parent, int power, long ticks) { + return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_NO_WAIT_FOR", player, ticks)); + } + + @Override + public void execute(Location location, Powerable blockData, LoaderTicks parent, int power, long ticks, Consumer delay) { + Powerable powerable = (Powerable) location.getBlock().getBlockData(); + powerable.setPowered(true); + parent.update(powerable); + + BauSystem.runTaskLater(BauSystem.getInstance(), () -> { + powerable.setPowered(false); + parent.update(powerable); + }, parent.ticks); + } + }, + + WAIT_FOR { + @Override + public int getPos() { + return 6; + } + + @Override + public SWItem menu(Player player, LoaderTicks parent, int power, long ticks) { + return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_WAIT_FOR", player, ticks)); + } + + @Override + public void execute(Location location, Powerable blockData, LoaderTicks parent, int power, long ticks, Consumer delay) { + NO_WAIT_FOR.execute(location, blockData, parent, power, ticks, delay); + delay.accept((long) parent.ticks); + } } } @@ -143,7 +110,7 @@ public class LoaderTicks extends LoaderInteractionElement