Du kannst es ja mal versuchen, ob es funktioniert, wenn du sonst gar keine anderen Objekte lädst, sondern nur das Blaulicht.
Wenn es dann geht, dann liegt es daran, dass zu viele Objekte existieren.
Beiträge von Jeffry
-
-
Schreibe das untere SendClientMessage in die Schleife nach dem format.
-
Wie hätte er sonst die Werte in der Datenbank ändern können?

@Raiffel:
So wie das aussieht speicherst du beim starten des Servers die Werte, und erst danach lädst du sie, heißt alles wird auf 0 gesetzt. -
Es heißt "CreatePlayerTextDraw", nicht "PlayerTextDrawCreate". Poste zu dem Rest bitte den Code wie du ihn hast.
-
Hmm, kannst du dann bitte folgendes machen?
1) Setze in der Datenbank die Werte der Dinge die zurück gesetzt werden auf 50 (z.B.), dann starte den Server. Dann poste den MySQL Log dazu (paar Posts drüber steht ja, wie du den bekommst).
2.) Dann schließe den Server bitte wieder, und poste den MySQL Log der dazu kommt.
3.) Zu 1 und 2 poste bitte jeweils noch den aktuellen Code der ausgeführt wird. -
Zu dem Problem mit dem nicht genug Geld:
else if (fsumme >= fgeld) return SendClientMessage(playerid, Color_Red, "Du hast nicht soviel Geld auf deiner Hand.");
zu:
else if (fsumme > fgeld) return SendClientMessage(playerid, Color_Red, "Du hast nicht soviel Geld auf deiner Hand.");und:
else if (fsumme >= fmoney) return SendClientMessage(playerid, Color_Red, "Kasse: So viel Geld haben wir nicht.");
zu:
else if (fsumme > fmoney) return SendClientMessage(playerid, Color_Red, "Kasse: So viel Geld haben wir nicht.");In der Datenbank Speichern kann es nicht, da du das auskommentiert hast.
//SaveKassen();
zu:
SaveKassen();Schreibe bitte das Laden der Kassen noch so, das ist besser, dann ist es gleich wie bei den Fahrzeugen:
forward LoadKassen();
public LoadKassen()
{
new query[128], bool:added, rows = cache_num_rows()+1, id, failcount, str[32]; //+1 weil du bei 1 anfängst
for(new i=1; i < MAX_FRAKTION; i++)
{
if(i < rows) id = cache_get_field_content_int(i-failcount-1, "ID");
else id = -1;
if(id != i)
{
switch(i)
{
case 1: format(KassenInfo[i][fName], 32, "Staatskasse");
case 2: format(KassenInfo[i][fName], 32, "Test1");
case 3: format(KassenInfo[i][fName], 32, "Fahrschule");
case 4: format(KassenInfo[i][fName], 32, "News");
case 5: format(KassenInfo[i][fName], 32, "ADAC");
}
format(query, sizeof(query), "INSERT INTO Kassen (ID, Name) VALUES ('%d', '%s')", i, KassenInfo[i][fName]);
mysql_tquery(handle, query);
failcount++;
}
else
{
cache_get_field_content(i-failcount-1, "Name", str);
format(KassenInfo[i][fName], 32, str);
KassenInfo[i][fGeld] = cache_get_field_content_int(i-failcount-1, "Geld");
KassenInfo[i][fDrogen] = cache_get_field_content_int(i-failcount-1, "Drogen");
KassenInfo[i][fWaffen] = cache_get_field_content_int(i-failcount-1, "Waffen");
}
}
return 1;
} -
Wenn du den Streamer verwendest am besten CreateDynamicObject.
CreateExplosion machst du per Timer einfach an der Position an der das Dynamit erstellt wird (wird ja immer die gleiche Position sein).
Also per Timer:
SetTimer("ExplodeDoor", 10000, false);forward ExplodeDoor();
public ExplodeDoor()
{
//Eben entsprechend ausfüllen, wie du es haben willst:
return CreateExplosion(xKoordinate, yKoordinate, zKoordinate, explosionsID, radius);
}Die Türe fliegt normalerweise nicht weg. Lösche die Türe und erstelle sie am Boden wieder, oder setze Sie mit MoveDynamicObject dort hin.
-
-
Ja, klar. Laut der Nachricht soll das beides mal das Modell sein.
Dann so:
if(GetVehicleModel(GetPlayerVehicleID(playerid)) != 488 && GetVehicleModel(GetPlayerVehicleID(playerid)) != 582)return SendClientMessage(playerid,COLOR_GREY,"** Du musst in einem News Van oder News Chopper sitzen."); -
zu &&Dann geht's.
-
-
Nein, du musst es als PlayerTextDraw erstellen, nicht als normales Textdraw.
Ändere die Funktionen jeweils zu der richtigen ab.
Zum Beispiel:
PlayerTextDrawFont(playerid, statsText[playerid], 1);Hier findest du alle, sowie ein Beispiel: http://wiki.sa-mp.com/wiki/CreatePlayerTextDraw
PS: Lass das mit den Vollzitaten bitte, das macht keinen Sinn. Danke

