Esta página ha sido traducida automáticamente, por lo que puede contener algunas inexactitudes. Puedes ayudar aportando una traducción, o bien puedes cambiar a la versión en inglés.

Cómo: SGC#

Empezar#

Si bien GSC es muy limitado, ofrece características con las que cualquier desarrollador básico de C ++ ya debería estar familiarizado. Si no estás familiarizado con él, ¡no te preocupes! Son súper simples de aprender y usar.

Debe tener conocimientos sobre la carga de scripts GSC antes de intentar escribirlos, verifique nuestra guía sobre esto

Comentarios#

Los comentarios existen de dos maneras, comentarios de bloque de una línea o de varias líneas.

// This is a one-line comment.

/*
This is a comment across
multiple lines!
*/

Declarar funciones#

Puede declarar funciones en GSC dándole un nombre, seguido de un (){ y un cierre } al final de la función. Ejemplo:

myFunction()
{
 self iprintlnbold("^2My First Function!"); 
}

Funciones de llamada#

Para llamar a una función, hay diferentes maneras de hacerlo.

Las funciones se pueden enhebrar o llamar secuencialmente.

Si una función está subprocesada, entonces esa función se realiza mientras el script continúa, mientras que si una función se llama secuencialmente, el script espera hasta que la función se complete antes de continuar.

function(); // The script will stop at this line and carry out function() before going down to the next line.
thread function(); // This will start function() and carry on to execute the next line.

Si llama a una función en una entidad, por ejemplo, unnamedent thread dostuff(), luego dentro de la función dostuff(), puede hacer referencia a un nombre como self.

Ejemplo:

something()
{
 ent = getent("ent","targetname");
 ent function();
}

function()
{
 self moveZ(150, 5);
}

Ejemplo con contexto:

connected()
{
  self endon("disconnect");
  for(;;)
  {
    self waittill("spawned_player");
    self thread myFunction();
  }
}
myFunction()
{
 self iprintlnbold("^2My First Function!"); 
}

img

Uso de variables#

Las variables se pueden usar de varias maneras, pero en todos los casos se utilizan para almacenar algunos datos durante la duración del juego.

Las variables vienen en diferentes formas: enteros, flotadores, entidades, cadenas, matrices y booleanos, también hay varias formas diferentes en que se pueden almacenar las variables.

Una variable simple se declara simplemente usando

variable = data;

Esta variable se puede usar en la función actual y en cualquier función que la pase como argumento, o se le llame (por lo que se usaría como self).

Las variables pueden ser globales (que se pueden usar en todos los subprocesos sin necesidad de ser llamadas) utilizando el

level.variable = data;

o se pueden asignar a entidades individualmente

entity.variable = data;

para cosas como player.health (entero, ya incorporado, pero se puede modificar) y level.teamBased (booleano).

Matemáticas y Operadores#

Las matemáticas se utilizan a lo largo de las secuencias de comandos para obtener muchos valores diferentes, ya sea la distancia entre dos objetos o para calcular una ecuación.

Por ejemplo, a una variable se le pueden dar datos de una ecuación matemática simple.

myVariable = 5 * 2;

Sin embargo, eso no es realmente útil. (Puede hacer los cálculos antes de colocarlo en el script) Pero, las variables se pueden calcular utilizando otras variables.

varAnswer = var1 + var2;

Hay varios operadores que puede usar para matemáticas.

+ :: Addition
- :: Subtraction
* :: Multiplication
/ :: Division
% :: Modulus (Remainder)
= :: Equals
++ :: Increment (+1)
-- :: Decrement (-1)
+= :: Incrementation (requires number)
-= :: Decrementation (requires number)

Ejemplos:

var++; // Set var to var + 1
var--; // Set var to var - 1
var += int; // Set var to var + int
var -= int; // Set var to var - int

Si declaraciones#

Una instrucción 'if' se utiliza para verificar si algunos datos satisfacen ciertas condiciones y, a continuación, para ejecutar código en función del resultado.

