die Zeile "if(Spieler[playerid][Admin] < 3) return 0;
löschen.
und wie schon gesagt oben im script: #define grau 0xAFAFAFAF
bei dcmd_vweg musst du die selbe Zeile auch löschen.
die Zeile "if(Spieler[playerid][Admin] < 3) return 0;
löschen.
und wie schon gesagt oben im script: #define grau 0xAFAFAFAF
bei dcmd_vweg musst du die selbe Zeile auch löschen.
wenn du eins hast dann brauchste das nicht. wenn keine errors kommen ist alles richtig.
unter deinen includes kommt die definierung von dcmd hin und unter OnPlayerCommandText das, was ich gepostet habe. Wenn du bereits stock/pupblic sscanf oder das sscanf 2.0 plugin hast, dann brauchste das nicht mehr.
//edit: Du musst es deinem Script anpassen!!!
Die variable "Spieler" ist in deinem script garnicht definiert! das ist eine Admin abfrage. wenn du ein admin system hast, musst du es anpassen.
ansonsten einfach löschen.
oben im script folgendes definieren:
#define grau 0xAFAFAFAF
OnPlayerCommandText(playerid,cmdtext[])
{
dcmd(v,1,cmdtext);
dcmd(vweg,4,cmdtext);
return 1;
}
#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
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;
}
new Adminauto[MAX_VEHICLES];
dcmd_v(playerid,params[])
{
new vID;
if(sscanf(params, "d", vID)) return SendClientMessage(playerid,grau,"Benutzung: /v [modelid]");
if(vID < 400 || vID > 611) return SendClientMessage(playerid,grau,"Nur Vehicle-ID's von 400-611 benutzen!");
if(Spieler[playerid][Admin] < 3) return 0;
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
new cv = CreateVehicle(vID, x, y, z, 0, 117, 117, -1);
Adminauto[cv] = 1;
SetVehicleNumberPlate(cv,"Admin Car");
SetVehicleHealth(cv,1000.0);
SetVehicleVirtualWorld(cv,GetPlayerVirtualWorld(playerid));
PutPlayerInVehicle(playerid,cv,0);
return 1;
}
dcmd_vweg(playerid,params[])
{
#pragma unused params
if(Spieler[playerid][Admin] <= 0) return 0;
new plv = GetPlayerVehicleID(playerid);
if(Adminauto[plv] == 1)
{
OnVehicleDestroy(plv,playerid);
DestroyVehicle(plv);
}
else
{
if(IsPlayerInAnyVehicle(playerid))
{
SendClientMessage(playerid,grau,"Dieses Fahrzeug kann nur gespawnt werden!");
}
else
{
SendClientMessage(playerid,grau,"Du sitzt in keinem Fahrzeug!");
}
}
return 1;
}
musst du deinem System anpassen, wenn du Hilfe brauchst beim einfügen von dcmd commands, helfe ich dir dabei gerne.
LG
Simon
Guten Tag
Ich kann alle Scripts compilen. Doch sobald ich mein GM in den vorgesehenen Gamemodes ordner mache und ihn dort compilen will, stürzt pawno ab. Am Script ist alles richtig, wie gesagt lässt es sich überall compilen nur in diesem Ordner nicht.
Ich bitte um Hilfe
LG
Simon
//edit: im Filterscript lässt er sich auch nicht compilen.. Aber aufm desk und sonst überall.
//edit: Fehler gelöst..
Aber Vorsicht! Auf vielen Servern ist das verboten und es ist auch möglich ein antiautoaim system zu scripten. Soweit ich weiß zielt man mit Autoaim immer im 90° Winkel. Wenn das erkannt wird, könntest du gebannt werden..
Also ich verstehe unter Aimbot ein bot der automatisch die anderen abschießt. Eventuell meint er Autoaim. das ist automatischen Zielen. Ich weiß nicht ob du GTA schonmal auf Konsolen gespielt hast, aber da ist das so. Die Personen werden automatisch anvisiert und du musst nur noch schießen. Treffen tust du wenn es Lagfrei ist fast immer.
Dein Kollege im Spiel meinte bestimmt das der Spieler die Konsolen einstellung, also um genauzu sein die Joypad einstellung hat und damit automatisch zielt und so gut wie immer trifft.
Du bekommst ihn ganz einfach indem du in deinen EInstellung die Steuerung von Maus und Tastertur auf Joypad umstellst, jedoch kannst du ohne einen Joypad dich mit der Maus nicht mehr umsehen.
Es muss aber nicht immer Autoaim oder ein Aimbot sein wenn man öfters mal getroffen wird. Es gibt einen Bug mitdem du rausfinden kannst ob dein Gegner Autoaim eingeschaltet hat oder nicht. Du ziehlst mit deinem Fadenkreuz auf den Kopf deines Gegners, nun bewegest du das Fadenkreuz kurz vom Kopf weg und wieder hin. Nun kannst du daneben schießen, triffst ihn aber trotzdem. Außerdem siehst du das an seinem Laufstil oder ob er sich wirklich immer mit dem Kopf des Gegners bewegt.
new Geschlecht[2][25] = {
"Männlich",
"Weiblich"
};
und die abfrage ist dann so:
format(string,sizeof(string),"Geschlecht: %s",Geschlecht[GetPVarint(playerid,"Geschlechter")]);
Eigentlich sind wir hier ein SAMP Forum und kein MTA.
aber mit MTA mappt man für seinen Samp Server..
#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
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;
}
Um nun ein befehl zu scripten musst du den unter OnPlayerCommandText definieren:
//dcmd(cmd,länge,cmdtext);
//beispiel:
dcmd(test,4,cmdtext);
und nun musst du außerhalb der publics den befehl scripten:
dcmd_test(playerid,params[])
{
SendClientMessage(playerid,0x00DD00FF,"Test");
return 1;
}
WIe meinst du das? das ist ganz normal dcmd.. meinst du ganz normal unter OnPlayerText(playerid,cmdtext[])
wenn ja, ne kann ich nicht da ich es bisher nur mit dcmd gemacht habe wenn parameter benötigt werden.
new ignor[MAX_PLAYERS][MAX_PLAYERS]
OnPlayerDisconnect(playerid,reason)
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
ignor[playerid][i] = 0;
ignor[i][playerid] = 0;
}
return 1;
}
nun zum befehl, ich benutze dcmd. müsstest du dann anpassen.
OnPlayerCommandText(playerid,cmdtext[])
{
dcmd(ignor,5,cmdtext);
return 1;
}
dcmd_ignor(playerid,params[])
{
new pID;
if(sscanf(params,"u",pID)) return SendClientMessage(playerid,farbe,"Benutze: /ignor [playerid]");
if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,farbe,"Ungültige playerid!");
if(ignor[playerid][i] == 0)
{
new name[MAX_PLAYER_NAME], str[100];
GetPlayerName(pID,name,sizeof(name));
format(str,sizeof(str),"Sie ignorieren absofort %s(%d)",name,pID);
SendClientMessage(playerid,0x00DD00FF,str);
ignor[playerid][pID] = 1;
}
else
{
new name[MAX_PLAYER_NAME], str[100];
GetPlayerName(pID,name,sizeof(name));
format(str,sizeof(str),"Sie ignorieren absofort nicht mehr %s(%d)",name,pID);
SendClientMessage(playerid,0x00DD00FF,str);
ignor[playerid][pID] = 0;
}
return 1;
}
du musst nun nurnoch die abfrage machen ob ignor[id1][id2] == 1 ist und wenn ja schreibste halt: dieser spieler ignoriert sie.
Kommt drauf an welche Objekte du ans auto kleben willst. Für Blinker habe ich ein Filterscript welches die Koords der Blinker speichert.
Bei anderen Objecten musst du dann ein eigenes schreiben oder ausprobieren.
Guten Tag
Ich möchte per Befehl leute rangebannen, das heißt jede ip die mit den 1. beiden stellen beginnt, wird sofort gekickt.
gespeichert und ausgelesen wird alles richtig, das wurde schon getestet, doch iwie kickt er ihn nicht weg:
public OnPlayerConnect(playerid)
{
new ip[40],ip2[4][5],ipstr[30],readstr[50];
GetPlayerIp(playerid,ip,sizeof(ip)); //kriegt die ip
split(ip,ip2,'.'); //teilt die ip in 4 teile immer beim "."
format(ipstr,sizeof(ipstr),"%s.%s.",ip2[0],ip2[1]); //stellt die 1. beiden stellen zusammen (bsp: 120.86.)
new File:rb = fopen("rangebans.txt",io_read); //öffnet die datei
while(fread(rb,readstr))
{
if(!strcmp(ipstr,readstr,true)) //überprüft ob die 1. beiden stellen der ip, mit der gebannten ip übereinstimmt
{
SendClientMessage(playerid,0xDD0000FF,"War wohl nichts!");
return Kick(playerid);
}
}
dann könnte er es viel einfacher machen und einfach abfragen ob er online ist.
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
Wäre sinnvoller.. Aber er möchte glaube ich, das nicht mehr gemacht wird als nötig.
Bei deiner variante würde er ja 1 schleife komplett durchgehen und dann eine 2. Da könnte er genauso gut eine schleife komplett durchgehen und abfragen ob der spieler connected ist.
Würde es auch mit einer variablen machen.
welches warning?
Überprüfe die Koordinaten nocheinmal und die pickup id.
bsnenter=CreatePickup(1559,1,1199.3176,-918.6033,43.1193,-1);
bsnexit=CreatePickup(1559,1,62.9931,-75.1433,1001.5078,-1);
Ansonsten mal die Koords überprüfen
Okay, dann weiß ich wie ich das nun mache.
Eine frage hätte ich dann noch: wie kann ein einen bestimmten Teil eines Strings löschen. Eventuell müssen Namen aus der liste gelöscht werden.
habe mir schon mehrere funktionen zur string manipulation angeschaut und eventuell auch die richtigen gefunden, aber wie genau das nun geht weiß ich nicht.
Genau daran arbeite ich gerade, ist schnell und einfach. Wollte aber vorher wissen ob es möglich wäre so alle zu öffnen.