Arbeite auch hier mit PlayerTextDraws. Ein Spieler kann ja immer nur den Tacho eines Fahrzeugs sehen, somit kannst du den Tacho pro Spieler erstellen, mit PlayerTextDraws bei OnPlayerConnect und die Textdraws immer entsprechend dem Fahrzeug in dem er ist, aktualisieren.
Beiträge von Jeffry
-
-
Das Array so:
enum arrayEnum {
text[10],
Float:x,
integer
};new array[10][arrayEnum] = {
{"Das",234.012,111},
{"ist",354.012,222},
{"ein",213.012,333},
{"Bespiel",221.012,444},
{"Array.",861.012,555},
{"...",55.012,666},
{"xxx",36.012,777},
{"aaa",4523.012,888},
{"bbb",872.012,999},
{"ccc",7.012,101}
};Die Berechnung der Werte so:
new tmp[sizeof(array)][arrayEnum];
tmp = array;
new rnd;
for(new i = 0; i < sizeof(array) / 2; i++)
{
rnd = random(sizeof(array) - i);
//--------------Ausgabe----------------------//
//Hier in die Datenbank eintragen, anstatt
//dem print.
printf("%d: %s", i, tmp[rnd][text]);
//---------------Ende------------------------//
for(new j = rnd; j < sizeof(array)-1; j++)
{
format(tmp[j][text], 10, tmp[j+1][text]);
}
tmp[sizeof(array)-i-1][text][0] = '\0';
}Zur Erklärung hier ein Log. Jeweils die erste Zeile ist das selektierte Item, und danach die 10 Zeilen, wie das "tmp" Array jetzt aussieht.
Damit keine doppelten Treffer auftreten, wird das selektierte Item jeweils aus der Liste gelöscht, und die darüber stehenden Items um eins nach unten verschoben.
Daher bilden sich hinten die null's.Code
Alles anzeigen[03/09/2016 19:18:13] 0: Array. [03/09/2016 19:18:13] Das [03/09/2016 19:18:13] ist [03/09/2016 19:18:13] ein [03/09/2016 19:18:13] Bespiel [03/09/2016 19:18:13] ... [03/09/2016 19:18:13] xxx [03/09/2016 19:18:13] aaa [03/09/2016 19:18:13] bbb [03/09/2016 19:18:13] ccc [03/09/2016 19:18:13] (null)Code
Alles anzeigen[03/09/2016 19:18:13] 1: ... [03/09/2016 19:18:13] Das [03/09/2016 19:18:13] ist [03/09/2016 19:18:13] ein [03/09/2016 19:18:13] Bespiel [03/09/2016 19:18:13] xxx [03/09/2016 19:18:13] aaa [03/09/2016 19:18:13] bbb [03/09/2016 19:18:13] ccc [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null)Code
Alles anzeigen[03/09/2016 19:18:13] 2: Das [03/09/2016 19:18:13] ist [03/09/2016 19:18:13] ein [03/09/2016 19:18:13] Bespiel [03/09/2016 19:18:13] xxx [03/09/2016 19:18:13] aaa [03/09/2016 19:18:13] bbb [03/09/2016 19:18:13] ccc [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null)Code
Alles anzeigen[03/09/2016 19:18:13] 3: bbb [03/09/2016 19:18:13] ist [03/09/2016 19:18:13] ein [03/09/2016 19:18:13] Bespiel [03/09/2016 19:18:13] xxx [03/09/2016 19:18:13] aaa [03/09/2016 19:18:13] ccc [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null)Code
Alles anzeigen[03/09/2016 19:18:13] 4: ein [03/09/2016 19:18:13] ist [03/09/2016 19:18:13] Bespiel [03/09/2016 19:18:13] xxx [03/09/2016 19:18:13] aaa [03/09/2016 19:18:13] ccc [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null) [03/09/2016 19:18:13] (null) -
Soll der Timer immer um genau 24 Uhr ausgeführt werden?
-
Das ist nicht möglich.
-
Ach' und eigentlich funktioniert es bei KEINEN Fahrzeug. Laut Prints hat jede TextDraw davon eine Invalide ID....
Eventuell bist du schon über dem Limit durch andere Textdraws.
Weil man müsste ja pro Fahrzeug ne Array haben um die Infos des richtigen Fahrzeugs zu bekommen..oder sehe ich es falsch?
Das bleibt genau so wie du es aktuell auch machen würdest. Die Daten die du ins Textdraw schreiben willst hast du ja irgendwo gespeichert, wenn du das Textdraw aktualisierst.
Sprich du hast ein ganz normales enum mit MAX_VEHICLES, in dem die Infos stehen. Wenn dem Spieler das Textdraw angezeigt wird, weißt du ja für welches Fahrzeug und kannst die Daten mit [wiki]PlayerTextDrawSetString[/wiki] setzen.Vielleicht könntest du n Beispiel machen, wie du es lösen würdest. Wäre lieb
Das Beispiel zum Textdraw aktualisieren ist im Link. Versuche mal ob du damit klar kommst. Poste dann eventuell deinen bis dahin vorhandenen Code, falls du nicht weiter kommst, auf der Basis kann ich dir dann besser helfen.
-
Du erstellst MAX_VEHICLES (2000) mal 6 Textdraws, sprich 12.000 Textdraws.
Das Limit liegt bei 2048.
https://wiki.sa-mp.com/wiki/LimitsBei den ersten ~300 Fahrzeugen müsste es klappen, danach nicht mehr.
Wie machst du es besser?
Erstelle 1 Player-Textdraw pro Spieler (wenn er online kommt), und zeige ihm dort die Informationen des Fahrzeugs an, das er sich anschaut. Er sieht ja immer nur die Informationen eines Autos, daher reicht 1 Textdraw pro Spieler. -
Das kannst du mit dem Farbcode von
https://wiki.sa-mp.com/wiki/GangZoneShowForPlayer
und
https://wiki.sa-mp.com/wiki/GangZoneShowForAll
machen. -
Ah, sorry, ich habe vergessen den Platzhalter auch zu entfernen.
format(sql, sizeof(sql), "INSERT INTO biz (name,besitzer,x,y,z,kostet) VALUES ('%s','Niemand',%f,%f,%f,%d)",result,spx,spy,spz,player1); -
Funktioniert jetzt, Danke
Ok, super.
Noch der Grund dazu, warum es jetzt funktioniert:
Es gibt bei GetVehicleParamsEx 3 verschiedene Stati, im Falle des Motors ist das so:
0 = Aus
1 = An
-1 = Ungesetzt (entspricht 0).Daher reicht es nicht, auf 1 und 0 zu prüfen.
https://wiki.sa-mp.com/wiki/GetVehicleParamsEx

