ServerPlugin "Grafisches Interface"

Dieses Thema im Forum "Programmierung" wurde erstellt von Kombustor, 8. April 2013.

  1. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Ich programmiere zurzeit an BattleRoyale (http://minecraft-server.eu/board/showthread.php?13630-Konzept-BattleRoyal-%96-Kit-PVP-Minispiel) und habe auch alle Kits programmiert!

    Ich möchte aber wenn man /klasse eingibt dass sich ein fenster öffnet, wo Items drinliegen welche man anklicken kann und somit die Kits bekommt, weiß jemand wie das geht, habe auf Google nichts gefunden!

    Könnte mir jemand einen Code schreiben?

    Wer nicht weiß was ich meine (auf dem Bild habe ich /kit eingegeben und das hat sich geöffnet!):
    [​IMG]

    Geht dies vielleicht mit einer virtual chest? Aber wie kann man dann interagieren?
     
    #1
  2. games6471
    Online

    games6471

    #2
  3. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Hab das Plugin... Ich schaue kurz, wie es heißt :D

    ##

    Das Plugin heißt ItemMenu
     
    #3
  4. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Habe die Klasse von dem Link den @games6471 erstellt (die iconMenu.class)

    Ich möchte jedoch das beim Klicken auf die icons im Menü ein Befehl ausgeführt wird, geht das irgendwie?

    Oder das eben ein Item für je eine Klasse steht und eben z.B eine ghastträne für den ghost, bei zeigen auf die ghastträne werden die lores angezeigt welche die infos zur klasse darstellen und bei klick wird im falle vom ghost dies ausgeführt:

    Code (Text):
    1. ItemStack Skalpell = new ItemStack(Material.STICK);
    2.         Skalpell.addUnsafeEnchantment( Enchantment.DAMAGE_ALL , 2);
    3.         ItemMeta SkalpellMeta = Skalpell.getItemMeta();
    4.         SkalpellMeta.setDisplayName(ChatColor.LIGHT_PURPLE + "Skalpell");
    5.         Skalpell.setItemMeta(SkalpellMeta);
    6.         p.getInventory().addItem(new ItemStack[] { Skalpell });
    7.        
    8.        
    9.        
    10.        
    11.        
    12.         p.getInventory().addItem(new ItemStack(364, 5));
    13.        
    14.         ItemStack CP = new ItemStack(Material.LEATHER_CHESTPLATE);
    15.         ItemMeta CPMeta = CP.getItemMeta();
    16.         CPMeta.setDisplayName(ChatColor.LIGHT_PURPLE + "Arztkittel");
    17.         CP.setItemMeta(CPMeta);
    18.         p.getInventory().setChestplate(CP);
    19.        
    20.        
    21.         ItemStack Boots = new ItemStack(Material.LEATHER_BOOTS);
    22.         ItemMeta BootsMeta = Boots.getItemMeta();
    23.         BootsMeta.setDisplayName(ChatColor.LIGHT_PURPLE + "Arzt-Schlappen");
    24.         Boots.setItemMeta(BootsMeta);
    25.         p.getInventory().setBoots(Boots);
    26.        
    27.         ItemStack item3 = new ItemStack(373, 2, (short) 8193);
    28.         ItemMeta item3Meta = item3.getItemMeta();
    29.         item3Meta.setDisplayName(ChatColor.LIGHT_PURPLE + "Blutspende");
    30.         item3.setItemMeta(item3Meta);
    31.         p.getInventory().addItem(new ItemStack[] { item3 });
    32.        
    33.        
    34.        
    35.         p.setDisplayName(ChatColor.AQUA+"[Doktor] "+ChatColor.RESET + p.getName());
     
    #4
  5. games6471
    Online

    games6471

    Ich glaube das hättest du auch selber rausfinden können.

    Code (Text):
    1.             @Override
    2.             public void onOptionClick(IconMenu.OptionClickEvent event) {
    3.                 event.getPlayer().sendMessage("You have chosen " + event.getName());
    4.                 event.setWillClose(true);
    5.             }
     
    #5
  6. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Hab nochmal editiert! Bitte das lesen!
     
    #6
  7. games6471
    Online

    games6471

    Entschulding, aber könntest du den zweiten Teil besser formulieren - nicht dass wir uns missverstehen.
     
    #7
  8. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Also ich möchte in dem menü eben verschiedene Items für jede Klasse eins!

    Wenn man auf die items klickt bekommt man die items, die für den Ghost seht ihr hier:

    Code (Text):
    1. //Schwert mit anderem namen³
    2.         ItemStack Schwert = new ItemStack(Material.STONE_SWORD);
    3.         ItemMeta SchwertMeta = Schwert.getItemMeta();
    4.         SchwertMeta.setDisplayName(ChatColor.DARK_GRAY + "Geisterschwert");
    5.         Schwert.setItemMeta(SchwertMeta);
    6.         p.getInventory().addItem(new ItemStack[] { Schwert });
    7.        
    8.        
    9.        
    10.         p.getInventory().addItem(new ItemStack(364, 5));
    11.        
    12.    
    13.         //Zucker
    14.    
    15.         p.getInventory().addItem(new ItemStack(353, 10));
    16.        
    17.        
    18.    
    19.         //GLOWSTONE_DUST
    20.         p.getInventory().addItem(new ItemStack(348, 5));
    21.        
    22.        
    23.        
    24.         p.setDisplayName(ChatColor.DARK_GRAY+"[Ghost] "+ChatColor.RESET + p.getName());
    So nun möchte ich das wenn man auf eine Ghastträne klickt diese Items bekommt, wie stell ich das an?

    Und ich möchte das Menü mit dem Befehl /klasse öffnen, dieser wird in der hauptklasse definiert
     
    #8
  9. games6471
    Online

    games6471

    Wie diese Menü geöffnet wird müsstest du bestimmt selber hinbekommen oder?

    Das andere ist auch nicht besonders schwer, wenn man sich einmal die verwendete Klasse genau anschaut. Ich meinte auch nicht, dass diese Code 1:1 nehmen solltest sondern eigentlich mit diesem eine Idee bekommst wie man soetwas aufbaut, aber nun gut. Ich werde es trotzdem erklären.

    Code (Text):
    1. .setOption(3, new ItemStack(Material.APPLE, 1), "Food", "The food is delicious")
    Mithilfe von .setOption() kannst du festlegen welche Items in dem Fake-Inventar abgebildet werden. Die Methode verlangt zusätzlich in den Parametern einen String (im Beispiel Food), welche die Variable für das Item deklariert.

    Sobald der jeweilige Spieler auf ein Item klickt wird dies ausgeführt:

    Code (Text):
    1.             @Override
    2.             public void onOptionClick(IconMenu.OptionClickEvent event) {
    3.  
    4. }
    Dort kannst du einfach mithilfe von event.getName() den Variable-Namen des geklickten Items abrufen und darauf deine Methoden oder Statements ausführen.
     
    #9
  10. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Ich hab jetzt in die herauskopiert Klasse "IconMenu" das geschrieben und komme nicht weiter:
    Code (Text):
    1.  
    2.     IconMenu menu = new IconMenu("Klassen:", 9, new IconMenu.OptionClickEventHandler() {
    3.         @Override
    4.         public void onOptionClick(IconMenu.OptionClickEvent event) {
    5.            
    6.            
    7.            
    8.             event.setWillClose(true);
    9.         }
    10.     }, plugin)
    11.     .setOption(0, new ItemStack(Material.STICK), "Doktor", "Items:", "- 2x Trank der Regeneration", "- 1x Stick (verzaubert auf Schärfe 2)", "- Lederschuhe", "- Lederharnisch", "- 5 Steaks")
    12.     .setOption(1, new ItemStack(Material.GHAST_TEAR, 1), "Ghost", "beschreibung");
    13.    
    14. }
    Was muss ich machen damit einem beim Klick nun die Items gegeben werden?
     
    #10
  11. games6471
    Online

    games6471

    Du sollst die Variable überprüfen, welche du mithilfe von event.getName() bekommst. Je nach dem welche Variable du bekommst deine passende Methode ausführen.
     
    #11
  12. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Kannst du mir bitte den Code geben, dann ist das Plugin erstmal fertig :(
     
    #12
  13. games6471
    Online

    games6471

    Du musst den Code auch verstehen, falls du den später noch verändern bzw. verbessern willst.
     
    #13
  14. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Ich versteh ihn wenn ich ihn anschaue, also wenn er fertig ist! Komm schon, ausnahmsweise :D
     
    #14
  15. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Ich hab jetzt in die IconMenu Klasse geschrieben:

    Code (Text):
    1.  
    2.     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    3.         if (sender instanceof Player) {
    4.             Player p = ((Player) sender).getPlayer();
    5.             IconMenu menu = new IconMenu("Menu", 27, new IconMenu.OptionClickEventHandler() {
    6.  
    7.                 @Override
    8.                 public void onOptionClick(IconMenu.OptionClickEvent event) {
    9.  
    10.                     event.setWillClose(true);
    11.                 }
    12.             }, [COLOR="#FF0000"]IconMenu.plugin[/COLOR]);
    13.             menu.setOption(3, new ItemStack(Material.APPLE, 1), "Food", "The food is delicious");
    14.             menu.setOption(4, new ItemStack(Material.IRON_SWORD, 1), "Weapon", "Weapons are for awesome people");
    15.             menu.setOption(5, new ItemStack(Material.EMERALD, 1), "Money", "Money brings happiness");
    16.             menu.open(p);
    17.             return true;
    18.         }
    19.         return false;
    20.     }
    21.  
    22.  
    Das rote wird unerringelt, was muss ich noch machen?
     
    #15
  16. games6471
    Online

    games6471

    Dort soll die Instanz deiner Main-Klasse hin. Also falls du in der Main-Klasse bist this.
     
    #16
  17. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Ja ist in der Main-Klasse, habe jetzt das doch "An internal Error occured while performing this command":

    Code (Text):
    1.  
    2.     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
    3.            
    4.            
    5.             Player p = (Player)sender;
    6.             String error = this.getConfig().getString("Config.messages.Klassen_error");
    7.             String mainPath = "Users.";
    8.             String kit = ".kit";
    9.            
    10.             if(cmd.getName().equalsIgnoreCase("klasse")){
    11.                 IconMenu menu = new IconMenu("Menu", 27, new IconMenu.OptionClickEventHandler() {
    12.                      
    13.                     @Override
    14.                     public void onOptionClick(IconMenu.OptionClickEvent event) {
    15.  
    16.                         event.setWillClose(true);
    17.                     }
    18.                 }, this.plugin);
    19.                 menu.setOption(3, new ItemStack(Material.SUGAR, 1), "Doktor", "DoktorInfo");
    20.                 menu.setOption(3, new ItemStack(Material.GHAST_TEAR, 1), "Ghost", "GhostInfo");
    21.                 menu.setOption(3, new ItemStack(Material.TNT, 1), "Pyro", "PyroInfo");
    22.                 menu.setOption(3, new ItemStack(Material.FIRE, 1), "Rambo", "RamboInfo");
    23.                 menu.setOption(3, new ItemStack(Material.STONE_SWORD, 1), "Scout", "ScoutInfo");
    24.                 menu.setOption(3, new ItemStack(Material.BOW, 1), "Sniper", "SniperInfo");
    25.                 menu.setOption(3, new ItemStack(Material.DIAMOND_SWORD, 1), "Tank", "TankInfo");
    26.                 menu.setOption(3, new ItemStack(Material.STICK, 1), "Zauberer", "ZaubererInfo");
    27.                
    28.                 menu.open(p);
    29.                 return true;
    30.                
    31.                
    32.                
    33.                
    34.                
    35.             }
    36.  
     
    #17
  18. games6471
    Online

    games6471

    Das man alles wieder hinterfragen muss. "An internal Error occured while performing this command" Schick uns mal den passenden Fehler in der Konsole oder Server.log. Es wäre viel schneller damit den Fehler zu finden.
     
    #18
  19. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Biddö :)
    Code (Text):
    1.  
    2. 2013-04-08 19:19:39 [INFO] KombustorLP issued server command: /klasse
    3. 2013-04-08 19:19:39 [SEVERE] null
    4. org.bukkit.command.CommandException: Unhandled exception executing command 'klasse' in plugin BattleRoyale v0.2.3.9
    5.     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46)
    6.     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:188)
    7.     at org.bukkit.craftbukkit.v1_5_R2.CraftServer.dispatchCommand(CraftServer.java:523)
    8.     at net.minecraft.server.v1_5_R2.PlayerConnection.handleCommand(PlayerConnection.java:966)
    9.     at net.minecraft.server.v1_5_R2.PlayerConnection.chat(PlayerConnection.java:884)
    10.     at net.minecraft.server.v1_5_R2.PlayerConnection.a(PlayerConnection.java:841)
    11.     at net.minecraft.server.v1_5_R2.Packet3Chat.handle(Packet3Chat.java:44)
    12.     at net.minecraft.server.v1_5_R2.NetworkManager.b(NetworkManager.java:292)
    13.     at net.minecraft.server.v1_5_R2.PlayerConnection.d(PlayerConnection.java:110)
    14.     at net.minecraft.server.v1_5_R2.ServerConnection.b(SourceFile:35)
    15.     at net.minecraft.server.v1_5_R2.DedicatedServerConnection.b(SourceFile:30)
    16.     at net.minecraft.server.v1_5_R2.MinecraftServer.r(MinecraftServer.java:578)
    17.     at net.minecraft.server.v1_5_R2.DedicatedServer.r(DedicatedServer.java:225)
    18.     at net.minecraft.server.v1_5_R2.MinecraftServer.q(MinecraftServer.java:474)
    19.     at net.minecraft.server.v1_5_R2.MinecraftServer.run(MinecraftServer.java:407)
    20.     at net.minecraft.server.v1_5_R2.ThreadServerApplication.run(SourceFile:573)
    21. Caused by: java.lang.NullPointerException
    22.     at de.diacrafting.BattleRoyale.IconMenu.<init>(IconMenu.java:42)
    23.     at de.diacrafting.BattleRoyale.BattleRoyale.onCommand(BattleRoyale.java:78)
    24.     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
    25.     ... 15 more
    26.  
     
    #19
  20. games6471
    Online

    games6471

    Du hast innerhalb des Itemmenu Konstruktors ein NPE. Schau mal nach, ob alle Paramter, die du an das Objekt übergeben hast einen richtigen Wert haben.
     
    #20