Selfmade Anticheat

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
  • Hallo liebes Breadfish


    Ich würde mich gerne an ein selbstgeschriebenes Anticheat setzen und hätte einpaar Fragen.


    Warum ich keinen Junkbuster will ?
    Junkbuster ist zwar ein gutes Anticheat jedoch nicht von mir. Ich möchte dass mein Script ganz alleine von mir geschrieben wird, also die ganzen Systeme, diverese Anti's und soweiter.
    Vielleicht ist das für manche blöd aber ich lege Wert auf ein Selfmade, dass auch wirklich selbstgeschrieben ist. ^^



    Bist dato habe ich einen "kleinen" Antiwaffencheat. Die meisten kennen das Prinzip natürlich.
    Man definiert die Waffen als "böse" Waffen und lässt nen Timer laufen der Spieler auf diese bestimmten Waffen prüft.
    Jedoch ist das nicht wirklich gut, denn andere Waffen die nicht auf der Blacklist sind können ercheatet werden und das ist auch blöd.
    Ich habe mich hier einwenig durchgelesen und bin auf "Serverseitige" Waffen, Gelder und so gestoßen.

    Nun ist meine Frage, was genau mit Serverseitig gemeint ist?

    Da blicke ich nicht durch .. :S



    Natürlich könnte ich das Anticheat von zb pRP nehmen, das wirklich gut ist in meinen Augen aber dann wäre es nicht von mir geschrieben und das möchte ich nicht.


    Ich hoffe jemand wäre so nett und könnte mir das genauer erläutern, wenn möglich mit kleinen Beispielen.



    Hochachtungsvoll,
    Makaveli

  • Also Serverseitig bedeutet, dass du alles was du gibst auch in einer Variable speicherst.
    z.B. Geld.
    Du gibst dem Spieler nicht nur per GivePlayerMoney sein Geld, sondern erhöhst Nebenbei auch die Variable fürs Geld.
    Sollte der Spieler dann mehr Geld auf der Hand haben, als in der Variable steht, hat er gecheatet.


    So ähnlich kannst du es auch bei Waffen machen.
    Sobald du jmd eine MP5 gibst (Beispiel) dann setzt du die Variable mp5[playerid] auf 1.
    Sollte diese Variable auf 0 stehen und er hat eine Mp5, hat er gecheatet.


    So ungefähr funktioniert das.
    Natürlich könnte man es noch mit Ammo machen etc...

  • Du gleichst bspw. das Geld, das der Spieler hat, mit dem in einer Variable ab.


    Dazu machst Du Dir eine Funktion, die neben dem GivePlayerMoney auch das Geld in der Variable ändert.


    Wenn sich beide Werte unterscheiden, hat er höchstwahrscheinlich gehackt. Es kann allerdings durch Lags zu Fehlbans kommen, sodass man am Besten nur kicken lassen sollten.


    Wenn Du Waffen serverside machen möchtest, machst du eine Variable:

    Code
    new pWeapons[MAX_PLAYERS][47] //Müsste die maximale Waffen ID sein


    Dann machst Du, wenn du dem Spieler eine Waffe gibst:

    Code
    pWeapons[playerid][waffenid] = 1;


    Wenn dann der Spieler eine Deagle hat und

    Code
    pWeapons[playerid][24] == 0

    ist, hat er sich die Waffe höchstwahrscheinlich gehackt.


    So ist es möglich, nicht nur die bad Weapons detecten zu lassen, sondern auch bspw. eine gehackte Deagle.


    Nach dem Prinzip verfährst du ebenfalls bei Armor, Heal, etc.
    @[pL]Makaveli:

  • Eine simpele Methode ist es auch einfach abzufragen ob der Spieler das Level, das er für die Waffe braucht hat.
    Das ist die Simpelste Methode 95% aller Waffenhacker rauszufiltern. Sonst halt mit Variable.

  • Also als erstes danke ich euch beiden für eure Hilfe und Erklärungen ^^.


    @John_Hunter
    Wenn ichs richtig verstanden habe (was ich hoffe) würde das ca. so aussehen.


    Spieler geht in einen Ammunation und kauf sich eine Deagle mit der ID 24.
    Nach dem erhalt der Waffe wird die Variable pWeapons[playerid][24] auf 1 gesetzt. Die Waffe wurde auf legalem Wege erhalten.


    Falls jedoch der Spieler eine Deagle hat und die Variable pWeapons[24] auf 0 ist sie höchstwarscheinlich ercheatet.


    Jedoch kommen mir da 2 Fragen.
    Wenn der Spieler seine ganzes Magazin verballert, verschwindet sie Waffe wieder. Also müsste dann die Variable für die Waffe auf 0 gesetzt werden, wie könnte ich das machen ?
    Und die zweite Frage, wie kann ich Abfragen welchen Wert die Variable hat ?


    Würde das mit dem kleinen Antihackcode hier funktionieren ( die Vorgehensweise ) :


    /*public AntiCheat(playerid) //--179
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    new waffen = GetPlayerWeapon(i);
    if(waffen == 38 || waffen == 4 || waffen == 35 || waffen == 16 || waffen == 17 || waffen == 18 || waffen == 26 || waffen == 32 && !IsPlayerAdmin(playerid))
    {
    new pname[MAX_PLAYER_NAME];
    new string[100];
    GetPlayerName(playerid, pname, sizeof(pname));
    format(string, sizeof(string), "=AntiCheat= %s wurde wegen WaffenHack gebannt!", pname);
    SendClientMessage(playerid, 0xAA3333AA, string);
    Ban(i);
    }
    }
    return 1;
    }*/


    Sorry wenn ich so viele Fragen stelle ^^


    Freundliche Grüße


  • Wow du hast es geschafft in anderen Worten meinen Post nochmal wiederzugeben.
    Nicht schlecht.



  • Das würde so schon passen.
    Nur brauchst du noch eine extra Klammer für die || Abfrage.
    Andernfalls könntest du auch einfach Switch und Case verwenden.


    new weapon = GetPlayerWeapon(i);
    switch (weapon)
    {
    case 38,4,35,16,17,18,26,32:
    {
    if(!IsPlayerAdmin(i)) Ban(i);
    }



    }

    So ungefähr.

  • Okay, ich habe nun die Waffen Variable erstellt


    new sWaffen[MAX_PLAYERS][47];


    Und als Beispiel beim Ammunationkauf :


    if(dialogid == DIALOG_AMMUNATION)
    {
    if(response)
    {
    if(listitem == 0)
    {
    if(GetPlayerMoney(playerid) < 1500)
    {
    return SendClientMessage(playerid, WHITE, "So viel Geld hast du nicht bei dir.");
    }
    else
    {
    GivePlayerMoney(playerid, -1500);
    GivePlayerWeapon(playerid, 24, 100);
    SpielerInfo[playerid][pGeld]-=1500;
    SendClientMessage(playerid, WHITE, "Du hast eine Desert Eagle gekauft.");
    sWaffen[playerid][24]=1;
    }
    }


    So nun sollte beim Kauf einer Deagle sWaffen[playerid][24] auf 1 gesetzt werden.
    Wie kann ich nun überprüfen, wenn der Spieler Waffen ID X hat ob die sWaffen[playerid][X] 0 oder 1 ist ?


    Also für jeden Spieler

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen

  • So:

    new weapon, ammo;
    for(new i = 0; i <= 12; i++) {
    GetPlayerWeaponData(playerid,i,weapon,ammo);
    if(sWaffe[weapon] == 0 && ammo > 0) Ban(playerid);


    }


    Ist ungetestet, kann sein, dass nen Logik Fehler drin ist.
    Müsste aber so passen.

  • Umso weniger Code in OnPlayerUpdate ist, desto besser.
    Deswegen ist es eventuell besser, meine Variante in einem Timer zu verwenden, welcher alle paar Sekunden ausgeührt wird.
    Das reicht ja auch.


    Alternativ kann man auch bei Onplayerkeystatechange abfragen, ob der Spieler schießt und dort dann die Waffenid rausfinden und bannen.


  • Hier kriege ich leider nen Error :


    public AntiCheat(playerid)
    {
    new weapon, ammo;
    for(new i = 0; i <= 12; i++)
    {
    GetPlayerWeaponData(playerid,i,weapon,ammo);
    if(sWaffen[weapon] == 0 && ammo > 0) Ban(playerid);
    }
    return 1;
    }

    error 033: array must be indexed (variable "sWaffen")


    :wacko:

  • Ein Tipp für deinen Anti Cheat, du kannst Aimbot mit der Abfrage wie viel Munition die Faust von dem Spieler hat abfragen.
    Leider gibt es auch Aimbot Hack's die nicht so Arbeiten, aber ein paar kannst du damit bestimmt überführen.


    Waffe: Faust
    Munition glaube ich 1000


    Mfg,
    Max

  • Ein Tipp für deinen Anti Cheat, du kannst Aimbot mit der Abfrage wie viel Munition die Faust von dem Spieler hat abfragen.
    Leider gibt es auch Aimbot Hack's die nicht so Arbeiten, aber ein paar kannst du damit bestimmt überführen.


    Waffe: Faust
    Munition glaube ich 1000


    Mfg,
    Max


    Wie funktioniert das genau?

  • Wie funktioniert das genau?


    Du gehst alle Waffen eines Spielers durch, wenn er einen Schlagring hat(ID 1) fragste ab, wieviele er hat. Wenn er 1000 Stück hat --> Bann
    Funktioniert, soweit ich weiß, aber nur, wenn der Spieler vor dem Aktivieren des Aimbots schon Schlagringe hat.
    Also müsste man in jeder Arena einen Schlagring vom System aus geben.
    mbcool:


  • Du gehst alle Waffen eines Spielers durch, wenn er einen Schlagring hat(ID 1) fragste ab, wieviele er hat. Wenn er 1000 Stück hat --> Bann
    Funktioniert, soweit ich weiß, aber nur, wenn der Spieler vor dem Aktivieren des Aimbots schon Schlagringe hat.
    Also müsste man in jeder Arena einen Schlagring vom System aus geben.
    mbcool:


    Aber inwiefiern erhöht der Aimbot die Munition?
    Der ist doch normalerweise nur fürs Zielen zuständig :o

  • Aber inwiefiern erhöht der Aimbot die Munition?
    Der ist doch normalerweise nur fürs Zielen zuständig :o


    Richtig. Aber einige Aimbots geben durch einen Bug 1000 Schlagringe. Das wird auch auf sehr vielen Servern als Banngrund benutzt, da es ein Beweis ist, dass der Jenige einen Aimbot nutzt.
    Man sollte halt noch abfragen, ob ein Admin ihm die 1000 Schlagringe gegeben hat.