#getStorageContents()
, #getArmorContents()
, #getExtraContents()
] puis de recharger avec les mutateurs #set...
, donc faire une classe qui s'occupe de faire ça plus ou moins implicitement.public class InventoryBackup {
private final UUID holder;
private final ItemStack[] storageContents;
private final ItemStack[] armorContent;
private final ItemStack[] extraContents; // extraContents[0] == main secondaire (off hand)
public InventoryBackup(Player player) {
this(player.getInventory());
}
public InventoryBackup(PlayerInventory inventory) {
this.holder = Objects.requireNonNull(inventory.getHolder(), "Cannot save a playerless inventory").getUniqueId();
this.storageContents = inventory.getStorageContents();
this.armorContent = inventory.getArmorContents();
this.extraContents = inventory.getExtraContents();
// pour sauvegarder le curseur:
// inventory.getHeldItemSlot();
// inventory.setHeldItemSlot(itemSlot);
}
public void restore() {
Player holder = Bukkit.getPlayer(this.holder);
Objects.requireNonNull(holder, "Cannot restore an offline player inventory");
PlayerInventory inventory = holder.getInventory();
inventory.setStorageContents(storageContents);
inventory.setArmorContents(armorContent);
inventory.setExtraContents(extraContents);
holder.updateInventory();
}
}
InventoryBackup(...)
sont des constructeurs, ils ont exactement le même nom que la classe et ne doivent pas avoir de type de return (même void
).new
avec tes propres paramètres et d'initialiser ta classe comme tu le veux :PlayerInventory inventory = ...;
InventoryBackup backup = new InventoryBackup(inventory);
this(player.getInventory())
appelant le second constructeur)Player player = ...;
InventoryBackup backup = new InventoryBackup(player);
InventoryBackup backup = new InventoryBackup(player.getInventory());
Objects.requireNonNull(...)
: vérifie que tu as bien importé la classe de java.util.Objects
et non d'un autre package.if
:// InventoryBackup(PlayerInventory inventory)
HumanEntity player = inventory.getHolder();
if(player == null)
throw new IllegalArgumentException("Cannot save a playerless inventory");
this.holder = player.getUniqueId();
// etc.
// restore()
Player holder = Bukkit.getPlayer(this.holder);
if(holder == null)
throw new IllegalStateException("Cannot restore an offline player inventory");
PlayerInventory inventory = holder.getInventory();
// etc.
storageContents
et extraContents
par une seule variable contents
et utilise le getter/setter approprié.Après pour l'erreur sur leObjects.requireNonNull(...)
: vérifie que tu as bien importé la classe dejava.util.Objects
et non d'un autre package.
Sinon tu peux simplement remplacer avec desif
:
Java:// InventoryBackup(PlayerInventory inventory) HumanEntity player = inventory.getHolder(); if(player == null) throw new IllegalArgumentException("Cannot save a playerless inventory"); this.holder = player.getUniqueId(); // etc.
Java:// restore() Player holder = Bukkit.getPlayer(this.holder); if(holder == null) throw new IllegalStateException("Cannot restore an offline player inventory"); PlayerInventory inventory = holder.getInventory(); // etc.
Ça ne me dérange pas de te remettre le code pour la 1.8 (le miens étant pour la 1.16), mais bon faut aussi que tu comprennes les erreurs simples, au lieu d'attendre un code préfait qui fonctionne du premier coup. L'idée est plutôt de te donner la piste à explorer qu'une solution fonctionnelle.Enfin, si tu joues en 1.8, remplace simplement les deuxstorageContents
etextraContents
par une seule variablecontents
et utilise le getter/setter approprié.
public class InventoryBackup {
private final UUID holder;
private final ItemStack[] contents;
private final ItemStack[] armorContent;
public InventoryBackup(Player player) {
this(player.getInventory());
}
public InventoryBackup(PlayerInventory inventory) {
HumanEntity player = inventory.getHolder();
if(player == null)
throw new IllegalArgumentException("Cannot save a playerless inventory");
this.holder = player.getUniqueId();
this.contents = inventory.getContents();
this.armorContent = inventory.getArmorContents(); // peut-être déjà inclus dans #getContents() pour la 1.8
// pour sauvegarder le curseur:
// inventory.getHeldItemSlot();
// inventory.setHeldItemSlot(itemSlot);
}
public void restore() {
Player holder = Bukkit.getPlayer(this.holder);
if(holder == null)
throw new IllegalStateException("Cannot restore an offline player inventory");
PlayerInventory inventory = holder.getInventory();
inventory.setContents(contents);
inventory.setArmorContents(armorContent);
holder.updateInventory();
}
}