3 New Items

Added AutoUpdateItem
Added CycleItem
Added AutoCycleItem
This commit is contained in:
NichtStudioCode 2021-02-01 12:24:25 +01:00
parent 73d5b0779d
commit a5262128c9
4 changed files with 131 additions and 1 deletions

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

@ -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<ItemBuilder> builderSupplier) {
super(builderSupplier);
task = Bukkit.getScheduler().runTaskTimer(InvGui.getInstance().getPlugin(), this::notifyWindows, 0, period);
}
public void cancel() {
task.cancel();
}
}

@ -1,5 +1,6 @@
package de.studiocode.invgui.item.impl; package de.studiocode.invgui.item.impl;
import de.studiocode.invgui.item.Item;
import de.studiocode.invgui.item.itembuilder.ItemBuilder; import de.studiocode.invgui.item.itembuilder.ItemBuilder;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.ClickType;
@ -7,7 +8,7 @@ import org.bukkit.event.inventory.InventoryClickEvent;
import org.jetbrains.annotations.NotNull; 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 { public class CommandItem extends SimpleItem {
@ -22,4 +23,5 @@ public class CommandItem extends SimpleItem {
public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) {
player.chat(command); player.chat(command);
} }
} }

@ -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<Integer> stateChangeHandler;
private final ItemBuilder[] states;
private int state;
public CycleItem(@Nullable Consumer<Integer> 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;
}
}