Nederlands Minecraft Forum

Minecraft => Tutorials => Topic gestart door: ShelLuser op 30 augustus 2018, 06:50:46

Titel: Het gebruik van 'strict JSON' in commando's
Bericht door: ShelLuser op 30 augustus 2018, 06:50:46
Hi gang!

Minecraft 1.13 is inmiddels uit (sterker nog: we zitten nu zelfs op 1.13.1) en een van de belangrijkste veranderingen ten opzichte van 1.12.2 is de commando structuur. Feitelijk is er gelukkig niet zo veel veranderd; een heleboel commando's mogen dan zijn aangepast, de structuur van de commando's is nog altijd hetzelfde.

JSON & NBT

Wanneer je extra eigenschappen wilt gebruiken binnen een commando dan moet je deze opgeven via NBT; het zogeheten Named Binary Tag formaat. NBT is een structuur waarin specifieke eigenschappen in een bepaald formaat worden opgeslagen en die ook specifieke limieten stelt aan dat formaat.

Dat klinkt allemaal lekker duur maar het is eigenlijk vrij eenvoudig. Neem een naam: een naam bestaat normaal gesproken uit letters, en dus wordt een naam normaliter opgeslagen als een zogenaamde String. De officiële benaming is TAG_String.

Soms heb je ook met nummers te maken. Dat wordt meteen een stukje lastiger want numerieke waardes kunnen binnen de NBT structuur op meerdere manieren worden opgeslagen. De meest gebruikte opslag is een Integer, ofwel TAG_Int. Daarnaast heb je ook andere varianten zoals een 'Short' (TAG_Short), 'Byte' (TAG_Byte) en een 'Float' (TAG_Float).

Een heleboel droge theorie, maar erg belangrijk om te weten wanneer je gebruik wilt maken van Minecraft commando's:

