Hallo liebe Community,
ich habe bis jetzt mit Dini gearbeitet und hatte damit echt keine Probleme. Nun nach einer Weile wollte ich auf MySQL
umsteigen, was auch prima geklappt hat.
Dann bin ich doch auf ein Problem gestoßen. Und zwar geht es da drum, dass ich die Class Selection überspringen lassen hab.
Mit Dini hat das ganze auch super funktioniert, doch seit ich mein Code verändert habe und auf MySQL umgestiegen bin,
geht es nicht mehr. Weder nachdem Register-Vorgang, noch nach dem Login-Vorgang.
Hier der Code:
Mit Dini:
public OnPlayerRequestClass(playerid, classid)
{
SpawnPlayer(playerid);
return 1;
}
public OnPlayerSpawn(playerid)
{
if(UserInfo[playerid][Registriert] == 1){
SetPlayerPos(playerid, 1109.3824,-1796.4907,16.5938);
SetPlayerFacingAngle(playerid,87.3954);
SetCameraBehindPlayer(playerid);
return SetPlayerSkin(playerid, 101);
}
new Userfile[64];
Userfile = UserPath(playerid);
SetPlayerPos(playerid, 1109.3824,-1796.4907,16.5938);
SetPlayerFacingAngle(playerid,87.3954);
SetCameraBehindPlayer(playerid);
GivePlayerWeapon(playerid,UserInfo[playerid][wPistol],UserInfo[playerid][pAmmu]);
GivePlayerWeapon(playerid,UserInfo[playerid][wSMG],UserInfo[playerid][sAmmu]);
SetPlayerSkin(playerid, dini_Int(Userfile, "Skin"));
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch( dialogid ){
case DIA_REGISTER:{
if(response){
if(!strlen(inputtext)){
new string[128], name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
SendClientMessage(playerid,RED,"Du hast vergessen ein Passwort anzugeben. ");
format(string,sizeof(string), "Hallo, %s. Du bist noch nicht registriert, trage dazu dein gewünschtes Passwort ein: ", name);
ShowPlayerDialog(playerid,DIA_REGISTER,DIALOG_STYLE_INPUT,"Registrierung",string,"Registrieren","Abbrechen");
}else{
Register(playerid, inputtext);
UserInfo[playerid][Registriert] = 1;
}
}else{
SendClientMessage(playerid,RED,"Du wurdest gekickt. Ohne Registrierung geht es hier nicht weiter. ");
Kick(playerid);
}
}
case DIA_LOGIN:{
if(response){
if(!strlen(inputtext)){
new string[128], name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
SendClientMessage(playerid,RED,"Du hast vergessen ein Passwort anzugeben. ");
format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", name);
ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_INPUT, "Login", string, "Einloggen", "Abbrechen");
}else{
Login(playerid, inputtext);
}
}else{
SendClientMessage(playerid,RED,"Du wurdest gekickt. Ohne Login geht es hier nicht weiter. ");
Kick(playerid);
}
}
}
return 1;
}
public Register(playerid, key[])
{
new Userfile[64];
Userfile = UserPath(playerid);
dini_Create(Userfile);
dini_Set(Userfile, "Passwort", key);
SetPlayerScore(playerid,0);
GivePlayerMoney(playerid, 50000);
SetSpawnInfo( playerid, 0, 101, 1958.33, 1343.12, 15.36, 269.15, 26, 36, 28, 150, 0, 0 );
UserInfo[playerid][Konto] = 50000;
SendClientMessage(playerid,GREEN,"Registrierung erfolgreich! Viel Spaß.");
}
public Login(playerid, key[])
{
new Userfile[64];
Userfile = UserPath(playerid);
if(!strcmp(key,dini_Get(Userfile, "Passwort"), true))
{
LoadUser(playerid);
SendClientMessage(playerid,GREEN,"Login erfolgreich! Viel Spaß.");
}else{
new string[128], name[MAX_PLAYER_NAME];
SendClientMessage(playerid, RED, "Dein Passwort ist falsch.");
format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", name);
ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_INPUT, "Login", string, "Einloggen", "Abbrechen");
}
return 1;
}
public SaveUser(playerid)
{
new Userfile[64], Float:X, Float:Y, Float:Z, Float:R, Weap, Ammu;
Userfile = UserPath(playerid);
GetPlayerWeaponData(playerid, 2, Weap, Ammu);
UserInfo[playerid][wPistol] = Weap; UserInfo[playerid][pAmmu] = Ammu;
GetPlayerWeaponData(playerid, 4, Weap, Ammu);
UserInfo[playerid][wSMG] = Weap; UserInfo[playerid][sAmmu] = Ammu;
GetPlayerPos(playerid, X, Y, Z);
GetPlayerFacingAngle(playerid, R);
UserInfo[playerid][p_x] = X; UserInfo[playerid][p_y] = Y; UserInfo[playerid][p_z] = Z; UserInfo[playerid][p_r] = R;
dini_IntSet(Userfile, "Level", GetPlayerScore(playerid));
dini_IntSet(Userfile, "Geld", GetPlayerMoney(playerid));
dini_IntSet(Userfile, "Skin", GetPlayerSkin(playerid));
dini_IntSet(Userfile, "Konto", UserInfo[playerid][Konto]);
dini_IntSet(Userfile, "Eingeloggt", UserInfo[playerid][Eingeloggt]);
dini_FloatSet(Userfile, "PosX", UserInfo[playerid][p_x]);
dini_FloatSet(Userfile, "PosY", UserInfo[playerid][p_y]);
dini_FloatSet(Userfile, "PosZ", UserInfo[playerid][p_z]);
dini_FloatSet(Userfile, "PosR", UserInfo[playerid][p_r]);
dini_IntSet(Userfile, "Pistol", UserInfo[playerid][wPistol]);
dini_IntSet(Userfile, "PistolAmmu", UserInfo[playerid][pAmmu]);
dini_IntSet(Userfile, "SMG", UserInfo[playerid][wSMG]);
dini_IntSet(Userfile, "SMGAmmu", UserInfo[playerid][sAmmu]);
return 1;
}
public LoadUser(playerid)
{
new Userfile[64];
Userfile = UserPath(playerid);
UserInfo[playerid][p_x] = dini_Float(Userfile, "PosX");
UserInfo[playerid][p_y] = dini_Float(Userfile, "PosY");
UserInfo[playerid][p_z] = dini_Float(Userfile, "PosZ");
UserInfo[playerid][p_r] = dini_Float(Userfile, "PosR");
UserInfo[playerid][wPistol] = dini_Int(Userfile, "Pistol");
UserInfo[playerid][pAmmu] = dini_Int(Userfile, "PistolAmmu");
UserInfo[playerid][wSMG] = dini_Int(Userfile, "SMG");
UserInfo[playerid][sAmmu] = dini_Int(Userfile, "SMGAmmu");
SetPlayerScore(playerid, dini_Int(Userfile, "Level"));
GivePlayerMoney(playerid, dini_Int(Userfile, "Geld"));
UserInfo[playerid][Konto] = dini_Int(Userfile, "Konto");
UserInfo[playerid][Eingeloggt] = dini_Int(Userfile, "Eingeloggt");
SetSpawnInfo(playerid, 0,dini_Int(Userfile, "Skin"), UserInfo[playerid][p_x], UserInfo[playerid][p_y], UserInfo[playerid][p_z], UserInfo[playerid][p_r], UserInfo[playerid][wPistol], UserInfo[playerid][pAmmu], UserInfo[playerid][wSMG], UserInfo[playerid][sAmmu], 0, 0 );
LoadCar(playerid);
return 1;
}
stock ResetUser(playerid)
{
for(new i=0; i<sizeof(UserInfo[]); i++){
UserInfo[playerid][pInfo:i] = 0;
}
return 1;
}
Und nun mit MySQL:
public OnPlayerRequestClass(playerid, classid)
{
SpawnPlayer(playerid);
return 1;
}
public OnPlayerSpawn(playerid)
{
if(UserInfo[playerid][Registriert] == 1){
SetPlayerPos(playerid,1109.3824,-1796.4907,16.5938);
SetPlayerFacingAngle(playerid,87.3954);
SetCameraBehindPlayer(playerid);
return SetPlayerSkin(playerid, 101);
}
SetPlayerPos(playerid, 1109.3824,-1796.4907,16.5938);
SetPlayerFacingAngle(playerid,87.3954);
SetCameraBehindPlayer(playerid);
GivePlayerWeapon(playerid,UserInfo[playerid][Pistol],UserInfo[playerid][pAmmu]);
GivePlayerWeapon(playerid,UserInfo[playerid][SMG],UserInfo[playerid][sAmmu]);
SetPlayerSkin(playerid, UserInfo[playerid][Skin]);
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch( dialogid ){
case DIA_REGISTER:{
if(response){
new string[128], query[128], passwort[40];
if(strlen(inputtext)>3){
///Registrierung
mysql_escape_string(inputtext, passwort, sqlHandle);
format(query, sizeof(query), "INSERT INTO user (username, password) VALUES ('%s','%s')",UserName(playerid), passwort);
mysql_tquery(sqlHandle,query,"OnUserRegister","i", playerid);
}else{
SendClientMessage(playerid,RED,"Das eingegebene Passwort war nicht lang genug. Mindestens 4 Zeichen lang. ");
format(string,sizeof(string), "Hallo, %s. Du bist noch nicht registriert, trage dazu dein gewünschtes Passwort ein: ", UserName(playerid));
ShowPlayerDialog(playerid,DIA_REGISTER,DIALOG_STYLE_INPUT,"Registrierung",string,"Registrieren","Abbrechen");
}
}else{
SendClientMessage(playerid,RED,"Du wurdest gekickt. Ohne Registrierung geht es hier nicht weiter. ");
Kick(playerid);
}
return 1;
}
case DIA_LOGIN:{
if(response){
new string[128], query[128], passwort[40];
if(strlen(inputtext)>0){
mysql_escape_string(inputtext,passwort,sqlHandle);
format(query, sizeof(query),"SELECT * FROM user WHERE username='%s' AND password='%s'", UserName(playerid), passwort);
mysql_tquery(sqlHandle,query,"OnPasswordResponse","i",playerid);
}else{
format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", UserName(playerid));
ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_PASSWORD, "Login", string, "Einloggen", "Abbrechen");
}
}else{
SendClientMessage(playerid,RED,"Du wurdest gekickt. Ohne Login geht es hier nicht weiter. ");
Kick(playerid);
}
return 1;
}
}
return 1;
}
public OnUserCheck(playerid)
{
new num_rows, num_fields, string[128];
cache_get_data(num_rows, num_fields, sqlHandle);
if(num_rows == 0){
///Registrierung
format(string, sizeof(string), "Hallo, %s. Du bist noch nicht registriert, trage dazu dein gewünschtes Passwort ein: ", UserName(playerid));
ShowPlayerDialog(playerid,DIA_REGISTER,DIALOG_STYLE_INPUT,"Registrierung",string,"Registrieren","Abbrechen");
}else{
///Login
format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", UserName(playerid));
ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_PASSWORD, "Login", string, "Einloggen", "Abbrechen");
}
return 1;
}
public OnUserRegister(playerid)
{
UserInfo[playerid][uID] = cache_insert_id(sqlHandle);
UserInfo[playerid][Registriert] = 1;
UserInfo[playerid][Eingeloggt] = 1;
GivePlayerMoney(playerid, 50000);
SetSpawnInfo( playerid, 0, 101, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0 );
return 1;
}
public OnPasswordResponse(playerid)
{
new num_rows, num_fields,string[128];
cache_get_data(num_rows,num_fields,sqlHandle);
if(num_rows==1){
UserInfo[playerid][uID] = cache_get_field_content_int(0,"id",sqlHandle);
UserInfo[playerid][Eingeloggt] = 1;
UserInfo[playerid][Level] = cache_get_field_content_int(0,"level",sqlHandle);
SetPlayerScore(playerid, UserInfo[playerid][Level]);
UserInfo[playerid][Skin] = cache_get_field_content_int(0,"skin",sqlHandle);
UserInfo[playerid][Geld] = cache_get_field_content_int(0,"money",sqlHandle);
SetPlayerMoney(playerid, UserInfo[playerid][Geld]);
UserInfo[playerid][Adminlevel] = cache_get_field_content_int(0,"adminlevel",sqlHandle);
UserInfo[playerid][Banned] = cache_get_field_content_int(0,"banned",sqlHandle);
SetSpawnInfo(playerid, 0, cache_get_field_content_int(0,"skin",sqlHandle),1109.3824,-1796.4907,16.5938, 87.3954 ,0,0,0,0,0,0);
}else{
SendClientMessage(playerid, RED, "Das eingegebene Passwort ist falsch!");
format(string, sizeof(string), "Willkommen, %s. Bitte trage dein Passwort ein, um dich einzuloggen.", UserName(playerid));
ShowPlayerDialog(playerid,DIA_LOGIN,DIALOG_STYLE_PASSWORD, "Login", string, "Einloggen", "Abbrechen");
}
return 1;
}
public SaveUser(playerid)
{
if(UserInfo[playerid][Eingeloggt] == 0) return 1;
///Speichern
new query[128];
format(query, sizeof(query),"UPDATE user SET level='%i', skin='%i', money='%i', adminlevel='%i', banned='%i' WHERE id='%s'", UserInfo[playerid][Level],UserInfo[playerid][Skin],UserInfo[playerid][Geld],UserInfo[playerid][Adminlevel],UserInfo[playerid][Banned],UserInfo[playerid][uID]);
mysql_tquery(sqlHandle,query,"","");
return 1;
}
public ResetUser(playerid)
{
for(new i=0; i<sizeof(UserInfo[]); i++){
UserInfo[playerid][uInfo:i] = 0;
}
return 1;
}
Also meiner Meinung nach müsste es kein Unterschied machen, ob es in MySQL oder Dini ist..
Ich habe auch schon SetSpawnInfo(); unter OnPlayerRequestClass geschrieben. Aber da spawnt der Spieler während dem Login- bzw. Register-Vorgang
und das will ich eigentlich nicht. Beispiel wie ich es bestmöglichst sein sollte: Register-Dialog taucht auf -> Spieler gibt Passwort ein -> klickt auf "Registrieren" oder drückt Enter
-> Spieler wird direkt gespawnt. Ohne vorher auf "Spawn" klicken zu müssen. Selbiges auch beim Login-Vorgang.
Hoffe ihr könnt mir da helfen und sorry für so viel Code..
Edit: Kann da keiner mal drüberschauen? Ich weiß, ist echt viel Code, aber trotz 2 Tage rumprobieren, komm ich nicht zum gewünschtem Ergebnis.
Mit freundlichen Grüßen
Ace'X