Das kommt bei dir zu Stande, weil du SetVehicleParamsEx vor CreateVehicle ausführst.
Ändere also beim Laden noch:
SetVehicleParamsEx(i, false, false, false, false, false, false, false);
zu:
SetVehicleParamsEx(Vehicle[i][SID], false, false, false, false, false, false, false);
Und setze es eine Zeile drunter unter CreateVehicle hin.Behalte die Änderung mit nur "else" dennoch bei.
-
Versuche es so:
Function LoadItems()
{
new num_fields,num_rows;
cache_get_data(num_rows,num_fields);
if(!num_rows)return print("["SERVER_DEBUG"] Es konnten keine Items geladen werden (rows = 0)");
LOOP(num_rows, i)
{
new id = GetFreeItemID(), str[32];
iData[id][itemX] = cache_get_field_content_float(i, "itemX", dbhandle);
iData[id][itemY] = cache_get_field_content_float(i, "itemY", dbhandle);
iData[id][itemZ] = cache_get_field_content_float(i, "itemZ", dbhandle);
if(iData[id][itemX] == 0 && iData[id][itemY] == 0 && iData[id][itemZ] == 0)continue;
iData[id][itemInteriorid] = cache_get_field_content_int(i, "itemInteriorid", dbhandle);
iData[id][itemID] = cache_get_field_content_int(i, "itemID", dbhandle);
iData[id][itemNumber] = cache_get_field_content_int(i, "itemNumber", dbhandle);
iData[id][itemDBID] = cache_get_field_content_int(i, "itemDBID", dbhandle);
format(str,sizeof str,"%s(%d)", GetItemName(iData[id][itemID]), iData[id][itemNumber]);
iData[id][itemTextLabel] = CreateDynamic3DTextLabel(str, COLOR_WHITE, iData[id][itemX], iData[id][itemY], iData[id][itemZ], 20.0, _, _, _, _, iData[id][itemInteriorid]);
iData[id][itemPickup] = CreateDynamicPickup(GetItemObjectID(iData[id][itemID]), 1, iData[id][itemX], iData[id][itemY], iData[id][itemZ], _, iData[id][itemInteriorid]);
printf("id: %d / Item: %s / Itemid: %d /Item Anzahl: %d / Pickup: %d - wurde geladen.",id,GetItemName(iData[id][itemID]),iData[id][itemID],iData[id][itemNumber],iData[id][itemPickup]);
}
return 1;
} -
Wie sieht der Code jetzt aus?
-
Versuche zuerst:
else if(tmp_engine == 1)
zu:
elseUnd
if(tmp_engine == 0)
zu:
if(tmp_engine != 1)Falls das nicht klappt:
Ändere
if(!Vehicle[i][SID])continue;
zu:
printf("i: %d / SID: %d / carid: %d", i, Vehicle[i][SID], carid);
if(!Vehicle[i][SID])continue;
Und poste was im Server Log steht, wenn du den Befehl eingibst. -
Lösche alle Einträge in der Tabelle "biz".
Dann ändere in der Datenbank in der Tabelle "biz" die Spalte "id" zu AUTO_INCREMENT (A_I), in der Struktur und speichere das.
Bearbeiten anklicken.A_I anklicken und speichern:

