Bukkit Inventar problem

04/06/2014 00:16 .cryptex#1
Hey Community,

Ich programmiere derzeit an einem Server, und versuche
auch ein Inventar zu öffnen, klappt auch. Aber wie mache ich
dass man wenn man nur in dem bestimmten Inventar auf das Item klickt,
was bekommt und ich im normalen player Inventar? Weil immer
wenn ich dieses Item ausziehen will, bekommt ich das zeug grade nochmal.

Kann mir einer Helfen?

mfg
04/06/2014 00:25 Floppy012#2
Bin grade nicht am PC. Du kannst versuchen die Namen der Inventare miteinander zu vergleichen.

Ich versuche es mal zu beschreiben
Code:
Inventory inv //<- Das ist dein Custom inventory

@EventHandler
public void onInventoryClick(InventoryClickEvent event){
Inventory eventInv = e.getInventroy();
if(eventInv.getName().equals(inv.getName())){
//Hier das machen Wenn die Inventare gleich sind.
}
}
so ungefähr sollte es aussehen. Wie gesagt, ich bin nicht am pc. Also codefehler bitte nicht beachten.

Mit freundlichen Grüßen

Floppy012
04/06/2014 00:29 lordsill#3
Erstelle mit der Bukkit API ein neues Inventar
Speichere den Spieler, der via Befehl das Inventar geöffnet hat in z.b. einer Liste.
Wenn nun ein Klick (InventoryClickEvent war das glaube ich) passiert, prüfe, ob der Spieler in der Liste ist
mit dem InventoryCloseEvent prüfst du, ob der Spieler in der Liste ist. Wenn er es ist, entfernst du ihn wieder.

Beim InventoryClickEvent kannst du ja schauen, auf welchen Slot geklickt wurde über das Event. Werde die SlotID aus und gebe dem Spieler ein Item (oder was du auch immer machen wolltest)
04/06/2014 00:33 .cryptex#4
Das von Floppy kapiere ich nocht nicht^^.

Das von Lordsill werde ich mal testen.
04/06/2014 00:39 Floppy012#5
Du kannst den inventaren Namen geben. Dann gibst du dem Inventar, das du selber erstellt hast, einen Namen. Dann kannst du im InventoryClickEvent das Inventar durch das das Event ausgelöst wurde abrufen. Dann kannst du von beiden Inventaren die Namen abrufen und sie vergleichen. Sind diese gleich, dann wird es wohl dein eigens erstelltes Inventar sein, falls nicht, nicht. LordSill's variante ist sicherer aber länger.

Mit freundlichen Grüßen

Floppy012
04/06/2014 11:49 .cryptex#6
PHP Code:
@EventHandler
    
public void onJoinEvent(PlayerJoinEvent e) {
        
Player p e.getPlayer();
        
        
ItemStack pvptool = new ItemStack(Material.COMPASS);
        
ItemMeta pvptoolmeta pvptool.getItemMeta();
        
pvptoolmeta.setDisplayName("§cPvP-Tool");
        
pvptool.setItemMeta(pvptoolmeta);
        
        
p.getInventory().setItem(8pvptool);
        
p.sendMessage(prefix "Willkommen auf dem Server!");
    }
    
    @
EventHandler
    
public void onDropEvent(PlayerDropItemEvent e) {
        if(
e.getItemDrop().getItemStack().getItemMeta().getDisplayName().equalsIgnoreCase("§cPvP-Tool")) {
        
e.setCancelled(true);
        }
    }
    @
EventHandler
    
public void Inventory(InventoryClickEvent e) {
        
Player p = (Playere.getWhoClicked();
        
        if(
e.getInventory().getName().equalsIgnoreCase("§cPvP-Tool"));
        
        if(
e.getCurrentItem().getType() == Material.LEATHER_HELMET) {
               
e.getWhoClicked().closeInventory();
        }
    }
    
    @
EventHandler
    
public void OnInventoryClick(PlayerInteractEvent e) {
        
Player p e.getPlayer();
        
    if(
e.getItem().getItemMeta().getDisplayName().equalsIgnoreCase("§cPvP-Tool")) {
        
Inventory inv p.getServer().createInventory(null27"            PvP-Tool");
            
                
ItemStack glass = new ItemStack(Material.STAINED_GLASS_PANE,1,(short15);
                
ItemMeta glassmeta glass.getItemMeta();
                
glassmeta.setDisplayName(" ");
                
glass.setItemMeta(glassmeta);
                
                
inv.setItem(21glass);
                
inv.setItem(22glass);
                
inv.setItem(23glass);
                
            
p.getPlayer().openInventory(inv);
            }
        }
      

Ich glaube du meinst es dann so Floppy oder? Wenn ja dann habe ich ein Problem bei Inventory Click event.
04/06/2014 12:21 lordsill#7
Da sind nur einige Fehler drinne.
Hier hast du u.a. den Namen des Inventars festgelegt:
Code:
Inventory inv = p.getServer().createInventory(null, 27, "            PvP-Tool");
In diesem Fall: " PvP-Tool"

Nun prüfst du aber, ob der Spieler das Inventar "§cPvP-Tool" offen hat (welches zu keinem Zeitpunkt erstellt wurde)
Denn "§cPvP-Tool" ist der Anzeigename eines Items, aber nicht der des Inventars, weshalb du daher dort auch den Namen des Inventars nehmen solltest: (InventoryClickEvent)
Code:
if(e.getInventory().getName().equalsIgnoreCase("            PvP-Tool"))
{
//Der Spieler nutzt das "neue" Inventar
}
Innerhalb der {} setzt du dann den Code, der prüft, was angeklickt wurde im neuen Inventar (Welches aktuell 3x Glass enthält)
Dort kannst dann die SlotID prüfen und anschließend deine gewünschte Aktion ausführen, sofern der Spieler auf den richtigen Slot geklickt hat.
(verwende dazu am besten am ende der If Anweisung vom Inventar ein e.setCancelled(true); damit man sich das Item nicht aus dem Inventar klauen kann)
04/06/2014 13:39 .cryptex#8
Habs nun gedändert, aber trotzdem wird es auch im inventar geschlossen...
04/06/2014 14:48 ComputerBaer#9
Code:
    @EventHandler
    public void Inventory(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        
        if(e.getInventory().getName().equalsIgnoreCase("§cPvP-Tool"));
        
        if(e.getCurrentItem().getType() == Material.LEATHER_HELMET) {
               e.getWhoClicked().closeInventory();
        }
    }
+
Code:
if(e.getInventory().getName().equalsIgnoreCase("            PvP-Tool"))
{
//Der Spieler nutzt das "neue" Inventar
}
=
Code:
    @EventHandler
    public void Inventory(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        
        if(e.getInventory().getName().equalsIgnoreCase("            PvP-Tool"))
        {
            if(e.getCurrentItem().getType() == Material.LEATHER_HELMET) {
                e.getWhoClicked().closeInventory();
            }
        }
    }
Edit:
Ich kann allerdings nicht nachvollziehen, wieso du auf einen Lederhelm reagierst, aber nur Glas im Inventar hast.
04/06/2014 17:47 .cryptex#10
Habe ein Teil entfernt^^ Der Text wollte ich nicht so lang machen.