Beiträge von namespace

    Hallo, ich habe gerade einen Selbsttest mit einem in C# geschriebenem Programm an meinem Server gemacht, indem ich mehrere Bots als Player getarnt auf den Server verbinden lasse. Bei ~ 110 gleichzeitigen eingehenden Verbindungen crashed der Server.


    Deshalb habe ich mir kurz überlegt, wie man das verhindern bzw. unterdrücken kann.
    Das ganze funktioniert über einen IP und Client-Version Check.


    Das Tutorial


    Zuerst erstellen wird einen neuen Ordner im scriptfiles-Ordner.
    Ihr könnt diesen nennen wir ihr wollt. Ich nenne diesen mal "flood_protection".


    Als nächstes verwende ich die Include-Datei "dini". Ihr könnt natürlich auch jedes andere File-System verwenden.
    Das ganze lässt sich auch problemlos auf MySQL oder ein anderes Datenbank-System übertragen.


    Wir inkludieren also dini und prüfen bei OnPlayerConnect, ob der Spieler mit dieser IP bereits verbunden ist:



    #define SERVER_VERSION "0.3e" // die server-version


    public OnPlayerConnect(playerid)
    {
    new playerIp[16], version[10], path[33];


    GetPlayerIp(playerid, playerIp, sizeof(playerIp)); // IP adresse auslesen
    GetPlayerVersion(playerid, version, sizeof(version)); // client-version des spielers auslesen


    do // die punkte in der IP entfernen
    {
    new dotPosition = strfind(playerIp, ".");

    strdel(playerIp, dotPosition, dotPosition + 1);
    } while (strfind(playerIp, ".") != -1);


    format(path, sizeof(path), "flood_protection/%s.ip", playerIp);


    if (!strcmp(version, SERVER_VERSION))
    {
    if (dini_Exists(path))
    {
    Kick(playerid); // spieler ist bereits mit einem anderen account verbunden
    }
    else
    {
    dini_Create(path); // spieler ist noch nicht verbunden, deshalb legen wir einen eintrag an
    }
    }
    else
    {
    Kick(playerid); // der spieler verbindet nicht mit der version, mit der der server läuft
    }


    return true;
    }


    Jetzt haben wir den Hauptteil.
    Allerdings müssen wir beim Verlassen des Spielers den Datei-Eintrag auch wieder entfernen:



    public OnPlayerDisconnect(playerid, reason)
    {
    new playerIp[16], path[33];


    GetPlayerIp(playerid, playerIp, sizeof(playerIp)); // IP adresse auslesen


    do // die punkte in der IP entfernen
    {
    new dotPosition = strfind(playerIp, ".");


    strdel(playerIp, dotPosition, dotPosition + 1);


    } while (strfind(playerIp, ".") != -1);


    format(path, sizeof(path), "flood_protection/%s.ip", playerIp);


    if (dini_Exists(path))
    {
    dini_Remove(path); // eintrag entfernen
    }


    return true;
    }


    Das ganze ist frei aus dem Kopf geschrieben und ungetestet.
    Das sollte soweit aber funktionieren.


    Hackt mir für Rechtschreibfehler bitte nicht den Kopf ab.


    Lg.

    Extrem assozial finde ich es, ein Script mit verschlüsseltem Downloadlink in einem Forum zu posten, indem sich großteils Jugendgruppen zwischen 11 und 15 aufhalten, welche nichtmal wissen, was eine Verschlüsselung ist (nach meiner Ansicht).
    Entweder soll man es mit normalen Link posten, oder es mit seiner "ultra-1337-ich-bin-so-cool-und-verschlüssle-meine-links"-Verschlüsselung in einem Forum posten, bei welchem wenigstens die Meisten wissen, was eine Verschlüsselung ist.


    Edit: Fehler ausgebessert.

    Du machst zum beispiel ein Update und vergiss eine befehl mit reinzuscripten und dadurch funktionieren einige funktionen nicht, du scriptest dan mit diesen
    Filterscript schnell den befehl dazu


    Das war jetzt nur ein Beispiel, man kann es auch anders einsetzen.
    Bspw. gleich wie bei "Second Life".

    Hört sich sehr gut an das System ich habe vorher auch noch nicht von so einen system gehört


    Allerdings nur 9/10 Punkten Denn, Wofür soll ich Ingame scripten? :D


    Mir würden jetzt mehrere Implementations-Möglichkeiten einfallen.
    Bspw, also "Not-Absicherung". Du hast gerade 200 Spieler Online, beim letzten Update aber vergessen, einen Command bei OnPlayerSpawn zu schreiben.
    Damit könnte das dann eben erledigt werden.


    Noch ein Weg wäre, für Spieler noch manche Funktionen und Callbacks zugänglich zu machen, und sie so ihr eigenes Haus mit eigenen Gates etc. scripten zu lassen.

    Hey,
    ich habe vor kurzem ein neues Projekt begonnen: LiveScript.


    LiveScript ist ein Filterscript, welches Script während der Laufzeit ausführen kann.
    Dazu habe ich mir eine eigene kleine Syntax-Regelung zusammengestellt, auf welche LiveScript basiert.
    Ich weiß nicht ob es sowas in der Art schonmal gegeben hat, aber ich kenne so ein System nur von "Second Life", bei dem man auch Ingame alles selbst scripted.


    LiveScript hat derzeit lediglich 429 Zeilen und ist sehr performant gehalten.
    Es können dynamisch Callbacks und Funktionen hinzugefügt werden.


    Die Definition von Callbacks und Funktionen sieht wiefolgt aus:



    new LSCallback[][CallbackInformation] =
    {
    {"__onscriptexecute_start", "__onscriptexecute_end"}
    };


    new LSFunction[][FunctionInformation] =
    {
    {"alert", "is"},
    {"die", "is"}
    };


    Ein Callback ist derzeit so aufgebaut:


    Code
    __[callbackname]_start
    .. // Code
    __[callbackname]_end


    Das Script hat einen Handler, der Callbacks bei bestimmten Bedingungen aufruft.
    Bspw. kann der Spieler den Callback "__onplayerspawn" verwenden. Sobald dieser im Script verwendet wird, wird er immer dann mit den jeweiligen Parametern aufgerufen, wenn ein Spieler gespawnt wird.


    Funktionen sind so änlich aufgebaut.


    In der LSFunction-Variable wird zuerst der Function-Name mitgegeben (bspw. "alert") und anschließend die Parameter(-typen). "is" - "integer (playerid), string (text)".
    Der Script-Interpreter geht dann jeden Callback durch und ruft die Script Function mit den jeweiligen Parametern auf.



    LSFunction_alert(playerid, text[])
    {
    ShowPlayerDialog(playerid, DIALOG_LS_ALERT, DIALOG_STYLE_MSGBOX, "Achtung", text, "OK", "");
    }


    Diese Funktion wird dann vom Script-Interpreter bei vorliegendem Aufruf durch CallLocalFunction aufgerufen.


    Bspw. würde so ein kleines Spieler-Script aussehen:


    Code
    #LIVESCRIPT_SCRIPT
    
    
    __onplayerspawn_start($playerid)
    alert("$playerid", "Hallo!")
    __onplayerspawn_end


    Die groben Syntax-Regeln sind derzeit:

    • Variablen müssen immer mit einem $ beginnen.
    • Parameter (auch Variablen) müssen immer in Anführungszeichen geschrieben werden.
    • Es werden keine Semikolons benötigt.

    Der Source Code wird vorerst nicht herausgegeben.
    Ich würde mich sehr über Vorschläge, bzw. Syntax-Vorschläge freuen.
    Natürlich auch über sonstiges Lob oder Kritik.


    Edit: Text erweitert.


    Lg.

    Beim 1. Fehler hast du eine Klammer vergessen.
    Die Warnings danach heißen, dass du die Variablen einfach noch nicht verwendet hast.
    Loose Indentation heißt, dass du irgendwo den Code falsch eingerückt hast.

    Naja, ist schon ziemlich praktisch, aber es gibt doch bereits so viele Pastebin Anbieter.
    Da wäre ein hauseigenes Pastebin System ziemlich überflüssig.