Hallo und Guten Tag,
Ich möchte ihnen nun mit Hilfe eines Tutorials alles erklären, was man für einen Game Text dessen Inhalt man selbst bestimmen kann, braucht und wie man es aufbaut.
Ich habe mich entschlossen diesen Befehl nicht wie üblich mit cmdtext zu machen sondern mit ocmd.
Ocmd ist ein Include bzw. man muss ein Include besitzen um ocmd nutzen zu können. Der download dieses Includes befindet sich hier: [Include] OCMD
Was brauchen wir noch?
Als nächstes brauchen wir den sscanf stock. Dieser befindet sicher hier drunter. Einfach unten im Script einfügen und fertig.
stock sscanf(sstring[], format[], {Float,_}:...)
{
#if defined isnull
if (isnull(sstring))
#else
if (sstring[0] == 0 || (sstring[0] == 1 && sstring[1] == 0))
#endif
{
return format[0];
}
#pragma tabsize 4
new
formatPos = 0,
sstringPos = 0,
paramPos = 2,
paramCount = numargs(),
delim = ' ';
while (sstring[sstringPos] && sstring[sstringPos] <= ' ')
{
sstringPos++;
}
while (paramPos < paramCount && sstring[sstringPos])
{
switch (format[formatPos++])
{
case '\0':
{
return 0;
}
case 'i', 'd':
{
new
neg = 1,
num = 0,
ch = sstring[sstringPos];
if (ch == '-')
{
neg = -1;
ch = sstring[++sstringPos];
}
do
{
sstringPos++;
if ('0' <= ch <= '9')
{
num = (num * 10) + (ch - '0');
}
else
{
return -1;
}
}
while ((ch = sstring[sstringPos]) > ' ' && ch != delim);
setarg(paramPos, 0, num * neg);
}
case 'h', 'x':
{
new
num = 0,
ch = sstring[sstringPos];
do
{
sstringPos++;
switch (ch)
{
case 'x', 'X':
{
num = 0;
continue;
}
case '0' .. '9':
{
num = (num << 4) | (ch - '0');
}
case 'a' .. 'f':
{
num = (num << 4) | (ch - ('a' - 10));
}
case 'A' .. 'F':
{
num = (num << 4) | (ch - ('A' - 10));
}
default:
{
return -1;
}
}
}
while ((ch = sstring[sstringPos]) > ' ' && ch != delim);
setarg(paramPos, 0, num);
}
case 'c':
{
setarg(paramPos, 0, sstring[sstringPos++]);
}
case 'f':
{
new changestr[16], changepos = 0, strpos = sstringPos;
while(changepos < 16 && sstring[strpos] && sstring[strpos] != delim)
{
changestr[changepos++] = sstring[strpos++];
}
changestr[changepos] = '\0';
setarg(paramPos,0,_:floatstr(changestr));
}
case 'p':
{
delim = format[formatPos++];
continue;
}
case '\'':
{
new
end = formatPos - 1,
ch;
while ((ch = format[++end]) && ch != '\'') {}
if (!ch)
{
return -1;
}
format[end] = '\0';
if ((ch = strfind(sstring, format[formatPos], false, sstringPos)) == -1)
{
if (format[end + 1])
{
return -1;
}
return 0;
}
format[end] = '\'';
sstringPos = ch + (end - formatPos);
formatPos = end + 1;
}
case 'u':
{
new
end = sstringPos - 1,
id = 0,
bool:num = true,
ch;
while ((ch = sstring[++end]) && ch != delim)
{
if (num)
{
if ('0' <= ch <= '9')
{
id = (id * 10) + (ch - '0');
}
else
{
num = false;
}
}
}
if (num && IsPlayerConnected(id))
{
setarg(paramPos, 0, id);
}
else
{
#if !defined foreach
#define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
#define __SSCANF_FOREACH__
#endif
sstring[end] = '\0';
num = false;
new
name[MAX_PLAYER_NAME];
id = end - sstringPos;
foreach (Player, playerid)
{
GetPlayerName(playerid, name, sizeof (name));
if (!strcmp(name, sstring[sstringPos], true, id))
{
setarg(paramPos, 0, playerid);
num = true;
break;
}
}
if (!num)
{
setarg(paramPos, 0, INVALID_PLAYER_ID);
}
sstring[end] = ch;
#if defined __SSCANF_FOREACH__
#undef foreach
#undef __SSCANF_FOREACH__
#endif
}
sstringPos = end;
}
case 's', 'z':
{
new
i = 0,
ch;
if (format[formatPos])
{
while ((ch = sstring[sstringPos++]) && ch != delim)
{
setarg(paramPos, i++, ch);
}
if (!i)
{
return -1;
}
}
else
{
while ((ch = sstring[sstringPos++]))
{
setarg(paramPos, i++, ch);
}
}
sstringPos--;
setarg(paramPos, i, '\0');
}
default:
{
continue;
}
}
while (sstring[sstringPos] && sstring[sstringPos] != delim && sstring[sstringPos] > ' ')
{
sstringPos++;
}
while (sstring[sstringPos] && (sstring[sstringPos] == delim || sstring[sstringPos] <= ' '))
{
sstringPos++;
}
paramPos++;
}
do
{
if ((delim = format[formatPos++]) > ' ')
{
if (delim == '\'')
{
while ((delim = format[formatPos++]) && delim != '\'') {}
}
else if (delim != 'z')
{
return delim;
}
}
}
while (delim > ' ');
return 0;
}
Alles anzeigen
Das letzte was wir brauchen wäre dann noch der stock SpielerName. Den auch unten ins Script einfügen:
stock SpielerName(playerid)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
return name;
}
So das waren die Vorbereitungen, nun kommt der eigentliche Teil:
Ähnlich wie ein cmdtext wird auch ein ocmd erstellt.
Der reine ocmd sieht so aus:
Anders als bei cmdtext muss man den Namen des Befehls nicht mit / angeben sondern man muss nur den Namen angeben:
Statt:
Wir nennen den Befehl nun: gt für GameText.
Das erste was wir machen müssen/sollten ist den Befehl nur einem Admin bzw. in diesem Fall einen Rcon Admin zu erlauben.
Darum fügen wir in die Klammern über return 1; dies ein:
Wenn das kein Script sondern eine normale Sprache wäre, hieße dies in deutsch:
Ist der Spieler kein Admin, dann sende ihm die Nachricht"..."!
Weiter gehts.
Nun kommt eine Definition in Form eines new:
Dies bedeutet einfach (meines wissens nach), dass string und reason maximal 128 Zeichen in Form von Buchstaben, Zahlen, ect. haben dürfen.
Nun kommt unser eben eingeügtes sscanf zum Einsatz:
Dies ist etwas komplexer.
Das "s" was wir dort sehen steht für den Text, den der Spieler eingibt. Ich werde demnächst ein weiteres Tutorial dazu machen und den Link dann hier drunter stellen.
Nun kommen wir doch zum nächsten Schritt.
Nun legen wir fest, was letztendlich alles angezeigt werden soll.
Der Text, der in den Klammern steht ist der Text der letztendlich angezeigt wird.
Wir können ihn beliebig ändern. Das %s, dass im moment dort steht lässt den angegebenen Text des Spielers hinter /gt
anzeigen.
Nach den " sehen wir ein reason, diesed benutze ich dafür.
Wahrscheinlich gibt es mehr Methoden. reason heißt jetzt einfach, dass in die erste %s Stelle der Text des Spielers kommt.
Möchte ich angeben wer den Text geschriebn hat kann ich hinzufügen:
Zusammengefasst zeigt die erste Stelle hinter den " das erste %s an, das zweite die zweite usw.
Kommen wir zum letzten Schritt.
Bis jetzt weiß das Script alles nötige, aber es wird noch nichts angezeigt.
Der einfache Mann denkt jetzt:
"Ok ganz einfach! Ich mache einfach
"
Und schon steht ein Problem fest:
Wir wissen nicht wie wir den eben verfassten Text in die Klammern bekommen.
Das ist eigentlich ganz einfach.
Das string an der Stelle des Textes bedeutet, dass das Script den Text aus dem string nimmt.
So das wars.
Ich hoffe ich konnte euch ein paar Dinge näher bringen.
//Edit Korrektur