Added InventoryModifier#replaceItemStack

This commit is contained in:
themode 2021-04-03 15:01:36 +02:00
parent d1c10243a8
commit f52e10c2b2
4 changed files with 25 additions and 4 deletions

View File

@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.UnaryOperator;
/**
* Represents an inventory which can be viewed by a collection of {@link Player}.
@ -159,7 +160,13 @@ public class Inventory implements InventoryModifier, InventoryClickHandler, View
}
@Override
public void clear() {
public synchronized void replaceItemStack(int slot, @NotNull UnaryOperator<@NotNull ItemStack> operator) {
// Make the method synchronized
InventoryModifier.super.replaceItemStack(slot, operator);
}
@Override
public synchronized void clear() {
// Clear the item array
Arrays.fill(itemStacks, ItemStack.AIR);
// Send the cleared inventory to viewers

View File

@ -9,6 +9,7 @@ import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.function.UnaryOperator;
/**
* Represents an inventory where items can be modified/retrieved.
@ -75,6 +76,11 @@ public interface InventoryModifier {
}
}
default void replaceItemStack(int slot, @NotNull UnaryOperator<@NotNull ItemStack> operator) {
var currentItem = getItemStack(slot);
setItemStack(slot, operator.apply(currentItem));
}
/**
* Clears the inventory and send relevant update to the viewer(s).
*/

View File

@ -23,6 +23,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.UnaryOperator;
import static net.minestom.server.utils.inventory.PlayerInventoryUtils.*;
@ -73,7 +74,7 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler
}
@Override
public void setItemStack(int slot, @NotNull ItemStack itemStack) {
public synchronized void setItemStack(int slot, @NotNull ItemStack itemStack) {
PlayerSetItemStackEvent setItemStackEvent = new PlayerSetItemStackEvent(player, slot, itemStack);
player.callEvent(PlayerSetItemStackEvent.class, setItemStackEvent);
if (setItemStackEvent.isCancelled())
@ -107,7 +108,13 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler
}
@Override
public void clear() {
public synchronized void replaceItemStack(int slot, @NotNull UnaryOperator<@NotNull ItemStack> operator) {
// Make the method synchronized
InventoryModifier.super.replaceItemStack(slot, operator);
}
@Override
public synchronized void clear() {
// Clear the item array
Arrays.fill(itemStacks, ItemStack.AIR);

View File

@ -225,7 +225,8 @@ public class PlayerInit {
PlayerInventory inventory = player.getInventory();
ItemStack itemStack = ItemStack.of(Material.STONE, 64);
//inventory.addItemStack(itemStack);
inventory.addItemStack(itemStack);
inventory.replaceItemStack(0, i -> i.withAmount(32));
{
ItemStack item = ItemStack.builder(Material.DIAMOND_CHESTPLATE)