Beiträge von Jeffry

    Wie gesagt.


    Und damit wieder zurück zum Thema.


    stock IsPlayerSkydiving(playerid)
    {
    switch(GetPlayerAnimationIndex(playerid))
    {
    case 958..979,1134: return true;
    }
    return false;
    }
    Mit dieser Funktion kann überprüft werden, ob ein Spieler gerade mit einem Fallschirm in der Luft fliegt.

    Gut, dann gehen wir die Sache mal richtig an.


    1.
    Wie und von wo aus, wird LOLTIMER denn aufgerufen? Poste bitte den Code dazu.


    2.
    Wo kommen "rang" und "id" her? Die sind im LOLTIMER nicht deklariert und müssen daher global deklariert sein.
    Wie bekommen sie ihren Wert?



    Die Lösung müsste am Ende in etwa so aussehen, abhängig von deinen Variablenbezeichnungen eben:
    forward LOLTIMER(playerid);
    public LOLTIMER(playerid)
    {
    new query[128];
    format(query,sizeof(query),"SELECT `rangname%i` FROM `gangrangs` WHERE `fID`='%i'",SpielerInfo[playerid][rang],SpielerInfo[playerid][frakID]);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(query);
    mysql_free_result();
    PlayerTextDrawSetString(playerid,Rang2[playerid],query);
    return 1;
    }


    Wobei die Frage offen bleibt, warum das in einem Timer stehen soll.

    Der Compiler hat bei lokalen Variablen hin und wieder mal Aussetzer. In irgendeinem Thread habe ich das auch mal an einem Beispiel nachgestellt, da war so ein Fehler ebenfalls vorhanden.


    Abgesehen von der Warnung wäre es ohnehin besser, wenn du
    new tempstring[512],stringlang[1024],sSplit[2][64];
    vor dem switch deklarierst, und nicht in jedem case extra.


    Zu viele Lokale Variablen blähen den Code nur auf, und wenn du das gleiche Array mehrmals nutzt, dann ist es besser, es eine Ebene höher zu deklarieren.
    Versuche es so.

    Poste bitte deine Zeile 76691 aus der Funktion LoadFactionCars.
    Eventuell ein paar Zeilen drum herum, und markiere dann die Zeile 76691.


    Du sprengst dort ein Array, das mit 35 Indizes deklariert wurde (0 - 34) mit dem Index 35.
    Das dortige Array muss vergrößert werden.

    Bei dir macht das nicht wirklich was schneller, zudem kann man den Variablennamen nicht ändern...
    Sehe den Sinn darin nicht so ganz...

    Der Sinn seiner Schreibweise ist nicht die Performance sondern die Schnelligkeit im Code-Schreiben. Prinzipiell das Gleiche wie ein Define von SendClientMessage nach SCM.
    Mit foreach kann das nicht wirklich verglichen werden.


    So kann anstatt
    for(new i = 0; i < 10; i++)
    einfach
    LOOP(10, i)
    geschrieben werden.


    Natürlich macht die Abwandlung nur bedingt Sinn, aber einige nutzen dies wohl auch dem Verständnis halber, zumindest habe ich diese Schreibweise schon des Öfteren gesehen.

    Je nach System, ja.
    Dann bräuchtest du zusätzlich noch eine Spielervariable, in der du beim Betreten des Pickups die Autohaus-ID speicherst:
    new autohausID[MAX_PLAYERS];


    autohausID[playerid] = /*HIER*/;
    Hier den gleichen Wert wie beim /*HIER*/ in der Schleife eintragen.


    Über dieses Array kannst du dann auf das Array mit den Koordinaten zugreifen, sprich:
    autohausCoords[autohausID[playerid]][x]
    Zum Beispiel.

    Mache es so:
    new query[256];
    format(query,sizeof(query),"INSERT INTO autos (besitzer,model,x,y,z,r,farbe1,farbe2,neon) VALUES ('%i','%i','%f','%f','%f','%f','%i','%i','%i')",PlayerInfo[playerid][p_id],CarInfo[carid][model],CarInfo[carid][c_x],CarInfo[carid][c_y],CarInfo[carid][c_z],CarInfo[carid][c_r],CarInfo[carid][farbe1],CarInfo[carid][farbe2],CarInfo[carid][cneon]);


    Zum einen war das Query zu klein (erhöht auf 256) und zum anderen mussten die Werte alle in eine Klammer, sonst legt das Query für jeden Wert eine neuen Datensatz an, und die Werte stehen nur bei "besitzer" drin.

    Füge dort dann noch das hier hinzu:
    for(ahID[playerid] = 0; ahID[playerid] < sizeof(SportAutos); ahID[playerid]++) if(SportAutos[ahID[playerid]][autohaus] == 0) break;
    PlayerTextDrawSetPreviewModel(playerid,AutoHB1[playerid],SportAutos[ahID[playerid]][cmodelid]);
    PlayerTextDrawShow(playerid,AutoHB1[playerid]);
    PlayerTextDrawSetPreviewModel(playerid,AutoHB2[playerid],SportAutos[ahID[playerid]][cmodelid]);
    PlayerTextDrawShow(playerid,AutoHB2[playerid]);
    PlayerTextDrawSetString(playerid,AutoHPreis[playerid],SportAutos[ahID[playerid]][cpreis]);
    new str[32];
    format(str,sizeof(str),"Preis: $%d",SportAutos[ahID[playerid]][cpreis]);
    PlayerTextDrawSetString(playerid,AutoHPreis[playerid],str);
    format(str,sizeof(str),"%s",getVehicleName(SportAutos[ahID[playerid]][cmodelid]));
    PlayerTextDrawSetString(playerid,AutoHName[playerid],str);


    Zur Erklärung, neu ist nur diese Zeile, den Rest habe ich von oben kopiert:
    for(ahID[playerid] = 0; ahID[playerid] < sizeof(SportAutos); ahID[playerid]++) if(SportAutos[ahID[playerid]][autohaus] == 0) break;
    Diese Zeile sucht das erste Auto des Autohauses.
    Die Autohaus-ID musst du hier angeben:
    ... if(SportAutos[ahID[playerid]][autohaus] == /*HIER*/) break;
    Im Beispiel steht dort die 0 (für das erste Autohaus).


    Falls du nur ein Autohaus hast, zum Beispiel zu Anfang für die Tests, reicht es anstatt der Schleife:
    ahID[playerid] = 0;
    Das geht aber nur, wenn du nur ein Autohaus hast, da ist das erste Auto ja immer das erste in der Liste.

    Genau.
    Was willst du stattdessen sehen? Das erste Fahrzeug aus der Liste zu dem entsprechenden Autohaus?


    Übrigens:
    Du kannst die Pfeile und Boxen (alle Textdraws die sich niemals in Farbe/Text/... ändern) auch als normale Textdraws (nicht PlayerTextdraw) erstellen. Wenn du viele Systeme mit Textdraws hast, kommst du sonst eventuell schneller an das Limit.

    Vor:
    ahID[playerid]++;
    das einfügen:
    if(ahID[playerid]+1 >= sizeof(SportAutos) || SportAutos[ahID[playerid]][autohaus] != SportAutos[ahID[playerid]+1][autohaus]) return 1;
    Sprich wenn man am Ende des Arrays angekommen ist, oder wenn das nächste Fahrzeug einem anderen Autohaus angehört, passiert nichts.