ServerPlugin [Codeschnipsel] Menüs so einfach wie noch nie!

Dieses Thema im Forum "Selbstgeschriebene Plugins | Mods | Programme" wurde erstellt von Spamversender, 29. Oktober 2014.

  1. Spamversender
    Offline

    Spamversender

    Registriert seit:
    9. März 2014
    Beiträge:
    118
    Hallo,

    hier möchte ich euch meinen GUI/Menü-Codeschnipsel vorstellen.

    Was macht dieser Codeschnipsel?
    Mit dessen Hilfe könnt ihr eigene Menüs erstellen, definieren was beim Klick auf bestimmte Items passieren soll, und das alles ganz einfach ohne dass ihr selbst euch um die Erstellung des Inventares kümmern müsst!

    Die Klassen habe ich hier zur Verfügung gestellt: *Klick*

    Diese Klassen könnt ihr einfach in euer Projekt kopieren.

    Tutorial:

    Da der Codeschnipsel ziemlich umfangreich ist, möchte ich hier ein kleines Tutorial geben.


    1. Controller registrieren

    Einfach in eurer Hauptklasse eine Instanz der MenuController-Klasse erstellen:
    Code (Text):
    1.  
    2. public class Hauptklasse extends JavaPlugin {
    3.  
    4.   private MenuController menu;
    5.  
    6. }
    7.  
    Dann in der onEnable-Methode dieses Objekt inizialisieren:
    Code (Text):
    1.  
    2. public void onEnable(){
    3.   menu = new MenuController();
    4. }
    5.  
    Dann geht es an das Registrieren und erstellen der Menüs. Ich mache dies immer in einer Extra-Methode, da es sonst unübersichtlich werden kann.

    2. erstellen und registrieren

    Zuerst erstellt man ein neues Menü:
    Code (Text):
    1.  
    2. Menu main = new Menu(JavaPlugin, MenuController, String, int);
    3.  
    JavaPlugin: das Objekt der Hauptklasse, standardmäßig "this"
    MenuController: das soeben erstellte Objekt, also "menu" oder "this.menu"
    String: Die Überschrift/der Titel des Menüs. Unterstützt Farbcodes mit "&"
    int: Optional. Die Anzahl der Zeilen die das Menü haben soll*

    * Wenn die Plätze der Items mehr Zeilen als gegeben benötigen, werden auch mehr Zeilen erstellt. Dieser Parameter soll nur dazu dienen, das Menü schöner zu machen, indem man einfach ein paar Zeilen einfügt.

    Dann geht es an das Setzen der Items (Erklärungen folgen später):
    Code (Text):
    1.  
    2. main.setItems(new MenuItem[]{
    3.   //hier kommen die Items rein
    4. });
    5.  
    (Items können auch per Menu.addItem(MenuItem) hinzugefügt werden)

    und schließlich das Registrieren des Menüs:
    Code (Text):
    1.  
    2. menu.registerMenu(String, Menu);
    3.  
    String: Der Name/die ID des Menüs. Dazu da, um das Menü später wiederzzfinden, wenn es aufgerufen werden soll.
    Menu: Unser soeben erstelltes Menu, also "main"

    3. Items setzen
    Mit der wichtigste Punkt. Es gibt 4 verschiedene Arten von Items:
    MenuItem (Basisklasse)
    PrevMenuItem
    CommandMenuItem
    OpenMenuItem


    MenuItem:
    Diese Klasse sollte man nehmen, wenn bei Klick auf das Item umfangreichere Aktionen ausgeführt werden sollen.
    Dies ist die Basisklasse für alle anderen MenuItem-Klassen, vererbt somit dessen Methoden.

    MenuItem(String, Material, (int), int, String-Array)
    String: Die Beschriftung (Displayname) des Items. Farbcodes können mit '§' oder '&' eingeleitet werden.
    Material: Art des Items
    int: Optional. Metadaten des Items
    int: Slot im Inventar, von 0 beginnend, eine Zeile hat 9 Slots (letzter ist also Nummer 8)
    String-Array: Die Lore des Items (bspw. für Zusatzinformationen). "" wenn keine Lore vorhanden sein soll. Farbcodes können mit '§' und '&' eingeleitet werden.

    MenuItem(ItemStack, int)
    ItemStack
    : Ein ItemStack, der als item verwendet werden soll
    int: Slot im Menü

    Abstrakte Methode:
    Wenn ein MenuItem per "new MenuItem(parameter)" deklariert wurde, muss direkt dahinter folgendes (Eclipse weist auch darauf hin):
    Code (Text):
    1.  
    2. new MenuItem("Button", Material.GRASS, 0, "Bla", "Bla", "Bla")
    3. {
    4.   @Override
    5.   public void onClick(Player p, MenuController menuctrl){
    6.  
    7.   }
    8. }
    9.  
    In diese onClick-Methode kommt dann der Code, der ausgeführt werden soll, wenn das MenuItem ageklickt wurde. Der Player gibt den klickenden Spieler an, MenuController die an das Menü übergebene MenuController-Instanz.

    Nützliche Methoden:
    getSlot() - gibt den Slot zurück
    getItem() - gibt den ItemStack des MenuItems zurück

    PrevMenuItem
    Diese Klasse ist dazu dar, um einheitliche "Zurück"-Buttons darzustellen. Ich habe standardmäßig als Beschriftung "Zurück" (kursiv) und als Item einen Smaragd genommen. Diese Daten kann man in der PrevMenuItem-Klasse ändern.
    Dieses MenuItem kann nichts weiter, als ein anderes Menü zu öffnen.

    PrevMenuItem(int, String, String-Array)
    int: Slot des Items im Menü
    String: ID des Menüs welches sich bei Klick auf das PrevMenuItem öffnen soll
    String-Array: Optional. Lore des PrevMenuItems (bspw. "Zurück zum Hauptmenü"). Wenn nicht anders angegeben, wird sie gelb dargestellt.

    Eine Instanz von PrevMenuItem muss die Methode "onClick()" nicht mehr überschreiben.

    CommandMenuItem
    Diese Klasse sollte genutzt werden, wenn lediglich einer/mehrere Commands ausgeführt werden sollen.


    CommandMenuItem(String, Material, (int), String, int, String-Array)
    String: Beschriftung des Items
    Material: selbsterklärend
    int: Optional. Metadaten-Zahl des Items
    String: Entweder ein einzelner String oder ein String[]-Array. Gibt die Commands (mit oder ohne "/") an.
    int: Slot im Menü
    String-Array: Lore des Items

    CommandMenuItem(ItemStack, String, int)
    ItemStack
    : ItemStack des Items
    String: Entweder ein einzelner String oder ein String[]-Array. Gibt die Commands (mit oder ohne "/") an.
    int: Slot im Menü

    Auch hier muss die Methode "onClick()" nicht implementiert werden, da dies die CommandMenuItem-Klasse erledigt. Es werden lediglich alle Commands ausgeführt.

    OpenMenuItem
    Dieses MenuItem wird genutzt wenn ein anderes Menü geöffnet werden soll.

    OpenMenuItem(String, Material, (int), String, int, String-Array)
    String: Beschriftung
    Material: selbsterklärend
    int: Optional. Metadaten
    String: ID des Menüs welches geöffnet werden soll
    int: Slot
    String-Array: Lore

    OpenMenuItem(ItemStack, String, int)
    ItemStack
    : ItemStack des Items
    String: Menü welches geöffnet werden soll
    int: Slot

    Auch hier keine Implementierung von "onClick()" nötig.

    4. Dynamische Menüs
    Oft kommt es vor, dass man Menüs hat, die aktuelle Daten anzeigen sollen. Um ein solches Menü zu erstellen, muss man eine Klasse erstellen, die von der Menu-Klasse erbt. Dann überschreibt man die "open(Player p)"-Methode, und setzt erst dort die Items in das Menü. Am Ende müssen dann nur noch
    Code (Text):
    1.  
    2. this.createInv();
    3. p.openInventory(this.inv);
    4.  
    aufgerufen werden. Die erste Anweisung sorgt dafür dass ein Bukkit-Inventar erstellt wird und die zweite öffnet dieses dem Spieler.


    Sämtliche Listener sind schon in den Klassen integriert, ihr müsst also nicht mehr machen als hier gezeigt!


    Ich hoffe ich konnte Einigen etwas unter die Arme greifen und einen brauchbaren Codeschnipsel zur Verfügung stellen.
    Bitte gebt mir Kritik und Feedback was ich noch machen könnte.
    Bitte auch alle Bugs posten damit ich diese so schnell wie möglich aushebeln kann!


    LG Spam
     
    #1
    MiCrJonas gefällt das.
  2. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    -> Inizialisieren.
    Ansonsten schöner Code, außer, dass du für jedes Menü einen eigenen Listener benutzt. Auch Kommentare und angemessene Exceptions wären (zum Debugging) sinnvoll.
    Außerdem wäre ein Konstructor MenuItem(ItemStack) sinnvoll.
     
    #2
  3. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Du kannst von einem ausgewiesenen Codeschnipsel kaum eigene Exeptions, einen Debugmode und am besten auch noch eine eigene Log erwarten, das wäre zuviel des Guten. In den anderen Punkten muss und kann ich Jonas guten Herzens nur beipflichten.
     
    #3
  4. Spamversender
    Offline

    Spamversender

    Registriert seit:
    9. März 2014
    Beiträge:
    118
    danke für das Feedback!

    @MiCrJonas ein Konstruktor menuItem(ItemStack) wäre möglich, allerdings muss man da noch einen int für den Slot beitragen.
    Beim Listener muss ich mal schauen ob man den nicht in die Controller-Klasse tun kann.

    Ich werde das Ding auch gleich etwas kommentieren und potenzielle Fehler abfangen :)

    Allgemein werde ich mal schauen ob man die Konstruktoren nicht irgendwie zusammenfügen kann, denn langsam sind es mir zu viele :D
     
    #4
    MiCrJonas gefällt das.
  5. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Das habe ich auch nicht behauptet. Und Exceptions kann man auch in Codeschnipsel einbauen, wobei das hier schon mehr ist.
     
    #5
  6. Spamversender
    Offline

    Spamversender

    Registriert seit:
    9. März 2014
    Beiträge:
    118
    Aber API kannst du das auch nicht nennen ;)
     
    #6
  7. Spamversender
    Offline

    Spamversender

    Registriert seit:
    9. März 2014
    Beiträge:
    118
    Codeschnipsel bearbeitet, Konstruktoren mit ItemStacks wurden hinzugefügt.
     
    #7
    MiCrJonas gefällt das.