Guten Tag.
Ich habe mal ein Anti-teleport hack versucht zu machen.
Es läuft ein Timer von 1ner Sekunde, der alles mögliche checkt und abfragt. unteranderem fragt er die position des spielers ab.
es wird ein timer von 500ms gestartet, der also beendet ist, bevor der 2. timer von 1ne sekunde abläuft.
also es wird die position abgefragt, dann wird ne halbe sekunde später wieder die position abgefragt und überprüft wie hoch die distanz ist.
Ich habe noch eine Variable mit eingebunden, die überprüft ob es ein Admin teleport oder cheaterteleport ist. also bei /get id, wird antiteleport bei der id ausgeschaltet und nach ca. 2 sekunden wieder angeschaltet.
OnGameModeInit:
SetTimer("check",1000,1);
der timer:
public check()
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
//anti teleport:
if(poscheatan[i] == 1 && Spieler[i][Admin] <= 0) //fra gt ab ob anti teleport cheat an ist und ob er admin ist
{
GetPlayerPos(i,cheatpos[0],cheatpos[1],cheatpos[2]);
SetTimerEx("cheatposcheck",500,0,"i",i);
}
else if(poscheatan[i] == 2) //das hier wird benötigt, falls der spieler vom script aus geportet wird
{
poscheatan[i] = 3;
}
else if(poscheatan[i] == 3)
{
poscheatan[i] = 1;
}
}
return 1;
}
2. Timer:
public cheatposcheck(playerid)
{
if(distanz(playerid,cheatpos[0],cheatpos[1],cheatpos[2]) >= 150)
{
cheater[playerid]++;
new str[256],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
format(str,sizeof(str),"[WARNUNG][CHEAT] %s (%d) steht und Verdacht eines Teleport-Hacks!", name, playerid);
for (new j = 0; j < MAX_PLAYERS; j++)
{
if(Spieler[j][Admin] >= 1)
{
SendClientMessage(j,0x0000FFFF,str);
}
}
if(cheater[playerid] >= 5)
{
new bstr[256],Spielerdatei[256];
format(bstr,sizeof(bstr),"%s wurde vom System gebannt, Grund: Teleport", name);
SendClientMessageToAll(0xFF0000FF,bstr);
Spieler[playerid][ban] = 1;
format(Spielerdatei,sizeof(Spielerdatei),"/User/%s.ini", name);
dini_Set(Spielerdatei,"bangrund","Teleport");
Kick(playerid);
}
}
return 1;
}
Hier die distanz definiert:
stock distanz(playerid,Float:x,Float:y,Float:z)
{
new Float:dis;
new Float:x1,Float:y1,Float:z1;
if (!IsPlayerConnected(playerid)) return -1;
GetPlayerPos(playerid,x1,y1,z1);
dis = floatsqroot(floatpower(floatabs(floatsub(x,x1)),2)+floatpower(floatabs(floatsub(y,y1)),2)+floatpower(floatabs(floatsub(z,z1)),2));
return floatround(dis);
}
und hier ein beispiel dcmd, wo gezeigt wird wie ich die variable poscheckan veränder, damit er erkennt das es sich im ein admincmd handelt:
dcmd_get(playerid,params[])
{
new pID;
if(sscanf(params, "u", pID))
{
return SendClientMessage(playerid,COLOR_RED,"Benutzung: /get [Playerid]");
}
if(!IsPlayerConnected(pID))
{
return SendClientMessage(playerid,COLOR_RED,"Kein Spieler mit angegebener ID Online");
}
if(Spieler[playerid][Admin] <= 1)
{
return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin Level 2!");
}
if(Spieler[playerid][Admin]<Spieler[pID][Admin])
{
return SendClientMessage(playerid,COLOR_RED,"Du kannst diesen Befehl nicht an höherrangigen Admins ausführen!");
}
else
{
poscheatan[pID] = 0; //wird ausgeschaltet
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
SetPlayerPos(pID, x+2, y+2, z+2);
new admint = GetPlayerInterior(playerid);
SetPlayerInterior(pID, admint);
new admvrt = GetPlayerInterior(playerid);
SetPlayerVirtualWorld(pID, admvrt);
new aname[MAX_PLAYER_NAME], string2[256];
GetPlayerName(playerid, aname, sizeof(aname));
format(string2, sizeof(string2), "Du wurdest von %s zu sich teleportiert.", aname);
SendClientMessage(pID, COLOR_RED, string2);
new name[MAX_PLAYER_NAME], string[256];
GetPlayerName(pID, name, sizeof(name));
format(string, sizeof(string), "Du hast %s zu dir teleportiert.", name );
SendClientMessage(playerid, COLOR_GREEN, string);
poscheatan[pID] = 2; //wird auf 2 gesetzt, im timer auf 3 und danach auf 1. also ca. 2 sekunden nach dem er geportet wird, wird antiteleport cheat wieder aktiviert
}
return 1;
}
Das Problem ist jetzt, das es immer fehlmeldung gibt. man wird gebannt obwohl man auf einer stelle steht. Ich würde gerne wissen was daran alles falsch ist und wie man es besser machen könnte. das habe ich nun auf die schnelle gemacht.
mfg
Simon