Beiträge von Campbell


    Warum so kompliziert, wenn man es schon als Parameter in CreateVehicle() lösen kann?

    Das geht viel einfacher:


    • Unter Annahme, dass wir fünf Balken wollen (20l = 1 Balken), erstellen wir fünf TextDraws.
    • Wir erstellen einen Timer für jedes Auto beim Erstellen des Autos, der dann aufgerufen wird, wenn der Tank 1l weniger enthält.
    • Wenn der Timer aufgerufen wird testen wir, ob sich ein Fahrer im Auto befindet und ob der Motor läuft.
    • Wenn ja, dann updaten wir die Balken, die angezeigt werden für den Fahrer.
    • Auch müssen wir die Balken bei ein- und aussteigen updaten.


    Also, machen wir uns ran (Beachte: Ich arbeite mit Iteratoren, damit ich Fahrzeuge und Spieler performanter handhaben kann - siehe Tutorial in meiner Signatur):



    // Preprocessor Directives:
    #include <foreach>


    #define FUEL_TIMER_INTERVAL (50000)


    // Aufbauen der Datenstruktur:
    enum vehicleEnumerator {
    vFuelTimerHandle,
    vTank
    }


    new Text:fuelBars[5],
    Iterator:vehicleIterator<MAX_VEHICLES>,
    vehicleData[MAX_VEHICLES][vehicleEnumerator];


    public OnGameModeInit() {
    // TextDraws erstellen!
    // ...


    // Autos erstellen:
    new vehicleID = CreateVehicle(/* ... */);
    Iter_Add(vehicleIterator, vehicleID);
    vehicleData[vehicleID][vFuelTimerHandle] = SetTimerEx("fuelTimer", FUEL_TIMER_INTERVAL, false, "i", vehicleID);
    return 1;
    }


    public OnPlayerStateChange(playerid, newstate, oldstate) {
    if(newstate == PLAYER_STATE_DRIVER) {
    updateFuelTextDraws(playerid, floatround(vehicleData[GetPlayerVehicleID(playerid)][vTank] / 20, floatround_ceil));
    } else if(oldstate == PLAYER_STATE_DRIVER) {
    updateFuelTextDraws(playerid, 0);
    }


    return 1;
    }


    forward fuelTimer(vehicleID);
    public fuelTimer(vehicleID) {
    new vParams[7];
    GetVehicleParamsEx(vehicleID, vParams[0], vParams[1], vParams[2], vParams[3], vParams[4], vParams[5], vParams[6]);
    if(vParams[0] == 1) {
    new driver = -1;
    foreach(new i : Player) {
    if(GetPlayerState(i) == PLAYER_STATE_DRIVER && GetPlayerVehicleID(i) == vehicleID) {
    driver = i;
    break;
    }
    }


    if(driver != -1) {
    updateFuelTextDraws(driver, floatround(vehicleData[vehicleID][vTank] / 20, floatround_ceil));
    }
    }
    }


    updateFuelTextDraws(playerid, bars) {
    new j;
    for(j = 4; j != bars - 1; j--) {
    TextDrawHideForPlayer(playerid, fuelBars[j]);
    }


    for(j = 0; j != (bars > 0) ? (bars - 1) : (bars); j++) {
    TextDrawShowForPlayer(playerid, fuelBars[j]);
    }
    }

    Die fallen nicht vom Himmel, diese Objekte sind an den Spieler angebracht. Damit es nur in Pershing Square schneit muss man eben eine Zone setzen und überprüfen, ob ein jeweiliger Spieler sich in dieser Zone befindet. Es existiert bereits ein Thread zu diesem Thema, das sich sehr weit oben in dieser Section befindet. Einfach mal suchen!

    • Entferne /* und */, sodass dein Code auch ausgeführt werden kann.
    • Verwende for() statt while(), sodass sich deine haus Variable auch erhöht oder: Schreibe haus++ als letzte Zeile in deine while()-Schleife.
    • In den neuen Versionen des Plugins gibt es auch extra Funktionen für Integer, Floats, etc. Du musst es garnicht so kompliziert mit einem result-String zu machen.
    • Warum verwendest du haus und hausid?
    • Warum schreibst du haus + 1 - das macht keinen Sinn!
    • Warum schreibst du zwei if-Abfragen anstatt einfach ein else einzubauen?
    • Warum gibst du die Anzahl der geladenen Häuser in der Schleife aus?

    Es wäre sinnvoll sich erstmal die Antwort selbst durch den Kopf gehen zu lassen, bevor man postet. Seit einer Weile benötigt man weder ein Editor noch gibt es InterPolateCamera() noch sollte man irgendeine Camera-Funktion unter OnPlayerRequestClass verwenden. Postet nicht, wenn ihr nicht wisst, wie man das Problem angeht!


    Zum Problem: Es ist möglich per InterpolateCameraPos() die Camera von Punkt A zu Punkt B zu schwenken (http://wiki.sa-mp.com/wiki/InterpolateCameraPos). Du solltest versuchen die Nachkommastellen auf ein oder zwei Stellen zu Runden (Bei X, Y und Z), denn es kann manchmals vorkommen, dass die Camera stockt.

    Da angebrachte Objekte an Spieler oder Fahrzeuge keine Kollisionen aufzeigen, kann man per EditObject die Größe dieser Objekte ändern. Bei nicht angebrachten Objekten funktioniert dies aber nicht, da diese Kollisionen mit sich bringen.

    • Deine Fehlerbeschreibung ist unverständlich.
    • Du kannst den Quellcode etwas verbessern, du benötigst lediglich einen String und nicht zwei. Verwende eine Variable einfach zweimal.
    • Ich bin mir sicher, dass du nicht 128 Zellen benötigst.

    Der User "ni204618_2_DB" besitzt nicht die nötigen Rechte, um die Queries erfolgreich auszuführen. Dies hat nichts mit deinem Script zu tun, sondern mit deinem MySQL User. Die Rechte musst du anpassen.

    Mal wieder ein gutes Tutorial Campbell nur heißt die Sprache immer noch Pawn und nicht Pawno eventuell dies oben noch verbessern.


    Zusätzlich ist eventuell noch hinzuzufügen, dass dies auch mit dem memory access Plugin von BigETI möglich ist. Was ich eher präferiere da man hier die Möglichkeit hat
    auf Arrays mit einem dynamischen Speicher zuzugreifen und diese jeweils auch "strukturieren" kann.


    Link:
    http://gta-sa-mp.de/forum/3-sa…393-memory-access-plugin/


    Danke für die Anmerkung, habe ich direkt verbessert. Scriptsprache und mitgelieferter Editor verwechsle ich immer wieder, naja ... Die Sache mit dem dynamischen Speicher habe ich bereits im Fazit angesprochen, werde daher nicht mehr näher darauf eingehen, da es auch nicht Teil des Tutorials ist. Hier geht es hauptsächlich darum performanter von Index zu Index zu springen anstatt alles stupide zu durchlaufen. Ich habe in diesem Fall die Problematik und eine Lösung anhand von foreach nähergebracht, natürlich kann man auf vielen Weisen diese Problematik angehen. Wie auch geschrieben können Iteratoren verschiedene Strukturen aufweisen, wodurch verschiedene Lösungen resultieren.

    • Beginne damit deinen Quellcode ordentlich einzurücken. (Nur hier im Forum? Klicke im Post auf "Quellcode" und beginne einzurücken - so macht es keinen Spaß dir zu helfen. 4 Leerzeichen = 1 Tab).
    • Debugging hilft dir dein Problem zu lösen. Füge print()s an geeigneten Stellen hinzu und schaue dir an, wohin der Quellcode läuft und an welcher Stelle es spinnt. Aus diesem Ergebnis wirst du dann ganz gezielt dein Problem angehen können.

    Das könnte ich, doch a) kann ich das so nicht machen, da ich nicht weis, wie du bisher Daten speicherst und b) würdest du dabei nichts lernen. Womit speicherst du denn deine Daten bisher? Schau dir doch mal die Registrierung an. Wie werden dort die Daten gespeichert? Ich vermute du verwendest ein Filesystem, wahrscheinlich dini, auch wenn das Nonsens ist, aber das mal beiseite. Schau dir die Datenspeicherung bei der Registrierung an, schau dir an, wie die Funktionen arbeiten und versuche dein Wissen später auf dein Problem zu transferieren.