So, ich hab mir mal Exolents Plugin angesehen und ausgehend davon, dass xPaw dieselbe Technik benutzt, es analysiert.
Die ganze Logik findet im client_PreThink Forward statt:
Code:
0x14BC PROC ; client_PreThink
Er benutzt die bekannte Methode, um zu prüfen, ob ein Spieler Jump gedrückt hat via EV_INT_oldbuttons und EV_INT_flags, um zu prüfen, in welchem Status sich ein Spieler befindet und wann er genau Jump gedrückt hat.
Insgesamt zählt er also wenn ein Spieler springt und wieder landet, die Anzahl der Frames, wann der Spieler das nächste mal wieder springt. Ein perfekter Bhop ist, wenn man genau 2 Frames nach dem Landen wieder springt. Ist dies der Fall, dann werden zwei interne Zähler erhöht (g_iTotalPerfectBhops und g_iRowPerfectBhops). Macht man einen nicht perfekten Bhop wird der der letztere Zähler logischerweise zurückgesetzt.
So wie ich das bis jetzt sehe (und ich werde es mir nicht genauer ansehen), prüft das Plugin nur die Anzahl der perfekten BHops in Reihe und bannt dann. Das andere wäre ja auch unlogisch.
Proof:
get_entity_int mit EV_INT_flags
Code:
0x14F8 PUSH.C 0x1B ; push EV_INT_flags (27d / 0x1B) auf den Stack (für FL_JUMPING etc)
0x1500 PUSH.S 0xC ; push CLIENT ID auf den Stack
0x1508 PUSH.C 0x8 ; (2 parameter?)
0x1510 SYSREQ.C entity_get_int ; PRI enthält rückgabewert
0x1518 STACK 0xC ; stack aufräumen
0x1520 STOR.S.pri -0x4 ; rückgabewert der funktion in LOCAL1 speichern
get_entity_int mit EV_INT_oldbuttons
Code:
0x1534 PUSH.C 0x1 ; push EV_INT_oldbuttons auf stack (0x2, für IN_JUMP etc)
0x153C PUSH.S 0xC ; push CLIENT ID auf stack
0x1544 PUSH.C 0x8 ; (2 parameter?)
0x154C SYSREQ.C entity_get_int
0x1554 STACK 0xC
0x155C STOR.S.pri -0x8 ; rueckgabewert in LOCAL2 speichern
Wenn JUMP gedrückt wird:
Code:
0x1568 LOAD.S.pri -0x4 ; FLAGS (LOCAL1) in PRI
0x1570 CONST.alt 0x200 ; #define IN_JUMP (1<<1) in ALT
0x1578 AND ; PRI = Flags & IN_JUMP
0x157C JZER jump_0047 ; wenn NICHT IN_JUMP (PRI=0), dann jump
0x1588 CONST.alt 0x22C4 ; g_iGroundFrames in ALT
0x1590 LOAD.S.pri 0xC ; CLIENT_ID in PRI
0x1598 BOUNDS 0x20 ; wenn CLIENT ID invalid, dann brech ab (max. 32)
0x15A0 IDXADDR ; indexiere g_iGroundFrames => Adresse vom wert in PRI
0x15A4 INC.I ; PRI += 1
0x15A8 LOAD.I ; PRI = g_iGroundFrames[CLIENT_ID] (hole den wert von der addresse)
0x15AC EQ.C.pri 0x2 ; PRI = true(=1), wenn g_iGroundFrames=2 ist
0x15B4 JZER jump_0048 ; g_iGroundFrames[CLIENT_ID] != 2 (wenn PRI == FALSE(=0), dann jump)
^-- Oben: wenn g_iGroundFrames[CLIENT_ID] == 2, dann unten: --v
Code:
0x15C0 PUSH.S 0xC
0x15C8 PUSH.C 0x4
0x15D0 CALL CheckRow ; checkRow: prüft die anzahl der perfekten jumps und bannt, wenn es zuviele in einer Reihe sind
Ich gucke noch mal eben wie viele perfekte Jumps man machen muss und editiere das dann hier rein, falls ich es finde.
Ansonsten werden mit dem Ding nur die alten Skripte erkannt und vermutlich der private KZHack, da ich davon ausgehe, dass dieser genau die Frames berechnet und jedes mal einen perfekten Bhop macht.
Da es jedoch auch KZHacks mit Streuung geben soll, wird er auch von diesem Detektor nicht erkannt.
Je nachdem wie viele perfekte Jumps in Reihe man machen muss bis man gebannt wird, kann man dann über den Bann von FIREonTOUR diskutieren. Weil ein paar perfekte hintereinander ist bestimmt machbar.
greets