Hallo. Ich hab gedacht ich versuch mich mal an einem eigenen Script für SA. Aber so langsam bin ich am verzweifeln.
naja, ich hab ein enum erstellt welches ja die daten bekommen soll:
enum PlayerData
{
pUserID,
pName[MAX_PLAYER_NAME],
pSkin,
pMoney,
pPass[34],
Float: pPosX,
Float: pPosY,
Float: pPosZ,
Float: pPosA,
Float: pHealth,
Float: pArmour,
pLevel,
pIP[16],
pPlaytime,
pSpeedo,
pLastLogin
};
new pUserData[MAX_PLAYERS][PlayerData];
Alles anzeigen
in einem Stock hole ich die daten aus der Datenbank:
new EscapedName[MAX_PLAYER_NAME];
mysql_real_escape_string(GetName(playerid), EscapedName);
format(Query, sizeof(Query), "SELECT * FROM `user_info` WHERE `username` = '%s'", EscapedName);
mysql_query(Query);
mysql_store_result();
// Die Daten werden zwar mit print() in der Konsole ausgegeben, kommen aber nicht im Enum an
mysql_fetch_row_format(Query, "|");
print(Query);
sscanf(Query, "e<p<|>ds[45]dds[34]ffffddds[16]ddd>",pUserData[playerid]);
Alles anzeigen
der stock wird in OnDialogResponse aufgerufen, nachdem das Password überprüft wurde.
in der Konsole kann ich die Testausgabe aus dem Stock sehen.
dort kommt sowas an:
1|Testuser|170|200|5aae391f8b738903e41c0c0a8cd3a028|-2121.839400|1199.909200|11.281400|273.644400|100.000000|100.000000|5|0|22|1|0
das OnDialogResponse wird wieder über einen Stock aufgerufen
stock InitPlayerConnection(playerid)
{
format(Query, sizeof(Query), "SELECT * FROM `user_info` WHERE `userName` = '%s'", GetName(playerid));
mysql_query(Query);
mysql_store_result();
if(mysql_num_rows() >= 1) // hat der user einen ingame Acc dann hier weiter, PW abfragen
{
mysql_free_result();
new plrIP[16];
GetPlayerIp(playerid, plrIP, sizeof(plrIP));
format(Query, sizeof(Query), "SELECT userIP FROM `user_info` WHERE `userName` = '%s' AND `userIP` = '%s'", GetName(playerid),plrIP);
mysql_query(Query);
mysql_store_result();
if(mysql_num_rows() != 0)// war der User schonmal hier mit dieser IP-Adresse
{
SetPVarInt(playerid, "JustLogged", 1); // Wenn wir mit der IP schonmal da waren
SendClientMessage(playerid, 0x009600AA, "Auto Logged in!");
}
else// ansonsten das Passwort abfragen
{
format(Query, sizeof(Query), "SELECT userPass FROM `user_info` WHERE `userName` = '%s'", GetName(playerid));
mysql_query(Query);
mysql_store_result();
mysql_free_result();
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Login / Authentication Process", "Hallo Spieler.\n\nBitte gibt dein Password hier ein.", "Login", "Abbrechen");
SendClientMessage(playerid, COLOR_WHITE, "Your account exists. Please enter your password to proceed.");
}
}
Alles anzeigen
dort wird im else z.b. ShowPlayerDialog augerufen und zwar den 1.
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case 1: // registrierte User Login Dialog
{
if(!response)
{
SendClientMessage(playerid, COLOR_BRIGHTRED, "Auf Wiedersehen!");
Kick(playerid);
}
else if(strlen(inputtext) == 0) // wenn kein PW eingegeben wird, 0 = kein Zeichen
{
SendClientMessage(playerid, COLOR_ORANGE, "Du hast kein Password eingegeben. Bitte gib das richtige ein!");
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Authentication", "Welcome!\n\nI need you to input the password for this account.", "Login", "Cancel");
}
else
{
//new string[700];
new pwstr[34];
new teststr1[800];
new teststr2[800];
GetFromAccount(GetName(playerid), "userPass", pwstr);
new str[34];
str = MD5_Hash(inputtext);
if(!strcmp(str,pwstr, true))
{
SetPVarInt(playerid, "Authentication", 1);
SetPVarInt(playerid, "JustLogged", 1);
getAccountData(playerid);
format(teststr1, sizeof(teststr1), "userID: %s; Name: %s; Skin: %s; Money: %s; Pass: %s;",
pUserData[playerid][pUserID],
pUserData[playerid][pName],
pUserData[playerid][pSkin],
pUserData[playerid][pMoney],
pUserData[playerid][pPass]);
print(teststr1);
format(teststr2, sizeof(teststr2), "PosX: %s; PosY: %s; PosZ: %s; PosA: %s;",
pUserData[playerid][pPosX],
pUserData[playerid][pPosY],
pUserData[playerid][pPosZ],
pUserData[playerid][pPosA]);
print(teststr2);
SetPlayerColor(playerid, COLOR_WHITE);
//TogglePlayerSpectating(playerid, 0);
SetSpawnInfo(playerid, 0, pUserData[playerid][pSkin], pUserData[playerid][pPosX], pUserData[playerid][pPosY], pUserData[playerid][pPosZ], pUserData[playerid][pPosA], 0, 0, 0, 0, 0, 0);
SetPlayerScore(playerid, pUserData[playerid][pPlaytime]); //Sets players score
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "test case 1 - Incorrect password. Please try again!");
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Authentication", "Welcome!\n\nI need you to input the password for this account.", "Login", "Cancel");
}
}
}
}
Alles anzeigen
bei diesen Testausgaben müssten doch die Daten aus dem enum drinn sein. Sind sie aber nicht.
Dadurch weiss das Script auch nicht wo ich spawnen soll, und ich bleibe in der Luft hängen.
public OnPlayerSpawn(playerid)
{
if(GetPVarInt(playerid, "JustLogged") == 1)
{
GivePlayerMoney(playerid, pUserData[playerid][pMoney]);
SetPlayerScore(playerid, pUserData[playerid][pPlaytime]);
SetPlayerSkin(playerid, pUserData[playerid][pSkin]);
SetPlayerPos(playerid, pUserData[playerid][pPosX], pUserData[playerid][pPosY], pUserData[playerid][pPosZ]+3);
SetPlayerFacingAngle(playerid, pUserData[playerid][pPosA]);
DeletePVar(playerid, "JustLogged");
}
Alles anzeigen
was mache ich denn falsch? Warum kommen die Daten im Enum nicht an? Ich hab da schon vieles Ausprobiert, nichts hat bisher zum Ziel geführt.