SetVehicleNumberPlate(car,SERVERTAG);
Beiträge von Jeffry
-
-
kein Objekt
Du könntest es mit Model ID 19300 versuchen.
nicht verschwindet wenn ein Spieler durch fährt etc
Wenn es im Fahrzeug pickup-bar sein soll wird es schwierig, das kann wohl nur der Typ 14, der verschwindet aber.
Du könntest es natürlich direkt nach dem Pickup einmal destroyen und wieder erstellen.
https://wiki.sa-mp.com/wiki/PickupTypes -
Das sollte eigentlich kein Problem sein und auch keine Lags erzeugen, sind ja nur interne Funktionen und ein IsPlayerInRangeOfPoint Aufruf.
Wobei, warum willst du es eigentlich nicht mit Pickups machen?
-
Kann man das anders erstellen ohne das da ein Pickup geladen wird oder ein Objekt?
Kannst du grundsätzlich schon machen, zum Beispiel mit einem Timer oder unter OnPlayerUpdate.
Wenn es nicht allzuviele Plätze sind, dann ist das kein Problem. Die Plätze speicherst du in einem globalen Array.Und das er es nur kriegt wenn er genau auf dieser Position ist und nicht mit einem Sphere beispiel von nen umkreis 5 meter?
Einen kleinen Umkreis musst du allerdings machen, da man nie exakt eine Position trifft. IsPlayerInRangeOfPoint mit z.B. 1m Umkreis.
Das Problem ist wenn 2 Spieler gleichzeit durch dieses Nitro fahren kriegt nur einer es.
Das passiert bei Timer/OnPlayerUpdate nicht.
-
Und wie wandel ich einen unix timestamp in einen lesbaren Wert um ? (statt 12351403018 halt ein normales datum im Format DD/MM/YYYY)
Der einfachste Weg ist folgende kleine Include: https://forum.sa-mp.com/showthread.php?t=347605
Bitte den Hinweis auf der letzten Seite (Seitevon mir beachten und einbauen.
habe nur .amx Files aber die wurden anscheinend mit einer älteren Streamer Version compiliert aber möchte diese mit der neuen Streamer Version auf dem Server abspielen, gibt es da Möglichkeiten?
Das geht nicht, der Code muss mit der zum Plugin passenden Include kompiliert werden, da sich die Funktionen zum Teil unterscheiden.
-
Hi, also jetzt wird der Ausgang einfach in eine neue ShopID eingetragen,
Da du zwei mal ein INSERT Query nutzt, werden zwei Datensätze eingetragen.
Nutze beim zweiten Befehl ein UPDATE Query mit WHERE Bedingung = der Shop ID. -
Noch ein Hinweis:
Gebe bei getFreeShopID nicht 0 zurück, falls kein Shop gefunden wird, sondern -1, weil der erste Index ja die 0 ist, somit würde der erste Shop überschrieben werden, wenn alle Shops voll sind.
Also dort, return -1.Und dann
new id = getFreeShopID();
Danach:
if(id == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Maximale Anzahl an Shops erreicht.");Außerdem ist noch ein Fehler in OnShopsLoad drin. Nutze dort bei den Cache Funktionen nicht 0 als ersten Parameter sondern i, sonst lädst du immer nur den ersten Shop.
-
Ja, so kannst du es machen.
Dann sieht der Code so aus:
forward LoadPlayerCars(playerid);
public LoadPlayerCars(playerid)
{
new rows;
cache_get_row_count(rows);
for(new i = 0; i < rows; i++)
{
cache_get_value_name_int(i, "dbID", PCar[playerid][i][P_dbID]); //Nutze dbID! Habe es geändert.
cache_get_value_name_float(i,"P_X",PCar[playerid][i][P_X]);
cache_get_value_name_float(i,"P_Y",PCar[playerid][i][P_Y]);
cache_get_value_name_float(i,"P_Z",PCar[playerid][i][P_Z]);
cache_get_value_name_float(i,"p_R",PCar[playerid][i][P_R]);
cache_get_value_name_int(i,"P_C1",PCar[playerid][i][P_C1]);
cache_get_value_name_int(i,"P_C2",PCar[playerid][i][P_C2]);
cache_get_value_name_int(i,"P_MID",PCar[playerid][i][P_MID]);
PCar[playerid][i][P_VID] = CreateVehicle(PCar[playerid][i][P_MID],PCar[playerid][i][P_X] , PCar[playerid][i][P_Y], PCar[playerid][i][P_Z], PCar[playerid][i][P_R], PCar[playerid][i][P_C1], PCar[playerid][i][P_C2], -1);
}
return 1;
}Und das Query (z.B. nach erfolgreichem Login):
mysql_format(handle, query, sizeof(query), "SELECT * FROM playercars WHERE P_uID = '%d'", pInfo[playerid][db_id]);
mysql_pquery(handle, query, "LoadPlayerCars", "d", playerid);
playercars = Tabellenname. Eventuell anpassen. -
Du bringst das alles durcheinander.
Wenn du die P_dbID als Auto Increment hast, dann darfst du dieser natürlich nicht die db_id des Spielers zuweisen, sondern musst dafür, wie bereits gesagt, eine neue Spalte anlegen, zum Beispiel P_BesitzerID. Und dann auch dieser Variable die db_id zuweisen.
Wie schon vorhin gesagt, du musst wissen, wofür die Variablen stehen. Wenn dir das nicht klar ist, benenne dieser sprechender, anstatt nur mit xID. Durcheinander bringen darfst du die Werte und Variablen nicht, sonst klappt es nicht und du verstehst es auch nicht.
Diese Sache mit SELECT ist mir halt ein großes Rätzel was ich ja nicht verstehe.
SELECT * FROM tabelle WHERE P_BesitzerID = %d
Das geht aber wie gesagt nur, wenn du auch eine Spalte für den Besitzer hast, was du ja bisher noch nicht gemacht hast.
-
Doch, ich habe das in Post #33 auch aufgeführt, das hast du aber bisher noch nicht gemacht.
Dort fehlt noch die Zuordnung zu dem das Fahrzeug gehört.
Wenn du eine "user" Tabelle hast, dann bietet es sich an, dass du die ID des Spielers in dieser Fahrzeug-Tabelle als "Besitzer-ID" einträgst.
Das Fahrzeug muss dem Spieler ja auch zugeordnet werden, woher soll man aus der Datenbank heraus sonst wissen, wem es gehört?Außerdem hast du die Anpassung mit P_ID und P_dbID noch nicht gemacht. In deinem Lade-Code steht nämlich immernoch die P_ID drin.
Du musst schon die Dinge machen, die ich dir sage, sonst reden wir aneinander vorbei, da ich von Dingen ausgehe, die du gar nicht hast.
-
Habe dazu keine Datenabfrage dachte das wäre das mit dem
Das brauchst du aber, sonst weiß der Code ja nicht, was er aus der Datenbank laden soll.
SELECT Query -> mysql_pquery und darüber das Callback aufrufen.
-
beschreibe das Problem genau,
Und
poste den Code
Dazu gehört auch das Query, welches ein Callback aufruft und bestenfalls ein Screenshot aus der Datenbank.
So kann niemand irgendetwas damit anfangen.
-
Alles läuft, nur verstehe ich ja nicht die Sache mit P_ID. Die ist ja nur -1, die brauch ich ja nicht oder?
Die brauchst du nicht, du hast ja dafür "P_dbID" erstellt.
Entferne diese aus der Tabelle und auch aus deinem Code. Achte aber darauf, an den entsprechenden Stellen das P_ID zu P_dbID zu ändern, sonst gibt es wieder Probleme.Teste anschließend dein System einmal komplett durch und prüfe nach jedem Schritt die Werte in der Datenbank.
Autokauf -> Speichern -> Parken -> Server verlassen -> Server betreten -> Auto laden -> etc (was du sonst noch hast).
Geht das alles ohne Probleme?Wenn ja, dann können wir mit dem "Löschen" weitermachen, dazu musst du aber erklären, was das machen soll und wann es das machen soll.
Wenn nein, poste den Code und beschreibe das Problem genau, welches auftritt. -
Dann musst du dort P_dbID schreiben, wenn du dort diese Variable nutzt.
Wofür deine Variablen stehen, musst du wissen.Zwecks der Meldung:
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) SendClientMessage(playerid,-1,"{c45461}Du bist kein Fahrer eines Fahrzeugs.");
zu:
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid,-1,"{c45461}Du bist kein Fahrer eines Fahrzeugs.");Zu dem Code:
Nein. Mache bitte erst mal das eine fertig, bevor du parallel noch etwas anfängst. Dann kommt nur alles durcheinander und es treten Folgefehler bzw. abhängige Fehler in anderen Code-Abschnitten auf, wenn wir hier kreuz und quer Anpassungen machen. -
AttachTrailerToVehicle(GetVehicleTrailer(vehicleid), vehicleid);
Das musst du entfernen, du willst den Anhänger ja nicht nochmal anhängen.
Wenn ein Fehler im Compiler auftritt, poste diesen.
-
Also so richtig, wie ich verstanden habe dbid ist Auto increment
So sieht es gut aus.
Ich meinte mit der Frage das P_ID als -1 nach dem Kauf gespeichert wird warum das so ist?
Wofür steht P_ID und wie setzt du den Wert?
-
Du versuchst dich auf eine externe Datenbank zu verbinden, sprich auf einem anderen Server als der mit dem SAMP Server?
Sonst nutze localhost oder 127.0.0.1.
-
So?
Du hast nur das P_ID aufgenommen und sonst nichts. Damit ist die WHERE Bedingung leer, das passt nicht.
In der Datenbank wird P_ID als -1 gespeichert das ist so nicht richtig oder? (Nach dem Autohauskauf)
Die ID mit Auto Increment wird benötigt. Diese muss in der WHERE Bedingung stehen und muss beim Kauf mit cache_insert_id gelesen werden, das hatten wir zuvor ja schon.
-
Der Code wird um z.B. 4 Uhr gar nichts machen, passt also nicht ganz.
Daher:
new h, m, s;
gettime(h, m, s);
if((h < 6) || (h > 21) || (h == 21 && m >= 30))
{
//Bank geschlossen
}
else
{
//Bank geöffnet
} -
Da müsste der Code meines Erachtens nach so aussehen:
ocmd:parken(playerid,params[])
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) SendClientMessage(playerid,-1,"{c45461}Du bist kein Fahrer eines Fahrzeugs.");
new Float:x,Float:y,Float:z,Float:r,v;
v = GetPlayerVehicleID(playerid);
GetVehiclePos(v,x,y,z); //Nicht GetPlayerPos
GetVehicleZAngle(v,r);
for(new d = 0; d < sizeof(PCar[]); d++)
{
if(PCar[playerid][d][P_VID] == v) //In der Schleife abfragen, in welchem Fahrzeug der Spieler ist. Abfrage auf seine Fahrzeuge, nicht auf die Autohausfahrzeuge
{
PCar[playerid][d][P_X] = x;
PCar[playerid][d][P_Y] = y;
PCar[playerid][d][P_Z] = z;
PCar[playerid][d][P_R] = r;
new q[256];
//Das Query muss UPDATE nutzen, nicht INSERT. Das Fahrzeug existiert in der Datenbank ja schon.
mysql_format(db, q, sizeof(q), "UPDATE personalcars SET P_X = '%f', P_Y = '%f', P_Z = '%f', P_R = '%f' WHERE id = '%d'",PCar[playerid][d][P_X],PCar[playerid][d][P_Y],PCar[playerid][d][P_Z],PCar[playerid][d][P_R],PCar[playerid][d][P_ID]);
mysql_pquery(db,q);
SendClientMessage(playerid,-1,"{c45461}Fahrzeug erfolgreich geparkt.");
return 1; //Um die Schleife und den Befehl zu beenden, damit untenstehende Nachricht nicht gesendet wird
}
}
//Wird nur ausgegeben, wenn kein Fahrzeug des Spielers.
SendClientMessage(playerid,-1,"{c45461}Du hast keinen Autoschlüssel für dieses Fahrzeug und kannst es nicht parken.");
return 1;
}Das ganze mit den Autohausauto-Arrays macht keinen Sinn, da das Fahrzeug ja bereits gekauft ist und nicht mehr im Autohaus steht. Daher darfst du darauf auch nicht mehr abfragen, sondern musst das Array des Spielers prüfen.
Passe das UPDATE Query bitte so an, wie deine Variablen und Spaltennamen heißen.
Im Code habe ich noch Erklärungen hinzugefügt.