-
Das kannst du so aufbauen:
Unter den Includes:
new PlayerText:statsText[MAX_PLAYERS];Bei OnPlayerConnect:
statsText[playerid] = CreatePlayerTextDraw(...); //Das kannst du selbst erstellen
Zum Beispiel mit einem TextDraw Editor: http://forum.sa-mp.com/showthread.php?t=290640
Musst es dann eben auf PlayerTextDraws ändern.Und bei OnGameModeInit startest du einen Timer:
SetTimer("UpdateStatsText", 1000, true);Ganz unten im Gamemode:
forward UpdateStatsText();
public UpdateStatsText()
{
new str[64];
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i))
{
format(str, sizeof(str), "Geld: %d\nLevel: %d", GetPlayerMoney(i), GetPlayerScore(i));
PlayerTextDrawSetString(i, statsText[i], str);
}
}
return 1;
} -
Das kannst du hiermit abfragen:
http://wiki.sa-mp.com/wiki/GetPlayerMoneyDas Level wahrscheinlich mit
http://wiki.sa-mp.com/wiki/GetPlayerScore -
Da hat ein Komma gefehlt, siehste mal was das ausmacht.

So:
SaveVehicle(i)
{
if(i < 0 || i >= sizeof(VehInfo)) return 1;
new query[512];
mysql_format(handle, query, sizeof(query), "UPDATE Auto SET ModellID = '%d', Fraktion = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosR = '%f', Abgeschleppt = '%d', inADAC = '%d', Name = '%e', Grund = '%e', Preis = '%d', ",
VehInfo[i][ModellID], VehInfo[i][Fraktion], VehInfo[i][PosX], VehInfo[i][PosY],VehInfo[i][PosZ],VehInfo[i][PosR],VehInfo[i][Abgeschleppt],VehInfo[i][inADAC],VehInfo[i][Named],VehInfo[i][Grund],VehInfo[i][Preis]);
mysql_format(handle, query, sizeof(query), "%sNewX = '%f', NewY = '%f', NewZ = '%f', NewR = '%f', Farbe1 = '%d', Farbe2 = '%d' WHERE ID = '%d'",query,
VehInfo[i][NewX],VehInfo[i][NewY],VehInfo[i][NewZ],VehInfo[i][NewR],VehInfo[i][Farbe1],VehInfo[i][Farbe2],i);
mysql_tquery(handle, query);
printf("query: %s", query);
return 1;
}Dann sollten die Werte richtig in der Datenbank stehen.
-
Schalte bitte mal den MySQL Debug Modus an und poste dann was im MySQL Log steht, wenn du die Gang Zonen aus der Datenbank laden lässt.
Wie du das machst steht hier: Tipps: Scripting-Probleme richtig erklären (Kapitel 1.4) -
Könntest du den entsprechenden Code dazu posten?
Ohne Code können wir dir nicht helfen. -
Ok, schreibe den Befehl auf jeden Fall so:
ocmd:opark(playerid, params[])
{
new preis, grund[34],named[34], string[128];
GetPlayerName(playerid, named, sizeof(named));
new Float:NeuX,Float:NeuY,Float:NeuZ, Float:NeuR;
if(sscanf(params,"is",preis,grund))return SendClientMessage(playerid, Color_Green,"Benutzung: /opark [Preis][Grund]");
if(SpielerInfo[playerid][pTeam] != 5) return SendClientMessage(playerid, hinweis1,"Du bist kein Mitglied des ADAC's!");
if(isinADAC[playerid] != 1) return SendClientMessage(playerid, hinweis1, "Du bist nicht in der ADAC Zone!");
else if(preis < 0 || preis > 1000) return SendClientMessage(playerid, hinweis1,"Du kannst das Bußgeld nicht weniger als 0 und mehr als 1000 kosten lassen!");
{
new i = GetFrakVehicleIdx(GetPlayerVehicleID(playerid));
if(i == -1) return SendClientMessage(playerid, hinweis1, "Du bist nicht in einem abschleppbaren Auto!");
format(VehInfo[i][Grund], 32, grund);
format(VehInfo[i][Named], 32, named);
GetVehiclePos(GetPlayerVehicleID(playerid),NeuX,NeuY,NeuZ);
GetVehicleZAngle(GetPlayerVehicleID(playerid),NeuR);
VehInfo[i][Preis] = preis;
VehInfo[i][inADAC] = 1;
VehInfo[i][Abgeschleppt] = 1;
VehInfo[i][NewX] = NeuX;
VehInfo[i][NewY] = NeuY;
VehInfo[i][NewZ] = NeuZ;
VehInfo[i][NewR] = NeuR;
format(string, sizeof(string),"|Strafzettel| Preis %i€ Grund: %s",preis,grund);
SendClientMessage(playerid, Color_Green, string);
SaveVehicle(i);
}
return 1;
}Und füge beim SaveVehicle den print so hinzu:
SaveVehicle(i)
{
if(i < 0 || i >= sizeof(VehInfo)) return 1;
new query[512];
mysql_format(handle, query, sizeof(query), "UPDATE Auto SET ModellID = '%d', Fraktion = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosR = '%f', Abgeschleppt = '%d', inADAC = '%d', Name = '%e', Grund = '%e', Preis = '%d', ",
VehInfo[i][ModellID], VehInfo[i][Fraktion], VehInfo[i][PosX], VehInfo[i][PosY],VehInfo[i][PosZ],VehInfo[i][PosR],VehInfo[i][Abgeschleppt],VehInfo[i][inADAC],VehInfo[i][Named],VehInfo[i][Grund],VehInfo[i][Preis]);
mysql_format(handle, query, sizeof(query), "%sNewX = '%f', NewY = '%f', NewZ = '%f', NewR = '%f', Farbe1 = '%d', Farbe2 = '%d' WHERE ID = '%d'",query,
VehInfo[i][NewX],VehInfo[i][NewY],VehInfo[i][NewZ],VehInfo[i][NewR],VehInfo[i][Farbe1],VehInfo[i][Farbe2],i);
mysql_tquery(handle, query);
printf("query: %s", query);
return 1;
}Dann poste was im server_log.txt steht, wenn du das Fahrzeug oparkst.
Und ggf. das was im MySQL Log steht.ZitatVorhin war bei LoadVehicles_Data ID nicht definiert, ich hab es einfach so gemacht:
Oh ja, tatsächlich. Naja, ohne Compiler eben.
Aber passt, das hast du richtig erkannt und gemacht! -
Also, immerhin gut, dass das mit den Spielern jetzt wieder läuft.
Deine Funktionen sind mehr oder weniger ein Mix aus beiden Systemen geworden. Schreibe das speichern so:
SaveVehicle(i)
{
if(i < 0 || i >= sizeof(VehInfo)) return 1;
new query[512];
mysql_format(handle, query, sizeof(query), "UPDATE Auto SET ModellID = '%d' Fraktion = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosR = '%f', Abgeschleppt = '%d', inADAC = '%d', Name = '%e', Grund = '%e', Preis = '%d', ",
VehInfo[i][ModellID], VehInfo[i][Fraktion], VehInfo[i][PosX], VehInfo[i][PosY],VehInfo[i][PosZ],VehInfo[i][PosR],VehInfo[i][Abgeschleppt],VehInfo[i][inADAC],VehInfo[i][Named],VehInfo[i][Grund],VehInfo[i][Preis]);
mysql_format(handle, query, sizeof(query), "%sNewX = '%f', NewY = '%f', NewZ = '%f', NewR = '%f', Farbe1 = '%d', Farbe2 = '%d' WHERE ID = '%d'",query,
VehInfo[i][NewX],VehInfo[i][NewY],VehInfo[i][NewZ],VehInfo[i][NewR],VehInfo[i][Farbe1],VehInfo[i][Farbe2],i);
mysql_tquery(handle, query);
return 1;
}SaveVehicles()
{
for(new i=0; i < sizeof(VehInfo); i++) SaveVehicle(i);
return 1;
}
Je nach dem wann du die Fahrzeuge speichern lassen willst, musst du das eine oder das andere eben noch entsprechend aufrufen.Das Laden sieht so aus:
forward LoadVehicles();
public LoadVehicles()
{
mysql_tquery(handle, "SELECT * FROM Auto", "LoadVehicles_Data", "");
return 1;
}forward LoadVehicles_Data();
public LoadVehicles_Data()
{
new query[512], bool:added, missing, str[64], rows;
rows = cache_num_rows();
for(new i=0; i < sizeof(FrakAutos); i++)
{
if(i < rows) id = cache_get_field_content_int(i-missing, "ID");
else id = -1;
if(id != i)
{
mysql_format(handle, query, sizeof(query), "INSERT INTO Auto (ID, ModellID, PosX, PosY, PosZ, PosR, Farbe1, Farbe2, Fraktion) VALUES ('%d', '%d', '%f', '%f', '%f', '%f', '%d', '%d', '%d')", i,
FrakAutos[i][ModellID],FrakAutos[i][PosX],FrakAutos[i][PosY],FrakAutos[i][PosZ],FrakAutos[i][PosR],FrakAutos[i][Farbe1],FrakAutos[i][Farbe2],FrakAutos[i][Fraktionp]);
mysql_tquery(handle, query);
VehInfo[i][ModellID] = FrakAutos[i][ModellID];
VehInfo[i][Fraktion] = FrakAutos[i][Fraktionp];
VehInfo[i][PosX] = FrakAutos[i][PosX];
VehInfo[i][PosY] = FrakAutos[i][PosY];
VehInfo[i][PosZ] = FrakAutos[i][PosZ];
VehInfo[i][PosR] = FrakAutos[i][PosR];
VehInfo[i][Farbe1] = FrakAutos[i][Farbe1];
VehInfo[i][Farbe2] = FrakAutos[i][Farbe2];
missing++;
}
else
{
VehInfo[i][ModellID] = cache_get_field_content_int(i-missing, "ModellID");
VehInfo[i][Fraktion] = cache_get_field_content_int(i-missing, "Fraktion");
VehInfo[i][PosX] = cache_get_field_content_float(i-missing, "PosX");
VehInfo[i][PosY] = cache_get_field_content_float(i-missing, "PosY");
VehInfo[i][PosZ] = cache_get_field_content_float(i-missing, "PosZ");
VehInfo[i][PosR] = cache_get_field_content_float(i-missing, "PosR");
VehInfo[i][Abgeschleppt] = cache_get_field_content_int(i-missing, "Abgeschleppt");
VehInfo[i][inADAC] = cache_get_field_content_int(i-missing, "inADAC");
VehInfo[i][Preis] = cache_get_field_content_int(i-missing, "Preis");
cache_get_field_content(i-missing, "Grund", str);
format(VehInfo[i][Grund], 64, str);
cache_get_field_content(i-missing, "Name", str);
format(VehInfo[i][Named], 64, str);
VehInfo[i][NewX] = cache_get_field_content_float(i-missing, "NewX");
VehInfo[i][NewY] = cache_get_field_content_float(i-missing, "NewY");
VehInfo[i][NewZ] = cache_get_field_content_float(i-missing, "NewZ");
VehInfo[i][NewR] = cache_get_field_content_float(i-missing, "NewR");
VehInfo[i][Farbe1] = cache_get_field_content_int(i-missing, "Farbe1");
VehInfo[i][Farbe2] = cache_get_field_content_int(i-missing, "Farbe2");
}
if(VehInfo[i][Abgeschleppt] == 1)
{
VehInfo[i][veh_ID] = CreateVehicle(VehInfo[i][ModellID], VehInfo[i][NewX], VehInfo[i][NewY], VehInfo[i][NewZ], VehInfo[i][NewR], VehInfo[i][Farbe1], VehInfo[i][Farbe2], -1);
}
else
{
VehInfo[i][veh_ID] = CreateVehicle(VehInfo[i][ModellID], VehInfo[i][PosX], VehInfo[i][PosY], VehInfo[i][PosZ], VehInfo[i][PosR], VehInfo[i][Farbe1], VehInfo[i][Farbe2], -1);
}
}
return 1;
}Und bei OnGameModeInit steht:
LoadVehicles();Jetzt hab ich dir mehr als das halbe System geschrieben, ich hoffe, dass das keine Fehler beinhaltet, da ich es ja nicht kompilieren kann.
-
Ok, gut, dass du den print gleich gepostet hast!
Dann schreibe im LoadPlayer-Callback das hier:
cache_get_field_content(0, "Name", SpielerInfo[playerid][pName]);
um zu:
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(SpielerInfo[playerid][pName], MAX_PLAYER_NAME, name);Dann klappt das Speichern auch.