AntiCheat bereitet Probleme

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Mein AntiCheat bereitet mir derzeit Probleme. Sobald ich auf den Server Connecte habe ich pHealth = 100; zugewiesen.


    Nun gebe ich mein Passwort ein und die pHealth wird komischerweise auf 0 gestzt (erfahren durch printf)


    Nun ist meine Frage was kann man machen damit dieser Befehl richtig funktioniert ?



    if(Health != pHealth[i] && Health > 0)
    {
    if(Health > pHealth[i])
    {

    SetPlayerHealth(i, pHealth[i]);
    SendClientMessage(i,COLOR_RED, "Health Hacker"); //hier mäckert er
    }
    else
    {
    pHealth[i] = Health;
    return 1;
    }
    }

  • Hier wird der Spawn angesprochen



    public OnPlayerSpawn(playerid)
    {
    pHealth[playerid] = PlayerInfo[playerid][pLive];
    foreach(Player, i)
    {
    new Float:Health;
    GetPlayerHealth(i, Health);
    new string[128];
    format(string,sizeof(string),"Health %i",Health);
    SendClientMessage(i,COLOR_RED,string);
    }
    SetPlayerArmour(playerid,0);
    SetPlayerSkin(playerid,PlayerInfo[playerid][pSkin]);
    if(PlayerInfo[playerid][pBanned]==-1)
    {
    SetPlayerPos(playerid,1242.8275,-1695.3693,16.1874);
    new string[1600],string1[1300],name1[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name1,sizeof(name1));
    format(string,sizeof(string),"Dieser Account ist gesperrt, mit ihm kann nicht gespielt werden.\n\nWenn das nicht dein Account ist, verwende einen anderen Nicknamen\nWenn das dein Account ist und du zu unrecht gesperrt wurdest, melde dich im Forum unter"Servername"\n\nGrund: %s\nDauer:Permanent\nAusgeführt von: %s",PlayerInfo[playerid][pBanreason],PlayerInfo[playerid][pBanner]);
    strcat(string1,string);
    ShowPlayerDialog(playerid, DIALOG_STATISTIKEN, DIALOG_STYLE_MSGBOX,PlayerInfo[playerid][pName],string1,"Ok","");
    SetTimerEx("KickTimer",1000,false,"i",playerid);
    }
    else
    {
    if(PlayerInfo[playerid][pBanned]==1)
    {
    SetPlayerPos(playerid,1242.8275,-1695.3693,16.1874);
    new string[1600],string1[1300],name1[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name1,sizeof(name1));
    format(string,sizeof(string),"Dieser Account ist gesperrt, mit ihm kann nicht gespielt werden.\n\nWenn das nicht dein Account ist, verwende einen anderen Nicknamen\nWenn das dein Account ist und du zu unrecht gesperrt wurdest, melde dich im Forum unter"Servername"\n\nGrund: %s\nDauer:%s\nAusgeführt von: %s",PlayerInfo[playerid][pBanreason],PlayerInfo[playerid],PlayerInfo[playerid][pBanner]);
    strcat(string1,string);
    ShowPlayerDialog(playerid, DIALOG_STATISTIKEN, DIALOG_STYLE_MSGBOX,PlayerInfo[playerid][pName],string1,"Ok","");
    SetTimerEx("KickTimer",1000,false,"i",playerid);
    }
    else
    {
    if(PlayerInfo[playerid][SpawnInKnast]==1)
    {
    SetPlayerPos(playerid, 265.9037,77.2875,1001.0391);
    SetPlayerInterior(playerid,6);
    jailTimer[playerid] = SetTimerEx("SetPlayerUnjail", 1000, 1, "d",playerid);
    if(jailTimer[playerid] == -1) KillTimer(jailTimer[playerid]);
    TogglePlayerControllable(playerid,1);
    }
    if(PlayerInfo[playerid][pSpawn] == 1)
    {
    SetPlayerPos(playerid,1243.0741,-1695.6372,16.1820);
    SetPlayerVirtualWorld(playerid,0);



    }
    if(PlayerInfo[playerid][pSpawn] == 2)
    {
    SetPlayerPos(playerid,-1969.2156,137.9266,27.6875);
    SetPlayerVirtualWorld(playerid,0);



    }
    if(PlayerInfo[playerid][pSpawn] == 3)
    {
    SetPlayerPos(playerid,2849.0522,1290.9452,11.3906);
    SetPlayerVirtualWorld(playerid,0);



    }
    if(PlayerInfo[playerid][pSpawn]==4)
    {
    if(PlayerInfo[playerid][pMember]>0 || PlayerInfo[playerid][pLeader]>0)
    {
    new fID;
    fID = PlayerInfo[playerid][pMember];
    SetPlayerPos(playerid, fInfo[fID][f_x],fInfo[fID][f_y],fInfo[fID][f_z]);
    SetPlayerFacingAngle(playerid, fInfo[fID][f_r]);
    SetPlayerInterior(playerid, fInfo[fID][f_inter]);
    SetPlayerVirtualWorld(playerid, fInfo[fID][f_world]);
    SetPlayerColor(playerid, fInfo[fID][f_color]);
    }
    else
    {
    PlayerInfo[playerid][pSpawn]=1;
    SpawnPlayer(playerid);
    }
    }
    if(PlayerInfo[playerid][pSpawn]==5)
    {
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][h_id])continue;
    if(!strlen(hInfo[i][h_besitzer]))continue;
    if(strcmp(hInfo[i][h_besitzer], getPlayerName(playerid), true))continue;
    if(hInfo[i][ih_x] != 0.0)
    {
    //Im Haus spawnen
    SetPlayerPos(playerid, hInfo[i][ih_x], hInfo[i][ih_y], hInfo[i][ih_z]);
    SetPlayerInterior(playerid, hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid, i);
    }
    else
    {
    //Vorm Haus Spawnen
    SetPlayerPos(playerid, hInfo[i][h_x], hInfo[i][h_y], hInfo[i][h_z]);
    SetPlayerInterior(playerid, 0);
    SetPlayerVirtualWorld(playerid, 0);
    }
    }
    }
    }
    }
    if(OnDuty[playerid] ==1)
    {
    OnDuty[playerid] =0;
    }
    return 1;
    }

  • Was wird dir beim Spawn so ausgegeben:
    pHealth[playerid] = PlayerInfo[playerid][pLive];
    zu:
    printf("1: %f", pHealth[playerid]);
    pHealth[playerid] = PlayerInfo[playerid][pLive];
    printf("2: %f", pHealth[playerid]);


    PS: Durch die Schleife in der Zeile drunter sendest du jedem Spieler, wenn irgendein Spieler spawnt, seinen aktuellen Health-Stand. Ist das gewollt?

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Die Schleife darunter mit foreach war nicht meine absicht gewesen.


    Ich habe den Code wie folgt nun abgeändert



    public OnPlayerSpawn(playerid)
    {
    if(PlayerInfo[playerid][SpawnInKnast]==1)
    {
    SetPlayerPos(playerid, 265.9037,77.2875,1001.0391);
    SetPlayerInterior(playerid,6);
    jailTimer[playerid] = SetTimerEx("SetPlayerUnjail", 1000, 1, "d",playerid);
    if(jailTimer[playerid] == -1) KillTimer(jailTimer[playerid]);
    TogglePlayerControllable(playerid,1);
    }
    switch(PlayerInfo[playerid][pSpawn])
    {
    case 0:
    {
    PlayerInfo[playerid][pSpawn]=1;
    }
    case 1:
    {
    SetPlayerPos(playerid,1830.9562,-1125.6575,23.8393);
    SetPlayerVirtualWorld(playerid,0);
    }
    case 2:
    {
    SetPlayerPos(playerid,-1969.2156,137.9266,27.6875);
    SetPlayerVirtualWorld(playerid,0);
    }
    case 3:
    {
    SetPlayerPos(playerid,2849.0522,1290.9452,11.3906);
    SetPlayerVirtualWorld(playerid,0);
    }
    case 4:
    {
    if(PlayerInfo[playerid][pMember]>0 || PlayerInfo[playerid][pLeader]>0)
    {
    new fID;
    fID = PlayerInfo[playerid][pMember];
    SetPlayerPos(playerid, fInfo[fID][f_x],fInfo[fID][f_y],fInfo[fID][f_z]);
    SetPlayerFacingAngle(playerid, fInfo[fID][f_r]);
    SetPlayerInterior(playerid, fInfo[fID][f_inter]);
    SetPlayerVirtualWorld(playerid, fInfo[fID][f_world]);
    SetPlayerColor(playerid, fInfo[fID][f_color]);
    }
    else
    {
    PlayerInfo[playerid][pSpawn]=1;
    SpawnPlayer(playerid);
    }
    }
    case 5:
    {
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][h_id])continue;
    if(!strlen(hInfo[i][h_besitzer]))continue;
    if(strcmp(hInfo[i][h_besitzer], getPlayerName(playerid), true))continue;
    if(hInfo[i][ih_x] != 0.0)
    {
    //Im Haus spawnen
    SetPlayerPos(playerid, hInfo[i][ih_x], hInfo[i][ih_y], hInfo[i][ih_z]);
    SetPlayerInterior(playerid, hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid, i);
    }
    else
    {
    //Vorm Haus Spawnen
    SetPlayerPos(playerid, hInfo[i][h_x], hInfo[i][h_y], hInfo[i][h_z]);
    SetPlayerInterior(playerid, 0);
    SetPlayerVirtualWorld(playerid, 0);
    }
    }
    }
    }
    if(OnDuty[playerid] ==1)
    {
    OnDuty[playerid] =0;
    }
    SetPlayerArmour(playerid,0);
    SetPlayerSkin(playerid,PlayerInfo[playerid][pSkin]);
    printf("1: %f", pHealth[playerid]);
    printf("2: %f", pHealth[playerid]);
    return 1;
    }


    Der Print gibt folgendes aus


    [18:01:12] 1: 100.000000[18:01:12] 2: 100.000000


    eigentlich beides richtig.


    Vielleicht ist OnPlayerConnect noch mit entscheiden aber dort setze ich das leben mit



    pHealth[playerid] = 100;


    Das Problem taucht nur auf wenn der Spieler sich neu einloggen tut. Allerdings nicht wenn ich den Spieler neu spawne

  • Mit SetPlayerHealth(playerid, PlayerInfo[playerid][pLive]);


    funktioniert es ich kriege dadurch auch keine Warnung das ich ein Heal Hacker wäre (habe das kicken ausgebaut und nen scm eingebaut.


    Allerdings erkennt SetPlayerHealth ja keinen Cheat soweit ich weiß

  • Für deinen Anti-Cheat dann:
    pHealth[playerid] = PlayerInfo[playerid][pLive];SetPlayerHealth(playerid, pHealth[playerid]);

    Ab dort kriege ich wieder angezeigt das ich ein Hacker bin.


    Ich poste mal hinzu dort wo mir das gesagt wird



    foreach(Player, i)
    {
    new Float:Health;
    GetPlayerHealth(i, Health);
    if(Health != pHealth[i] && Health > 0)
    {
    if(Health > pHealth[i])
    {



    SetPlayerHealth(i, pHealth[i]);
    SendClientMessage(i,COLOR_RED, "Health Hacker");
    }
    else
    {
    pHealth[i] = Health;
    return 1;
    }
    }
    }

  • Was wird dir so ausgegeben?
    new Float:Health;
    foreach(Player, i)
    {
    GetPlayerHealth(i, Health);
    printf("i: %d / Health: %f / pHealth: %f", i, Health, pHealth[i]);
    if(Health > pHealth[i] && Health > 0)
    {
    SetPlayerHealth(i, pHealth[i]);
    SendClientMessage(i,COLOR_RED, "Health Hacker");
    }
    else
    {
    pHealth[i] = Health;
    }
    }

  • Folgendes wird mir ausgegeben


    [18:26:15] i: 0 / Health: 100.000000 / pHealth: 90.000000
    [18:26:15] i: 0 / Health: 90.000000 / pHealth: 90.000000
    [18:26:15] i: 0 / Health: 90.000000 / pHealth: 90.000000



    ich sehe [18:26:15] i: 0 / Health: 100.000000 / pHealth: 90.000000
    hier ist wohl ein Fehler. Allerdings gebe ich den Health nicht mehr an außer in OnPlayerSpawn