Das solltest du nicht per Timer machen, sondern die Funktion dort aufrufen, wo der Rang geändert wird.
Sonst spricht der Code ja ständig die Datenbank an. Bei mehreren Spielern wird das ziemlich ressourcenlastig.
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. -
Dafür kannst du dieses Callback nutzen:
https://wiki.sa-mp.com/wiki/OnUnoccupiedVehicleUpdate -
Lade dir das crashdetect Plugin herunter und füge es in deinen Server ein. Dann poste was im Server Log steht, wenn du den Server startest.
-
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.
-
Die ID brauchst du in dem Array nicht, die ergibt sich aus der Zeile automatisch.
Zugriff bei CreateVehicle wäre dann:
CreateVehicle(SportAutos[ahID[playerid]][cmodelid], autohausCoords[autohausID[playerid]][ah_x], //... -
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. -
Aber wo soll ich diese schleife hinscripten, und welche Variablen etc. brauch ich noch?
Siehe Post #33:
TextDraw Autohaus-System, aber wie?Die eine Zeile mit der Schleife ist eigentlich alles, den Rest müsstest du ja schon drin haben.
-
Die Vorbereitung für die kalte Jahresszeit fängt dann mal an


Demnächst sind auch die Winterreifen auf dem Einkaufszettel.
-
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.
-
Poste bitte den Code, der mit dem Query das "carSavedToDB" Callback aufruft.
In dem dortigen Query ist ein Syntaxfehler. -
Jeffry, ich schulde dir nun 2 Bier.
Haha, passt schon

Melde dich einfach hier wenn's zu den mehreren Autohäusern noch Fragen gibt.Bis dahin schonmal viel Erfolg.

-
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. -
Gibt es eigentlich einen Weg bei dem TextDrawPreview eine Art Platzhalter einzubauen?
Was genau meinst du damit?
Prinzipiell kannst du alle Objekte dort anzeigen lassen (via Model ID). Kommt drauf an, was du anzeigen willst.
Soll es aber nicht einfach das erste Auto anzeigen? -
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. -
Kannst du bitte den dazugehörigen Code posten?