(https://i.imgur.com/OhTnECy.png)
De uitvoer van: /data get entity @p

Valt je iets op aan dit screenshot? Een heleboel numerieke eigenschappen hebben een rode letter achter hun waarde. Je kan duidelijk f, b en s onderscheiden. Precies hetgeen wat ik hierboven beschreef.

Goed, nu weten we iets meer over de structuur van al die eigenschappen, maar hoe schrijven we dit alles precies op?

Dat brengt ons bij het 2e deel: JSON, ofwel JavaScript Object Notation.

Voor ieder type eigenschap is er een bepaalde methode om deze te noteren. Neem een naam: ik had al eerder gezegd dat een naam TAG_String is. Wel, wanneer je een String een waarde wilt toekennen via de JSON notatie dan moet je deze binnen quotes plaatsen: "".

Heb je een lijst aan gegevens dan moet je een zogenaamde TAG_List definiëren, binnen JSON doe je dat door de waardes binnen blokhaken te plaatsen: []. Heb je echter een verzameling van definities (bijvoorbeeld: Naam:"ShelLuser", XP: 166) dan moet je gebruik maken van een zogenaamde Compound (TAG_Compound). Dat doe je door alle definities binnen gebroken haken te plaatsen: {}.

Ieder Minecraft commando wat je gebruikt om specifieke eigenschappen aan iets toe te kennen volgt deze specifieke structuur.

Korte zijsprong: het magische zwaard!

Stel ik wil mijzelf een magisch zwaard geven. Unbreaking 3, Sharpness 5, Looting 3 en Mending. Nou kunnen we natuurlijk met enchanted books & een anvil gaan lopen zooien of het /enchant commando gebruiken; het is makkelijker om alles met één commando te doen (helemaal met de command completion in 1.13):

/give @p minecraft:diamond_sword{Enchantments:[{id:"minecraft:unbreaking",lvl:3},{id:"minecraft:sharpness",lvl:5},{id:"minecraft:looting",lvl:3},{id:"minecraft:mending",lvl:3}]}

En zie: alle onderdelen die ik eerder heb genoemd. Enchantments is feitelijk een list, dat kan je zien aan de blokhaken: []. Om precies te zijn: een list van 'compounds', dat zie je aan de gebroken haken: {}. Binnen zo'n compound specificeer ik 2 waardes: een id en een level. De id is feitelijk een String (dat zien we aan de quotes) en lvl is een numerieke waarde. Een Integer om precies te zijn, dat is de standaard wanneer je niks anders opgeeft.

Maar wat nu als we dit zwaard een naam willen geven?

Strict JSON

In vorige versies van Minecraft was het opgeven van een naam simpel: het enige wat je hoefde te doen is een String opgeven. Ofwel: plaats de naam binnen quotes en je bent klaar. Helaas werkt dat niet meer met 1.13:

/give @p diamond_sword{display:{Name:"Slasher"}}

... de reden?  We moeten nu strict JSON gebruiken.

'Strict' is de Engelse benaming voor strikt, ofwel we moeten nu heel precies zijn met het gebruik van de notatie. Alles moet bijna letterlijk tot in de punten en komma's worden opgegeven. Gelukkig hoeft het allemaal niet zo moeilijk te zijn, maar als je je hier wat meer in verdiept dan zal je zien dat we nu bijzonder veel mogelijkheden hebben gekregen...

Een String gebruikt quotes, dus...

Ik heb al meerdere malen gesteld dat je quotes moet gebruiken als je een String (TAG_String) opgeeft. Met strict JSON moet dit letterlijk; Minecraft verwacht dat je heel specifiek quotes toe gaat passen.

Ofwel, dat commando hierboven wat niet werkt kan eenvoudig worden aangepast:

/give @p minecraft:diamond_sword{display:{Name:"\"Slasher\""}}

Dit werkt wel. Sommige mensen snappen niet goed waarom er ineens backslashes (\) worden gebruikt: dat is bedoeld om Minecraft te vertellen dat het volgende karakter (dus de quotes) negeert moet worden, dit wordt ook wel een 'escape' genoemd. Wanneer je geen backslash zou gebruiken dan zou Minecraft alleen "" zien. Een openingsquote en een er direct achteraan om af te sluiten. Maar dat moeten we dus voorkomen, vandaar de backslash.

En nu wat moeilijker...

Dit is natuurlijk niet de reden om strict JSON te gebruiken. Feitelijk foppen we het systeem een beetje met die extra quotes. De reden voor strict JSON is om extra eigenschappen aan je tekst toe te kunnen kennen. Neem dat zwaard hierboven: als je de cursor erover beweegt zal je zien dat het een schuin opgeschreven witte naam heeft. Wit is de standaard kleur en een naam wordt meteen schuin ('italic') wanneer je iets van naam veranderd.

Maar waarom maken we geen rode naam, niet schuin maar vet gedrukt? Slasher!

Binnen vorige versies van Minecraft was dit nagenoeg onmogelijk zonder truukjes te gebruiken. Bijvoorbeeld MCEdit of later via functies. Met 1.13 daarentegen...

/give @p minecraft:diamond_sword{display:{Name:"{\"text\":\"Slasher\",\"color\":\"red\",\"italic\":false,\"bold\":true}"}}

(https://i.imgur.com/VDmUoJy.png)

En dit, dames en heren, is een van de redenen waarom ik zo idolaat van Minecraft 1.13 ben. Dit soort escapades was voorheen simpelweg onmogelijk zonder het gebruik van 'cheats' (bijvoorbeeld het gebruik van kleur codes zoals §6§o binnen een functie).

Schrik niet: het kan nog erger! :o

Strict JSON wordt op meerdere plekken toegepast. Soms verplicht (zoals de hierboven beschreven namen) en soms is het puur optioneel. En dat kan tot hele leuke dingen leiden:

(https://i.imgur.com/EXvag0T.png)

Dit is een van de custom advancements die ik op mijn server heb gemaakt. Vergelijk dit zelf maar eens met de normale advancements en je ziet dat het er totaal anders uitziet. Grijze kleur en een italic opmaak. Het geheim? Simpel, strict JSON uiteraard!

{
    "display": {
        "icon": {
            "item": "minecraft:cow_spawn_egg",
            "nbt": "{Enchantments:[{id:\"minecraft:unbreaking\",lvl:3}]}"
        },
        "title": {"text":"M000","color":"gray","italic":true},
        "description": {"text":"Killed the EnderCow","italic":false},
        "show_toast": true,
        "announce_to_chat": true
    },

Let's team up!

(https://i.imgur.com/z7E27BQ.png)

En opnieuw: dit is het soort aanpassing wat voorheen totaal onmogelijk was zonder mods. Wil je een suffix achter een naam? Dan zal je waarschijnlijk een permissie plugin zoals PermissionsEx moeten gebruiken, samen met een chat plugin die ondersteuning biedt voor extra prefixes of suffixes.

Maar dus niet meer met Minecraft 1.13, het wordt nu standaard ondersteund. "Gewoon".

Voor de geïnteresseerden onder ons:


Opsommend

Als je je server (of wereld) naar 1.13 gaat upgraden en je maakt gebruik van commando's dan zal dat in het begin beslist soms irritant worden. Weer die strict JSON zooi... waarom niet gewoon even een String accepteren?

Maar als je je ietwat meer in deze materie verdiept dan zal je hopelijk snel ontdekken dat er zoveel meer mogelijk is. Het kan in het begin lastig zijn, maar 1.13 opent mogelijkheden binnen Minecraft die voorheen totaal onmogelijk waren zonder mods.

En dat vind ik een hele belangrijke verbetering. Want waarom zou je je beperken tot iets wat een mod programmeur heeft bedacht als je net zo makkelijk je eigen opzet kan maken?

Bedenk goed: als je probeert een server te runnen dan is het je onderscheiden van de rest en van de belangrijkste punten. En als iedereen al "mod x" gebruikt is jouw server dan echt zoveel anders omdat jij nou net toevallig een paar kleine dingetjes hebt aangepast? "I don't think so".

Maar met 1.13 kan je daar heel zwaar je eigen stempel op drukken. En strict JSON kan daar een heel belangrijk onderdeel van worden.
Titel: Re: Het gebruik van 'strict JSON' in commando's
Bericht door: smessie op 30 augustus 2018, 10:53:59
Heel mooie tutorial, goedgekeurd!
Titel: Re: Het gebruik van 'strict JSON' in commando's
Bericht door: remymine op 22 september 2018, 15:57:35
Respect voor deze tutorial! Kan ik erg waarderen, helaas erg weinig reacties op deze kwalitatieve post.