• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

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

Spamversender

Schafhirte
Registriert
9 März 2014
Beiträge
121
Diamanten
0
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:
public class Hauptklasse extends JavaPlugin {

  private MenuController menu;

}

Dann in der onEnable-Methode dieses Objekt inizialisieren:
Code:
public void onEnable(){
  menu = new MenuController();
}

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:
Menu main = new Menu(JavaPlugin, MenuController, String, int);
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:
main.setItems(new MenuItem[]{
  //hier kommen die Items rein
});
(Items können auch per Menu.addItem(MenuItem) hinzugefügt werden)

und schließlich das Registrieren des Menüs:
Code:
menu.registerMenu(String, Menu);
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:
new MenuItem("Button", Material.GRASS, 0, "Bla", "Bla", "Bla")
{
  @Override
  public void onClick(Player p, MenuController menuctrl){

  }
}
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:
this.createInv();
p.openInventory(this.inv);
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
 
Zuletzt bearbeitet:

FelixKlauke

Erzengel
Ehem. Teammitglied
Registriert
5 Januar 2014
Beiträge
1.038
Diamanten
299
Minecraft
FelixKlauke
-> 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.

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.
 

Spamversender

Schafhirte
Registriert
9 März 2014
Beiträge
121
Diamanten
0
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
 
Oben