Para comprender esta sección, primero debe conocer los operadores utilizados para comparar datos:

== :: Equal To
!= :: Not Equal To
!  :: Negation (Not equal to)
<  :: Less than
>  :: Greater than
<= :: Less or Equal to
>= :: Greater or Equal to
&& :: And
|| :: Or

Ejemplo:

if (3 < 5) {
    iprintln("Condition met");
} else {
    iprintln("Condition not met");
}

Esto también se puede utilizar para comprobar las condiciones de las variables del jugador o sólo variables.

self.condition = false;
if (self.condition) { // is true?
    self iprintln("self.condition is true");
} else {
    self iprintln("self.condition is false");
}

También puede usar un "else if" en la declaración. Esto se usa en un escenario en el que desea comprobar varias comparaciones.

if(var1 == var2)
{
  // If above arguement is true
}
else if(!var1 && var3)
{
  // If var1 is false but var3 is true
}
else
{
  // If all other if statements were false
}

En GSC, puede comprobar si una variable se define como una condición. Esta función se llama isDefined, toma la variable como único parámetro y devuelve true/false. Si una variable es igual a undefined o simplemente no está definido en absoluto, deberías obtener false.

var = 5;
var2 = 6;

if (isDefined(var)) { // var is defined as 5
    iprintln("var is defined");
    var2 = undefined; // undefine var2
}

if (isDefined(var2)) { // this should not be met as var2 was undefined.
    iprintln("var2 is defined");
} else if (!isDefined(var2)) {
    iprintln("var2 is undefined");
}

Bucles#

Los bucles vienen en diferentes formas...

Mientras :: Un bucle while es un bucle que sigue enlazando MIENTRAS el argumento es verdadero.

Para :: Un bucle for es un bucle que repite una cantidad determinada de veces

Foreach :: Se utiliza un bucle foreach cuando se desea hacer algo en todos los elementos de una matriz.

while#

Mientras que los bucles son básicamente para bucles, pero solo comprueba si la condición es true/false.

En este ejemplo, si number es verdadero (no 0) entonces seguirá funcionando. Pero, cada vez que se ejecuta el bucle while, disminuimos number por 1.

number = 5;
while (number) {
    iprintln("Number equals: " + number);
    number--;
}

iprintln("The while loop has ended."); // this will only be seen if the loop ended

/*

5 prints should have been made:
"Number equals: 5"
"Number equals: 4"
"Number equals: 3"
"Number equals: 2"
"Number equals: 1"
"The while loop has ended."

*/

for#

Para los bucles son bucles que pueden ser infinitos o bucles que sólo se ejecutan hasta que se cumple una condición de algún tipo.

Un bucle infinito se ve como:

for(;;) {
    iprintln("Infinite loop!");
    wait 0.05; // **IMPORTANT! ONLY RUNS EVERY SERVER FRAME!**
}

Un bucle que se detendrá después i ya no es inferior a var, que es igual a 10.

var = 10;
for(i=0; i<var; i++) {
    iprintln("Looping! " + i);
}

foreach#

Los bucles Foreach son bucles que le permiten hacer algo en cada elemento de una matriz.

Un bucle foreach se ve como:

foreach(something in array)
{
  // Do something
}

Un ejemplo sería algo como esto:

foreach(player in level.players) // "For every player in the game"
{
    player giveWeapon("dsr50_mp", 0); // Give every player in the game a DSR 50.
}

Esperar#

GSC se ejecuta en cada trama de servidor, que consta de 20 tramas de servidor por 1 segundo. Si se llama a esto en una función sin subprocesos, contendrá el servidor/entidad.

wait 0.05; // 1 server frame
wait 0.5;  // 10 server frames
wait 1;    // 20 server frames
wait (1);  // 20 server frames

Interruptor#

Los estuches de interruptor son útiles para verificar el caso de muchos valores. Por lo general, se considera que esto es más rápido y se recomienda su uso que un if declaración.

