Beiträge von Woozie

    Ich arbeite derzeit an verschiedenen Nebenmissionen (ihr würdet es als Jobs bezeichnen) für mein kleines Projekt. Wie auch diese Sidemission, kommen alle zusätzlichen Funktionen als Module (Includes) zum GameMode hinzu. Der Vorteil ist, daß man diese Module unter beliebigen GameModes laufen lassen kann (sehr geringe Anpassungen sind zwar nötig, aber die Bearbeitungszeit entspricht etwa max. 5 bis 10 Minuten!).


    Ich möchte mich auch gern mal wieder etwas aktiver in diesem Forum beteiligen und fange damit an, euch diese Sidemission zu zeigen.


    Hauptaugenmerk liegt bei mir auf Benutzerfreundlichkeit; das heisst, keine Befehle! Die Aufgabe soll immer selbsterklärend sein oder zumindest kurz dem Spieler erklärt werden.


    Nun zur Sidemission:
    Firefighter ist ein recht einfacher Feuerwehrjob(!).
    Es gibt Feuerwehrstationen in Los Santos (nahe dem Skatepark), in San Fierro Doherty und in Las Venturas.


    Die Aufgabe ist recht einfach, aber nicht ungefährlich. Einfach in den roten Marker reingehen, eine Meldung zur Begrüßung erscheint (siehe 2. Bild). Sofort kann man in einen Feuerwehrtruck einsteigen und auf den Auftrag warten (kommt recht schnell; bis zu 10 Aufträge erscheinen nach und nach). Einfach zum Auftragsort hinfahren und den Brandherd (Bild 4) mit der Löschkanone des Feuerwehrtrucks löschen. Oder man steigt aus und benutzt den Feuerlöscher, den man erhält, wenn man im FD Truck sitzt.


    Klingt simpel, ist es aus. Aber, Problem bei den Brandherden ist deren Unberechenbarkeit (hier etwas vereinfacht durch Anzeige des ExploTimers). Die Information 'Next explosion' gibt preis, wann es die nächste Detonation gibt. Ist diese Zeit abgelaufen, sollte man sich so schnell es geht vom Brandherd entfernen.


    Die Anzeige 'Intensity' zeigt einem an, wie stark das Feuer noch brennt. Ist diese Anzeige auf 0 runter, hat man das Feuer gelöscht und man erhält Geld für seine Mühen.


    Eine Erweiterung ist zwar geplant, aber Zeitpunkt der Umsetzung noch offen. Und zwar soll man auch Bots aus dem Auto retten können, nachdem man das Feuer am Fahrzeug gelöscht hat.
    Für weitere Fragen oder Vorschläge stehe ich euch gern zur Verfügung.


    Hab mal deinen Code in einen leeren GameMode gepackt und bissl die Fehler entfernt. Lokal läuft der Timer 1a.



    Da ich den ArenaTextID TextDraw nicht habe, hab ich dies auskommentiert.

    Zeile 16:

    Code
    mysql_pquery(handle, query, "SaveMysqlCars", "sii", Spielerinfo[playerid][Name],x,playerid);


    musst du nicht die Größe des Strings angeben?
    Also

    Code
    mysql_pquery(handle, query, "SaveMysqlCars", "s[24]ii", Spielerinfo[playerid][Name],x,playerid);

    ?

    Wie bereits erwähnt, benutze ich dieses Plugin nicht und kenne es daher auch nicht. Ich gehe von PHP aus und nutze eine eigene Include von Strickenkids MySQL Plugin in der ich die Funktionen von besagtem Author in PHP konforme umwandel.


    Ich erklär meinen obrigen Code mal in deutsch, versuchsweise:


    • Abfragen, ob es bereits einen Datensatz mit dem Fahrzeugbesitzer gibt
    • gibt es EINEN (oder mehrere), dann muss der Datensatz von diesem Fahrzeugbesitzer aktualisiert werden (UPDATE)
    • gibt es KEINEN, dann muss ein neuer Datensatz angelegt werden (INSERT)

    Sorry, wenn ich euch, mangels detaillierter Kenntnisse dieses MySQL Plugins, nicht direkt weiterhelfen kann.
    Und nein, ich nehm das nicht persönlich und hoffe dennoch, euch mit dem MySQL Problem weiterhelfen zu können. ;)


    Nachtrag:


    Code
    the manual that corresponds to your MySQL server version for the right syntax to use near '=540,`Neon` ,`Plate`,`Number`='GBN-0',`Gesperrt`,`Sperrpreis`,`K' at line 1

    Kannst du uns bitte mal per PRINT den kompletten SQL String anzeigen lassen bzw. hier posten?

    Sorry, beim UPDATE ist ein kleiner Fehler drin, da die WHERE Klausel fehlt:



    Zur Erklärung:
    ab Zeile 12: es gibt einen Datensatz mit deiner SELECT Abfrage, also aktualisiert er diesen Datensatz mit den neuen Werten
    ab Zeile 21: es gibt keinen Datensatz, also fügt er einen neuen in deine Tabelle ein


    und
    Zeile 12 nicht ändern, da er per IF abfragt, ob es mehr als 0 Datensätze gibt (also einen oder mehrere)!

    Gib mir mal bitte den Link zu deinem MySQL Plugin, damit ich mir die Include ansehen kann (wegen den Befehlen).


    Nachträglich bearbeitet:
    Probier das mal


    Ich hab gestern abend noch das mit dem "" im SendClientMessage getestet. Es gab keinen Absturz. War aber nur ein SCM und nicht mehrere. Teste das mal lieber genauer durch, nicht daß dein Problem weiterhin besteht

    Was ich nicht verstehe, wieso ignorierst du meinen Beitrag (Link: MSQL Speichert als "Null")? Dort hab ich dir eine Alternative angeboten. So, wie du das machst, ist doch umständlich.


    Deine Reihenfolge ist:
    1. neuer Eintrag in deine Tabelle einfügen mit dem Name des Fahrzeugeigentümers - egal, ob es bereits so einen Eintrag gibt
    2. du aktualisiert diesen Eintrag mit weiteren Werten
    3. du aktualisiert erneut diesen Eintrag mit den restlichen Werten


    Meine Reihenfolge ist:
    1. prüfen, ob es einen Datensatz mit dem Namen des Fahrzeugeigentümers gibt
    2a. ja, es gibt einen - also aktualisiert diesen Datensatz mit den aktuellen Werten
    2b. nein, es gibt keinen - neuen Datensatz einfügen mit allen aktuellen Werten


    Was macht nun mehr Sinn?


    Außerdem hab ich dir empfohlen, für die Felder in deiner Tabelle Standardwerte zu nutzen, da du dadurch Resourcen sparst und solche Fehler vermeiden kannst.

    Ok, dann entferne den Timer bitte mal, und schaue ob es dann auch nach 10 Minuten abstürzt.

    Ich denke mal, daß es nicht daran liegt; wieso auch? In seinem Script wird irgendwo ein CallRemoteFunction aufgerufen, k.A. welche Funktion dort expliziet aufgerufen wird. In dieser besagten Funktion knallt es.

    Starte deinen Server mal ohne Filterscripte bitte.


    Nachtrag:
    im übrigen würd ich dir SWITCH CASE anstelle von IF empfehlen.


    2.Nachtrag:
    für mich sieht das nicht nach einem 5-Minuten-Crash aus, sondern nach ca. 11 Minuten laut Log.


    J0a9 schrieb:

    C
    [17:39:17] Number of vehicle models: 79
    [17:50:12] [debug] Server crashed while executing VDL.amx
    ...

    Versuch es mal so. K.A. obs funktioniert. Sollte auch selbsterklärend sein.


    Nachtrag:
    übrigens empfehl ich dir Standardwerte bei deiner Tabelle einzutragen. Dann brauchst du die Felder nicht immer mit 0 zu füllen, da das MySQL selber dann tut. Verkürzt deinen String auch immens und spart etwas Resourcen ;).

    Wenn du Resourcen sparen möchtest, entfern auch noch die Leerzeichen (zwischen den Werten und Kommas) in deinem Query-String. Sieht zwar MIT schöner aus, aber überflüssig.
    NULL ist ein Wert der MySQL Datenbank. Wenn du beim Erstellen der Tabelle NULL (nicht 0) Werte als Vorgabe eingestellt hast, wird NULL dort eingefügt, wo du keine Werte beim INSERT angibst.


    Dein Problem deutet also daraufhin, sofern ich das richtig gelesen habe (habs nur kurz überflogen), daß dein INSERT korrekt ausgeführt wird, dein anschließender UPDATE nicht.


    Übrigens, wieso fragst du vorher nicht ab, ob es mit diesen Werten (ID) nicht schon ein Eintrag gibt. Gibt es ihn, UPDATE, ansonsten INSERT. So, wie du das machst, erstellst du immer mit INSERT einen neuen Eintrag und aktualisiert ihn mit UPDATE dann.

    Welche Funktion ruft bei dir ein CallRemoteFunction auf? Läßt du ein FilterScript laufen? Zumindest deutet dies drauf hin. Der Server stürzt beim Ruf dieser Funktion ab. Die davor ausgeführte Funktion ist deine Public serverNews.