Ändere dann im Code:
format(sql, sizeof(sql), "INSERT INTO biz (id,name,besitzer,x,y,z,kostet) VALUES (%d,'%s','Niemand',%f,%f,%f,%d)",ladebize,result,spx,spy,spz,player1);
zu:
format(sql, sizeof(sql), "INSERT INTO biz (name,besitzer,x,y,z,kostet) VALUES ('%s','Niemand',%f,%f,%f,%d)",result,spx,spy,spz,player1);Somit wird immer die nächste freie ID automatisch von der Datenbank vergeben, ohne dass du selbst mitzählen musst.
Performancetechnisch und auch vom Aufwand her ist das die geschickteste Lösung. -
Problem ist, dass du immer nur die erste Zeile ausliest, da du das Query jedes mal neu sendest.
Mache es so:
ocmd:fraktioncontrol(playerid,params[])
{
new frakid,irang,str[500];
frakid = SpielerInfo[playerid][Frakt];
printf("DEBUG ID %i",frakid);
mysql_queryf("SELECT Name FROM user WHERE Fraktion='%i'",frakid); //Query absenden
mysql_store_result(); //Ergebnis Speichern
while(mysql_retrieve_row()) //Alle Zeilen des Ergebnisses durchlaufen
{
//Felder jeder Zeile auslesen
mysql_fetch_field("Name",data);
strmid(fraktionsmember,data,0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
mysql_fetch_field("Rang",data);
irang=strval(data);
printf("DEBUG Name %s",fraktionsmember);
if(ReturnPlayerID(fraktionsmember) != INVALID_PLAYER_ID) format(str, sizeof(str),"%s\n Name: %s - Rang: %i ({009F00}Online{FFFFFF})\n",str, fraktionsmember, irang);
else format(str, sizeof(str), "%s\n Name: %s - Rang: %i ({C70A00}Offline{FFFFFF})\n",str, fraktionsmember,irang);
printf("DEBUG Ende");
}
mysql_free_result();
ShowPlayerDialog(playerid, DIALOG_SONSTIGES, DIALOG_STYLE_MSGBOX, "{FFFFFF}Mitglieder-Übersicht", str, "Ok","");
return 1;
} -
Du zählst in der Schleife ExistItems nicht hoch.
-
Lass dir beides mal per print ausgeben und vergleiche, ob es das Gleiche ist.
-
Der Hash ist nur 28 Zeichen lang. Normalerweise sollte er 32 Zeichen lang sein.
Wie sieht denn die Struktur der Tabelle aus, das hast du nicht geschickt. Hat das Passwort-Feld mindestens eine Länge von 32 Zeichen? Wenn nicht, erhöhe das. -
Poste bitte einen Screenshot von dem Datensatz des Users mit dem du es probierst, auf dem man den kompletten MD5 Hash sieht, sowie einen Screenshot von der Struktur der accounts Tabelle.
-
Hast du im Ordner "scriptfiles" den Ordner "Accounts" angelegt?
Groß-/Kleinschreibung auch korrekt? -
Ändere das
new CopPeds[27][1] =
zu:
new CopPeds[27];In das Array schreibst du dann mit:
CopPeds[0] = ...
CopPeds[1] = ...
...