Limitaciones del compilador T6 GSC#
El compilador utilizado para BO2 tiene algunas limitaciones y defectos con los que probablemente se encontrará en algún momento. La mayoría de estos están documentados y son fáciles de solucionar si simplemente sigue la forma correcta de hacer lo que sea que esté haciendo. Entonces, veamos algunos.
(Créditos a JezuzLizard para documentarlos)
Bucles infinitos#
- No se puede utilizar ningún anidado
foreach
ya que provocará un bucle infinito. - No se puede utilizar
continue;
enforeach
ofor
bucles ya que causará un bucle infinito.
Operadores#
Siempre debe usar paréntesis al comparar valores que usan condiciones y al usar operadores. P.E.M.D.A.S y las matemáticas básicas seguirán siendo importantes al hacer GSC. Si no recuerdas eso, tu guión puede estropearse dependiendo de lo que estés haciendo.
(0 - 1) < 1
no es lo mismo que0 - 1 < 1
. El compilador lo reconocerá y compilará como0 - (1 < 1)
.(0 - 1) < 1
volverátrue
(o 1) porque 1 es mayor que -10 - 1 < 1
volveráfalse
(o 0) porque comparará los valores y luego restará.
Si aún no entiende, simplemente use paréntesis cuando los operadores estén involucrados.
Ternary Operators compila pero no funciona como se esperaba.
En lugar de devolver uno de los dos valores especificados, el compilador lo compilará para devolver bools en su lugar.
Si declaraciones#
-
No se pueden utilizar más de 2 condiciones en un
if
instrucción conectada por OR (||
) operadores entre paréntesis.Ejemplo:
if ((a || b || c) && d)
Esto no se compilará. Sin embargo, puede reescribir esto como cualquiera de los dos:
if ((a || b) && d || c && d) if (a && d || b && d || c && d)
-
No puede utilizar OR (
||
) operadores en unif
y entre paréntesis si la cadena de condiciones no estaría en el lado izquierdo de la instrucción if y el número de condiciones en el lado más derecho no es al menos 2.Ejemplo:
if (a && (b || c))
Esto no se compilará. Sin embargo
if ((b || c) && a)
compilará en el caso de:
if ((a || b) && (c || d))
Variables#
-
No puede utilizar notificaciones/waittills definidas por variables con entradas/salidas adicionales.
Ejemplo:
var = "connected"; level notify(var, player); level waittill(var, player);
Esto compilará. Sin embargo, la notificación/espera no funcionará. Esta es la única manera de hacer esto:
level notify("connected", player); level waittill("connected", player);
Animtree#
Desafortunadamente, para ciertos scripts que hacen:
#using_animtree( "animtree" );
es necesario para que el script funcione. Los scripts que lo contienen se bloquearán al iniciar / mientras se ejecuta. Hay una solución alternativa que utiliza nombres de script como maps/mp/gametypes_zm/_globalentities.gsc
y nombrar un script extraído pero no descompilado.