T6 GSC Compiler Limitations#
The compiler used for BO2 has some limitations and flaws that you will most likely run into at one point. Most of these are documented and are easy to work around if you just follow the correct way to do whatever you are doing. So, let's look at some.
(Credits to JezuzLizard for documenting these)
- You cannot use any nested
foreachas it will cause an infinite loop.
- You cannot use
forloops as it will cause an infinite loop.
You should always use parenthesis when comparing values that use conditions and while using operators. P.E.M.D.A.S and basic math will still matter when doing GSC. If you do not remember that, your script may mess up depending on what you are doing.
(0 - 1) < 1is not the same as
0 - 1 < 1. The compiler will recognize & compile it as
0 - (1 < 1).
(0 - 1) < 1will return
true(or 1) because 1 is greater than -1
0 - 1 < 1will return
false(or 0) because it will compare the values then subtract.
If you still do not understand, just use parenthesis when operators are involved.
Ternary Operators compiles but doesn't work as expected.
Instead of returning one of the two values specified the compiler will compile it to return bools instead.
You cannot use more than 2 conditions in an
ifstatement connected by OR (
||) operators enclosed in parenthesis.
if ((a || b || c) && d)
This will not compile. However, you can rewrite this as either of the two:
if ((a || b) && d || c && d) if (a && d || b && d || c && d)
You cannot use OR (
||) operators in an
ifstatement and in parenthesis if the string of conditions would not be on the leftmost side of the if statement and the number of conditions on the rightmost side is not at least 2.
if (a && (b || c))
This will not compile. However,
if ((b || c) && a)
will compile in the case of:
if ((a || b) && (c || d))
You cannot use variable-defined notifies/waittills with extra inputs/outputs.
var = "connected"; level notify(var, player); level waittill(var, player);
This will compile. However, the notify/waittill will not work. This is the only way to do this:
level notify("connected", player); level waittill("connected", player);
Unfortunately, for certain scripts doing:
#using_animtree( "animtree" );
is required for the script to function. Scripts containing it will crash on start/while running. There is a workaround using script names such as
maps/mp/gametypes_zm/_globalentities.gsc and naming an extracted but not decompiled script.