value = 3;
switch (value)
{
    case 1:
        iprintln("Value was 1");
        break;
    case 2:
        iprintln("Value was 2");
        break;
    case 3:
        iprintln("Value was 3");
        break;
    default:
        iprintln("Value was not found");
        break;
}

Notificar / Endon / Waittill#

Estas 3 funciones le permiten hacer que un script espere eventos específicos y luego desencadenar esos eventos en diferentes partes de los scripts.

Lo siguiente desencadena el killed_player notificación sobre self (que es un jugador en este caso):

self notify("killed_player");

Si utiliza player waittill("x") o player endon("x")y, a continuación, utilizando un level notify("x") no activará ninguno de ellos: el nivel no es la misma entidad que el jugador, y los desencadenantes de todas las entidades son independientes.

Usar las funciones es fácil. En primer lugar, decida en qué entidad desea esperar el desencadenador. Este es un jugador la mayor parte del tiempo, pero si desea un disparador global, use level.

Luego debe decidir qué disparador usar. Puede elegir entre endon o waittill - ambos se explican por sí mismos, uno terminará la función en la que se está ejecutando cuando se activa, y el otro 'esperará' hasta el disparador especificado.

Ejemplo:

spawnPlayer()
{
  self notify("spawned");
  
  /*
     ... Code snipped ... this is another type of 
     comment that can span multiple lines. 
  */
  
}

Callback_PlayerKilled(attacker, some other arguments)
{
  self endon("spawned"); // This makes callback_playerkilled() terminate when "spawned" is triggered in spawnplayer().
}

Incluidas otras SGC#

Mediante el uso del formato #include path\filename; puede incluir un archivo GSC en su archivo GSC existente.
Los nombres de archivo pueden tener o no la extensión de archivo, las carpetas están separadas por una barra diagonal inversa.
Toda la ruta debe estar en una palabra, puede tener espacios/pestañas/nuevas líneas antes y después del nombre de archivo hasta punto y coma.
Las inclusiones deben realizarse antes de que se defina cualquier tipo de función dentro del archivo.

Elementos HUD#

Nota Para ciertas cosas (ELEMENTOS HUD en mente) usted es Obligatorio Para utilizar un include, simplemente wack #include maps\mp\gametypes\_hud_util; en la parte superior de su script y lo siguiente funcionará.

Puede obtener texto en las pantallas de los jugadores con relativa facilidad. Utilizamos lo siguiente para hacerlo:

Para setPoint puede utilizar cualquiera de los siguientes, o simplemente valores directos. Tenga en cuenta que si está utilizando valores, las comillas no son necesarias.

self.someText setPoint(<POINT1>, <POINT2>, <POINT3>, <POINT4>);

<POINT1> This is the Horizontal "Point"
<POINT2> This is the Vertical "Point"
<POINT3> This can either be a Number (X) or a "Point". (Horizontal)
<POINT4> This can either be a Number (Y) or a "Point". (Vertical)

Horizontal:
LEFT
RIGHT
CENTER

Vertical:
BOTTOM
TOP
CENTER

Nota: hay más, pero no te sugiero que los uses.

Ejemplo:

self.someText = self createFontString( "Objective", 1.5 );
self.someText setPoint( "CENTER", "CENTER", "CENTER", "CENTER" );
self.someText setText( "^1forum.plutonium.pw" ); 

img


Migración desde otros juegos#

Esta guía tiene partes de la guía CoD 4 GSC de Zeroy, pero no se cambió nada al respecto para nuestros juegos, esto muestra lo versátil que es realmente GSC. Puede tomar código simple de otros juegos y portarlo con el mínimo esfuerzo.


Recursos/Créditos#

Descargar el script Utilicé lo que demuestra algunos de los temas discutidos aquí.

Introducción a Zeroy CoD4 GSC

Ejemplo de CoDScript de Ingramz

"Creación de una guía de elementos HUD" de iAegle