Spamversender
Schafhirte
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:
Dann in der onEnable-Methode dieses Objekt inizialisieren:
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ü:
Dann geht es an das Setzen der Items (Erklärungen folgen später):
(Items können auch per Menu.addItem(MenuItem) hinzugefügt werden)
und schließlich das Registrieren des Menüs:
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.
Abstrakte Methode:
Wenn ein MenuItem per "new MenuItem(parameter)" deklariert wurde, muss direkt dahinter folgendes (Eclipse weist auch darauf hin):
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.
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.
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
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
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.
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
});
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"
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ü
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){
}
}
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.
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
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);
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: