2016-03-07 1 views
-2

J'essaie de faire du kitPvP simple avec l'API bukkit (principalement pour apprendre), mais j'ai du mal à sauvegarder l'inventaire d'un joueur avant de choisir un kit.Des kits simples avec l'API bukkit

Mon code en ce moment: (Fichier: Commands.java, il devient appelée main avec onCommand)

public boolean testkit(CommandSender sender, String[] args) { 
     if(sender instanceof Player) { 
      String kit = args[0]; // I know, may throw exception 
      Player player = (Player) sender; 
      PlayerInventory inventory = player.getInventory(); 
      // Backup inventory into HashMap(?) 

      if(kit.equalsIgnoreCase("basic")) { 
       // Clear inventory then give items to player (or replace) 
      } else if(kit.equalsIgnoreCase("out")) { 
       // Clear inventory then give backup to player (or replace) 
      } else { 
       sender.sendMessage("No such kit."); 
       return false; 
      } 
      return true; // Returns if a good kit selected 
     } else { 
      sender.sendMessage("Only players can select kits!"); 
      return false; 
     } 
    } 

Maintenant, j'ai un problème avec les pièces suivantes:

  • Sauvegarde l'inventaire d'un joueur
  • Remplacement de l'inventaire du joueur avec un autre inventaire

Je n'ai aucune idée de comment faire ces choses, parce que vous ne pouvez pas créer une nouvelle instance de PlayerInventory (c'est une interface), et je n'ai aucune idée de ce qui pourrait contenir les éléments du joueur. (Je sais aussi qu'un HashMap sera effacé si le serveur se ferme, mais ce n'est pas le point)

Aussi, j'imagine qu'il existe un moyen de remplacer l'inventaire du joueur par un autre, mais je n'ai absolument aucune idée de comment.

EDIT: Trouvé une solution plutôt non-délégante. Plus de here, a trouvé comment faire un nouvel inventaire, et fait une fonction pour itérer juste sur l'inventaire du joueur et copier les éléments dans la sauvegarde. Une question cependant: Est-ce que l'ItemStack sera mis à jour pour le nouvel inventaire s'il est changé à l'ancien inventaire? (Pas très important ici, mais important de savoir OMI) Si ce sera le cas, un moyen d'éviter cela?

Répondre

3

Ce que vous devriez faire est d'appeler getContents() dans l'inventaire du joueur, puis de sauvegarder le tableau qui retourne dans une HashMap. Vous puis clear() l'inventaire du joueur, et individuellement définir le contenu de chaque emplacement (ou, pour une solution plus élégante, avoir un ItemStack[] prêt pour les éléments de chaque kit, que vous pouvez pousser dans l'inventaire en utilisant setContents()).

Une fois que le lecteur est terminé avec le kit et que vous souhaitez restaurer son inventaire d'origine, vous n'avez qu'à setContents() avec la copie de ses éléments que vous avez stockée dans la HashMap.

Notez que la getContents() et setContents() ne traitent pas avec des fentes d'armure, afin de le faire, vous aurez envie aussi getArmorContents() et setArmorContents().

+1

Une note assez importante pour les autres utilisateurs qui pourraient lire ceci: elle n'inclut pas les emplacements d'armure, et je ne sais pas si elle inclut une fente pour main gauche. (Inclut clear, setcontents et getcontents) –

+0

ok, j'ai édité cela dans la réponse @AmitGold – hintss