From a5262128c9c12ee143eea1b1297ca063b1739922 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Mon, 1 Feb 2021 12:24:25 +0100 Subject: [PATCH] 3 New Items Added AutoUpdateItem Added CycleItem Added AutoCycleItem --- .../invgui/item/impl/AutoCycleItem.java | 48 +++++++++++++++++ .../invgui/item/impl/AutoUpdateItem.java | 28 ++++++++++ .../invgui/item/impl/CommandItem.java | 4 +- .../invgui/item/impl/CycleItem.java | 52 +++++++++++++++++++ 4 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/studiocode/invgui/item/impl/AutoCycleItem.java create mode 100644 src/main/java/de/studiocode/invgui/item/impl/AutoUpdateItem.java create mode 100644 src/main/java/de/studiocode/invgui/item/impl/CycleItem.java diff --git a/src/main/java/de/studiocode/invgui/item/impl/AutoCycleItem.java b/src/main/java/de/studiocode/invgui/item/impl/AutoCycleItem.java new file mode 100644 index 0000000..635a097 --- /dev/null +++ b/src/main/java/de/studiocode/invgui/item/impl/AutoCycleItem.java @@ -0,0 +1,48 @@ +package de.studiocode.invgui.item.impl; + +import de.studiocode.invgui.InvGui; +import de.studiocode.invgui.item.Item; +import de.studiocode.invgui.item.itembuilder.ItemBuilder; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.scheduler.BukkitTask; + +/** + * An {@link Item} that automatically cycles through a predefined array of + * {@link ItemBuilder} at a predefined speed. + */ +public class AutoCycleItem extends BaseItem { + + private final ItemBuilder[] itemBuilders; + private final BukkitTask task; + + private int state = -1; + + public AutoCycleItem(int period, ItemBuilder... itemBuilders) { + this.itemBuilders = itemBuilders; + task = Bukkit.getScheduler().runTaskTimer(InvGui.getInstance().getPlugin(), this::cycle, 0, period); + } + + public void cancel() { + task.cancel(); + } + + private void cycle() { + state++; + if (state == itemBuilders.length) state = 0; + notifyWindows(); + } + + @Override + public ItemBuilder getItemBuilder() { + return itemBuilders[state]; + } + + @Override + public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { + // empty + } + +} diff --git a/src/main/java/de/studiocode/invgui/item/impl/AutoUpdateItem.java b/src/main/java/de/studiocode/invgui/item/impl/AutoUpdateItem.java new file mode 100644 index 0000000..79d85fa --- /dev/null +++ b/src/main/java/de/studiocode/invgui/item/impl/AutoUpdateItem.java @@ -0,0 +1,28 @@ +package de.studiocode.invgui.item.impl; + +import de.studiocode.invgui.InvGui; +import de.studiocode.invgui.item.Item; +import de.studiocode.invgui.item.itembuilder.ItemBuilder; +import org.bukkit.Bukkit; +import org.bukkit.scheduler.BukkitTask; + +import java.util.function.Supplier; + +/** + * An {@link Item} that updates it's {@link ItemBuilder} every specified amount + * of ticks. + */ +public class AutoUpdateItem extends SupplierItem { + + private final BukkitTask task; + + public AutoUpdateItem(int period, Supplier builderSupplier) { + super(builderSupplier); + task = Bukkit.getScheduler().runTaskTimer(InvGui.getInstance().getPlugin(), this::notifyWindows, 0, period); + } + + public void cancel() { + task.cancel(); + } + +} diff --git a/src/main/java/de/studiocode/invgui/item/impl/CommandItem.java b/src/main/java/de/studiocode/invgui/item/impl/CommandItem.java index bdf20e1..f3d9858 100644 --- a/src/main/java/de/studiocode/invgui/item/impl/CommandItem.java +++ b/src/main/java/de/studiocode/invgui/item/impl/CommandItem.java @@ -1,5 +1,6 @@ package de.studiocode.invgui.item.impl; +import de.studiocode.invgui.item.Item; import de.studiocode.invgui.item.itembuilder.ItemBuilder; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -7,7 +8,7 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.jetbrains.annotations.NotNull; /** - * An item that will force a player to run a command or say something in the chat when clicked. + * An {@link Item} that will force a player to run a command or say something in the chat when clicked. */ public class CommandItem extends SimpleItem { @@ -22,4 +23,5 @@ public class CommandItem extends SimpleItem { public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { player.chat(command); } + } diff --git a/src/main/java/de/studiocode/invgui/item/impl/CycleItem.java b/src/main/java/de/studiocode/invgui/item/impl/CycleItem.java new file mode 100644 index 0000000..a83d8df --- /dev/null +++ b/src/main/java/de/studiocode/invgui/item/impl/CycleItem.java @@ -0,0 +1,52 @@ +package de.studiocode.invgui.item.impl; + +import de.studiocode.invgui.item.Item; +import de.studiocode.invgui.item.itembuilder.ItemBuilder; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +/** + * An {@link Item} that cycles trough a predefined array of {@link ItemBuilder}s when clicked. + */ +public class CycleItem extends BaseItem { + + private final Consumer stateChangeHandler; + private final ItemBuilder[] states; + + private int state; + + public CycleItem(@Nullable Consumer stateChangeHandler, @NotNull ItemBuilder... states) { + this.stateChangeHandler = stateChangeHandler; + this.states = states; + } + + @Override + public ItemBuilder getItemBuilder() { + return states[state]; + } + + @Override + public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { + if (clickType.isLeftClick()) { + if (++state == states.length) state = 0; + handleStateChange(); + } else if (clickType.isRightClick()) { + if (--state < 0) state = states.length -1; + handleStateChange(); + } + } + + private void handleStateChange() { + if (stateChangeHandler != null) stateChangeHandler.accept(state); + } + + public int getState() { + return state; + } + +}