
*************************************************
AdminMod Skript zur Invisibitilty Cheat Erkennung 
auf Counter-Strike Servern

Version 1.0
*************************************************

Dieses Readme beschreibt die Installation des AdminMod Skriptes zur automatischen
Invisibility Cheat Erkennung. Dies ist keine Schritt-fuer-Schritt Anleitung, die
den Benutzer an der Hand nimmt und durch das Setup fuehrt. Stattdessen gehen wir
davon aus, dass dieses Skript von Server Admins eingesetzt wird, die sich mit 
ihrem System auskennen und wissen, was sie tun.



Hintergrund:
~~~~~~~~~~~~

AdminMod ermoeglicht von haus aus bestimmte Models mit einem Passwort zu 
schuetzen. Der Invisibility Cheat benutzt die Models orange, oranget, 
arcticorange oder arcticoranget. Die Benutzung der ersten beiden lassen 
sich durch AdminMod mit einem Passwort verhindern. Belegt man allerdings die 
letzten beiden mit einem Passwort, so koennen Spieler auch das dritte Terror-
Model namens arctic nicht mehr benutzen. Dieses Skript erkennt, wenn jemand 
sein Model auf eines der vier genannten aendern will und schreibt eine Warnung
auf den Bildschirm, die allen Mitspielern mitteilt, dass besagter Spieler 
versucht, sieh unsichtbar zu machen. 



Installation:
~~~~~~~~~~~~~

Dieser Tarball enthaelt folgende Dateien:

README            Dieses README
adminNC.sma       Das standard Skript erweitert um die Cheat Warnung
admin_jagNC.sma   Das Jag-Skript erweitert um die Cheat Warnung
adminhelper.inc   Includedatei mit zusaetzlichen Funktionen fuer adminNC.sma
jaghelper.inc     Includedatei mit zusaetzlichen Funktionen fuer admin_jagNC.sma
admin.cfg         Konfigurationsdatei, mit der man Optionen des Skripts einstellen kann
admin.sma.diff     Patch fuer admin.sma (diff -bu)
admin_jag.sma.diff Patch fuer admin_jag.sma (diff -bu)


Als erstes: Lies dieses Readme.

Vor der Installation ist ein Backup der Originalskripte dringend angeraten. Wir 
gehen im weiteren davon aus, dass hlds_l/ das Verzeichnis bezeichnet, in dem 
sich der Counter-Strike Server befindet. Weiter gehen wir davon aus, dass sich
in hlds_l/admin/ das AdminMod Paket befindet mit den Unterverzeichnissen include
und compiler.

Wer das Standard- bzw. das Jagskript ohne irgendwelche Aenderungen benutzt, kann 
statt dessen einfach adminNC.sma bzw. admin_jagNC.sma einsetzen. Wer seine eigenen
Aenderungen in den Skripten vorgenommen hat, benutzt entweder die mitgelieferten
Skripte und ergaenzt sie um seine Aenderungen oder er muss die entsprechenden 
Aenderungen aus den *NC.sma Dateien in seine Skripte uebertragen. Dazu stehen auch
zwei Patchdateien zur Verfuegung, die evtl. dafuer benutzt werden koennen. 

Einige zusaetzliche Hilfsfunktionen sind in Includedateien ausgelagert worden. 
Nachdem man das entsprechend angepasste Skript etwa im Verzeichnis examples
fertiggestellt hat, muss man eine der beiden Includedateien in das include/ 
Verzeichnis kopieren. Benutzt man das Standardskript als Grundlage, so waere das
adminhelper.inc, fuer das Jagskript entsprechend jaghelper.inc. Die Includedatei 
ist vom Hauptskript miteinzubinden.

Bei der Kompilation werden Warnungen auftreten, dass einige Funktionen nicht 
benutzt werden. Diese kann man getrost ignorieren. Wen es stoert, der kann die
entsprechenden Funktionen aus der Includedatei loeschen. Fehler bei der Kompilation
ruehren hoechstwahrscheinlich von Inkompabilitaeten mit eigenen Aenderungen im Skript
her. Daher muss der findige Skriptprogrammierer auch selber sehen, wie er sie 
beseitigt.

Bevor man das aktuelle Skript durch das neu kompilierte ersetzt, ist noch die
Datei admin.cfg ins Verzeichnis hlds_l/cstrike/ zu kopieren und entsprechend 
anzupassen. Danach kann das neue Skript ins Verzeichnis hlds_l/cstrike/dlls.
Das Skript wird bei einem Wechsel der Map neu geladen.



Funktion und Optionen:
~~~~~~~~~~~~~~~~~~~~~~

Wenn ein Spieler auf eines der vier kritischen Model wechselt, so wird eine Warnung
auf dem Bildschirm ausgegeben. Zusaetzlich wird eine Meldung ins Logfile geschrieben.
Wer den Wortlaut aendern will, muss das im Skript tun.
Nach einer Warnung gibt es eine Pause, die mindestens eingehalten werden muss, bevor
eine neue Warnung ausgegeben wird. Weiterhin gibt es eine Pause bevor eine erneute
Warnung fuer einen Spieler ausgegeben wird, vor dem bereits gewarnt wurde. Diese
Zeitraeume und weitere Optionen werden in Servervariablen gespeichert und lassen 
sich online aendern. Folgende Variablen beeinflussen die Funktion des Skripts:

