Anti Waffenhack

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
  • Hi Ich bin grad dabei ein Anti Waffenhack zumachen dafür habe ich die Variable GaveWeapon[MAX_PLAYERS]; bei jedem GivePlayerWeapon( auf 1 gesetzt. Und ich frage in einem Timer ab ob er neue Waffen hat und die Variable gleich 0 ist, wenn ja wird er gekickt, der benötigte Abschnitt ist hier. Irgendein Denkfehler ist da drin aber ich find ihn nicht.


    new weapon2[13], ammo2[13], weapon[13], ammo[13];
    for(new i = 0; i < 13; i++)
    {
    GetPlayerWeaponData(playerid, i, weapon[i], ammo[i]);
    if(weapon[i] != weapon2[i] && GaveWeapon[playerid] == 0)
    {
    format(string, sizeof(string), "AdmCmd: %s wurde vom System gekickt, Grund: Waffenhack", cheater);
    SendClientMessageToAll(COLOR_RED2, string);
    Kick(playerid);
    getdate(year, month, day);
    gettime(hour, minute, second);
    format(banstring, sizeof(banstring), "%s wurde wegen Waffenhacks gekickt.(%d.%d.%d) %d:%d:%d Uhr",cheater, month, day, year, hour, minute, second);
    KickLog(banstring);
    }
    else
    {
    GaveWeapon[playerid] = 0;
    }
    GetPlayerWeaponData(playerid, i, weapon2[i], ammo2[i]);
    }



    Ich werde dennoch immer gekickt wenn ich mir eine normale Waffe kaufe.

    Einmal editiert, zuletzt von Sc4uT ()

  • Also ich versuch es nochmal verständlich zu machen, ich habe bei jedem GivePlayerWeapon(, die Variable GaveWeapon[playerid] = 1; auf eins gesetzt. In etwa so:

    GivePlayerWeapon(playerid, 24, 42); //DESERT EAGLE
    GivePlayerWeapon(playerid, 29, 60); //MP5
    GaveWeapon[playerid] = 1;
    Ich frage einfach bei jedem neuen Timer durchlauf die Waffen ab und vergleiche sie mit dem vorherigen Durchlauf, wenn sich die Waffen geändert haben und die Variable von vorhin immernoch auf 0 ist Also GaveWeapon[playerid] == 0, dann wird er wegen Waffenhhacks gebannt. Ich bin jetzt soweit, dass ich die Variable am Anfang des Scripts speichere und sie Playerspezifisch ist. Muss jetzt nur noch testen.



    Ganz Oben:
    new weapon2[MAX_PLAYERS][13], ammo2[MAX_PLAYERS][13], weapon[MAX_PLAYERS][13], ammo[MAX_PLAYERS][13];

    for(new i = 0; i < 13; i++)
    {
    GetPlayerWeaponData(playerid, i, weapon[playerid][i], ammo[playerid][i]);
    if(weapon[playerid][i] != weapon2[playerid][i] && GaveWeapon[playerid] == 0)
    {
    format(string, sizeof(string), "AdmCmd: %s wurde vom System gekickt, Grund: Waffenhack", cheater);
    SendClientMessageToAll(COLOR_RED2, string);
    Kick(playerid);
    getdate(year, month, day);
    gettime(hour, minute, second);
    format(banstring, sizeof(banstring), "%s wurde wegen Waffenhacks gekickt.(%d.%d.%d) %d:%d:%d Uhr",cheater, month, day, year, hour, minute, second);
    KickLog(banstring);
    }
    else
    {
    GaveWeapon[playerid] = 0;
    }
    GetPlayerWeaponData(playerid, i, weapon2[playerid][i], ammo2[playerid][i]);
    }



    //EDIT Es funktioniert immer noch nicht.

    2 Mal editiert, zuletzt von Sc4uT ()

  • Ich würds mit GetPlayerWeapon machen, wenn er sich ne Waffe hackt und die dann auswählt gibts direkt Bann :D

  • GaveWeapon steht (falls ich alles richtig verstanden habe) ja nur für eine einzige Waffe, du checkst also nicht ob die jeweilige Waffe übergeben wurde (übers script) sondern nur ob eine Waffe überhaupt übergeben wurde. Das ganze überprüfst du nochmal (ist das richtig?) über die Arrays weapon und weapon2. Du bist hier schonmal viel zu ressourcen verschwenderisch, denn diese double checks brauchst du nicht. Sollte dein Script mal Mist bauen bist du mit denen genauso schlecht dran wie ohne auch (false positive etc.).


    Im Code kann man nicht sehen, was du anderswo mit den Variablen machst, somit ist auch keine direkte Hilfe möglich.


    Also mein Vorschlag:


    Verwende nur ein Array:


    new weapon[MAX_PLAYERS][?], ammo[MAX_PLAYERS][?];


    Jetzt kommts drauf an: Erlaubst du alle Waffen im Script auf deinem Server? Wenn nicht dann mach das Array nur so groß wie du auch Waffen hast.


    Wenn dein Script einer Person die Waffe übergibt schreibst du in das Array rein, welche. Im der Anticheatfunktion checkst du dann ob die Person auch wirklich diese Waffe hat. Du brauchst wirklich nur ein Array für die Waffen anstelle von 2 plus extra Variable.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax