wurde doch schon im Spamtalk vor ein paar tagen gepostet.
Aber das Spiel ist trotzdem geil
Beiträge von Snail
-
-
sieht gut aus, allerdings würde ich b_StartSystem() durch b_OnPlayerDisconnect() ersetzen,
dazu dann bei OnPlayerConnect SetTimerEx verwenden und bei OnPlayerDisconnect den Timer wieder killen -
-
http://wiki.sa-mp.com/wiki/IsPlayerInRangeOfPoint
Allerdings würde ich dir von deinem Vorhaben abraten, da Tore die automatisch aufgehen sehr serverbelastend sind. Wenn du zu faul bist Commands einzugeben, kannst du dir einen Keybinder machen. Ansonsten kannst du Tore auch durch einen Tastendruck öffnen lassen.
-
sollte so gehen :
public OnPlayerText(playerid, text[])
{
if(imuc[playerid]==1)
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid,x,y,z);
new pname[MAX_PLAYER_NAME],sendstr[128]; GetPlayerName(playerid,pname,sizeof pname);
format(sendstr,sizeof sendstr,"[UC] %s: %s",pname,text);
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(PlayerToPoint(15,i,x,y,z))
{
SendClientMessage(i,COLOR_YELLOW,sendstr);
}
}
}
return 0;
}
return 1;
} -
Such mal nach Ingame Object Creator bzw. Ingame Object Editor
damit kannst du auf deinem Samp-Homeserver Objekte erstellen und diese abspeichern lassen. -
Ich habe ja bereits geschrieben, dass man mit s0beit die TextDraws und die Karte ausblenden lassen kann.
So könnt ihr die gesamte Bildfläche filmen.
Allerdings solltet ihr vorher mit dem Serverbesitzer reden, ob ihr es zu Aufnahmezwecken verwenden dürft. -
Zitat
leider nur 60 Wörter
aber nur weil ich nicht mit umlauts schreiben gewoehnt bin
geht mir genauso
-
Man sollte wenigstens noch ein Kommentar hinzufügen können
Also z.B. "Haus - X, Y, Z ||".
So kennt sich kein Mensch aus was welche Koord. ist.
Daher nur 5/10 -
Nicht unbedingt, aber wenn du nur 100 Slots zur Verfügung hast,
warum sollen sich dann alle Schleifen Variablen etc. 500 mal wiederholen wenn sie doch nur 100 mal benötigt werden.
Du könntest alternativ auch in die a_samp.inc gehen und bei
#define MAX_PLAYERS die 500 durch 100 ersetzen.
Oder du gibts bei deinem GameMode oben das hier ein :#undef MAX_PLAYERS
#define MAX_PLAYERS 100 -
Du kannst die Transparancy oder wie das heißt
runterstellen.
D.h. es wird "durchsichtiger".
Dazu musst du den letzten Regler beim ColorPicker verschieben -
GetMaxPlayers() gibt den Wert wieder, der in der server.cfg eingestellt wurde für die maximale userzahl.
MAX_PLAYERS dagegen ist in der a_samp.inc festgelegt auf 500.
--> Wenn du einen 100 Slot server hast, dann würde eine Schleife mit MAX_PLAYERS 500 mal durchlaufen
Eine schleife mit GetMaxPLayers nur 100 mal, so wie man es in der .cfg festgelegt hat
Das ganze kann man dann soweit ich weiß auch noch optimieren, indem man GetMaxPlayers als Variable speichert.
// oben :
new maxp;
//OnGameModeInit :
maxp = GetMaxPlayers();
// später dann MAX_PLAYERS durch maxp ersetzen -
Zitat
if(sscanf(params, "d", pID)) { //508
muss glaub ich zu :
if(sscanf(params, "i", pID)) { //508
-
einfach bei public mapwechsel()
map = random(10);
10 musst du durch die anzahl deiner maps ersetzen -
damit kannst du Farben als Hexcode erstellen
-
Bei OnGameModeInit einen Timer laufen lassen der sich alle 15 min wiederholt
// oben :
forward mapwechsel();
new map = 0;
// OnGameModeInit :
SetTimer("mapwechsel", 15*60*1000, 1);public mapwechsel()
{
if(map == 0)
{
map = 1;
SendClientMessageToAll(COLOR, "NEUE MAP");
}
else if(map == 1)
{
// usw
}
return 1;
}
// Dann bei OnPlayerSpawn ne Abfrage :if(map == 0)
{
SetPlayerPos(...);
}
else if(map == 1)
{
SetPlayerPos(...);
}
-
Warum wollt ihr immer das man euch alles scriptet.
Lernt doch erst mal die Grundlagen bevor ihr hier euch alles scripten lasst.
Was du brauchst ist ein Timer, und ein paar Abfragen.PS :
Zitat
//wenn ihr wollt, auch noch ein text ;)Es bringt dir nichts wenn du immer nur alles aus Tutorials kopierst !
-
-
if (strcmp(cmdtext, "/wanteds", true)==0)
{
new name[MAX_PLAYER_NAME];
new string[1024];
format(string, sizeof(string), "");
for(new i=0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i)
{
if(GetPlayerWantedLevel(playerid) =! 0)
{
GetPlayerName(i, name, sizeof(name));
format(string, sizeof(string), "%s\n%s - Wantedlevel %d", string, name, GetPlayerWantedLevel(i));
}
}
}
ShowPlayerDialog(playerid, ID, DIALOG_STYLE_MSGBOX, "Verbrecherliste", string, "OK", "OK");
// Für ID musst du eine Dialog-ID einsetzten
return 1;
}DIe Abfrage ob man Cop ist oder nicht musst du machen, weil ich nicht weiß wie deine Variablen heißen.
Was den Befehl /clearwanteds angeht, empfehle ich DCMD :
// oben Im Script :
#define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1// Dann bei OnPlayerCommandText :
dcmd(clearwanteds,13,cmdtext);
// dann außerhalb eines Publics :
dcmd_clearwanteds(playerid, params[])
{
new pid;
if(sscanf(params, "i", pid))
{
return SendClientMessage(playerid,COLOR_RED,"Benutzung: /clearwanteds [playerid]");
}
if(!IsPlayerConnected(pid))
{
return SendClientMessage(playerid,COLOR_RED,"Ungültige ID - Benutzung: /clearwanteds [playerid]");
}
SetPlayerWantedLevel(pid, 0);
return 1;
}Bevor das geht, musst du allerdings noch ganz unten in deinem Script das hier einfügen :
stock sscanf(string[], format[], {Float,_}:...)
{
#if defined isnull
if (isnull(string))
#else
if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
#endif
{
return format[0];
}
#pragma tabsize 4
new
formatPos = 0,
stringPos = 0,
paramPos = 2,
paramCount = numargs(),
delim = ' ';
while (string[stringPos] && string[stringPos] <= ' ')
{
stringPos++;
}
while (paramPos < paramCount && string[stringPos])
{
switch (format[formatPos++])
{
case '\0':
{
return 0;
}
case 'i', 'd':
{
new
neg = 1,
num = 0,
ch = string[stringPos];
if (ch == '-')
{
neg = -1;
ch = string[++stringPos];
}
do
{
stringPos++;
if ('0' <= ch <= '9')
{
num = (num * 10) + (ch - '0');
}
else
{
return -1;
}
}
while ((ch = string[stringPos]) > ' ' && ch != delim);
setarg(paramPos, 0, num * neg);
}
case 'h', 'x':
{
new
num = 0,
ch = string[stringPos];
do
{
stringPos++;
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 = string[stringPos]) > ' ' && ch != delim);
setarg(paramPos, 0, num);
}
case 'c':
{
setarg(paramPos, 0, string[stringPos++]);
}
case 'f':
{new changestr[16], changepos = 0, strpos = stringPos;
while(changepos < 16 && string[strpos] && string[strpos] != delim)
{
changestr[changepos++] = string[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(string, format[formatPos], false, stringPos)) == -1)
{
if (format[end + 1])
{
return -1;
}
return 0;
}
format[end] = '\'';
stringPos = ch + (end - formatPos);
formatPos = end + 1;
}
case 'u':
{
new
end = stringPos - 1,
id = 0,
bool:num = true,
ch;
while ((ch = string[++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
string[end] = '\0';
num = false;
new
name[MAX_PLAYER_NAME];
id = end - stringPos;
foreach (Player, playerid)
{
GetPlayerName(playerid, name, sizeof (name));
if (!strcmp(name, string[stringPos], true, id))
{
setarg(paramPos, 0, playerid);
num = true;
break;
}
}
if (!num)
{
setarg(paramPos, 0, INVALID_PLAYER_ID);
}
string[end] = ch;
#if defined __SSCANF_FOREACH__
#undef foreach
#undef __SSCANF_FOREACH__
#endif
}
stringPos = end;
}
case 's', 'z':
{
new
i = 0,
ch;
if (format[formatPos])
{
while ((ch = string[stringPos++]) && ch != delim)
{
setarg(paramPos, i++, ch);
}
if (!i)
{
return -1;
}
}
else
{
while ((ch = string[stringPos++]))
{
setarg(paramPos, i++, ch);
}
}
stringPos--;
setarg(paramPos, i, '\0');
}
default:
{
continue;
}
}
while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
{
stringPos++;
}
while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
{
stringPos++;
}
paramPos++;
}
do
{
if ((delim = format[formatPos++]) > ' ')
{
if (delim == '\'')
{
while ((delim = format[formatPos++]) && delim != '\'') {}
}
else if (delim != 'z')
{
return delim;
}
}
}
while (delim > ' ');
return 0;
}PS : ist jetzt alles aus dem Stegreif geschrieben, also es könnte sein, dass da was nicht geht
-
Meinst du mit Endround einen GameMode Restart ?
Wenn ja dann lass nen Timer durchlaufen der die uhrzeit überprüft.
Die zeit kannst du mit "gettime(hour, min, sek)" abfragen.
Dann if(hour == 3 && min == 0)
Dann einfach SendRconCommand("gmx");
Den Timer musst du aber im Minutentakt laufen lassen.// EDIT : zu langsam