Diese Seite wurde maschinell übersetzt, sie kann einige Ungenauigkeiten enthalten. Du kannst helfen, indem du eine Übersetzung beisteuerst, alternativ kannst du zur englischen Version.

Gewusst wie: GSC#

Erste Schritte#

Obwohl GSC sehr begrenzt ist, bietet es Funktionen, mit denen jeder grundlegende C ++ - Entwickler bereits vertraut sein sollte. Wenn Sie damit nicht vertraut sind, machen Sie sich keine Sorgen! Sie sind super einfach zu erlernen und zu bedienen.

Sie sollten Kenntnisse über das Laden von GSC-Skripten haben, bevor Sie versuchen, sie zu schreiben, bitte überprüfen Sie unser Leitfaden dazu

Kommentare#

Kommentare gibt es auf zwei Arten: einzeilige oder mehrzeilige Blockkommentare.

// This is a one-line comment.

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

Deklarieren von Funktionen#

Sie können Funktionen in GSC deklarieren, indem Sie ihm einen Namen geben, gefolgt von einem (){ und ein Abschluss } am Ende Ihrer Funktion. Beispiel:

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

Aufrufen von Funktionen#

Um eine Funktion aufzurufen, gibt es verschiedene Möglichkeiten, dies zu tun.

Funktionen können gefädelt oder sequenziell aufgerufen werden.

Wenn eine Funktion mit einem Thread versehen ist, wird diese Funktion ausgeführt, während das Skript fortgesetzt wird, während das Skript, wenn eine Funktion sequenziell aufgerufen wird, wartet, bis die Funktion abgeschlossen ist, bevor sie fortgesetzt wird.

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.

Wenn Sie eine Funktion auf einer Entität aufrufen, z. B. unnamedent thread dostuff(), dann innerhalb der Funktion dostuff()können Sie sich auf unnamedent beziehen als self.

Beispiel:

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

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

Beispiel mit Kontext:

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

img

Verwenden von Variablen#

Variablen können auf verschiedene Arten verwendet werden, aber in allen Fällen werden sie verwendet, um einige Daten für die Dauer des Spiels zu speichern.

Variablen gibt es in verschiedenen Formen: Ganzzahlen, Gleitkommazahlen, Entitäten, Strings, Arrays und boolesche Werte, es gibt auch verschiedene Möglichkeiten, wie Variablen gespeichert werden können.

Eine einfache Variable wird einfach mit

variable = data;

Diese Variable kann in der aktuellen Funktion und jeder Funktion verwendet werden, die sie als Argument übergibt oder aufgerufen wird (sie wird also als self).

Variablen können global sein (die in allen Threads verwendet werden können, ohne aufgerufen werden zu müssen), indem Sie die

level.variable = data;

oder sie können Entitäten einzeln zugeordnet werden

entity.variable = data;

für Dinge wie player.health (Integer, bereits eingebaut, kann aber geändert werden) und level.teamBased (boolean).

Mathematik & Operatoren#

Mathematik wird im gesamten Skript verwendet, um viele verschiedene Werte zu erhalten, sei es der Abstand zwischen zwei Objekten oder zum Berechnen einer Gleichung.

Zum Beispiel können einer Variablen Daten aus einer einfachen mathematischen Gleichung gegeben werden.

myVariable = 5 * 2;

Das ist jedoch nicht wirklich nützlich. (Sie können einfach rechnen, bevor Sie es in das Skript einfügen) Variablen können jedoch mit anderen Variablen berechnet werden.

varAnswer = var1 + var2;

Es gibt mehrere Operatoren, die Sie für die Mathematik verwenden können.

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

Beispiele:

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

If-Anweisungen#

Eine "if"-Anweisung wird verwendet, um zu überprüfen, ob einige Daten bestimmte Bedingungen erfüllen, und um dann codeabhängig vom Ergebnis auszuführen.

Um diesen Abschnitt zu verstehen, müssen Sie zunächst die Operatoren kennen, die zum Vergleichen von Daten verwendet werden:

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

Beispiel:

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

Dies kann auch verwendet werden, um die Bedingungen von Spielervariablen oder nur Variablen zu überprüfen.

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

Sie können auch ein "else if" in der Anweisung verwenden. Dies wird in einem Szenario verwendet, in dem Sie mehrere Vergleiche überprüfen möchten.

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
}

In GSC können Sie überprüfen, ob eine Variable als Bedingung definiert ist. Diese Funktion heißt isDefinednimmt er die Variable als einzigen Parameter und gibt true/false zurück. Wenn eine Variable gleich undefined oder einfach gar nicht definiert ist, sollten Sie 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");
}

Schlingen#

Schleifen gibt es in verschiedenen Formen...

Während :: Eine while-Schleife ist eine Schleife, die eine Schleife hält, WÄHREND das Argument wahr ist.

