Hallöchen da draußen 
Ich bin seit gestern damit beschäftigt, unsere Menü Klassen etwas zu erweitern und eigentlich ist nurnoch eine Unschönheit übrig, mit der ich nicht fertig werde. Die Lage: Es gibt eine Parent Menüklasse "InventoryMenu" und, einfach gehalten, die beiden Childklassen OpenableMenu (Kisten, Trichter, Ofen, etc.) und HotbarMenu (die 9 Hotbarslots halt).
Mit dieser Basis habe ich dann alle Methoden zum Setzen der ClickHandler geschrieben und das ganze funktioniert auch ziemlich gut. Probleme entstehen jedoch durch den Wildcast der HotbarAction. Die HotbarAction ist so aufgebaut:
Methoden in der InventoryMenu Klasse sind zum Beispiel so aufgebaut:
Zuletzt wäre noch wichtig, den TargetContext zu zeigen, der ja die HotbarAction als Typ Argument hat:
So und jetzt zur eigentlichen Frage
In der Klassendefinition (Sorry, wenn ich hier vielleicht einige Fachwörter durcheinander bringe) der HotbarMenu Klasse kann ich ja keinen HotbarAction Typ wie Entity/Block/Item angeben, der soll ja für jeden ClickHandler spezifisch sein. Daher muss ich einen Wildcast nehmen.
Folglich wird die Beispielmethode die ich gesendet habe nicht wie in 1. sondern wie in 2. angelegt:
Wenn ich den ContextConsumer nun als Lamda anlege bei Methodenaufruf, dann gibt der TargetContext mir nicht zb "Entity" an, weil die im vorherigen Parameter angegebene HotbarAction den Typ <Entity> hat, sondern nur "capure of ?".
Also meine Methode wäre zb:
Wie als Kommentar geschrieben, muss ich nun den Target zu meinem Wunschtyp casten. Das Problem ist, ich programmiere die Menü Klassen, aber andere Entwickler sollen ja nur die Methoden aufrufen und müssen dann wild raten, welcher Typ das Target ist. Das ist ja nicht der Sinn und eigentlich ist alles da. Nur kann ich nicht angeben, dass die Wildcasts in " setClickHandler(int slot, HotbarAction<?> action, ContextConsumer<HotbarAction<?>> clickHandler)" vom gleichen Typ sind.
Ich hoffe, ich konnte mein Problem gut erklären und jemand hat eine Lösung oder Tips parat
allein schon ein Hint, was ich googlen könnte wäre eine Hilfe ^^
Liebe Grüße und Danke im Voraus,
Leo / CubBossa
Ich bin seit gestern damit beschäftigt, unsere Menü Klassen etwas zu erweitern und eigentlich ist nurnoch eine Unschönheit übrig, mit der ich nicht fertig werde. Die Lage: Es gibt eine Parent Menüklasse "InventoryMenu" und, einfach gehalten, die beiden Childklassen OpenableMenu (Kisten, Trichter, Ofen, etc.) und HotbarMenu (die 9 Hotbarslots halt).
Java:
public abstract class InventoryMenu<T, A extends ActionContext<T>, B extends BackContext, C extends CloseContext> {}
public abstract class OpenableMenu extends InventoryMenu<ClickType, ClickContext, BackContext, CloseContext> {}
public class HotbarMenu extends InventoryMenu<HotbarAction<?>, TargetContext<HotbarAction<?>, ?>, BackContext, CloseContext> {}
Mit dieser Basis habe ich dann alle Methoden zum Setzen der ClickHandler geschrieben und das ganze funktioniert auch ziemlich gut. Probleme entstehen jedoch durch den Wildcast der HotbarAction. Die HotbarAction ist so aufgebaut:
Java:
public class HotbarAction<T> {
public static final HotbarAction<Block> RIGHT_CLICK_BLOCK = new HotbarAction<>();
public static final HotbarAction<Entity> RIGHT_CLICK_ENTITY = new HotbarAction<>();
...
}
Methoden in der InventoryMenu Klasse sind zum Beispiel so aufgebaut:
Java:
public void setClickHandler(int slot, T action, @Nullable ContextConsumer<A> clickHandler) {}
Zuletzt wäre noch wichtig, den TargetContext zu zeigen, der ja die HotbarAction als Typ Argument hat:
Java:
public class TargetContext<A, T> extends ActionContext<A> {
//A ist der Action Type, also bei Hotbarmenüs HotbarAction<T>. T ist das Target, also bei RIGHT_CLICK_BLOCK die Klasse "Block"
private final T target;
public TargetContext(Player player, ItemStack itemStack, int slot, boolean cancelled, A action, T target) {
super(player, itemStack, slot, action, cancelled);
this.target = target;
}
}
So und jetzt zur eigentlichen Frage
In der Klassendefinition (Sorry, wenn ich hier vielleicht einige Fachwörter durcheinander bringe) der HotbarMenu Klasse kann ich ja keinen HotbarAction Typ wie Entity/Block/Item angeben, der soll ja für jeden ClickHandler spezifisch sein. Daher muss ich einen Wildcast nehmen.
Folglich wird die Beispielmethode die ich gesendet habe nicht wie in 1. sondern wie in 2. angelegt:
Java:
public <T> void setItemAndClickHandler(int slot, ItemStack item, HotbarAction<T> action, @Nullable ContextConsumer<TargetContext<HotbarAction<T>, T>> clickHandler) {}
public void setItemAndClickHandler(int slot, ItemStack item, HotbarAction<?> action, @Nullable ContextConsumer<TargetContext<HotbarAction<?>, ?>> clickHandler) {}
Wenn ich den ContextConsumer nun als Lamda anlege bei Methodenaufruf, dann gibt der TargetContext mir nicht zb "Entity" an, weil die im vorherigen Parameter angegebene HotbarAction den Typ <Entity> hat, sondern nur "capure of ?".
Also meine Methode wäre zb:
Java:
menu.setClickHandler(0, HotbarAction.LEFT_CLICK_ENTITY, context -> {
Entity e = context.getTarget(); //Hier verlangt er nun einen Cast.
});
Wie als Kommentar geschrieben, muss ich nun den Target zu meinem Wunschtyp casten. Das Problem ist, ich programmiere die Menü Klassen, aber andere Entwickler sollen ja nur die Methoden aufrufen und müssen dann wild raten, welcher Typ das Target ist. Das ist ja nicht der Sinn und eigentlich ist alles da. Nur kann ich nicht angeben, dass die Wildcasts in " setClickHandler(int slot, HotbarAction<?> action, ContextConsumer<HotbarAction<?>> clickHandler)" vom gleichen Typ sind.
Ich hoffe, ich konnte mein Problem gut erklären und jemand hat eine Lösung oder Tips parat
Liebe Grüße und Danke im Voraus,
Leo / CubBossa
Zuletzt bearbeitet: