Skip to content

Commit 94c1d98

Browse files
Add Item.Builder#setCyclingItemProvider
1 parent f96744c commit 94c1d98

6 files changed

Lines changed: 50 additions & 6 deletions

File tree

invui/src/main/java/xyz/xenondevs/invui/internal/util/ArrayUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.util.HashMap;
77
import java.util.Map;
8+
import java.util.function.IntFunction;
89
import java.util.function.Predicate;
910

1011
public class ArrayUtils {
@@ -29,9 +30,8 @@ public static <T> Map<Integer, T> findAllOccurrences(@Nullable T[] array, Predic
2930
}
3031

3132
@NullUnmarked
32-
@SuppressWarnings("unchecked")
33-
public static <T> T[] concat(T first, T[] rest) {
34-
T[] result = (T[]) new Object[rest.length + 1];
33+
public static <T> T[] concat(IntFunction<T[]> newArray, T first, T[] rest) {
34+
T[] result = newArray.apply(rest.length + 1);
3535
result[0] = first;
3636
System.arraycopy(rest, 0, result, 1, rest.length);
3737
return result;

invui/src/main/java/xyz/xenondevs/invui/inventory/CompositeInventory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public final class CompositeInventory extends Inventory {
2626
*/
2727
public CompositeInventory(Inventory first, Inventory... other) {
2828
super(calculateSize(first, other));
29-
this.inventories = ArrayUtils.concat(first, other);
29+
this.inventories = ArrayUtils.concat(Inventory[]::new, first, other);
3030
}
3131

3232
/**

invui/src/main/java/xyz/xenondevs/invui/inventory/Inventory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -904,7 +904,7 @@ public int[] simulateAdd(ItemStack first, ItemStack... rest) {
904904
if (rest.length == 0) {
905905
return new int[] {simulateSingleAdd(first)};
906906
} else {
907-
ItemStack[] allStacks = ArrayUtils.concat(first, rest);
907+
ItemStack[] allStacks = ArrayUtils.concat(ItemStack[]::new, first, rest);
908908
return simulateMultiAdd(Arrays.asList(allStacks));
909909
}
910910
}
@@ -940,7 +940,7 @@ public boolean canHold(ItemStack first, ItemStack... rest) {
940940
if (rest.length == 0) {
941941
return simulateSingleAdd(first) == 0;
942942
} else {
943-
ItemStack[] allStacks = ArrayUtils.concat(first, rest);
943+
ItemStack[] allStacks = ArrayUtils.concat(ItemStack[]::new, first, rest);
944944
return Arrays.stream(simulateMultiAdd(Arrays.asList(allStacks))).allMatch(i -> i == 0);
945945
}
946946
}

invui/src/main/java/xyz/xenondevs/invui/item/CustomBoundItem.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import xyz.xenondevs.invui.util.TriConsumer;
1515
import xyz.xenondevs.invui.window.AbstractWindow;
1616

17+
import java.util.List;
1718
import java.util.function.*;
1819

1920
class CustomBoundItem<G extends Gui> extends AbstractBoundItem {
@@ -104,6 +105,23 @@ public Builder<G> setItemProvider(BiFunction<Player, G, ItemProvider> itemProvid
104105
return this;
105106
}
106107

108+
@Override
109+
public BoundItem.Builder<G> setCyclingItemProvider(int period, List<? extends ItemProvider> itemProviders) {
110+
if (itemProviders.isEmpty())
111+
throw new IllegalArgumentException("itemProviders must not be empty");
112+
113+
if (itemProviders.size() > 1) {
114+
updatePeriodically(period);
115+
this.itemProviderFn = (viewer, gui) -> {
116+
int i = (Bukkit.getCurrentTick() / period) % itemProviders.size();
117+
return itemProviders.get(i);
118+
};
119+
} else {
120+
setItemProvider(itemProviders.getFirst());
121+
}
122+
return this;
123+
}
124+
107125
@Override
108126
public Builder<G> async(ItemProvider placeholder) {
109127
this.asyncPlaceholder = placeholder;

invui/src/main/java/xyz/xenondevs/invui/item/CustomItem.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import xyz.xenondevs.invui.InvUI;
99
import xyz.xenondevs.invui.window.AbstractWindow;
1010

11+
import java.util.List;
1112
import java.util.function.BiConsumer;
1213
import java.util.function.Consumer;
1314
import java.util.function.Function;
@@ -78,6 +79,23 @@ public Builder setItemProvider(Function<Player, ItemProvider> itemProvider) {
7879
return this;
7980
}
8081

82+
@Override
83+
public Builder setCyclingItemProvider(int period, List<? extends ItemProvider> itemProviders) {
84+
if (itemProviders.isEmpty())
85+
throw new IllegalArgumentException("itemProviders must not be empty");
86+
87+
if (itemProviders.size() > 1) {
88+
updatePeriodically(period);
89+
this.itemProviderFn = viewer -> {
90+
int i = (Bukkit.getCurrentTick() / period) % itemProviders.size();
91+
return itemProviders.get(i);
92+
};
93+
} else {
94+
setItemProvider(itemProviders.getFirst());
95+
}
96+
return this;
97+
}
98+
8199
@Override
82100
public Builder async(ItemProvider placeholder) {
83101
this.asyncPlaceholder = placeholder;

invui/src/main/java/xyz/xenondevs/invui/item/Item.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import org.bukkit.event.inventory.ClickType;
55
import org.bukkit.inventory.ItemStack;
66
import xyz.xenondevs.invui.gui.Gui;
7+
import xyz.xenondevs.invui.internal.util.ArrayUtils;
78
import xyz.xenondevs.invui.window.Window;
89

10+
import java.util.List;
911
import java.util.function.BiConsumer;
1012
import java.util.function.Consumer;
1113
import java.util.function.Function;
@@ -65,6 +67,12 @@ interface Builder<S extends Builder<S>> {
6567

6668
S setItemProvider(Function<Player, ItemProvider> itemProvider);
6769

70+
default S setCyclingItemProvider(int period, ItemProvider itemProvider, ItemProvider... itemProviders) {
71+
return setCyclingItemProvider(period, List.of(ArrayUtils.concat(ItemProvider[]::new, itemProvider, itemProviders)));
72+
}
73+
74+
S setCyclingItemProvider(int period, List<? extends ItemProvider> itemProviders);
75+
6876
S async(ItemProvider placeholder);
6977

7078
S updatePeriodically(long period);

0 commit comments

Comments
 (0)