Beiträge von mabako

    Man wird doch sicher nen Hack schreiben könne, wenn man den MTA source hat, der das client site Script so umscriptet, nachdem mans ausgelesen und analysiert hat, das man z.B. bestimmte SetElementDatas manipuliert, das man z.B. selber sein geld mit setElementData setzen kann , sofern der Betrag des Aktuellen Geldes in einer ElementData gespeichert wird...

    Ja.

    --

    So, okay: net.dll - Überprüft ob n paar MTA-dll's verändert wurden. Nimmt man die .dll, die bei nightlys und offiziellen Releases dabei ist, kann man mit geänderten dlls nicht spielen. Nimmt man die von MTA angebotene für selbstzusammengebaute Versionen, kann man nur auf Windows MTA-Server, die auch so ne andere .dll haben (also nicht die, die beim offiziellen Release/nightly dabei war) und sonst auf keine Server.

    So, auch mal was kleines von mir - ne Resource :D

    Okay, macht nicht viel, nur Abfragen auf die Datenbank. Und das ist ja schonmal was. Braucht ryden's MySQL-Plugin und sonst nur noch ne kleine Änderung in der settings.xml - wenn die vorher nur aus <settings/> bestand, einfach das übernehmen und anpassen, ansonsten halt nur die <setting name=...> nehmen.

    Code
    <settings>
    	<!-- MySQL Configuration -->
    	<setting name="@sql.user" value="username"/>
    	<setting name="@sql.password" value="password"/>
    	<setting name="@sql.database" value="database"/>
    	<setting name="@sql.hostname" value="localhost"/>
    	<setting name="@sql.port" value="3306"/>
    </settings>

    So, mal angenommen die Resource ist jetzt in der mtaserver.conf drinne (oder einfach so gestartet), dann gibts ne Reihe von Funktionen, die jetzt zur Verfügung stehen - um mysql_free_result oder ähnliches braucht man sich keine Sorgen mehr zu machen.

    sql:create_table
    Zum Beispiel können wir ja mal ne Tabelle erstellen:


    Ist garnicht schwer:

    • name ist immer der Name der Tabellenspalte an
    • type der typ (z.b. float für Floats - Koordinaten z.b., int(10) für ganze Zahlen, int(10) unsigned für ganze Zahlen ohne Vorzeichen (d.h. immer positiv), text für Text und so weiter. Gibt im Netz genug Zeugs, was MySQL-Datentypen erklärt, einfach mal suchen.
    • null = true würde angeben, dass die Werte in der Spalte auch gerne NULL sein dürfen (wird von der resource als nil zurückgegeben)
    • primary_key = true für den Primary Key, das is meistens ne eindeutige ID, können auch mehrere Spalten mit primary_key sein.
    • auto_increment - wenn's auf true ist, dann hat die Spalte eine ID, die sich bei jedem einfügen um 1 erhöht, wenn's auf ner x-beliebigen Zahl gesetzt ist, dann wird das als Grundwert für's auto_increment genommen, d.h. wird ab da gezählt.

    Insgesamt nicht sonderlich schwer, kann man z.b. in onResourceStart aufrufen.

    Rückgabewerte sind:

    • true, true wenn die Tabelle erfolgreich erstellt wurde
    • true, false wenn die Tabelle existiert und keine Änderungen notwending sind oder erfolgreich modifiziert wurde (wenn man ne Spalte hinzufügt oder ändert)
    • false wenn's n Fehler gab.

    Nun brauch man ja Tabellen nicht allzu oft erstellen, widmen wir uns mal lieber Abfragen, dafür gibt's genau vier Funktionen:

    sql:query_free
    Ist nicht ganz so schwer, ist einfach ne beliebige Datenbank-Abfrage. Gibt true zurück wenns erfolgreich war, sonst false

    Im Beispiel können wir ja mal einen Teleporter (DB-Struktur von oben) löschen:

    Code
    exports.sql:query_free( "DELETE FROM teleports WHERE teleportID = 123" )


    oder wenn wir Fehler beachten wollen (wollen wir!):

    Code
    if exports.sql:query_free( "DELETE FROM teleports WHERE teleportID = 123" ) then
    	-- Code falls die Abfrage erfolgreich war, z.b. die Objekte im Spiel löschen, ne Meldung ausgeben und so weiter.
    else
    	-- Code falls die Abfrage fehlgeschlagen ist, z.b. ne Fehlermeldung
    end

    sql:query_assoc
    Führt ne Abfrage aus (im Normalfall SELECT), die Ergebnisse zurückgibt, mehrere Spalten und Zeilen möglicherweise. Gibt ne Tabelle zurück (oder false, wenn's n Fehler gab).

    sql:query_assoc_single
    Führt ne Abfrage aus, die entweder eine oder keine Zeile zurückgibt. Wenn's eine Zeile ist, dann gibt es ne Tabelle mit Feldern zurück, sonst false. Ist ähnlich zu query_assoc, braucht man jedoch keine Schleife dafür.

    Code
    local result = exports.sql:query_assoc( "SELECT * FROM teleports WHERE teleportID = 123" )
    if result then
    	createMarker( result.aX, result.aY, result.aZ )
    	-- und so weiter
    end

    sql:query_insertid
    Fügt ne INSERT-Abfrage aus und gibt - falls diese erfolgreich war - die Insert-ID zurück (auto_increment un so)

    Zum Beispiel in obiger Abfrage:

    Code
    local insertid = exports.sql:query_insertid( "INSERT INTO teleports (`aX`, `aY`, `aZ`, `aInterior`, `aDimension`, `bX`, `bY`, `bZ`, `bInterior`, `bDimension`) VALUES (...)" )
    if insertid then
    	-- irgendwas mit der ID machen
    end

    kleine Tipps am Rande
    Alle query-Funktionen können bei Bedarf Escape-Zeichen in Strings einfügen (sollte man machen), dazu einfach '%s' in den Query schreiben und dann als Parameter ergänzen, das wird dann automatisch ersetzt:

    Code
    exports.sql:query_free( "DELETE FROM accounts WHERE username = '%s' AND passwort = '%s'", username, passwort )


    Im Vergleich:

    Code
    exports.sql:query_free( "DELETE FROM accounts WHERE username = '" .. exports.sql:escape_string( username ) .. "' AND passwort = '" .. exports.sql:escape_string( passwort ) .. "'" )

    Und was ich bei INSERT zumindest immer ganz nützlich fand, ist table.concat für die einzelnen Felder:

    Code
    local vehicleID = exports.sql:query_insertid( "INSERT INTO vehicles (model, posX, posY, posZ, rotX, rotY, rotZ, numberplate, color1, color2, interior, dimension) VALUES (" .. table.concat( { model, x, y, z, 0, 0, rz, '"%s"', color1, color2, interior, dimension }, ", " ) .. ")", getVehiclePlateText( vehicle ) )


    Statt:

    Code
    local vehicleID = exports.sql:query_insertid( "INSERT INTO vehicles (model, posX, posY, posZ, rotX, rotY, rotZ, numberplate, color1, color2, interior, dimension) VALUES (" .. model .. ", " .. x .. ", " .. y .. ", " .. z .. ", 0, 0, " .. rz .. ", '%s', " .. color1 .. ", " .. color2 ..", " .. interior .. ", " .. dimension)", getVehiclePlateText( vehicle ) )

    Download
    Im Anhang, gibts auch über Git(Hub): Link

    kickedname kriegst du doch als Name übergeben, das is kein player. Und die .. müssen nur dastehen, wenn man zwei Strings verknüpft, also nich bei (..bla oder bei bla..)

    Code
    outputChatBox( kickedname .. " wurde gekickt. Grund: " .. reason )

    Ich glaub, in onPlayerQuit wäre das noch besser aufgehoben

    Es gibt z.b. Ped-Funktionen :P

    DP2 ist ja schon im Januar 2008 rausgekommen, dann .x warn nur noch paar kleine Fehlerbehebungen (keine serials mehr usw). Nightlies sind halt die "neue" MTA-Version, d.h. jede Nacht wird der aktuelle Quelltext von MTA kompiliert und der Client/Server dann auf http://nightly.mtasa.com zur Verfügung gestellt.

    Nutzt du die Nightlies oder DP2(.x)?

    Ich kann das sowohl client- als auch serverseitig ausführend und es gibt ein Element vom Typ ped zurück, und ich nutze die Nightlies.

    Wenn du den bei dir im Client reinmachst, dann natürlich nicht. Falls du das aber auf einem Server lädst (engineImportTXD, engineImportDFF), dann sieht das jeder, der da spielt.

    Wie wärs z.b. mit

    Analog für die meisten anderen Player-Events, einfach die Variable, die den Player beinhaltet, als "key" für den Array nehmen - PlayerInfo[source], PlayerInfo[player], usw. Gibt dir auch n Fehler aus, wenn du auf was zugreifst, bei dem du vorher noch nicht PlayerInfo[...] = { } gemacht hast

    65535 is für unsigned short :/ int wär ja immerhin 4 294 967 295 möglich.

    Code
    // Allow 100k server elements, 100k client elements and 100k xml nodes
    #define MAX_SERVER_ELEMENTS 100000
    #define MAX_CLIENT_ELEMENTS 100000
    #define MAX_XML             100000
    typedef unsigned long ElementID;

    Einfach source runterladen, Visual C++ 2008 Express-Edition runterladen (und was es noch brauchen könnte: Plattform-SDK + DirectX SDK glaub. Kann ich schlecht beurteilen, wir kriegen über MSDNAA die Pro auf DVD für umsonst) core/CGUI.cpp Zeile 66 bearbeiten.

    Ergebnis sieht dann so aus:

    Externer Inhalt mtasa.org
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

    Toll. Mich hauts fast aus den Socken.

    Bringts doch voll - und ist voll einfach (wenn man vorher schon MTA kompilieren konnte), man kann die alte Chatbox behalten!

    Das kann man im WBB einstellen - ich würde hier auf pure Absicht tippen. Bei jeder Standardinstallation vom WBB ist es an, und hier ist es aus - und das ohne eigenes Design, auf das man's schieben könnte.

    Vielleicht weil deine eigene Zeit falsch eingestellt ist? :P Zumindest auf meinem Server wird die Zeit automatisch korrigiert (ntp*) und selbst auf meinem Pc zu hause passiert das von alleine (Windows kann sowas)