Bedingte Anweisungen
Link to bedingte-anweisungen
Manche Codezeilen sollten nur ausgeführt werden, wenn bestimmte Kriterien erfüllt werden (oder auch nicht). Für sowas gibt es bedingte Anweisungen.
If (Wenn)
Link to if-wenn
Eine bedingte Anweisung beginnt immer mit einer If-Abfrage. Sie prüft, ob das gegebene Statement wahr (true) ist und führt ggf. den folgenden Code in der Klammer aus. Be careful, you need TWO EQUALS when comparing values! (Das liegt daran, dass ein Gleichheitszeichen für die Deklaration von Werten reserviert ist!)
ZenScript Copyval test = 0;
if (test == 0) { //true
print("Test ist Null!");
}
Else (Ansonsten)
Link to else-ansonsten
Ein Else-Statement kann an eine If-Abfrage angehängt werden und wird ausgeführt, falls die Abfrage nicht true (false) ergibt.
ZenScript Copyvar test = 0;
if (test == 0) { //true
//wird ausgeführt, falls test gleich 0 ist
print("Test ist Null!");
} else {
//wird ausgeführt, falls test ungleich 0 ist
print("Test ist NICHT Null!");
}
test = 1;
if (test == 0) { //false
//wird ausgeführt, falls test gleich 0 ist
print("Jetzt ist test gleich Null!");
} else {
//wird ausgeführt, falls test ungleich 0 ist
print("Jetzt ist test NICHT gleich Null!");
}
Dinge, die man überprüfen kann
Link to dinge-die-man-überprüfen-kann
Berechnungen: +
,-
,*
,/
,mod
,verkettung(~)
Unterstützte Operatoren sind Logisches OR(||)
, Logisches AND(&&)
, Bitweises OR(|)
, Bitweises AND(&)
, und Bitweises XOR(^).
ZenScript Copy//You can check for:
//Number values
val a = 0 as int;
if (a == 0) { print("NumVal"); }
//Calculated number values
val b = 1;
val c = 5;
//All evaluate to true
if (b+c == 6) { print("Num1!"); }
if (b*c == 5) { print("Num2!"); }
if (b/c == 0.2) { print("Num3!"); }
//OR, XOR, AND
val d = "Hello";
val e = "World";
val f = d~e; //f = "HelloWorld", the Tilde just concatenates one thing to another
//||(OR) means, as long as one of the criteria is met, it evaluates to true
if (d == "Hello" || e == "Hello") { print("OR1!"); } //true
if (d == "Hello" || e == "World") { print("OR2!"); } //true
//^(XOR) means, ONLY ONE criteria may be met, otherwise it evaluates to false
if (d == "Hello" ^ e == "Hello") { print("XOR1!"); } //true
if (d == "Hello" ^ e == "World") { print("XOR2!"); } //false
//&&(AND) means, both criteria need to be met, otherwise it evaluates to false
if (d == "Hello" && e == "Hello") { print("AND1!"); } //false
if (d == "Hello" && e == "World") { print("AND2!"); } //true
Der ? Operator
Link to der--operator
Die ganze Zeit überall If/Else schreiben zu müssen kann schnell nervig werden. Besonders wenn du nur kleinere entweder/oder-Bedingungen benötigst. Für solche Fälle wurde der ?
-Operator implementiert. Er funktioniert genau wie ein If/Else-Statement, für welches man weniger Code benötigt. Syntax: boolean ? if : else
ZenScript Copyval switchy = false;
//gibt den Status aus
print("Switchy is " ~ switchy);
//wenn switchy true ergibt, vInt = 1, ansonsten vInt = 2
val vInt = switchy ? 1 : 2;
print(vInt);
//Gibt "Hallo" aus, wenn switchy true ist, ansonsten "Tschüss"
print(switchy ? print("Tschüss") : print("Hallo"); "Hallo" : "Tschüss");
//Gibt "Tschüss" aus, wenn switchy true ergibt, ansonsten "Hallo"
switchy ?
Operatoren
Link to operatoren
Du kannst folgende Operatoren verwenden. Alle gegebenen Beispiele ergeben true.
Name | Zeichen | Erklärung | Beispiel |
---|---|---|---|
Name Nicht | Zeichen ! | Erklärung Invertiert ein Boolean (true/false) | Beispiel !false |
Name Nicht gleich | Zeichen != | Erklärung Prüft, ob der Wert davor und danach nicht gleich ist | Beispiel 1 != 2 |
Name Gleich | Zeichen == | Erklärung Prüft, ob der Wert davor und danach gleich ist | Beispiel 1 == 1 |
Name Größer als | Zeichen > | Erklärung Prüft, ob der Wert davor größer ist als der Wert danach | Beispiel 1 > 2 |
Name Größer oder gleich | Zeichen >= | Erklärung Prüft, ob der Wert davor größer oder gleich groß wie der Wert danach ist | Beispiel 1 >= 1 |
Name Kleiner als | Zeichen < | Erklärung Prüft, ob der Wert davor kleiner ist als der Wert danach | Beispiel 1 < 2 |
Name Kleiner oder gleich | Zeichen <= | Erklärung Prüft, ob der Wert davor kleiner oder gleich klein wie der Wert danach ist | Beispiel 1 <= 1 |
Name Logisches AND | Zeichen && | Erklärung Checks if both before and after values are true, false if one or both are false | Beispiel true && true |
Name Logisches OR | Zeichen || | Erklärung Checks if either the value before or after are true, false if neither are true | Beispiel false || true |
Name Bitweises XOR | Zeichen ^ | Erklärung Checks if exactly one of the before or after values is true, false if both or none are true | Beispiel true ^ false |
Name Bitweises AND | Zeichen & | Erklärung Performs a bitwise AND operation on the before and after values. See this for more | Beispiel true && true |
Name Bitweises OR | Zeichen | | Erklärung Performs a bitwise OR operation on the before and after values. See this for more | Beispiel false || true |
Unterschied zwischen
Link to unterschied-zwischen--und--sowie-zwischen--und-
The main difference between the single and the double, with semantics aside, is that the double performs a check after each condition and exits early - this is called short-circuiting. However, the single goes through the entire chain of conditions, even if the first one would have cancelled the entire condition. This not only saves resources, but also allows for easier scripting such as null checks and chained conditions.
ZenScript Copyvar a = 5;
var item = ... as IItemStack;
// Even though a is 5, it still goes through all of the conditions listed
if (a == 5 | a == 3 | a == 10 | a == -1) {
...
}
// Even though a is 5 and the condition is impossible (a variable can't be both 3 and 5), it still goes through all of the conditions listed
if (a == 3 & a < 2 & a > 8 & a == 5) {
...
}
// Checks if item is not null before accessing variables from item
if (!isNull(item) && item.amount == 1) {
...
}
// Checks if item is not null while accessing variables from a potentially null item, throwing an error if the item is null
if (!isNull(item) & item.amount == 1) {
...
}
Der in/has-Operator
Link to der-inhas-operator
The in
and the has
operator check if something is in something.
First you need the list you want to check in, then the in
/has
then the value you want to check for. in
and has
are the same keyword for ZS, but in most cases people use has
for checking if a collection contains an item and in for loops as this represents the English grammar.
in/has loadedMods
Link to inhas-loadedmods
You can check, if a mod is loaded by checking if it's in the loadedMods list
ZenScript Copy//While contains checks can use in
if (loadedMods in "mcp") {
print("Minecraft Coder Pack loaded");
}
//Most people prefer using has
if (loadedMods has "mcp") {
print("Minecraft Coder Pack loaded");
}
in/has IIngredient
Link to inhas-iingredient
You can also check if an item matches a definition by comparing two IIngredients.
With this one you need to be a bit careful as not to confuse the two entries:
This is only true when the IIngredient AFTER the in
can also be found completely in the one BEFORE the in
.
In most cases you will use the has
keyword instead as it's intention is more clear and it does exactly the same.
ZenScript Copy// Checks if the iron ingot is in the oreDict "ingotIron"
if (<ore:ingotIron> in <minecraft:iron_ingot>) {
print("Iron ingots are in the right oreDict");
}
// Preferred, same function as previous
if (<ore:ingotIron> has <minecraft:iron_ingot>) {
print("Iron ingots are in the right oreDict");
}
This is only true when ALL matching items from the IIngredient AFTER the has
can also be found in the IIngredient BEFORE has
: Say we have an IIngredient that contains all dusts (e.g. redstone and glowstone dust):
ZenScript Copyval redstone = <minecraft:redstone>;
val glowstone = <minecraft:glowstone>;
val allDusts = <ore:dustAll>;
allDusts.add(redstone, glowstone);
//True as redstone is a part of alldusts
if (allDusts has redstone) {
}
//False as allDusts consists of redstone and glowstone, and redstone only consists of redstone.
if (redstone has allDusts) {
}