Skip to content
stefvanschie edited this page Jun 13, 2022 · 2 revisions

Talen: Engels (English)

Gui items verschillen iets van een normale ItemStack, omdat ze een actie geassocieerd hebben. Die actie wordt aangeroepen zodra iemand op dat item klikt, dus je hoeft geen InventoryClickEvents te registreren.

Een Gui item maken is erg makkelijk, neem gewoon je normale ItemStack en doe deze in de GuiItem constructor.

GuiItem item = new GuiItem(new ItemStack(Material.STONE));

Als je wilt dat dit Gui Item een actie heeft, kan je er een specificeren als de tweede parameter.

GuiItem item = new GuiItem(new ItemStack(Material.STONE), event -> event.getWhoClicked().sendMessage("Jij hebt geklikt!"));

En dat is het voor het niet-XML-gedeelte.

XML

Maar de XML-sectie is echter groot.

Oké, laten we hier stap voor stap doorheen gaan. Om een item aan een paneel toe te voegen kan je gewoon het item-element als kind aan dit paneel toevoegen.

<outlinepane x="0" y="0" length="9" height="6">
  <item/>
</outlinepane>

Elk item heeft tenminste een ID nodig, deze is hetzelfde als de normale Material waarde. Deze waarde is not hoofdlettergevoelig.

<item id="stone"/>

Dit is het minimale voor een item, dus we gaan nu naar de optionele attributen.

Optionele attributen

We kunnen ook specificeren hoeveel er van elk item moet zijn met het amount-attribuut. Normaal is de hoeveelheid één.

<item id="stone" amount="5"/>

En we kunnen ook de damage-waarde voor het item aangeven. Normaal is dit nul.

<item id="stone" damage=""3/>

We kunnen, net zoals voor de GUIs ook een field-, populate- en onClick-attribuut specificeren.

Voor de field, doe je het volgende.

<item id="stone" field="item"/>

En in de code het volgende.

GuiItem item;

Voor de populate, doe je het volgende.

<item id="stone" populate="populateItem"/>

En in de code het volgende.

public void populateItem(GuiItem item) {}

Het return-type kan zijn wat je wilt, maar het resultaat wordt altijd genegeerd.

En for de onClick, doe je het volgende.

<item id="stone" onClick="itemClick"/>

En in de code het volgende.

public void itemClick(InventoryClickEvent event) {}

De gespecificeerde methode moet public zijn. Het return-type kan zijn wat je wilt, maar het resultaat wordt altijd genegeerd. De InventoryClickEvent-parameter is optioneel.

Optionele kinderen

We kunnen een naam specificeren om als de naam van het item te nemen met het displayname element.

<item id="stone">
  <displayname>Een eigen naam!</displayname>
</item>

We kunnen ook een hoofdtexture specificeren om te gebruiken. Dit werkt alleen als het item een spelerhoofd is. Je kan of de owner specificeren die de naam van de eigenaar aangeeft of het id specificeren die de ID van een skin op het internet aangeeft. Als je een skin zoals deze hebt: http://textures.minecraft.net/texture/7c57f9192e81eb6897c24ecd4935cfb5a731a6f9a57abb51f2b35e8b4be7ebc, specificeer je de ID, dit is het laatste gedeelte met alle getallen en letters: 7c57f9192e81eb6897c24ecd4935cfb5a731a6f9a57abb51f2b35e8b4be7ebc.

<item id="player_head">
  <skull owner="notch"/>
</item>

<item id="player_head">
  <skull id="7c57f9192e81eb6897c24ecd4935cfb5a731a6f9a57abb51f2b35e8b4be7ebc"/>
</item>

En we kunnen een lore aangeven over meerdere regels met het lore-element die bestaat uit één of meerdere line-elementen.

<item id="stone">
  <lore>
    <line>Line 1</line>
    <line>Line 2</line>
  </lore>
</item>

We kunnen ook betoveringen specificeren met het enchantments-elements met meerdere enchantment-elementen erin. Deze hebben een id en een level. Het idis de naam van de betovering (niet hoofdlettergevoelig) en hetlevel` is de hoogte van de betovering.

<item id="stone">
  <enchantments>
    <enchantment id="durability" level="3"/>
    <enchantment id="arrow_damage" level="2"/>
  </enchantments>
</item>

Als je item model data nodig heeft, bijvoorbeeld vanwege een bronpakket, kan je deze specificeren via het modeldata-element.

<item id="stone">
  <modeldata>1</modeldata>
</item>

Het laatste ding dat je kan doen is iets ingewikkelder. Neem als voorbeeld een GUi waarin we onze vliegsnelheid kunnen aanpassen naar vijf verschillende instellingen. Eén voor de standaardsnelheid, één voor iets sneller, één voor nog iets sneller, etc. Elk item verwijst naar een andere methode, maar je kan zien dat de methodes erg op elkaar lijken.

public void flightSpeed1(InventoryClickEvent event) {
  ((Player) event.getWhoClicked()).setFlySpeed(0.1F);
}

public void flightSpeed2(InventoryClickEvent event) {
  ((Player) event.getWhoClicked()).setFlySpeed(0.2F);
}

public void flightSpeed3(InventoryClickEvent event) {
  ((Player) event.getWhoClicked()).setFlySpeed(0.3F);
}

//etc.

Dit is duidelijk onhandig. Dit is waarom er eigenschappen zijn. Eigenschappen zijn extra parameters die worden verstuurd zodra iemand op het item klikt en worden gedefinieerd in de GUI. Met deze eigenschappen kan je een universele methode maken voor alle vliegsnelheden en deze definiëren in het XML-bestand. Het XML ziet er als volgt uit.

<item id="stone" onClick="vliegsnelheid">
  <properties>
    <property type="float">0.1</property>
  </properties>
</item>
<item id="stone" onClick="vliegsnelheid">
  <properties>
    <property type="float">0.2</property>
  </properties>
</item>

Zoals je kan zien specificeren we een eigenschap en geven het een waarde, in dit geval 0.1 en 0.2. We kunnen een type specificeren voor de eigenschap, in dit geval float. Er zijn negen verschillende types.

  • byte
  • short
  • integer
  • long
  • float
  • double
  • character
  • boolean
  • string Als je geen type specificeert wordt string standaard gekozen. We kunnen ook meerdere eigenschappen voor één item hebben. Houd er rekening mee dat als je twee items hebt die naar dezelfde methode verwijzen dat deze items dezelfde eigenschap-types in dezelfde volgorde moeten hebben.

Onze code kan nu als volgt verandert worden.

public void vliegsnelheid(InventoryClickEvent event, float snelheid) {
  ((Player) event.getWhoClicked()).setFlySpeed(snelheid);
}

Dit kan gebruikt worden voor al onze vliegsnelheden. De snelheid-parameter heeft zijn waarde gespecificeerd in het XML-bestand en zal automatisch voor elke speler worden gebruikt.

Je kan ook als volgt je eigen eigenschap-type registreren.

Gui.registerProperty("myproperty", tekst -> {});

De tekst is de opgegeven tekst en je moet het de type laten teruggeven die je wilt specificeren in je methodes.

Clone this wiki locally