Variable       Default            Beschreibung

pdebug              0  0: es werden keine Debugmeldungen ins Log geschrieben.
                       1: es werden Debugmeldungen ins Log geschrieben
                       Hiermit kann man die Funktionsweise des Skipts ueberwachen.

display_invis_warn  0  0: Es erfolgt nur ein Eintrag ins Log jedoch keine Meldung
                          auf dem Bildschirm
                       1: Es wird eine Warnung auf dem Bildschirm ausgegeben, wenn
                          ein versuch zu cheaten erkannt wird.

warn_pause         60   Pause in Sekunden die zwischen zwei Warnungen mindestens 
                        eingehalten wird.

invis_warn_pause  480  Pause in Sekunden, die zwischen zwei Warnungen fuer 
                       denselben Spieler eingehalten wird.

warn_time          30   Zeitdauer in Sekunden, wie lange die Meldung auf dem Bildschirm
                        eingeblendet wird. Diese sollte kleiner als warn_pause sein.



Konfigurationsdatei:
~~~~~~~~~~~~~~~~~~~~

Obige Variablen werden ueber die Konfigurationsdatei admin.cfg initialisiert. Die
Inistialisierung geschieht nur bei Serverstart oder dem ersten Aufruf des Skriptes.
Gesetzte Variablen behalten ihre Werte auch ueber Wechsel der Map hinweg bei. Zum
nachtraeglichen aendern von Variablen stehen neue Funktionen zur Verfuegung.

Die date admin.cfg hat das folgende Format:
----------------------------------------------------------------
// enable pdebug  DO NOT CHANGE THE LAYOUT OF THIS FILE!!
0
// display cheater warning
0
// time in seconds between any two warnings
60
// time in seconds between two invis warnings from same user
480
// time a warning is displayed
30
----------------------------------------------------------------

Das Layout dieser datei ist feststehend und kann nicht geandert werden. Die Routine
zur Initialisierung erwartet etwa den Wert fuer warn_pause genau in der sechsten Zeile.
Das ist zwar unschoen, liegt aber daran, dass ich keine Zeit mehr hatte, auch noch 
einen entsprechenden Fileparser zu schreiben. Um eine Variable mit einem anderen Wert
zu initialisieren, ist nur der entsrpechende Wert in der Datei zu aendern.



Neue Funktionen:
~~~~~~~~~~~~~~~~

Zum Umgang mit den Variablen bietet dieses Skript vier neue Funktionen:

admin_enable <variablenname>

Setzt eine boolsche Variable auf true (1). Bsp.: 
[admin_enable display_invis_warn



admin_disable <variablenname>

Setzt eine boolsche Variable auf false (0) Bsp.: 
[admin_disable pdebug



admin_set <variablenname> <wert>

Setzt ein Variable auf einen Wert. Bsp.: 
[admin_set warn_time 40



admin_var <variablenname>

Gibt den Wert einer Variablen aus. Bsp.:

[admin_var warn_pause
[warn_pause is set to <60>

Der Zugang zu diesen Funktionen wird ueber den Werte von ACCESS_VARIABLE geregelt.
Der Standardwert steht auf 256, was im Jagskript Ban-Rechten entspricht.



Bugs:
~~~~~

Das Skript benutzt die Funktion timeleft(). Der groesste Nachteil dieses Skriptes
liegt darin, dass die Funktion timeleft() nicht nur die Restzeit zurueckgibt, sondern
sie auch in die Konsole schreibt. Daher koennen die Konsolen der Spieler mit timeleft
Nachrichten zugemuellt werden. Eine Moeglichkeit dies zu umgehen waere, statt der
Funktion timeleft() den Inhalt der cvar mp_timeleft zu verwenden. Man kann den Wert
von mp_timeleft durch den Aufruf getvar("mp_timeleft") abfragen. Dieser Workaround
ist nicht getestet worden, da er mir nicht sonderlich gut gefaellt. Die Variable
mp_timeleft bietet keine konsistenten Zeitstempel da CS ihren Wert mitunter nach
Belieben aendert. Eine andere Moeglichkeit ist mir momentan nicht bekannt, bis die
DLL eine Funktion zur Verfuegung stellt, die einen Zeitstempel ohne Ausgaben liefert.
Wer es sich zutraut kann natuerlich eine solche Funktion selbst implementieren. Das
ist nicht weiter schwierig.




Disclaimer:
~~~~~~~~~~~

Das Skript hat eine Testphase durchlaufen und ich glaube alle Fehler gefunden zu haben.
Natuerlich kann ich fuer die Funktionsweise oder jedwelche Folgen keine Garantie oder
Verantwortung uebernehmen. Zur Vorsicht sollte man evtl das Skript erst ein paar Tage 
mit abgeschalteter Warnung laufen lassen und die Logs ueberpruefen, ob Falschmeldungen
generiert wurden. 

Anmerkungen, Bugreports oder Verbesserungen bitte an:
fzschocke@web.de



Florian Zschocke
Aachen, 19.12.2000
