|
| 1 | +--- |
| 2 | +title: Containermenüs |
| 3 | +description: Ein Leitfaden, in der erklärt wird, wie man ein einfaches Menü für einen Containerblock erstellt. |
| 4 | +authors: |
| 5 | + - Tenneb22 |
| 6 | +--- |
| 7 | + |
| 8 | +<!----> |
| 9 | + |
| 10 | +:::info VORAUSSETZUNGEN |
| 11 | + |
| 12 | +Du solltest zunächst den Abschnitt [Blockcontainer](./block-containers) lesen, um dich mit der Erstellung einer Containerblock-Entität vertraut zu machen. |
| 13 | + |
| 14 | +::: |
| 15 | + |
| 16 | +Wenn man einen Container, wie zum Beispiel eine Truhe, öffnet, sind hauptsächlich zwei Dinge erforderlich, um dessen Inhalt anzuzeigen: |
| 17 | + |
| 18 | +- ein `Screen`, der für das Rendering des Inhalts und des Hintergrunds auf dem Bildschirm zuständig ist. |
| 19 | +- ein `Menu`, das die Shift-Klick-Logik und die Synchronisation zwischen Server und Client handhabt. |
| 20 | + |
| 21 | +In diesem Leitfaden erstellen wir eine Erdkiste mit einem 3x3-Container, auf den man durch einen Rechtsklick und das Öffnen einer Oberfläche zugreifen kann. |
| 22 | + |
| 23 | +## Den Block erstellen {#creating-the-block} |
| 24 | + |
| 25 | +Zunächst möchten wir einen Block und eine Block-Entität erstellen; weitere Informationen findest du im Leitfaden [Blockcontainer](./block-containers#creating-the-block). |
| 26 | + |
| 27 | +@[code transcludeWith=:::block](@/reference/latest/src/main/java/com/example/docs/block/custom/DirtChestBlock.java) |
| 28 | + |
| 29 | +@[code transcludeWith=:::be](@/reference/latest/src/main/java/com/example/docs/block/entity/custom/DirtChestBlockEntity.java) |
| 30 | + |
| 31 | +::: info |
| 32 | + |
| 33 | +Da wir einen 3x3-Container wollen, müssen wir die Größe der Elemente auf 9 festlegen. |
| 34 | + |
| 35 | +::: |
| 36 | + |
| 37 | +### Das Menü öffnen {#opening-the-screen} |
| 38 | + |
| 39 | +Wir möchten das Menü irgendwie öffnen können, daher werden wir das innerhalb der Methode `useWithoutItem` umsetzen: |
| 40 | + |
| 41 | +@[code transcludeWith=:::use](@/reference/latest/src/main/java/com/example/docs/block/custom/DirtChestBlock.java) |
| 42 | + |
| 43 | +### Den MenuProvider implementieren {#implementing-menuprovider} |
| 44 | + |
| 45 | +Um die Menü-Funktionalität hinzuzufügen, müssen wir nun `MenuProvider` in der Block-Entität implementieren: |
| 46 | + |
| 47 | +@[code transcludeWith=:::menu](@/reference/latest/src/main/java/com/example/docs/block/entity/custom/DirtChestBlockEntity.java) |
| 48 | + |
| 49 | +Die Methode `getDisplayName` gibt den Namen des Blocks zurück, der oben auf der Oberfläche angezeigt wird. |
| 50 | + |
| 51 | +## Das Menü erstellen {#creating-the-menu} |
| 52 | + |
| 53 | +`createMenu` erwartet, dass wir ein Menü zurückgeben, aber wir haben noch keines für unseren Block erstellt. Um dies zu tun, werden wir eine Klasse `DirtChestMenu` erstellen, welche von `AbstractContainerMenu` erbt: |
| 54 | + |
| 55 | +@[code transcludeWith=:::menu](@/reference/latest/src/main/java/com/example/docs/menu/custom/DirtChestMenu.java) |
| 56 | + |
| 57 | +Der clientseitige Konstruktor wird auf dem Client aufgerufen, wenn der Server möchte, dass dort ein Menü geöffnet wird. Es erstellt einen leeren Container, der dann automatisch mit dem tatsächlichen Container auf dem Server synchronisiert wird. |
| 58 | + |
| 59 | +Der serverseitige Konstruktor wird auf dem Server aufgerufen, und da er den Inhalt des Containers kennt, kann er diesen direkt als Argument übergeben. |
| 60 | + |
| 61 | +`quickMoveStack` übernimmt den Shift-Klick auf Items innerhalb des Menüs. Dieses Beispiel bildet das Verhalten von Vanilla Menüs wie Truhen und Spendern nach. |
| 62 | + |
| 63 | +Zuerst müssen wir das Menü in einer neuen Klasse `ModMenuType` registrieren: |
| 64 | + |
| 65 | +@[code transcludeWith=:::registerMenu](@/reference/latest/src/main/java/com/example/docs/menu/ModMenuType.java) |
| 66 | + |
| 67 | +Wir können jetzt den Rückgabewert von `createMenu` in der Block-Entität setzen, um unser Menü zu verwenden: |
| 68 | + |
| 69 | +@[code transcludeWith=:::providerImplemented](@/reference/latest/src/main/java/com/example/docs/block/entity/custom/DirtChestBlockEntity.java) |
| 70 | + |
| 71 | +::: info |
| 72 | + |
| 73 | +Die Methode `createMenu` wird nur auf dem Server aufgerufen, daher rufen wir den serverseitigen Konstruktor auf und übergeben `this` (die Block-Entität) als Container-Parameter. |
| 74 | + |
| 75 | +::: |
| 76 | + |
| 77 | +## Die Oberfläche erstellen {#creating-the-screen} |
| 78 | + |
| 79 | +Um tatsächlich den Inhalt des Containers auf dem Client anzuzeigen, müssen wir außerdem eine Oberfläche für unser Menü erstellen. |
| 80 | +Wir werden eine neue Klasse erstellen, welche von `AbstractContainerScreen` erbt: |
| 81 | + |
| 82 | +@[code transcludeWith=:::screen](@/reference/latest/src/client/java/com/example/docs/rendering/screens/inventory/DirtChestScreen.java) |
| 83 | + |
| 84 | +Als Hintergrund für diese Oberfläche verwenden wir einfach die Standardtextur der Werfer-Oberfläche, da unsere Erdkiste dasselbe Slot-Layout verwendet. Du könntest alternativ deine eigene Textur für `CONTAINER_TEXTURE` bereitstellen. |
| 85 | + |
| 86 | +Da es sich hierbei um eine Oberfläche für ein Menü handelt, müssen wir es außerdem auf dem Client mit der Methode `MenuScreens#register()` registrieren: |
| 87 | + |
| 88 | +@[code transcludeWith=:::registerScreens](@/reference/latest/src/client/java/com/example/docs/ExampleModScreens.java) |
| 89 | + |
| 90 | +Wenn du dein Spiel geladen hast, solltest du nun eine Erdkiste haben, die du mit einem Rechtsklick öffnen kannst, um ein Menü aufzurufen und Items darin zu verstauen. |
| 91 | + |
| 92 | + |
0 commit comments