Muss ich das floatdiv nutzen? -> vehTankVerbrauch wird als Float:vehTankVerbrauch definiert.
Und vehFuel ist auch ein Float?
Wenn ja, dann evtl mal so schreiben:
Vehicle[i][vehFuel] -= floatdiv(Vehicle[i][vehTankVerbrauch], 1000.0);
Muss ich das floatdiv nutzen? -> vehTankVerbrauch wird als Float:vehTankVerbrauch definiert.
Und vehFuel ist auch ein Float?
Wenn ja, dann evtl mal so schreiben:
Vehicle[i][vehFuel] -= floatdiv(Vehicle[i][vehTankVerbrauch], 1000.0);
Inwiefern lässt sich das irgendwo noch einsetzen.
Ich meine, könnte ich z.B anstatt if(!strlen(string)) auch if(string[0] == EOS) einsetzen? Und inwiefern macht das dann auch Sinn? Dann könnte ich ja auch if(!string[0]) einsetzen oder nicht?
Wo lässt sich EOS wo verwenden?
Alles korrekt.
Das prüft quasi nur, ob das erste Zeichen im String das NULL Zeichen ist und wenn dem so ist, dann ist der String leer. Das ist einfach nur etwas schneller und performanter, als strlen zu nutzen ![]()
Ein krass ausführliches Tutorial zu Strings gibt es hier: https://forum.sa-mp.com/showthread.php?t=654471
Wie LeonMrBonnie schon korrekt erklärt hat ist das % Zeichen der Modulo Operator: https://de.wikipedia.org/wiki/Division_mit_Rest
Naja, man es kann aber sicherlich einrichten, das sobald einmal auf Weiter geklickt wurde, der Schließen Button als Zurück benutzt werden kann.
Natürlich, ich wollte dich lediglich darauf hinweisen, dass das bei diesem System (deinem Grundsystem) nicht vorhanden war/ist.
Probiere es mal so (nicht getestet):
case PLAYER_QUERY_PPROTOCOL:
{
if(!rows) return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
new str[1024] = "Datum\tUhrzeit\tInhalt\n",end = GetPVarInt(playerid,"ProtocolEnd"),btnA[32] = "Schließen",btnB[32]="";
for(new i,date[11],time[9],data[128]; i<rows; i++)
{
cache_get_value_name(i, "Datum", date, sizeof(date)),
cache_get_value_name(i, "Uhrzeit", time, sizeof(time)),
cache_get_value_name(i, "Inhalt", data, sizeof(data));
if(data[0] != EOS) format(str, sizeof str, "%s%s\t%s\t%s\n", str, date, time, data);
}
if(end != 0) btnA = "Zurück",SetPVarInt(playerid,"ProtocolBtnA",1);
if(rows%10 == 0) btnB = "Weiter",SetPVarInt(playerid,"ProtocolBtnB",1);
else if(end != 0) btnB = "Schließen",SetPVarInt(playerid,"ProtocolBtnB",2);
ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, btnA, btnB);
}
case D_PP:
{
new end = GetPVarInt(playerid,"ProtocolEnd"),btnA = GetPVarInt(playerid,"ProtocolBtnA"),btnB = GetPVarInt(playerid,"ProtocolBtnB");
DeletePVar(playerid,"ProtocolEnd"),DeletePVar(playerid,"ProtocolBtnA"),DeletePVar(playerid,"ProtocolBtnB");
if(response) //Left Button
{
switch(btnA)
{
case 0: DeletePVar(playerid,"ProtocolName"),SCM(playerid,COLOR_GREY,"Fenster geschlossen.");
case 1: ShowPlayerProtocol(playerid,end-10);
}
}
else
{
switch(btnB)
{
case 1: ShowPlayerProtocol(playerid,end+10);
case 2: DeletePVar(playerid,"ProtocolName"),SCM(playerid,COLOR_GREY,"Fenster geschlossen.");
}
}
}
Alles anzeigen
Naja der Tankverbrauch ist ja bei jeden Fahrzeug verscheiden ist schon etwas seltsam wen ich da alles umändern muss.
Musst du doch nicht.
Ich habe dir doch die Formel gegeben:
Vehicle[i][vehFuel] -= floatdiv(Vehicle[i][Verbrauch], 1000);
Egal was der Verbrauch ist (solange du ihn in L auf 100km angibst) wird der so umgerechnet, dass alle 100m das richtige abgezogen wird.
Das Ding ist halt, wenn ich eine oder mehrere Seiten zurück gehe, schließt er und sagt dass nichts mehr sei.
Ich habe keine Ahnung, was du meinst.
Aber dir ist klar, es gibt nur 2 Buttons.
Entweder Schließen oder Weiter. Es gibt kein zurück ![]()
Vehicle[i][vehKMStand] += 0.1;
Das ist Zeile 15, da hat er also 100m zurückgelegt, da kannst du also Ansetzen mit dem Abziehen:
Das ist einfacher Dreisatz:
100km = 13.1L
1km = 0.131L
//Ergo
1000m = 0.131L
100m = 0.0131L (oder eben 13.1ml)
Wir gehen also davon aus, dass Vehicle[i][Verbrauch] = 13.1 ist.
Dann könntest du das in Zeile 16 z.B. einfach so abziehen:
Vehicle[i][vehFuel] -= floatdiv(Vehicle[i][Verbrauch], 1000);
Dann würde er alle 100m 13.1ml verbrauchen.
Wenn das nicht zu frequentiert ist, einfach auf 50 oder 10m gehen.
Einfach mit dem Dreisatz umrechnen ![]()
Dann teste mal aus Spaß if(!response) das tauscht die Funktion der Buttons ![]()
Wie sieht dein Code denn unter OnDialogResponse aus? ![]()
Dann setze mal prints und schau, wo er sich aufhängt :o
Und aktivier evtl mal den Mysql Log
//Edit:
Habe es mal bei mir lokal getestet und es funzt einwandfrei.
Bekomme keine Fehler oder dergleichen und habe exakt deine Datenstruktur gewählt.
Das war der Code, den ich verwendet habe:
ocmd:pp(playerid, params[])
{
if(pInfo[playerid][pAdmin] < 6)return 1;
if(IsNull(params))return SCM(playerid, COLOR_GREY, "Befehl: /pp [Name]");
SetPVarString(playerid,"ProtocolName",params);
ShowPlayerProtocol(playerid,0);
return 1;
}
case PLAYER_QUERY_PPROTOCOL:
{
if(!rows) return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
new str[1024] = "Datum\tUhrzeit\tInhalt\n";
for(new i,date[11],time[9],data[128]; i<rows; i++)
{
cache_get_value_name(i, "Datum", date, sizeof(date)),
cache_get_value_name(i, "Uhrzeit", time, sizeof(time)),
cache_get_value_name(i, "Inhalt", data, sizeof(data));
if(data[0] != EOS) format(str, sizeof str, "%s%s\t%s\t%s\n", str, date, time, data);
}
ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", ((rows%10 == 0)?("Weiter"):("")));
}
case D_PP:
{
new end = GetPVarInt(playerid,"ProtocolEnd");
DeletePVar(playerid,"ProtocolEnd");
if(response) return DeletePVar(playerid,"ProtocolName"), SCM(playerid, COLOR_GREY, "Du hast entweder das Fenster geschlossen oder es sind keine weiteren Einträge vorhanden!");
ShowPlayerProtocol(playerid,end+10);
}
stock ShowPlayerProtocol(playerid,start)
{
new query[64 + MAX_PLAYER_NAME];
GetPVarString(playerid,"ProtocolName",query,MAX_PLAYER_NAME);
mysql_format(handle, query, sizeof query, "SELECT * FROM playerprotocol WHERE Name='%e' LIMIT %d,10", query,start),
mysql_pquery(handle, query, "PlayerQuery", "d", PLAYER_QUERY_PPROTOCOL);
return SetPVarInt(playerid, "ProtocolEnd", start),1;
}
Alles anzeigen
Aber mir ist schleierhaft wie du die playerid an das PlayerQuery übergibst (Zeile 36)
und wie fragst du die rows ab?
Ich kenne halt nicht all deinen Code.
An dem Stück Code liegt der Fehler zumindest nicht ![]()
Hmmm, dann schreib es mal so:
case PLAYER_QUERY_PPROTOCOL:
{
if(!rows) return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
SetPVarInt(playerid,"ProtocolRows",rows);
new str[2000] = "Datum\tUhrzeit\tInhalt\n";
for(new i,date[11],time[9],data[512]; i<rows; i++)
{
cache_get_value_name(i, "Datum", date, sizeof(date)),
cache_get_value_name(i, "Uhrzeit", time, sizeof(time)),
cache_get_value_name(i, "Inhalt", data, sizeof(data));
if(data[0] != EOS) format(str, sizeof str, "%s%s\t%s\t%s\n", str, date, time, data);
}
ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", ((rows%10 == 0)?("Weiter"):("")));
}
Alles anzeigen
Ich bin mir ziemlich sicher, dass es ein Größen Problem ist.
Mach mal das else eine Zeile drunter.
Der Fehler ist es darf zwischen einem if und einem else kein Statement stehen.
Sprich:
//Das okay
if(a) {...bla}
else {...bla}
//Das nicht okay
if(a) {...bla}
Funktion();
else {...bla} //Weil worauf bezieht sich jetzt das else?!
Also so schreiben:
public OnGameModeInit()
{
SetGameModeText("The new Generation of Roleplay!");
mysql_log(LOG_ALL);
Handle=mysql_connect(mysql_host, mysql_user, mysql_data, mysql_pass);
if(mysql_errno() < 1) print(">> [MYSQL]: Die Verbindung zur Datenbank wurde erfolgreich hergestellt.");
else print(">> [MYSQL]: Die Verbindung zur Datenbank konnte NICHT erfolreich hergestellt werden. Der Server wird nun heruntergefahren."),
SendRconCommand("exit");
return 1;
}
Alles anzeigen
Ahhh du speicherst die Sekunden ![]()
Daran habe ich nicht gedacht, schreibe mal den Mittleren Teil so:
case PLAYER_QUERY_PPROTOCOL:
{
if(!rows) return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
SetPVarInt(playerid,"ProtocolRows",rows);
new str[(128+11+9)*10] = "Datum\tUhrzeit\tInhalt\n";
for(new i,date[11],time[9],data[128]; i<rows; i++)
{
cache_get_value_name(i, "Datum", date, sizeof(date)),
cache_get_value_name(i, "Uhrzeit", time, sizeof(time)),
cache_get_value_name(i, "Inhalt", data, sizeof(data));
if(data[0] != EOS) format(str, sizeof str, "%s%s\t%s\t%s\n", str, date, time, data);
}
ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", ((rows%10 == 0)?("Weiter"):("")));
}
Alles anzeigen
Pack mal crashdetect rein und zeig mal deine Tabellen Struktur ![]()
Und hast du mal Beispieldaten? Also mich interessiert die Länge der einzelnen Felder...
//Edit:
PS: Zeile 21 mal so schreiben:
ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", ((rows%10 == 0)?("Weiter"):("")));
Geht sowas noch ?
Die Frage ist doch eher, sollte es so gemacht werden?
Und die Antwort ist ganz klar nein.
Das hat seine Gründe, wieso diese Asynchronität eingeführt wurde.
Natürlich muss man jetzt etwas umdenken, weil man es davor gewohnt war synchron zu arbeiten.
Du brauchst den Wert nicht, du kannst einfach den Code, der danach kommt in den Callback packen und ihn da weiter ausführen lassen.
Und dort quasi den Wert verarbeiten lassen.
//Code von Kasakow
new query[41 + MAX_PLAYER_NAME];
mysql_format(handle, query, sizeof(query), "SELECT `ID` FROM `Accounts` WHERE `Name` = '%e'", Name),
mysql_pquery(handle, query, "Callback", "d", playerid);
forward Callback(playerid); //Kann beliebig umbenannt werden
public Callback(playerid)
{
new rows;
cache_get_row_count(rows);
if(rows == 0)
{
//Hier der Code Weiter, wenn nicht
}
else
{
//Hier der Code Weiter wenn doch :D
}
}
Alles anzeigen
Danke aber hast du vielleicht noch ein paar Tipps, wo ich mehr darüber lernen kann, etc.
Auch wenn es blöd klingt aber irgendwie finde ich nicht viel dazu.
Hmmmm...learning by doing ![]()
Einfach leicht anfangen, mit ein paar Keras Beispielen, etwas abändern und spielen, schauen was was macht.
Vllt fällt dir auch TensorFlow JS leichter? Gibt glaube ich auch gute Tutorials von "The Coding Train" ![]()
@Talykos Jetzt übertreiben wir mal nicht, zumal new query[MAX_PLAYERS_NAME+1]; das auch nicht geht, da der Rest des Querys ja noch drum rum muss.
ProtocolRead[P_MAX][600][3]
Das frisst deine Ressourcen.
Lösche es, du kannst das alles schöner schreiben.
Versuche es mal so:
ocmd:pp(playerid, params[])
{
if(pInfo[playerid][pAdmin] < 6)return 1;
if(IsNull(params))return SCM(playerid, COLOR_GREY, "Befehl: /pp [Name]");
SetPVarString(playerid,"ProtocolName",params);
ShowPlayerProtocol(playerid,0);
return 1;
}
case PLAYER_QUERY_PPROTOCOL:
{
if(!rows) return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
SetPVarInt(playerid,"ProtocolRows",rows);
new str[(128+11+6)*10] = "Datum\tUhrzeit\tInhalt\n";
for(new i,date[11],time[6],data[128]; i<rows; i++)
{
cache_get_value_name(i, "Datum", date, sizeof(date)),
cache_get_value_name(i, "Uhrzeit", time, sizeof(time)),
cache_get_value_name(i, "Inhalt", data, sizeof(data));
if(data[0] != EOS) format(str, sizeof str, "%s%s\t%s\t%s\n", str, date, time, data);
}
ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", "");
}
case D_PP:
{
new step = GetPVarInt(playerid, "ProtocolRows"), end = GetPVarInt(playerid,"ProtocolEnd");
DeletePVar(playerid,"ProtocolRows"),DeletePVar(playerid,"ProtocolEnd");
if(!response || listitem || step%10 != 0)
{
DeletePVar(playerid,"ProtocolName");
return SCM(playerid, COLOR_GREY, "Du hast entweder das Fenster geschlossen oder es sind keine weiteren Einträge vorhanden!");
}
ShowPlayerProtocol(playerid,end+10);
}
stock ShowPlayerProtocol(playerid,start)
{
new query[64 + MAX_PLAYER_NAME];
GetPVarString(playerid,"ProtocolName",query,MAX_PLAYER_NAME);
mysql_format(handle, query, sizeof query, "SELECT * FROM playerprotocol WHERE Name='%e' LIMIT %d,10", query,start),
mysql_pquery(handle, query, "PlayerQuery", "d", PLAYER_QUERY_PPROTOCOL);
return SetPVarInt(playerid, "ProtocolEnd", start),1;
}
Alles anzeigen
Das scheint mir ein eleganter Weg zu sein! ![]()
Schlaf schön ![]()
Mal 2 ganz blöde Fragen.
habe diesen Kurs gefunden
"gefunden" du meinst wohl, du wurdest bei jedem YouTube Video mit dieser dummen Werbung belästigt.
Also ich rate dir davon ab.
Das Andere sieht doch ganz gut aus, der erklärt viel, wenn du es etwas peppiger haben magst empfehle ich dir Siraj Raval ![]()
Ansonsten ist das schon mal ein guter Einstieg in die Thematik ![]()
format(string, sizeof(string), "{2C140F}LyD {050E2B}- %d", Vehicle[pTaxifahrer[i]][vehID]);
Ich rate einfach mal ins Blaue @Kasakow hat da schon ganz recht mit seiner Aussage.
Schreib es mal so:
format(string, sizeof(string), "{2C140F}LyD {050E2B}- %d", pTaxifahrer[i]);
Ehhh offensichtlich gibt es keine Variable LSFlugzeuge? ![]()
Vllt n Tippfehler oder so ![]()