Beiträge von maddinat0r


    Komisch, er war seit einem guten halben Jahr nicht mehr online ;)
    Da wird sich nicht mehr viel tun.


    Naja, alle 6 Monate schau ich hier schon vorbei :)
    Ich update hier schon mal auf v1.3, da diese Version sehr bald veröffentlicht wird.


    schönes Plugin :thumbup:


    Danke :thumbup:


    //EDIT:
    v1.3 ist nun veröffentlicht
    Änderungen:
    - neue Funktionen um Talk-Power in moderierten Channel zu vergeben/nehmen und um die Beschreibung eines Clients zu ändern:

    native TSC_SetClientTalkerStatus(clientid, bool:status);
    native TSC_SetClientDescription(clientid, const description[]);
    - Bug-Fix: abgefragte Client- und Channel-Daten sind nicht normalisiert
    - Bug-Fix: 'TSC_OnClientDisconnect' wird nicht aufgerufen wenn ein Client gebannt oder gekickt wird
    - Bug-Fix: Bugs können auftreten wenn der SA-MP und/oder der TS3 Server neugestartet wurde


    Downloads wie immer auf der GitHub-Projektseite.

    Hab mich halt dafür entschieden das Plugin auch hier vorzustellen.


    Die 0.x-Versionen waren wirklich nicht die Besten. v1.x hingegen ist so gemacht wie es sein sollte und hat an sich garnichts (außer die Natives) mit v0.x gemeinsam.
    Versuchs einfach mal wieder auf Linux, ich bin mir ziemlich sicher dass es jetzt einwandfrei klappt.

    Wie seegras gesagt hat, es geht, aber es ist nicht über TSC möglich. Man bräuchte dazu die Datenbank-ID des Clienten und die kriegt man (über TSC) sowieso nur raus, wenn der Spieler auf dem Server ist.

    TeamSpeak Connector v1.3


    Das TSConnector Plugin gibt dir die Möglichkeit einen TeamSpeak3 Server von deinem Gamemode oder Filterscript aus zu verwalten. Das heißt, dass du Spieler auf dem TS3 Server zum Beispiel kicken und bannen kannst und auch neue Channels erstellen, bearbeiten und löschen kannst.


    Installation

    • Erstelle einen ServerQuery Account auf dem zu steuernden TeamSpeak3 Server
      BEACHTE: Der ServerQuery Account muss genug Rechte haben, um alle Channel abonnieren zu können!
    • Füge diese Zeile in dein PAWN-Script ein um eine Verbindung mit dem TS3-Server aufzubauen:

      Code
      TSC_Connect("serveradmin", "password", "127.0.0.1", 9987);
      //  "serveradmin": der ServerQuery Login-Name
      //  "password": das ServerQuery Login-Passwort
      //  "127.0.0.1" die TeamSpeak3 Server-IP
      //  9987: der TeamSpeak3 Server-Port


      Das Aufrufen von 'TSC_Connect' wird den Server solange einfrieren, bis eine Verbindung aufgebaut wurde.

    • Das wars auch schon! Jetzt kannst du alle anderen Funktionen des Plugins benutzen.


    Hier ist ein kleines Code-Beispiel:

    #define TS_SERVER_GROUP_PLAYER 1337


    public OnGameModeInit()
    {
    TSC_Connect("serveradmin", "password", "127.0.0.1", 9987);
    TSC_ChangeNickname("SA:MP Server");

    TSC_CreateChannel("Channel 1");
    return 1;
    }


    public TSC_OnChannelCreated(channelid)
    {
    new channel_name[32];
    TSC_GetChannelName(channelid, channel_name);
    if(strcmp("Channel 1", channel_name) == 0)
    {
    TSC_SetChannelDescription(channelid, "Beschreibung von Channel 1!");
    TSC_SetChannelType(channelid, SEMI_PERMANENT);
    TSC_SetChannelUserLimit(channelid, 25);
    }
    return 1;
    }


    public TSC_OnClientConnect(clientid, nickname[])
    {
    TSC_PokeClient(clientid, "Willkommen!");
    TSC_AddClientToServerGroup(clientid, TS_SERVER_GROUP_PLAYER);
    return 1;
    }

    Ein paar Ideen:

    • einen Spieler automatisch in den richtigen Fraktionschannel verschieben wenn er in den Dienst geht (im Spiel)
    • nervige Leute vom SA:MP Server UND TeamSpeak3 Server kicken
    • ingame Umgebungs-Sprachchat: wenn zwei Spieler in der Nähe sind, neuen Channel erstellen und diese in den Channel verschieben


    Eine Liste aller Funktionen findet ihr in der Include.


    Weiteres

    • wie schon oben erwähnt, ist es wichtig, dass der ServerQuery Account genug Rechte haben muss um alle Channel zu abonnieren
    • der TeamSpeak3 Server hat einen eingebaute ServerQuery-Spamschutz; es gibt eine Whitelist in der ihr die IP vom SA:MP Server eintragen könnt um den Spam-Schutz für das TSC-Plugin zu deaktivieren
    • das Plugin ist komplett threaded, das heißt es können keine bemerkbaren Laggs enstehen (Ausnahme: 'TSC_Connect')


    Bei Fragen, Problemen, Kritik oder Vorschlägen, schreibt hier in den Thread rein.


    Source (GitHub)
    Download (GitHub)

    Ich habe dir nur geschrieben, dass du einen Fehler bei der mysql_errno() Abfrage hast, der Code ein bisschen unordentlich eingerückt ist und dir den 2. Parameter bei mysql_log() erklärt (damit DU es verstehst und damit DU entscheiden kannst ob du Anfängern empfiehlst, das etwas übersichtlichere Logging anzubieten oder nicht). Das Code-Einrücken ist meine Meinung, mysql_errno() begründete Kritik und der Log-Typ ein Tipp.


    if(mysql_errno() < 1)print("MySQL: Die Verbindung wurde erfolgreich hergestellt."),mysql_log(LOG_ALL); else print("MySQL: Die Verbindung zur MySQL Datenbank konnte nicht hergestellt werden | Der Server wird nun heruntergefahren."), SendRconCommand("exit");


    Die mysql_errno-Abfrage ist so nicht ganz korrekt. mysql_errno() returnt 0, wenn kein Fehler vorhanden ist, du überprüfst hier jedoch nur ob die Error-ID kleiner als 1 ist. mysql_errno() kann auch -1 (ungültige Verbindung) returnen.
    Über den Coding-Stil kann man sich ja streiten, aber ich glaub für Anfänger ist es wesentlich einfacher, strukturierten Code zu lesen (anstelle von Code, das einfach in eine Zeile geklatscht ist).
    Also so sollte es die Code-Zeile meiner Meinung nach aussehen:

    mysql_log(LOG_ALL);
    if(mysql_errno() == 0)
    {
    print("MySQL: Die Verbindung wurde erfolgreich hergestellt.");
    }
    else
    {
    print("MySQL: Die Verbindung zur MySQL Datenbank konnte nicht hergestellt werden | Der Server wird nun heruntergefahren.");
    SendRconCommand("exit");
    }


    Ansonsten könntest du noch näher auf den 2. Parameter von mysql_log() eingehen (der überhaupt nicht auf der Wiki-Seite erwähnt wird, werde das sofort korrigieren). Hier die Faustregel, wann man welchen Log-Typ benutzen soll:
    - Text-Logging ('LOG_TYPE_TEXT'): wenn man Debug-Nachrichten loggt oder auf seinem Home-Server loggt
    - HTML-Logging ('LOG_TYPE_HTML'): wenn man nur Errors und Warnings loggt und auf dem Hauptserver loggt
    Text-Logging ist in Kombination mit Debug-Nachrichten sehr langsam und kann wirklich große Verzögerungen auslösen. Jedoch ist das Text-Logging die zuverlässigste Logging-Methode, um Crashes oder Bugs im Plugin ausfindig zu machen.
    HTML-Logging ist entsprechend die schnellste Logging-Methode (soweit ichs im Kopf hab ist es 900x schneller als das Text-Logging), jedoch loggt es nicht alles, wenn das Plugin abstürzt. Die HTML-Datei verträgt auch nicht allzu viele Log-Nachrichten, deshalb sollte man nicht Debug-Nachrichten loggen, wenn man diesen Logging-Typ benutzen will.




    Ich finde es gut das du solch ein Tutorial machst zwar ist es noch ausbaufähig.


    Jedoch mach ich noch paar Anmerkungen/Informationen:


    • Manche haben das Problem mit gewissen .dll`s (msvcp110.dll, msvcr110.dll etc...), diese muss kann man downloaden und in den Samp-Server-Ordner verschieben oder ganz einfach microsoft visual c++ redistributable updaten.
    • Ebenso kannst du noch ein Beispiel hinzunehmen wie man einen String ausließt das wissen auch nicht die meisten.
    • cache_get_data(num_rows, num_fields); kann man nutzen jedoch gibt es schon lange cache_get_field_count(); was um einiges effizenter ist.#
    • Nutze mysql_pquery anstelle von mysql_tquery da dieses um einiges schneller ist.
    • Zusätzlich kannst du bei mysql_connect die Anzahl der maximalen Verbindungen als Threads einstellen.


    NIE irgendwelche losen .dll's runterladen und einfach in nen Ordner reinklatschen!!! Falls ihr mit dem Plugin irgendwelche Errors bekommt, dass irgendne .dll fehlt, schaut hier im F.A.Q. nach. Dort sind alle C++ Redistributables (Programme von verifizierten Herstellern, die .dll's installieren) aufgelistet, die ihr installiert haben solltet.
    mysql_pquery ist auch nur in bestimmten Szenarios schneller als mysql_tquery. mysql_pquery ist nie immer schneller als mysql_tquery.




    Abgesehen von den hier und von anderen erwähnten Sachen ist das Tutorial relativ okay.

    Nein, nicht nur um einen zweiten Entwickler zu finden, sonder auch weil das Java Projekt einige nette Features mitbringt, die das Programmieren um einiges erleichtern.
    Anscheinend weißt du nicht wie viele Vorteile Java hat.

    Ich kenne die Vorteile von Java, und die Nachteile auch. Wir können diese Unterhaltung gerne per PN weiterführen.
    Jeden weiteren Beitrag, der nicht direkt mit dem Projekt zu tun hat, werde ich als Spam betrachten und dementsprechend melden.


    Sind diese in irgendeiner Form, abgesehen von dir, bekannt ?

    Vom Bekanntheitsgrad her warscheinlich nicht, jedoch haben Knurrer (der Projektleiter) und Lemi (Administrator) ausreichend Erfahrung in ihren jeweiligen Positionen, um solch ein Projekt zu führen.


    Wieso wollt ihr unbedingt C++ verwenden? Guckt euch das hier mal an -> [ PLUGIN ] Project Shoebill Milestone2 - SA-MP Java Development Kit - SNAPSHOT von mk124


    Ich denke ihr werdet mehr Leute finden die sich mit Java auskennen als mit C++.

    Wir kommen mit dem C++-Gamemode relativ gut voran. Wieso sollten wir auf Java umsteigen? Nur um deswegen schneller einen 2. Entwickler zu finden?

    Die statische Version (mysql_static.so) läuft doch, also kannst du die ja verwenden.
    Du benutzt 99.99%ig ein auf 64bit basierendes OS und das Plugin braucht 32bit Libraries, die ein 64bit OS normalerweise nicht hat. Also solange du keine Lust hast dich mit dem ganzen Library-Kram auseinanderzusetzen, solltest du bei der mysql_static.so bleiben.

    Ich fühl mich leicht verarscht. Warum glaubt ihr eigentlich alle, weshalb ich das ORM-System in BlueG's Plugin eingebaut hab? Weil ich nix besseres zu tun hab?
    Das ORM-System ist dazu da, das Speichern und Laden vom MySQL-Zeugs so einfach wie das Atmen zu machen. Sogar ein Tutorial auf 2 verschiedenen Sprachen gibt es dazu (hier in der Tutorial-Sektion auffindbar).

    Habe es auf 1 Gesetzt und es kamen immer noch keine Errors ?



    MySqlConnection = mysql_connect(SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS);
    if (mysql_errno(MySqlConnection) == 0)
    {
    printf("SERVER: Verbindung zur Datenbank wurde erfolgreich hergestellt.");
    //printf("Host: %s,User: %s,Datanbank: %s,Passwort: %s", SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS);
    }
    else
    {
    print("SERVER: Es konnte keine Verbindung zur Datenbank hergestellt werden!");
    print(" Es wird erneut versucht eine Verbindung zur Datenbank herzustellen.");
    //printf("Host: %s,User: %s,Datanbank: %s,Passwort: %s", SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS);
    mysql_reconnect(MySqlConnection);
    if (mysql_errno(MySqlConnection) == 0) {
    print("SERVER: Es konnte im 2. Versuch eine Verbindung hergestellt werden!");
    //printf("Host: %s,User: %s,Datanbank: %s,Passwort: %s", SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS);
    }
    }

    So sollte das aussehen.


    Wenn mysql_errno 0 zurueckgibt, heißt das, dass kein Error auftrat. Ansonsten returnt es eine Error-Nummer.
    In deinem Code ueberpruefst du, ob ob mysql_errno 1 zurueckgibt, von daher ist hier der Fehler.