Bukkit - Inventory per Player

Discussion in 'Plugin Development' started by maxecito, Aug 29, 2015.

Thread Status:
Not open for further replies.
  1. Offline

    maxecito

    Pretty simple question, difficult solution, because I would need to edit my whole code.
    Im doing a Harry Potter plugin, and you are able to select a spell after you right--clicked your "wand" (a stick in this case)
    Now, I managed it to mess it up, because... Yeah, I created 1 Inventory for all. Everyone should be able to unlock different spells, and now when 1 changes, all change.

    I created the Inventory in a seperate class, and via some methodes I can receive / set everything I need.
    Now, I cannot find a way to receive the Player in the Inventory class without
    1) removing the modifiers = cant access it anymore
    2) the need to remove / rewrite 90% of my whole code

    CODE (SpellInventory):
    Code:
    package at.skyblock.main;
    
    import java.util.ArrayList;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.event.Listener;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    
    public class SpellInventory implements Listener {
    
       // Erstellt bei Rechtsklick mit dem Zauberstab das Inventar, in dem die
       // Spells gesetzt werden können. (!Nur erlernte werden angezeigt, siehe ->
       // SpellUnlocks!)
       // Die hier vorhandenen createDisplays() werden noch zu den Spellbooks (also
       // SpellUnlocks class) gemoved.
    
       public static Inventory spells = Bukkit.createInventory(null, 9,
           ChatColor.BOLD + "" + ChatColor.WHITE + "Choose your Spell");
    
       // Methode um dem Inventar auch von anderen Klassen (in diesem Fall
       // SpellUnlocks) Spells hinzuzufügen
       // Für die verarbeitung eines klicks auf eines der im Inventar vorhandenen
       // Items, ist die Main class zuständig
    
       public static void createDisplay(Material material, Inventory inv, int Slot, String name, String lore) {
         ItemStack item = new ItemStack(material);
         ItemMeta meta = item.getItemMeta();
         meta.setDisplayName(name);
         ArrayList<String> Lore = new ArrayList<String>();
         Lore.add(lore);
         meta.setLore(Lore);
         item.setItemMeta(meta);
    
         inv.setItem(Slot, item);
    
       }
       
       public static Inventory getInventory(){
       return spells;
       }
    
       // Selbsterklärend
       public static void removeDisplay(Inventory inv, Material material) {
    
         if (inv.contains(material)) {
           inv.remove(material);
         }
    
       }
    
       static {
         // Proceed to remove this section, and give all unlocks to the books
         // (see -> SpellUnlocks)
         createDisplay(Material.MOSSY_COBBLESTONE, spells, 6, "Petrificus Totalus", "Ganzkörperklammer Fluch");
         createDisplay(Material.TNT, spells, 7, "Bombarda", "Sprengzauber");
       }
    
    }
    
    
    • Main class: (Not really nesseccary, just in case someone wants to take a look at it)
    Code:
    package at.skyblock.main;
    
    import java.util.HashSet;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Color;
    import org.bukkit.FireworkEffect;
    import org.bukkit.FireworkEffect.Type;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.Sound;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.Firework;
    import org.bukkit.entity.LightningStrike;
    import org.bukkit.entity.LivingEntity;
    import org.bukkit.entity.Player;
    import org.bukkit.entity.TNTPrimed;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.FireworkMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.potion.PotionEffect;
    import org.bukkit.potion.PotionEffectType;
    import org.bukkit.util.Vector;
    
    public class Main extends JavaPlugin implements Listener {
       // Instanz der Main class wird in "SpellUnlocks" kreiiert
       private SpellUnlocks event = new SpellUnlocks(this);
    
       public void onEnable() {
         // Andere-Klassen Events werden regestriert
         getServer().getPluginManager().registerEvents(this, this);
         getServer().getPluginManager().registerEvents(event, this);
         getServer().getPluginManager().registerEvents(new SpellInventory(), this);
         // Fügt den Spellbooks die ItemMeta hinzu (Siehe funktion in SpellBooks)
         event.createSpellbooks();
    
         // Checkt im halben sekunden (20tick=1sec) Intervall ob der Spieler die
         // Sprüche schon hat, löscht sie falls nicht.
    
       }
    
       @EventHandler
       public void onSpellApply(PlayerJoinEvent e) {
         Player p = e.getPlayer();
         if (getConfig().getBoolean("MSPotter." + p.getUniqueId() + ".hasUnforgivableCurses") == true) {
    
           SpellInventory.createDisplay(Material.BEDROCK, SpellInventory.getInventory(), 0, "Avada Kedavra",
               "Todeszauber");
    
         } else if (getConfig().getBoolean("MSPotter." + p.getUniqueId() + ".hasUnforgivableCurses") != true) {
           SpellInventory.removeDisplay(SpellInventory.getInventory(), Material.BEDROCK);
         }
         if (getConfig().getBoolean("MSPotter." + p.getUniqueId() + ".hasBasicSpells") == true) {
    
           SpellInventory.createDisplay(Material.FIREWORK_CHARGE, SpellInventory.getInventory(), 1, "Stupefy",
               "Schockzauber");
           SpellInventory.createDisplay(Material.REDSTONE, SpellInventory.getInventory(), 2, "Expelliarmus",
               "Entwaffnungszauber");
    
         } else if (getConfig().getBoolean("MSPotter." + p.getUniqueId() + ".hasBasicSpells") != true) {
    
           SpellInventory.removeDisplay(SpellInventory.getInventory(), Material.FIREWORK_CHARGE);
           SpellInventory.removeDisplay(SpellInventory.getInventory(), Material.REDSTONE);
    
         }
    
       }
    
       // Selbsterklärend
       public void onDisable() {
         saveConfig();
       }
    
       // Checkt welcher Spell in Inventar ausgewählt wurde, und setzt diesen als
       // currentSpell für den Spieler
       @EventHandler
       public void chooseSpell(InventoryClickEvent event) {
         Player player = (Player) event.getWhoClicked();
         ItemStack clicked = event.getCurrentItem();
         Inventory inventory = event.getInventory();
    
         if (inventory.getName().equals(SpellInventory.spells.getName())) {
           event.setCancelled(true);
           if (clicked.getType() == Material.BEDROCK) {
    
             player.closeInventory();
             getConfig().set("MSPotter." + player.getUniqueId() + ".currentSpell", "AvadaKedavra");
             saveConfig();
           } else if (clicked.getType() == Material.FIREWORK_CHARGE) {
    
             player.closeInventory();
             getConfig().set("MSPotter." + player.getUniqueId() + ".currentSpell", "Stupefy");
             saveConfig();
           } else if (clicked.getType() == Material.REDSTONE) {
    
             player.closeInventory();
             getConfig().set("MSPotter." + player.getUniqueId() + ".currentSpell", "Expelliarmus");
             saveConfig();
           } else if (clicked.getType() == Material.MOSSY_COBBLESTONE) {
    
             player.closeInventory();
             getConfig().set("MSPotter." + player.getUniqueId() + ".currentSpell", "PetrificusTotalus");
             saveConfig();
           } else if (clicked.getType() == Material.TNT) {
             player.closeInventory();
             getConfig().set("MSPotter." + player.getUniqueId() + ".currentSpell", "Bombarda");
             saveConfig();
           }
         }
    
       }
    
       // Hauptteil: Checkt bei Linksklick mit dem Zauberstab, welcher Spell
       // gesetzt ist, führt diesen dann mit Partikeln sound on effekten aus.
       @SuppressWarnings({ "deprecation", "unused" })
       @EventHandler
       public void useSpell(PlayerInteractEvent e) {
    
         final Player p = e.getPlayer();
         if (e.getAction().equals(Action.LEFT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK)) {
           if (p.getItemInHand().getType().equals(Material.STICK)) {
             Location loc = p.getTargetBlock((HashSet<Byte>) null, 20).getLocation();
    
             final Firework f = (Firework) p.getWorld().spawn(loc.add(0, 1.5, 0), Firework.class);
             FireworkMeta fm = f.getFireworkMeta();
    
             if (getConfig().getString("MSPotter." + p.getUniqueId() + ".currentSpell").equals("AvadaKedavra")) {
               if (getConfig().getBoolean("MSPotter." + p.getUniqueId() + ".cooldowns.AvadaKedavra") == false) {
    
                 getConfig().set("MSPotter." + p.getUniqueId() + ".cooldowns.AvadaKedavra", true);
    
                 p.playSound(p.getLocation(), Sound.ENDERDRAGON_GROWL, 1.0F, 0);
    
                 fm.addEffect(FireworkEffect.builder().flicker(false).trail(true).with(Type.BURST)
                     .withColor(Color.GREEN).withFade(Color.BLACK).build());
                 fm.setPower(5);
                 f.setFireworkMeta(fm);
    
                 this.getServer().getScheduler().scheduleAsyncDelayedTask(this, new Runnable() {
    
                   public void run() {
    
                     f.detonate();
    
                   }
                 }, 2L);
    
                 for (Entity en : f.getNearbyEntities(1, 1, 1)) {
    
                   if (en instanceof LivingEntity) {
                     LivingEntity le = (LivingEntity) en;
                     LightningStrike ls = (LightningStrike) le.getWorld().spawn(le.getLocation(),
                         LightningStrike.class);
                     le.setHealth(0);
    
                   }
                 }
    
                 this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
    
                   public void run() {
                     getConfig().set("MSPotter." + p.getUniqueId() + ".cooldowns.AvadaKedavra", false);
                   }
                 }, 6000L);
               }
               // #################################################################################################
    
             } else if (getConfig().getString("MSPotter." + p.getUniqueId() + ".currentSpell").equals("Stupefy")) {
    
               fm.addEffect(FireworkEffect.builder().flicker(false).trail(true).with(Type.BALL)
                   .withColor(Color.AQUA).withFade(Color.BLUE).build());
               fm.setPower(3);
               f.setFireworkMeta(fm);
               this.getServer().getScheduler().scheduleAsyncDelayedTask(this, new Runnable() {
    
                 public void run() {
    
                   f.detonate();
    
                 }
               }, 2L);
    
               for (Entity en : f.getNearbyEntities(1.5, 1.5, 1.5)) {
    
                 if (en instanceof LivingEntity) {
                   LivingEntity le = (LivingEntity) en;
                   le.setVelocity(p.getLocation().getDirection().multiply(3));
                   le.setVelocity(new Vector(le.getVelocity().getX(), 1.0D, le.getVelocity().getZ()));
                   if (le.getHealth() > 3) {
                     le.setHealth(le.getHealth() - 1.5);
                   }
                 }
    
               }
    
             } else
               if (getConfig().getString("MSPotter." + p.getUniqueId() + ".currentSpell").equals("Expelliarmus")) {
    
               p.playSound(p.getLocation(), Sound.SHOOT_ARROW, 1.0F, 0);
               fm.addEffect(FireworkEffect.builder().flicker(false).trail(true).with(Type.STAR)
                   .withColor(Color.RED).build());
               fm.setPower(1);
               f.setFireworkMeta(fm);
               this.getServer().getScheduler().scheduleAsyncDelayedTask(this, new Runnable() {
    
                 public void run() {
    
                   f.detonate();
    
                 }
               }, 2L);
    
               for (Entity en : f.getNearbyEntities(1, 1, 1)) {
    
                 if (en instanceof Player) {
    
                   Player target = (Player) en;
    
                   if (target.getInventory().getItemInHand().getType().equals(Material.STICK)) {
                     if (target.getInventory().getItemInHand() != null
                         && target.getInventory().getItemInHand().getType() != Material.AIR) {
    
                       ItemStack wand = target.getInventory().getItemInHand();
                       p.getWorld().dropItemNaturally(p.getLocation(), wand);
    
                       target.getInventory().remove(Material.STICK);
    
                     }
                   } else {
                     p.sendMessage(ChatColor.RED + "Dein Gegner hat keinen Zauberstab in der Hand!");
                   }
    
                 }
    
               }
    
             } else if (getConfig().getString("MSPotter." + p.getUniqueId() + ".currentSpell")
                 .equals("PetrificusTotalus")) {
               p.playSound(p.getLocation(), Sound.ITEM_BREAK, 1.0F, 0);
    
               fm.addEffect(FireworkEffect.builder().flicker(false).trail(true).with(Type.BALL)
                   .withColor(Color.WHITE).build());
               fm.setPower(1);
               f.setFireworkMeta(fm);
               this.getServer().getScheduler().scheduleAsyncDelayedTask(this, new Runnable() {
    
                 public void run() {
    
                   f.detonate();
    
                 }
               }, 2L);
    
               for (Entity en : f.getNearbyEntities(1, 1, 1)) {
    
                 if (en instanceof LivingEntity) {
                   LivingEntity le = (LivingEntity) en;
                   if (le.isOnGround()) {
                     le.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 100, 10000));
                     le.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 100, -10000));
                   } else {
                     p.sendMessage(ChatColor.RED + "Du kannst nur Gegner am Boden treffen!");
                   }
                 }
    
               }
    
             } else if (getConfig().getString("MSPotter." + p.getUniqueId() + ".currentSpell").equals("Bombarda")) {
    
               p.playSound(p.getLocation(), Sound.EXPLODE, 1.0F, 0);
    
               TNTPrimed tnt = loc.getWorld().spawn(loc, TNTPrimed.class);
               tnt.setFuseTicks(0);
    
             }
           }
    
         } else if (e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
           if (p.getItemInHand().getType().equals(Material.STICK)) {
             p.openInventory(SpellInventory.spells);
           }
         }
       }
    
    }
    

    Would be GREAT if someone could help me out!

    - Maxecito / AscendedKitten
     
  2. Offline

    stefvanschie

    I assume you have saved somewhere who have which spells unlocked. When you're creating an inventory with the spells, before you add them, check if the player has that spell unlocked. If the player hasn't don't display it or make it another item or something.
     
Thread Status:
Not open for further replies.

Share This Page