fix: NPE on unavailable music discs on lower versions (#3475)

* fix: NPE on unavailable music discs

* chore: documentation for InventoryUtil changes

* fix: no need for additional decrement

* chore: address requested changes

* fix: prevent binary mismatch

Co-authored-by: Alex <mc.cache@web.de>
This commit is contained in:
Pierre Maurice Schwang 2022-02-04 18:21:43 +01:00 committed by GitHub
parent 0d78ba5f35
commit 543284e016
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 87 additions and 11 deletions

View File

@ -42,6 +42,7 @@ import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -50,11 +51,15 @@ import java.util.stream.IntStream;
@Singleton @Singleton
public class BukkitInventoryUtil extends InventoryUtil { public class BukkitInventoryUtil extends InventoryUtil {
private static ItemStack getItem(PlotItemStack item) { private static @Nullable ItemStack getItem(PlotItemStack item) {
if (item == null) { if (item == null) {
return null; return null;
} }
ItemStack stack = new ItemStack(BukkitAdapter.adapt(item.getType()), item.getAmount()); Material material = BukkitAdapter.adapt(item.getType());
if (material == null) {
return null;
}
ItemStack stack = new ItemStack(material, item.getAmount());
ItemMeta meta = null; ItemMeta meta = null;
if (item.getName() != null) { if (item.getName() != null) {
meta = stack.getItemMeta(); meta = stack.getItemMeta();
@ -104,14 +109,19 @@ public class BukkitInventoryUtil extends InventoryUtil {
} }
@Override @Override
public void setItem(PlotInventory inv, int index, PlotItemStack item) { public boolean setItemChecked(PlotInventory inv, int index, PlotItemStack item) {
BukkitPlayer bp = (BukkitPlayer) inv.getPlayer(); BukkitPlayer bp = (BukkitPlayer) inv.getPlayer();
InventoryView opened = bp.player.getOpenInventory(); InventoryView opened = bp.player.getOpenInventory();
if (!inv.isOpen()) { ItemStack stack = getItem(item);
return; if (stack == null) {
return false;
} }
opened.setItem(index, getItem(item)); if (!inv.isOpen()) {
return true;
}
opened.setItem(index, stack);
bp.player.updateInventory(); bp.player.updateInventory();
return true;
} }
@SuppressWarnings("deprecation") // Paper deprecation @SuppressWarnings("deprecation") // Paper deprecation

View File

@ -41,6 +41,7 @@ import com.plotsquared.core.plot.flag.implementations.MusicFlag;
import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.InventoryUtil; import com.plotsquared.core.util.InventoryUtil;
import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.Permissions;
import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.item.ItemTypes;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -148,8 +149,14 @@ public class Music extends SubCommand {
for (final String disc : DISCS) { for (final String disc : DISCS) {
final String name = String.format("<gold>%s</gold>", disc); final String name = String.format("<gold>%s</gold>", disc);
final String[] lore = {TranslatableCaption.of("plotjukebox.click_to_play").getComponent(player)}; final String[] lore = {TranslatableCaption.of("plotjukebox.click_to_play").getComponent(player)};
final PlotItemStack item = new PlotItemStack(disc, 1, name, lore); ItemType type = ItemTypes.get(disc);
inv.setItem(index++, item); if (type == null) {
continue;
}
final PlotItemStack item = new PlotItemStack(type, 1, name, lore);
if (inv.setItemChecked(index, item)) {
index++;
}
} }
// Always add the cancel button // Always add the cancel button

View File

@ -103,9 +103,32 @@ public class PlotInventory {
this.open = false; this.open = false;
} }
/**
* Put an item into this inventory
*
* @param index the index (= slot) where to place the item
* @param item the item to place
* @see #setItemChecked(int, PlotItemStack)
*/
public void setItem(int index, PlotItemStack item) { public void setItem(int index, PlotItemStack item) {
setItemChecked(index, item);
}
/**
* Put an item into this inventory, while also checking the existence of the material in the current version
*
* @param index the index (= slot) where to place the item
* @param item the item to place
* @return {@code true} if the item could be placed, otherwise {@code false}
* @see InventoryUtil#setItemChecked(PlotInventory, int, PlotItemStack)
* @since TODO
*/
public boolean setItemChecked(int index, PlotItemStack item) {
if (!this.inventoryUtil.setItemChecked(this, index, item)) {
return false;
}
this.items[index] = item; this.items[index] = item;
this.inventoryUtil.setItem(this, index, item); return true;
} }
public PlotItemStack getItem(int index) { public PlotItemStack getItem(int index) {

View File

@ -46,7 +46,21 @@ public class PlotItemStack {
final String id, final int amount, final String name, final String id, final int amount, final String name,
final String... lore final String... lore
) { ) {
this.type = ItemTypes.get(id); this(ItemTypes.get(id), amount, name, lore);
}
/**
* @param type The item type
* @param amount Amount of items in the stack
* @param name The display name of the item stack
* @param lore The item stack lore
* @since TODO
*/
public PlotItemStack(
final ItemType type, final int amount, final String name,
final String... lore
) {
this.type = type;
this.amount = amount; this.amount = amount;
this.name = name; this.name = name;
this.lore = lore; this.lore = lore;

View File

@ -38,11 +38,33 @@ public abstract class InventoryUtil {
public abstract void close(final PlotInventory inv); public abstract void close(final PlotInventory inv);
public abstract void setItem( /**
* Attempts to set an item into a {@link PlotInventory} while also checking the existence of the material
*
* @param plotInventory The inventory where the item should be placed
* @param index The index where to place the item
* @param item The item to place into the inventory
* @return {@code true} if the item could be placed, {@code false} otherwise (e.g. item not available in current version)
* @since TODO
*/
public abstract boolean setItemChecked(
final PlotInventory plotInventory, final int index, final PlotInventory plotInventory, final int index,
final PlotItemStack item final PlotItemStack item
); );
/**
* Attempts to set an item into a {@link PlotInventory}
*
* @param plotInventory The inventory where the item should be placed
* @param index The index where to place the item
* @param item The item to place into the inventory
* @see #setItemChecked(PlotInventory, int, PlotItemStack)
*/
public void setItem(final PlotInventory plotInventory, final int index,
final PlotItemStack item) {
setItemChecked(plotInventory, index, item);
}
public abstract PlotItemStack[] getItems(final PlotPlayer<?> player); public abstract PlotItemStack[] getItems(final PlotPlayer<?> player);
public abstract boolean isOpen(final PlotInventory plotInventory); public abstract boolean isOpen(final PlotInventory plotInventory);