Beiträge von Saargreen


    Liest die Zahl aus, die in der cfg steht.
    Ist schon um einiges besser (wenn es kein 500 Slots Server ist) als MAX_PLAYERS

    GetMaxPlayers ist TÖDLICH!
    Eine zusätzliche Abfrage, welche auch jedes mal ausgeführt wird.


    Ganz einfach: sa-mp.inc mit Notepad++ öffnen und "#define MAX_PLAYERS 500" ändern. z.B. in 50 :)
    Konstanten sind um ein Vielfaches schneller als eine Nichtkonstante Variable....
    Achso ja, und dann natürlich noch mit IsPlayerConnected arbeiten :)

    -.- Wie oft sollte ich es oben noch schreiben? Es hat nichts mit dem Spiel zu tun.
    Bei solchen Intelligenzbolzen bekomm ich Migräne.... Ich hab doch oben geschrieben,
    dass es eben NICHT an Mods liegt, DA VERDAMMT NOCHMAL KEINE DRAUF SIND!


    Durch nen Zufall habe ich gerade den Fehler gefunden 8|


    Ich habe einfach mal nach "GTA schwarze Straßen" gegooglet und habe die Lösung gefunden.
    Bei neueren ATI Karten muss ab und zu die "Antisotropische Filterung" für GTA: SA auf 16x gestellt
    werden, und siehe da: Es geht.


    Danke an Rocky für deine Bemühungen :)

    Hey Leute!


    Ich habe schon seit längerem ein Problem, und zwar sieht mein GTA so aus: (man beachte die schwarze Straße vor mir und die nur sehr verpixelt geladenen Gebäude rechts)


    Klick1
    Klick2
    Klick3


    (Die Screens sind etwas älter, trotzdem siehts immernoch so aus)


    Auf Distanz sind alle Straßen/Zuggleise schwarz und kein einziges Objekt wird geladen. Ich habe das Problem
    seit ich mir eine "HIS Radeon HD 6850" eingebaut habe. Davor hatte ich auch eine Radeon HD, allerdings eine
    ältere. Es liegt NICHT, nochmal: NICHT am Spiel! Mehrmals neu installiert, keine Mods, Sichtweite ganz hoch,
    gta_sa.set von nem Kollegen geholt, nichts hat geholfen. Also nochmal: ICH BRAUCHE VERDAMMTNOCHMAL
    KEINEN TIPP WIE "MACH MODS RAUS", nur für die Blitzmerker hier :)


    Die Grafiktreiber sind installiert, Spiele wie BF3, CODMW3, CODMW1, Skyrim, GTA IV laufen alle problemlos, nur eben
    GTA: SA nicht.


    Hat vielleicht jemand eine Idee?


    MfG, UltimateKeks :)


    //Anmerkung: Es ist auch im Singleplayer und auf jedem anderen Server der Fall.

    Hab vor ca 1 Jahr Zeit meine
    Bescheinigung gemacht. Ein Mofa darf:


    -Maximal 25km/h laufen
    -50ccm Hubraum haben
    -nur einen Sitz haben.


    So steht es im Gesetz. Das Teil darf 200ps haben, hauptsache die Zündung macht bei 25km/h dicht und du kannst nicht schneller fahren.


    Hier ein Link: http://www.fahrlehrerverband-bw.de/07-FSKl/Kl_Motorrad.htm


    Im Deutschland wird das ganze in der FeV (Fahrerlaubnis-Verordnung) geregelt.


    http://www.verkehrsportal.de/fev/fev_04.php



    (siehe §4 Absatz 1)



    GENAU so ist es,und nicht anders. Ende. Ps ist scheißegal :)
    MfG, Keks :)

    Ich habe nun nochmal alles "verkommentarisiert"
    Ich habe genaustens jede Funktion erklärt, außerdem
    habe ich eine Möglichkeit hinzugefügt, dem Spieler anzuzeigen
    wie lange er noch gebannt ist.

    Danke ^^


    Ist mir selbst nicht aufgefallen 8|


    Das Problem ist/war: Es ist ja nur ein Beispiel, gerade diese Zeilen SOLL ja niemand kopieren. Deswegen habe ich mir auch nicht die Mühe gemacht und "SpielerName(playerid)" ausgetauscht.
    Normalerweise hätte ich den Namen mit GetPlayerName() vor dem Kick genommen und dann später in der Tabelle verarbeitet. Naja ich ändere es besser mal um ^^

    cool für anfänger die gerne wissen wie es geht aber ,
    aber dsa tutorial für ein timeban gibt es ja mind. 300mal hier auf forum.sa-mp.de!


    7/10 für die bemühung :)


    mfg m0nkey :thumbup:

    Wirklich? Naja ich hatte die Suchfunktion bevor ich das Tut geschrieben hatte nach "timeban tutorial" durchsucht.
    Ich fand überwiegend User die einen Thread aufmachten mit Titeln wie "Wie schreibt man ein Tban System?" und auch
    in der Liste der Tuts fand ich nichts über Tbans... Das bewegte mich ja dazu das Tut zu schreiben :D


    Ich schreib doch kein Tut wenns das schon ca. 100mal gibt :D


    Danke trotzdem :)

    Commands müssen auf ein Script angepasst werden, niemand wird dir hier einfach das Command aus seinem Script schicken können. Vllt benutzt er Dcmd, ocmd, benutzt OnPlayerCommandText
    oder macht sonst was. Und wenn du so etwas nicht auf die Reihe bekommst, bezweifle ich dass du ein GF editieren kannst :)

    Das originale GF Script hat nicht umsonst groß in Rot in der Überschrift



    This script is not recommended for new scripters!! (siehe HIER )



    stehen.

    SCMTA
    Is nicht vorhanden.
    Das Tutorial is zu kurz und simpel.

    Danke und editiert.
    Bin 'n fauler Sack und hab mir Funktionen für SendClientMessage und SendClientMessageToAll geschrieben, das ist förmlich eingebrannt ^^

    Ich kam eben auf die Idee weil es mich als "Scriptneuling" damals immer nervte dass es absolut kein Tutorial für ein Tbansystem gab. Alles was es gab war Foxban, funktionierte super, aber war eben nix eigenes :)


    Danke :thumbup:

    Heyho Com :)


    Ich habe bemerkt dass es hier kein Tutorial zum schreiben eines Tban Systems gibt,
    daher habe ich mir gedacht schreibe ich doch mal eins.


    Was benötigst du?

    Du benötigst Opas Commandprozessor (ocmd ), sscanf , ein Accountsystem und etwas Grundwissen.


    Was ist ein Timeban System?


    Mit einem Timeban System lässt sich ein User für eine beliebige Zeit
    vom Server verbannen. Die Zeit läuft auch ab wenn der Server ausgeschaltet ist.


    Schritt 1:


    Als erstes benötigen wir eine Funktion, mit der wir den Timeban ausführen.

    stock TBan(playerid,const string[],dauer,bannerid) //playerid = ID des zu bannenden, const string[] = der Grund, dauer = zeit, bannerid = die ID des Admins
    {
    return 1;
    }


    Diesen Stock füllen wir nun.


    Wir nehmen erst einmal den aktuellen UNIX-Timestamp (= Zeit in Sekunden seit dem 1.1.1970)
    new timestamp;
    timestamp = gettime(); //gettime() returnt (wenn man keine Parameter angibt) die genaue Zeit in Sekunden seit dem 1. Januar 1970




    Dann nehmen wir die Variable "dauer", multiplizieren sie mit 60 (= die Dauer des Timebans in Sekunden)
    und rechnen ihn auf den UNIX-Timestamp drauf. Dies ist nun logischerweise der Timestamp, bis wann der Timeban
    laufen wird.
    new sekunden = dauer * 60; //Die Minuten die der Admin angibt werden hier mit 60 multipliziert. Man erhält so die Sekunden, wie lange der Spieler gebannt wird.
    timestamp += sekunden; //Hier rechnen wir die Sekunden auf den vorher genommenen UNIX Timestamp auf, das ergibt dann das Datum bis wann der Spieler gebannt wird (in Sekunden)
    Nun geben wir an die Spieler auf dem Server eine hübsche Nachricht aus und kicken den zu Timebannenden.
    new name[MAX_PLAYER_NAME],bannername[MAX_PLAYER_NAME]; //2 Strings für die beiden Namen vom zu bannenden User und vom Admin werden deklariert
    GetPlayerName(playerid,name,sizeof(name)); //wir nehmen den Namen des zu bannenden und speichern den Namen in "name"
    GetPlayerName(bannerid,bannername,sizeof(bannername)); //das selbe passiert mit dem Namen des Admins
    format(str,sizeof(str),"AdmMsg: %s wurde von %s für %d Minuten gebannt",name,bannername,dauer); //mit format formatieren wir einen String in dem alle Infos stehen.
    SendClientMessageToAll(ROT,str); //und hier wird der gerade formatierte String an alle User auf dem Server ausgegeben.
    format(str,sizeof(str),"Grund: %s",string);//Da eine ClientMessage maximal 128 Zeichen haben kann geben wir den Grund seperat aus.
    SendClientMessageToAll(ROT,str);
    Kick(playerid); //Der Spieler wird gekickt.


    Als letztes kommt der Speicherteil. Wir speichern das "Datum" bis wann er gebannt ist ab um es beim Connecten wieder abzufragen, aber dazu später. Ich weiß leider nicht welches Dateisystem ihr benutzt. Ich nenne hier einfach mal
    jeweils ein Beispiel für MySQL & Dini.

    Mysql:

    mysql_SetInt("accounts", "TBan", timestamp, "Name", name);


    Dini:

    new pfad[MAX_PLAYER_NAME+16]; //wir deklarieren einen neuen String mit der Größe MAX_PLAYER_NAME (maximale Anzahl an Zeichen in einem Namen) + 16
    format(pfad,sizeof(pfad),"/accounts/%s.ini",name); //hier wird dann der Name in den String formatiert.
    dini_IntSet(pfad, "tban", timestamp); //Die Speicherung des Datums bis wann der Spieler gebannt wird erfolgt.
    Und fertig ist unser Timeban-Stock. Er sollte nun z.B. so aussehen:
    stock TBan(playerid,const string[],dauer,bannerid)
    {
    new timestamp;
    timestamp = gettime();
    new sekunden = dauer * 60;
    timestamp += sekunden;
    new name[MAX_PLAYER_NAME],bannername[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    GetPlayerName(bannerid,bannername,sizeof(bannername));
    format(str,sizeof(str),"AdmMsg: %s wurde von %s für %d Minuten gebannt",name,bannername,dauer);
    SendClientMessageToAll(ROT,str);
    format(str,sizeof(str),"Grund: %s",string);
    SendClientMessageToAll(ROT,str);
    Kick(playerid);
    mysql_SetInt("accounts", "TBan", timestamp, "Name", name);
    return 1;
    }


    Dieser Stock würde also folgendes tun: er berechnet die Zeit bis wann der Spieler gebannt sein soll, und speichert diese Zeit im Account ab. Außerdem gibt er eine Nachricht aus und kickt den Spieler natürlich.


    Schritt 2:


    Der Stock nützt rein gar nichts wenn er nicht auch irgendwo aufgerufen wird. Die einfachste Methode ist nun ocmd in Verbindung mit sscanf, ihr könnt natürlich auch
    einen anderen Cmdprozessor verwenden, ich erkläre es hier aber nur mit ocmd & sscanf.


    Wir schreiben erst einmal das blanke Command wofür wir ocmd benötigen.
    ocmd:tban(playerid,params[])
    {
    return 1;
    }


    Dann machen wir die hinter dem Befehl eingegeben Parameter für uns verwendbar. Dazu benutzen wir sscanf.
    new pID,grund[64],dauer;
    if(sscanf(params, "usi", pID, grund,dauer))return SendClientMessage(playerid, 0xFF004BFF, "/tban [ID] [Grund] [Dauer (in Minuten)]"); //wir speichern die 3 hinter dem Command angegeben Parameter in Variablen. Wenn nicht genau 3 Parameter angegeben wurden, wird eine ClientMessage returnt, in der der Admin angezeigt bekommt was genau er einzugeben hat


    Mit den gerade gewonnen Werten können wir nun unseren Tban-Stock ausführen:
    TBan(pID,grund,dauer,playerid);


    Der Befehl sollte also in etwa so aussehen:
    ocmd:tban(playerid,params[])
    {
    new pID,grund[64],dauer;
    if(sscanf(params, "usi", pID, grund,dauer))return SendClientMessage(playerid, 0xFF004BFF, "/tban [ID] [Grund] [Dauer]");
    TBan(pID,grund,dauer,playerid);
    return 1;
    }


    Schritt 3:


    Wir haben es fast geschafft. Jetzt müssen wir nur noch beim Connecten bzw beim Login des Spielers überprüfen ob er noch gebannt ist.


    Erst nehmen wir den aktuellen UNIX-Timestamp
    new timestamp = gettime(); //Wieder das selbe wie beim Tban-stock....


    Dann lesen wir aus dem Account das Datum aus, bis wann der User noch gebannt ist. Beispiel mit MySQL:
    new bisgebannt = mysql_GetInt("accounts", "TBan", "Name", SpielerName(playerid)); //das Datum wird ausgelesen und in der gerade neu deklarierten Variable "bisgebannt" gespeichert.

    Wir vergleichen nun den aktuellen Timestamp mit dem, bis wann er noch gebannt ist. Ist der aktuelle TS kleiner als der
    TS bis wann er noch gebannt ist, so liegt das Banndatum noch in der Zukunft. Somit ist er noch gebannt und
    der Spieler wird gekickt.
    if(timestamp < bisgebannt) //wenn der gerade genommene Timestamp kleiner als bisgebannt ist, liegt das entbannungsdatum in der Zukunft.
    {
    SendClientMessage(playerid,0xFF3200FF,"Du bist noch gebannt! Komm später wieder!"); //Ist dies der Fall wird der Spieler gekickt.
    Kick(playerid);//Kick erfolgt
    }
    //Hier eine kompliziertere, aber "bessere" Methode:
    if(timestamp < bisgebannt) //wenn der gerade genommene Timestamp kleiner als bisgebannt ist, liegt das entbannungsdatum in der Zukunft.
    {
    new differenz = bisgebannt - timestamp; //wir subtrahieren bisgebannt von timestamp, wir erhalten also die Zeit in Sekunden wie lange der Spieler noch gebannt ist.
    new minuten = differenz / 60; //wir machen aus den Sekunden Minuten....
    new str[64]; //neuer String wird deklariert....
    format(str,sizeof(str),"Du bist noch %i Minuten gebannt!",minuten); //So bekommt der Spieler sogar noch angezeigt, wie langer er noch genau gebannt ist.
    SendClientMessage(playerid,0xFAFAFAFF,str); //String wird dem Spieler ausgegeben
    Kick(playerid);//Kick erfolgt
    }


    Diese Zeilen sollten beim Laden des Accounts ausgeführt werden, am besten als erstes.


    So sollten die Zeilen in etwa aussehen:
    new timestamp = gettime();
    new bisgebannt = mysql_GetInt("accounts", "TBan", "Name", SpielerName(playerid));
    if(timestamp < bisgebannt)
    {
    SendClientMessage(playerid,0xFF3200FF,"Du bist noch gebannt! Komm später wieder!");
    Kick(playerid);
    }







    Damit verabschiede ich mich. Falls Fragen oder Unklarheiten aufkommen helfe ich gerne. Meldet euch dann am besten per PN :)
    Feedback ist natürlich strengstes erwünscht :D


    MfG,

    Keks.


    /e: Schrechtreibfehler
    /e2: Schrechtreibfehler²

    /e3: Kleiner Fehler....