Beiträge von Manniac

    Wenn du beide Lichter gleichzeitig aus bzw anschalten willst, kannst du außerdem auch "SetVehicleParams(-Ex)" verwenden.


    Einfach einen Timer wiederholen und jeweils die Lichter an/ab- schalten.


    Ansonsten ^.

    http://forum.sa-mp.de/index.php?form=Explain


    Zitat

    Du hast der Variable bspw durch ein "new variable[10]" eine gewisse Anzahl an Dimensionen gegeben. In diesem Beispiel 10 (variable[0] - variable[9]).
    Nun kannst du aber auch nur diese nutzen.
    Der Fehler tritt auf wenn du also bspw nur 10 Dimensionen erstellst, aber versuchst weitere Dimensionen anzusprechen,
    also du bspw versucht, nun die Variable "variable[200]" zu nutzen.
    Von Trooper[Y] 27 20


    Zum 2. : Du hat "IsNumeric" bereits erstellt.


    Weitere Platzhalter sehen wie folgt aus:
    %b Fügt eine Binärummer an dieser Position
    %c Fügt ein einzelnes Zeichen ein
    %d Fügt einen Integer (ganze Zahl) ein.
    %f Fügt eine Zahl mit Nachkommastellen ein (Float)
    %i Fügt einen Integer (ganze Zahl) ein
    %s Fügt einen String ein
    %x Fügt eine Hexdezimalzahl ein
    %% Fügt ein % ein


    Die wichtigsten sind jedoch "%d", "%f", "%i" ( = vom Prinzip her "%d" ) und "%s".
    Zu beachten ist, dass "%i" und "%d" exakt das selbe tun. Beide geben normale Zahlen ( 1,2, 123231 ) aus.
    Gewöhnt euch einfach an, "%i" zu verwenden ( Integer ), damit ihr nicht mit "Float" durcheinander kommt.


    Möchte man nun die Zahl "1" ausgeben, kann man das wie folgt tun:
    format(string,sizeof(string),"%d",1);
    Output -> 1


    Wenn man allerdings möchte, dass die mindestzahl an Ziffern 2 ist, kann man "%02d" verwenden.
    format(string,sizeof(string),"%02d",1);
    Output -> 01


    Des Weiteren kann man "format" verwenden, um einer 2-Dimensionalen Variable einen String zuzuweisen.
    [pwn]vehicle[vehicleid][owner] = "PETER"; // Würde nicht funktionieren 
    format(vehicle[vehicleid][owner],24,"%s", playername);// richtig


    7.2 STRVAL
    "strval" gehört zu den "String-Funktionen".
    Diese Funktion ist mMn einer der wichtigsten in dem "Paket". Sie wandelt einen string ( =Text ) in einen integer ( = Zahl ) um.
    Ein gutes Beispiel hierfür wäre folgendes:
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    switch(dialogid)
    {
    case DIALOG_MONEY:
    {
    if(!response)return 1;
    new amount = strval(inputtext);
    GivePlayerMoney(playerid,amount);
    }
    }
    return 1;
    }


    Würden wir hier direkt "inputtext" als 2. Parameter einsetzen, würden wir einen Fehler bekommen.


    7.3 print
    Diese Funktion bzw. die Funktion von 7.4 wird gerne verwendet, um sein Script zu debuggen. ( Um Fehler zu finden, welche auf den ersten Blick nicht ersichtlich sind )
    "print" hat lediglich einen Parameter: "Text".


    Wichtig ist, dass der Text nicht InGame ausgegeben wird, sondern in der Konsole btw. server_log.txt gespeichert wird.
    public OnGameModeInit()
    {
    // Don't use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    print("Hello World!");
    return 1;
    }
    ^Code gibt in der Konsole bei dem Serverstart "Hello World" aus.


    7.4 printf
    Diese Funktion wird noch häufiger zum debuggen verwendet. Grund hierfür ist, dass man bei dieser Funktion auch Parameter verwenden kann.
    Der Aufbau ist im Prinzip genauso wie bei "format".
    new var = 121;
    new string[] = "Hello"
    new var2 = 1;
    public OnGameModeInit()
    {
    // Don't use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    printf("%d | %s | %02d",var,string,var2);
    return 1;
    }
    Würde in der Konsole
    121 | Hello | 01ausgeben.


    8. Schleifen


    Kommen wir nun zu dem ( wahrscheinlich ) letzten Themengebiet, von dem ein (fortgeschrittener-) Anfänger wissen sollte: Schleifen.
    Es gibt 3 Arten von Schleifen ( wobei 2 davon ziemlich die selben sind )
    8.1 "for"- Schleife
    Das ist wohl die häufigste anzutreffende Art der Schleifen. Außerdem ist sie auch die "bequemste" Schleife.
    Der Aufbau sieht meistens wie folgt aus:
    for(variable; bedingung; counter)
    {


    }
    Was bedeutet das nun?
    Variable = Neue Variable, die man direkt in der Schleife deklariert & verwendet
    Bedingung = Wie lange soll die Schleife laufen?
    counter = Was soll mit der vorher definierten Variable passieren?


    Ein oft gesehenes Beispiel wäre:
    for(new i = 0; i<GetMaxPlayers(); i++)
    {


    }
    Dieser Schleife läuft nun solange, wie die Variable i kleiner als der Wert ist, den GetMaxPlayers zurückgibt.


    Leider ist dieser Code extrem ineffizient. Siehe
    new i;
    for(;i<MAX_PLAYERS;i++)
    {


    }
    Wäre daher die beste Lösung. Aber halt, wohin ist denn die Variable verschwunden?
    Diese kann ganz einfach außerhalb der Schleife erstellt werden. Die Deklaration wird in der Schleife mit ";" einfach übersprungen.


    new i;
    for(;i<50;i++)
    {
    printf("%02d",i);
    }


    Diese Schleife sollte nun von 00 - 49 die einzelnen Zahlen in der Konsole ausgeben.


    8.2 "while"- loop
    Eine "while" Schleife führt eine Aufgabe solange aus, bis die Bedingung nicht mehr stimmt.
    Der Aufbau ist wie folgt:
    while(bedingung)
    {


    Zu beachten ist, dass man unter normalen Umständen keine Variablen in der While-Schleife deklarieren kann.


    Ein kleines Beispiel:
    new var=50;
    while(var > 0) // Während var größer 0
    {
    printf("%02d",var); // printe var
    var --; // Ziehe 1 von var ab
    }
    Diese Code würde nun von 50 - 01 alle Zahlen printen.
    Wichtig ist, dass man das abziehen bzw dazuzählen nicht vergisst, da sonst die Variable unendlich weiterlaufen würde.


    Solch eine Schleife verwendet man meistens, um eine bestimmte Menge an Datensätzen aus der Datenbank zu laden.



    8.3 "do-while" Schleife
    Diese Schleife wird nie verwendet. ( Zumindest kenne ich kein sinnvolles Beispiel )
    Der Grund dafür ist, dass sie eine Aufgabe mindestens einmal ausführt, bevor sie die Bedingung berücksichtigt.
    Ein Beispiel:


    new var = 0;
    do
    {
    printf("%02d",var);
    var--;
    }
    while (var > 1);


    Der Output wäre "00", da die Schleife zuerst einmal die Aufgabe erledigt, bevor sie die Bedingung beachtet.
    Würde man das Ganze mit einer "while" Schleife machen, sähe das folgendermaßen aus:
    new var = 0;
    while( var > 1)
    {
    printf("%02d",var);
    var --;
    }


    Diese Code hat keinen Output, da die Bedingung nicht erfüllt werden kann.



    8.4 "Jump-Statements"


    Es gibt noch weiter Möglichkeiten, eine Schleife zu verändern.
    Dazu gehören "break, continue sowie goto ( welches ich aber nicht erklären werde, da es unsinnig ist. Auf Anfrage kann ich es aber hinzufügen )


    8.4.1 continue
    Um eine Schleife noch effizienter zu gestalten, kann man eine weitere Reihe von Bedingungen erstellen.
    Warum sollte eine "for"-Schleife beispielsweise 500 Slots durchgehen, wenn nur 100 davon tatsächlich Spieler sind?


    new i;
    for(;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i) || IsPlayerNPC(i))continue;
    }
    Diese Code überprüft nun, ob der Spieler
    a) nicht auf dem Server ist &
    b) ob er ein NPC ist.


    Sollte eine der beiden Bedingungen zutreffen, überspringt "continue" sie also.


    Ein weiters Beispiel:
    new i;
    for(;i<5;i++)
    {
    if(i == 3)continue;
    printf("%02d",i);
    }


    Der Output wäre also: 00, 01, 02, 04
    Grund: Wenn i == 3 -> überspringen



    8.4.2 break
    Sollte man nur einen Wert in einer Datenmenge suchen, wäre es sinnlos, die Schleife weiterlaufen zu lassen, wenn man den Wert gefunden hat.
    Um eine Schleife abzubrechen verwendet man "break".
    new i;
    for(;i<500;i++)
    {
    if(i == 5)break;
    printf("%02d",i);
    }


    Wie man sehen kann, würde die Schleife 500x durchlaufen, wenn wir die "break"-Bedingung nicht hätten.
    Der Output wäre -> 00, 01, 02, 03, 04




    Tutorial um 7 + 8. erweitert.


    Sollte jemand Fehler finden, kann er sie mir gerne melden.


    Edits:

    Spoiler anzeigen
    1-5: Fehler ausgebessert
    6: 7+8 hinzugefügt
    8: Beitrag als neu makieren entfernt


    Zuallererst: [ SCRIPTING ] PAWN - Die Grundlagen der SAMP-API
    3.2 Spricht genau dein Problem an.


    In diesem Fall würde ich allerdings der Übersicht halber ein stock erstellen, welches dem Spieler dann die Nachrichten ausgibt. ( "stock ShowLic(playerid)" )
    Falls du aber keine Lust hast, ^ durchzulesen, hier eine kleine Zusammenfassung:


    Variable erstellen, spielerID als Parameter angeben & durch den stock ( "ShowLic(variablenname)" bsp. ) Nachrichten ausgeben lassen.