[SAMMELTHREAD] Kleine Scripting Fragen

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Eigentlich müsste das richtig sein, hast du vllt irgendwo anders im Script ein Klammerfehler o.ä?


    beim if(sSpieler[playerid][Gebannt] = 1) sollte man 2 = Zeichen verwenden ( == 1) aber das gibt nur eine Warnung und kein Error.


    Hast du kein SekundenTimer im Script der jede Sekunde läuft und Spieler irgendwas abfragt? Falls ja finde ich da den SetTimerEx unnötig.

    SA:MP in 2020?

  • C
    new max_tank[211];
    
    
    max_tank[0] = 80; //Bedeutet der Landstalker hat ein maximales Füllvolumen von 80 Litern
    
    
    //Abfragen: (angenommen wir sitzen in einem Landstalker)
    new v = GetPlayerVehicleID(playerid);
    printf("Landstalker hat ein Tankvolumen von %d Litern.", max_tank[GetVehicleModel(v)-400]);
    //Das gibt dir 80 eben aus :)

    Hier mal ein simples Beispiel ^^

    Okay. Aber wieso "max_tank[0] = 80 ? Wofür steht die 0? und wofür die 211?

  • Ah, das macht sinn. Also fängt man aus performance Gründen bei 0 an? Zur übersichtlichkeit könnte man doch auch 400 nehmen und die voherigen ignorieren oder?


    Geht es auch so?



    GetFuelSize(vehicleid)
    {
    if(GetVehicleModel(vehicleid) == 411 || 412) return 60;


    }


    Ich glaube das "oder" ist falsch. kann ich überhaupt 60 returnen? als tankgröße? Ich will generell ja nicht nur mit playerid abfragen können, das auto muss ja beim server start bereits benzin bekommen

  • Du kannst statt vehicleid natürlich die modelid direkt übergeben. Das so zu machen, ist aber wiederum nicht Sinn der Sache, dafür ist ja das Array gedacht, damit du nicht so viele If-Abfragen oder eine switch-Anweisung brauchst.

  • Mit dem array müsste ich doch 211 mal max_tank[0], max_tank[1],.. listen, oder? Von der schreibarbeit her dachte ich, geht es schneller wenn ich die modellids 411 und xxx und xxx und xxx = 60 liter. Ist es performancetechnisch ein großer unterschied?


    Also sagen wir mal ich mache es wie in Kalibers Beispiel. Und möchte die Autos beim server start befüllen. Also setzte ich sinnigerweise bei "onvehiclespawn" an, oder? dann habe ich ja keine playerid. Somit müsste die abfrage dann so aussehen: ?


    printf("Landstalker hat ein Tankvolumen von %d Litern.", max_tank[GetVehicleModel(vehicleid)-400]);


    korrekt? Dann bleibt mir nurnoc hdie frage wo ich am besten diemax_tank[x] = y; im script plaziere?

  • Du könntest es auch wie mit den CarNames machen:


    Nur dann eben mit der Tankgröße

    Code
    stock const CarTank[] =
    {
        80, 100, 50, 20 // etc.
    };
    
    
    #define GetVehicleMaxFuel(%0) CarTank[((model==0)?(0):(model-400))]
  • new max_tank[211];

    zu:
    new max_tank[212];


    Mit dem array müsste ich doch 211 mal max_tank[0], max_tank[1],.. listen, oder? Von der schreibarbeit her dachte ich, geht es schneller wenn ich die modellids 411 und xxx und xxx und xxx = 60 liter. Ist es performancetechnisch ein großer unterschied?

    Ja, du hättest alle 212 Indizes im Code stehen. Was wäre deine Methode mit "und xxx"?
    Du könntest es z.B. alternativ so machen:
    for(new i = 0; i < sizeof(max_tank); i++)
    {
    switch(i)
    {
    case 0, 15, 19: max_tank[i] = 60;
    case 1, 20, 99, 150: max_tank[i] = 70;
    //...
    }
    }
    Der Vorschlag von Madd92 ist aber am sinnvollsten.


    Dann bleibt mir nurnoc hdie frage wo ich am besten diemax_tank[x] = y; im script plaziere?

    OnGameModeInit.



    printf("Landstalker hat ein Tankvolumen von %d Litern.", max_tank[GetVehicleModel(vehicleid)-400]);

    Das kannst du bei OnVehicleSpawn so machen, ja.

  • Danke euch!
    Madds letzter Vorschlag sieht übersichtlich aus. Da kann ich dann gleich noch so eine Tabelle mit Verbrauchs Faktoren der Modelle machen, super. :)


    EDIT: Okay, ich hab jetzt 2 Tabellen (Tankinhalt und verbrauchskoeffizient) aber ich schaff es nicht "GetVehicleMaxFuel" abzufragen :(
    Wie sollte das aussehen?


    mein "Tank[i] = Tank[i] - GetVehicleFuelUsage(i);" sagt undefined symbol "model" ?

    Einmal editiert, zuletzt von jdm_guy ()

  • Edit: nee stimmt auch nicht, bin grad zu blöd dafür xD


    #define GetVehicleMaxFuel(%0) CarTank[%0 - 400] würde gehen, aber da ist dann keine Abfrage drin, ob die ModelID valide ist.
    Vielleicht auch lieber einfach so, statt dem Define:


    Code
    stock GetVehicleModelMaxFuel(modelid)
    {
    	return modelid < 400 || modelid > 611 ? 0 : CarTank[modelid - 400];
    }

    Weiß grad nicht, ob und wenn ja wie man das als Define implementieren könnte.

    2 Mal editiert, zuletzt von Madd92 ()

  • Hey wie ich hier vor kurzem mal anmerkte gehen bei mir einige TextDraws nicht, anscheinend gehen die manchmal?


    Mir ist aufgefallen ein paar Pickups verschwinden manchmal für reallife Tage und sind dann nach 50 Server restarts wieder da, genau so wie mit dem Textdraws wie behebe ich das? 8|

    SA:MP in 2020?

  • Wie kann ich einen AudioStream abspielen den ich vom lokalen Server beziehe, also keine remote Adresse?


    Wie muss da meine PlayAudioStreamForPlayer Zeile aussehen, wenn die entsprechende Audio Datei beispielsweise im gleichen Ordner liegt wie der Server?

  • Der Stream wird vom user requestet, nicht vom server..
    Das heißt...du musst es aus der Sicht vom user schreiben...und da gibts nunma nix lokales auf dem Server...dat sieht der nicht xD


    Also musst es so machen:
    http://server-ip/sound.mp3
    Vorrausgesetzt Port 80 is frei usw...

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Wieso kommt hier nicht das gleiche raus??


    Tacho bringt 0-167MPH:



    getPlayerSpeed(playerid)
    {
    new Float:x, Float:y, Float:z, Float:rtn;
    if(IsPlayerInAnyVehicle(playerid))
    {
    GetVehicleVelocity(GetPlayerVehicleID(playerid), x, y, z);
    }
    else
    {
    GetPlayerVelocity(playerid, x, y, z);
    }
    rtn = floatsqroot(x*x + y*y + z*z); //
    return floatround(rtn * 100 *1.35); // *
    }



    Aber nun kommt plötzlich eine Zahl mit 10 Stellen hier raus.. :



    getFuelSpeed(vehicleid)
    {
    new Float:x, Float:y, Float:z, Float:rtn;

    rtn = GetVehicleVelocity(vehicleid, x, y, z);
    rtn = floatsqroot(x*x + y*y + z*z); //
    return floatround(rtn * 100 *1.35); //


    Ich versteh es nicht. Wieso ist das so?

  • Aber nun kommt plötzlich eine Zahl mit 10 Stellen hier raus.. :

    dann hast du vermutlich %f statt %d angegeben.
    BTW: du brauchst nicht den return Wert von GetVehicleVelocity speichern

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Leute wisst ihr vielleicht wieso immer beim Compilen (Keine Rückmeldung) kommt und dann nach einer Minute ca. fertig Compiled?

    Ein (oder mehrere) sehr große Arrays global deklariert.



    //Also z.B. oben im Skript sowas wie:
    new [1000][1000][1000];

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S