Skip to content

Commit 399091b

Browse files
Improvements
Fix update, and remove methods. MenuType menu constructor now uses a HashMap instead of a LinkedHashMap so it's faster <3
1 parent d6377f3 commit 399091b

File tree

1 file changed

+85
-64
lines changed

1 file changed

+85
-64
lines changed

src/main/java/me/flame/menus/menu/BaseMenu.java

Lines changed: 85 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import me.flame.menus.items.MenuItem;
1111
import me.flame.menus.menu.fillers.Filler;
12+
import me.flame.menus.menu.fillers.MenuFiller;
1213
import me.flame.menus.menu.iterator.MenuIterator;
1314
import me.flame.menus.modifiers.Modifier;
1415

@@ -35,8 +36,6 @@
3536

3637
import static org.bukkit.ChatColor.translateAlternateColorCodes;
3738

38-
// changed
39-
4039
@Getter
4140
@ApiStatus.NonExtendable
4241
@SuppressWarnings({ "unused", "BooleanMethodIsAlwaysInverted", "unchecked", "UnusedReturnValue" })
@@ -45,17 +44,14 @@ public abstract class BaseMenu<M extends BaseMenu<M>> implements IMenu<M> {
4544
protected Inventory inventory;
4645

4746
@NotNull
48-
protected final MenuType type;
47+
protected MenuType type = MenuType.CHEST;
4948

5049
@NotNull
5150
protected final EnumSet<Modifier> modifiers;
5251

5352
@NotNull
5453
protected final Map<Integer, MenuItem> itemMap;
5554

56-
@NotNull
57-
protected final Filler filler = Filler.from(this);
58-
5955
@NotNull
6056
private final MenuIterator iterator = new MenuIterator(IterationDirection.HORIZONTAL, this);
6157

@@ -65,6 +61,8 @@ public abstract class BaseMenu<M extends BaseMenu<M>> implements IMenu<M> {
6561
@NotNull
6662
private static final BukkitScheduler sch = Bukkit.getScheduler();
6763

64+
protected @Setter MenuFiller defaultFiller = Filler.from(this);
65+
6866
protected int rows = 1, size;
6967

7068
protected @Setter boolean dynamicSizing = false, updating = false;
@@ -85,7 +83,6 @@ public BaseMenu(MenuType type, String title, EnumSet<Modifier> modifiers) {
8583
}
8684

8785
public BaseMenu(int rows, String title, @NotNull EnumSet<Modifier> modifiers, boolean colorize) {
88-
this.type = MenuType.CHEST;
8986
this.modifiers = modifiers;
9087
this.rows = rows;
9188
this.title = colorize ? translateAlternateColorCodes('&', title) : title;
@@ -99,12 +96,20 @@ public BaseMenu(int rows, String title, @NotNull EnumSet<Modifier> modifiers, bo
9996
this.modifiers = modifiers;
10097
this.title = colorize ? translateAlternateColorCodes('&', title) : title;
10198
this.size = type.getLimit();
102-
this.itemMap = new LinkedHashMap<>(size);
99+
this.itemMap = new HashMap<>(size);
103100
this.inventory = Bukkit.createInventory(this, type.getType(), title);
104101
}
105102

106103
private static final Material AIR = Material.AIR;
107104

105+
public MenuFiller getFiller() {
106+
return getFiller(Filler.class);
107+
}
108+
109+
public <T extends MenuFiller> T getFiller(Class<T> value) {
110+
return value.cast(defaultFiller);
111+
}
112+
108113
public MenuIterator iterator() {
109114
return iterator;
110115
}
@@ -141,14 +146,8 @@ public M addItem(@NotNull final ItemStack... items) {
141146

142147
int slot = 0;
143148
for (final ItemStack guiItem : items) {
144-
if (slot >= size) {
145-
notAddedItems.add(guiItem);
146-
continue;
147-
}
148-
149-
while (occupiedSlots.contains(slot)) {
150-
slot++;
151-
}
149+
slot = getSlot(occupiedSlots, slot);
150+
if (isInvalidSlot(notAddedItems, slot, guiItem)) continue; // incase.
152151

153152
itemMap.put(slot, MenuItem.of(guiItem));
154153
slot++;
@@ -168,14 +167,8 @@ public M addItem(@NotNull final MenuItem... items) {
168167

169168
int slot = 0;
170169
for (final MenuItem guiItem : items) {
171-
if (slot >= size) {
172-
notAddedItems.add(guiItem);
173-
continue;
174-
}
175-
176-
while (occupiedSlots.contains(slot)) {
177-
slot++;
178-
}
170+
slot = getSlot(occupiedSlots, slot);
171+
if (isInvalidSlot(notAddedItems, slot, guiItem)) continue; // incase.
179172

180173
itemMap.put(slot, guiItem);
181174
slot++;
@@ -189,6 +182,32 @@ public M addItem(@NotNull final MenuItem... items) {
189182
return (M) this;
190183
}
191184

185+
private boolean isInvalidSlot(List<MenuItem> notAddedItems, int slot, MenuItem guiItem) {
186+
if (slot >= size) {
187+
notAddedItems.add(guiItem);
188+
return true;
189+
}
190+
return false;
191+
}
192+
193+
private boolean isInvalidSlot(List<ItemStack> notAddedItems, int slot, ItemStack guiItem) {
194+
if (slot >= size) {
195+
notAddedItems.add(guiItem);
196+
return true;
197+
}
198+
return false;
199+
}
200+
201+
private static int getSlot(Set<Integer> occupiedSlots, int slot) {
202+
while (true) {
203+
boolean contains = occupiedSlots.contains(slot);
204+
if (!contains) break;
205+
slot++;
206+
}
207+
208+
return slot;
209+
}
210+
192211
public M setItem(@NotNull Slot slot, ItemStack item) {
193212
if (!slot.isSlot()) return (M) this;
194213
itemMap.put(slot.slot, MenuItem.of(item));
@@ -211,28 +230,6 @@ public M setItem(int slot, MenuItem item) {
211230
return (M) this;
212231
}
213232

214-
public M removeItem(@NotNull final MenuItem item) {
215-
int size = itemMap.size();
216-
for (int i = 0; i < size; i++) {
217-
if (Objects.equals(item, itemMap.get(i))) {
218-
itemMap.remove(i);
219-
break;
220-
}
221-
}
222-
return (M) this;
223-
}
224-
225-
public M removeItem(@NotNull final ItemStack itemStack) {
226-
int size = itemMap.size();
227-
for (int i = 0; i < size; i++) {
228-
if (Objects.equals(itemStack, itemMap.get(i).getItemStack())) {
229-
itemMap.remove(i);
230-
break;
231-
}
232-
}
233-
return (M) this;
234-
}
235-
236233
public @Nullable MenuItem getItem(int i) {
237234
return itemMap.get(i);
238235
}
@@ -289,7 +286,7 @@ public Optional<MenuItem> get(Predicate<MenuItem> itemDescription) {
289286
return null;
290287
}
291288

292-
public M removeItems(@NotNull final ItemStack... itemStacks) {
289+
public M removeItem(@NotNull final ItemStack... itemStacks) {
293290
return removeItemStacks(Arrays.asList(itemStacks));
294291
}
295292

@@ -301,65 +298,89 @@ public M removeItemStacks(@NotNull final List<ItemStack> itemStacks) {
301298
if (item == null) continue;
302299

303300
val itemStack = item.getItemStack();
304-
if (set.contains(itemStack)) itemMap.remove(i);
301+
if (set.contains(itemStack)) {
302+
itemMap.remove(i);
303+
inventory.remove(itemStack);
304+
}
305305
}
306306
return (M) this;
307307
}
308308

309-
public M removeItems(@NotNull final MenuItem... itemStacks) {
310-
return removeItems(Arrays.asList(itemStacks));
309+
public M removeItem(@NotNull final MenuItem... items) {
310+
Set<MenuItem> slots = ImmutableSet.copyOf(items);
311+
312+
int size = itemMap.size();
313+
for (int i = 0; i < size; i++) {
314+
MenuItem item = itemMap.get(i);
315+
if (item != null && slots.contains(item)) {
316+
itemMap.remove(i);
317+
inventory.remove(item.getItemStack());
318+
}
319+
}
320+
return (M) this;
311321
}
312322

313-
public M removeItems(@NotNull final List<MenuItem> itemStacks) {
323+
@Override
324+
public M removeItem(@NotNull final List<MenuItem> itemStacks) {
314325
Set<MenuItem> set = ImmutableSet.copyOf(itemStacks);
315326
int size = itemMap.size();
316327
for (int i = 0; i < size; i++) {
317-
if (set.contains(itemMap.get(i))) itemMap.remove(i);
328+
MenuItem item = itemMap.get(i);
329+
if (set.contains(item)) {
330+
itemMap.remove(i);
331+
inventory.remove(item.getItemStack());
332+
}
318333
}
319334
return (M) this;
320335
}
321336

322-
public M update() {
337+
M update(Inventory inventory) {
323338
this.updating = true;
324-
recreateItems();
325-
List<HumanEntity> entities = ImmutableList.copyOf(inventory.getViewers());
339+
recreateItems(inventory);
340+
List<HumanEntity> entities = new ArrayList<>(inventory.getViewers());
326341
entities.forEach(e -> ((Player) e).updateInventory());
327342
this.updating = false;
328343
return (M) this;
329344
}
330345

346+
@Override
347+
public M update() {
348+
return this.update(this.inventory);
349+
}
350+
331351
public void updatePer(long repeatTime) {
332-
sch.runTaskTimer(Menus.plugin(), this::update, 0, repeatTime);
352+
sch.runTaskTimer(Menus.plugin(), () -> update(), 0, repeatTime);
333353
}
334354

335-
public void updatePer(Duration repeatTime) {
336-
sch.runTaskTimer(Menus.plugin(), this::update, 0, repeatTime.toMillis() / 50);
355+
public void updatePer(@NotNull Duration repeatTime) {
356+
sch.runTaskTimer(Menus.plugin(), () -> update(), 0, repeatTime.toMillis() / 50);
337357
}
338358

339359
public void updatePer(long delay, long repeatTime) {
340-
sch.runTaskTimer(Menus.plugin(), this::update, delay, repeatTime);
360+
sch.runTaskTimer(Menus.plugin(), () -> update(), delay, repeatTime);
341361
}
342362

343-
public void updatePer(Duration delay, Duration repeatTime) {
344-
sch.runTaskTimer(Menus.plugin(), this::update, delay.toMillis() / 50, repeatTime.toMillis() / 50);
363+
public void updatePer(@NotNull Duration delay, @NotNull Duration repeatTime) {
364+
sch.runTaskTimer(Menus.plugin(), () -> update(), delay.toMillis() / 50, repeatTime.toMillis() / 50);
345365
}
346366

347367
public M updateTitle(String title) {
368+
Inventory oldInventory = this.inventory;
348369
String colorizedTitle = translateAlternateColorCodes('&', title);
370+
this.updating = true;
349371
Inventory updatedInventory = type == MenuType.CHEST
350372
? Bukkit.createInventory(this, size, colorizedTitle)
351373
: Bukkit.createInventory(this, type.getType(), colorizedTitle);
352374
this.title = colorizedTitle;
353375
this.inventory = updatedInventory;
354376

355-
this.updating = true;
356-
List<HumanEntity> entities = ImmutableList.copyOf(inventory.getViewers());
377+
List<HumanEntity> entities = ImmutableList.copyOf(oldInventory.getViewers());
357378
entities.forEach(e -> e.openInventory(updatedInventory));
358379
this.updating = false;
359380
return (M) this;
360381
}
361382

362-
protected void recreateItems() {
383+
protected void recreateItems(Inventory inventory) {
363384
int size = itemMap.size();
364385
for (int i = 0; i < size; i++) {
365386
MenuItem menuItem = itemMap.get(i);

0 commit comments

Comments
 (0)