Hey Community,
ich habe ein MySql System und habe komischerweise bei einem Skript ein Problem.
Das Skript setzt einfach wie es will die Variablen um(?).
Hier sind mal die Stellen in denen ich die Variable "pInfo[*][pLevel]" setze bzw. benutze:
public OnPlayerConnect(playerid) {
// ...
for(new i; pInfo_e:i < pInfo_e; ++i) { pInfo[playerid][pInfo_e:i] = 0; }
// ...
}
public Account_Load(playerid) {
// ....
mysql_get_field("money", data); pInfo[playerid][pMoney] = strval(data);
mysql_get_field("level", data); pInfo[playerid][pLevel] = strval(data);
printf("[debug] %d > %d (1)", strval(data), pInfo[playerid][pLevel]); // Ausgabe: [debug] 0 > 0 (1)
mysql_get_field("ep", data); pInfo[playerid][pEp] = strval(data);
// ...
}
// ....
mysql_get_field("money", data); pInfo[playerid][pMoney] = strval(data);
mysql_get_field("level", data); pInfo[playerid][pLevel] = strval(data);
printf("[debug] %d > %d (1)", strval(data), pInfo[playerid][pLevel]); // Ausgabe: [debug] 0 > 0 (1)
mysql_get_field("ep", data); pInfo[playerid][pEp] = strval(data);
// ...
}
public Account_Save(playerid) {
// ...
printf("%d", pInfo[playerid][pLevel]); // Ausgabe: 0
format(qry,sizeof qry, "UPDATE `game_accs` SET `money` = '%d', `level` = '%d', `ep` = '%d' WHERE `ID` = '%d';", pInfo[playerid][pMoney], pInfo[playerid][pLevel], pInfo[playerid][pEp], pInfo[playerid][pID]); // gekürzt, da die anderen Werte unwichtig & komischerweise richtig sind.
printf("[debug] Query: %s (2)", qry); // Ausgabe: UPDATE `game_accounts` SET `money` = '5000', `level` = '0', `ep` = '0' WHERE `ID` = '1'; (2) (stimmt soweit alles soweit alles gut)
// ...
}
// ...
printf("%d", pInfo[playerid][pLevel]); // Ausgabe: 0
format(qry,sizeof qry, "UPDATE `game_accs` SET `money` = '%d', `level` = '%d', `ep` = '%d' WHERE `ID` = '%d';", pInfo[playerid][pMoney], pInfo[playerid][pLevel], pInfo[playerid][pEp], pInfo[playerid][pID]); // gekürzt, da die anderen Werte unwichtig & komischerweise richtig sind.
printf("[debug] Query: %s (2)", qry); // Ausgabe: UPDATE `game_accounts` SET `money` = '5000', `level` = '0', `ep` = '0' WHERE `ID` = '1'; (2) (stimmt soweit alles soweit alles gut)
// ...
}
// ...
format(string,sizeof string,"%s~n~Level %d (%d Ep)", Player_GetRang(playerid), pInfo[playerid][pLevel], pInfo[playerid][pEp]); // Ausgabe: Rang~n~Level 0 (0 Ep) (stimmt auch noch)
PlayerTextDrawSetString(playerid, StatsBoxLeft[playerid], string);
SetPlayerScore(playerid, pInfo[playerid][pLevel]); // stimmt
// ...
format(string,sizeof string,"%s~n~Level %d (%d Ep)", Player_GetRang(playerid), pInfo[playerid][pLevel], pInfo[playerid][pEp]); // Ausgabe: Rang~n~Level 0 (0 Ep) (stimmt auch noch)
PlayerTextDrawSetString(playerid, StatsBoxLeft[playerid], string);
SetPlayerScore(playerid, pInfo[playerid][pLevel]); // stimmt
// ...
Hier nochmal die Logs von MySql, damit man auch sieht dass es richtig gespeichert sowie geladen wird:
Code
// ------------------------ Vorher// Laden[22:31:49] >> mysql_fetch_field_row( Connection handle: 1 )[22:31:49] CMySQLHandler::FetchField("money") - 5000// Speichern:[22:31:53] CMySQLHandler::Query(UPDATE `game_accs` SET `money` = '5000', `level` = '0', `ep` = '0' WHERE `ID` = '1';) - Successfully executed.// ------------------------ Nachher// Laden:[22:32:06] >> mysql_fetch_field_row( Connection handle: 1 )[22:32:06] CMySQLHandler::FetchField("money") - 5000 // man sieht es stimmt// Speichern: [22:36:45] CMySQLHandler::Query(UPDATE `game_accs` SET `money` = '100', `level` = '101', `ep` = '67' WHERE `ID` = '1';) - Successfully executed.// Nach einer weile im Spiel (weiss nicht genau welche Aktionen...) setzen sich diese Werte schon um. o.O// Geld, Level sowie Ep wurden einfach umgesetzt (gleiche gilt für eine weitere Variable (die z.B. nie benutzt wurde(?)))
Es sind immer die Werte 100, 101, 67 und beim letzten Wert ist es 32.
Da es echt ziemlich zufällig ist (vielleicht gibt es doch eine Aktion die man machen muss), weiss ich nicht genau wo der Fehler entstehen soll,
außer da wo ich die Variable(n) benutzt habe.
Es muss ja etwas mit dem Speichern zu tun haben, allerdings finde ich da überhaupt keinen Fehler.
Ich habe nochmal in der Tabelle geschaut, es sind alle Werte auf "int(11)" eingestellt.
Crashdetect spuckt auch nichts raus, also ein Fehler vom Skript ist es ja anscheinend nicht.
PS: Wer sich davon selbst überzeugen will kann mir eine PN schreiben, dann gebe ich euch die IP vom Testserver.
// Edit: eine Zeile vergessen
// Edit 2: Fehler gefunden
if ( ortModus == 20 ) { ortModus = 0; format(pInfo[playerid][pArea], 64, GetAreaName(x,y,z)); }
ortModus ++;
pArea war kein String, sondern ein Integer aber trotzdem wurde das richtige Gebiet angezeigt und es kam kein Fehler beim Compilieren, merkwürdig.