Für :: A for-Schleife ist eine Schleife, die eine bestimmte Anzahl von Malen wiederholt

Foreach :: Eine foreach-Schleife wird verwendet, wenn Sie etwas für alle Elemente in einem Array tun möchten.

while#

Während Schleifen grundsätzlich für Schleifen sind, aber nur überprüft wird, ob die Bedingung true / false ist.

In diesem Beispiel ist wenn number ist wahr (nicht 0), dann wird es weiter laufen. Aber jedes Mal, wenn die While-Schleife ausgeführt wird, verringern wir uns number durch 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#

Für Schleifen sind Schleifen, die unendlich sein können, oder Schleifen, die nur laufen, bis eine Bedingung erfüllt ist.

Eine Endlosschleife sieht folgendermaßen aus:

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

Eine Schleife, die nach i ist nicht mehr kleiner als var, was 10 entspricht.

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

foreach#

Foreach-Schleifen sind Schleifen, mit denen Sie für jedes Element in einem Array etwas tun können.

Eine foreach-Schleife sieht folgendermaßen aus:

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

Ein Beispiel würde in etwa so aussehen:

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.
}

Warte#

GSC wird auf jedem Server-Frame ausgeführt, der aus 20 Server-Frames pro 1 Sekunde besteht. Wenn dies für eine Funktion ohne Thread aufgerufen wird, enthält sie den Server / die Entität.

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

Schalter#

Switch-Fälle sind nützlich, um den Fall vieler Werte zu überprüfen. Dies wird in der Regel als schneller angesehen und empfohlen als ein if Aussage.

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;
}

Benachrichtigen / Endon / Waittill#

Mit diesen 3 Funktionen können Sie ein Skript auf bestimmte Ereignisse warten lassen und diese Ereignisse dann in verschiedenen Teilen der Skripte auslösen.

Das Folgende löst die killed_player Benachrichtigung am self (was in diesem Fall ein Spieler ist):

self notify("killed_player");

Wenn Sie player waittill("x") oder player endon("x"), dann mit einem level notify("x") wird keines von beiden auslösen - Level ist nicht die gleiche Entität wie Player, und die Trigger aller Entitäten sind unabhängig.

Die Nutzung der Funktionen ist einfach. Entscheiden Sie zunächst, auf welche Entität Sie warten möchten, bis der Auslöser aktiviert ist. Dies ist die meiste Zeit ein Spieler, aber wenn Sie einen globalen Trigger wollen, dann verwenden Sie level.

Dann müssen Sie entscheiden, welcher Trigger verwendet werden soll. Sie können wählen entweder endon oder waittill - Sie sind beide selbsterklärend, einer beendet die Funktion, in der er ausgeführt wird, wenn er ausgelöst wird, und der andere "wartet" bis zum angegebenen Trigger.

Beispiel:

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().
}

Einschließlich anderer GSC#

Durch Verwenden des Formats #include path\filename; Sie können eine GSC-Datei in Ihre vorhandene GSC-Datei einfügen.
Dateinamen können entweder die Dateierweiterung haben oder nicht, Ordner sind durch einen umgekehrten Schrägstrich getrennt.
Der gesamte Pfad muss in einem Wort sein, kann Leerzeichen / Tabulatoren / Zeilenumbrüche vor und nach dem Dateinamen bis zum Semikolon haben.
Includes müssen durchgeführt werden, bevor irgendeine Art von Funktion in der Datei definiert wird.

HUD-Elemente#

Anmerkung Für bestimmte Dinge (HUD-Elemente im Hinterkopf) sind Sie Erforderlich um ein include, einfach wack #include maps\mp\gametypes\_hud_util; ganz oben in Ihrem Skript und das Folgende wird funktionieren.

Sie können Text auf den Bildschirmen der Spieler relativ einfach abrufen. Dazu verwenden wir Folgendes:

Für setPoint Sie können einen der folgenden Werte oder nur direkte Werte verwenden. Beachten Sie, dass die Anführungszeichen nicht erforderlich sind, wenn Sie Werte verwenden.

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

Hinweis: Es gibt mehr, aber ich schlage nicht vor, dass Sie diese verwenden.

Beispiel:

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

img


Portierung aus anderen Spielen#

Dieser Leitfaden enthält Teile aus Zeroys CoD 4 GSC-Anleitung, aber für unsere Spiele wurde nichts daran geändert, dies zeigt, wie vielseitig GSC wirklich ist. Sie können einfachen Code aus anderen Spielen nehmen und ihn mit minimalem Aufwand portieren.


Ressourcen/Credits#

Laden Sie das Skript herunter Ich habe einige der hier diskutierten Themen verwendet.

Zeroy's CoD4 GSC Einführung

CoDScript-Beispiel von Ingramz

iAegle's "Creating a HUD Element Guide"