Balkan SA:MP

PAWN skriptanje, gamemodovi, filterskripte, include fajlovi, mape, pluginovi => Razgovor u vezi PAWN - skriptanja => Temu započeo: Darkic poslato Januar 04, 2020, 20:30:24 POSLE PODNE

Naslov: MySQL
Poruka od: Darkic poslato Januar 04, 2020, 20:30:24 POSLE PODNE
Problem(error/warning): invalid cache id, no active cache. Da napomenem da mi se ovo desi samo na prvom loginu, odnosno nakon registracije, jer izbacuje jedan za drugim dialogom.
Dio skripte: [pawn]
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
   if(dialogid == DIALOG_LOGIN && response == 0 || dialogid == DIALOG_REGISTER && response == 0) return Kick(playerid);
   if(dialogid == DIALOG_LOGIN && response == 1)
   {
      new Salted_Key[65];
      SHA256_PassHash(inputtext, pInfo[playerid][Salt], Salted_Key, 65);

      if(strcmp(Salted_Key, pInfo[playerid][Password]) == 0)
      {
         cache_set_active(pInfo[playerid][Player_Cache]);
         cache_get_value_int(0, "ID", pInfo[playerid][ID]);
            
         cache_get_value_int(0, "KILLS", pInfo[playerid][Kills]);
         cache_get_value_int(0, "DEATHS", pInfo[playerid][Deaths]);

         cache_get_value_int(0, "SCORE", pInfo[playerid][Score]);
         cache_get_value_int(0, "CASH", pInfo[playerid][Cash]);

         cache_get_value_int(0, "SKIN", pInfo[playerid][Skin]);
         cache_get_value_int(0, "ADMIN", pInfo[playerid][Admin]);
         cache_get_value_int(0, "MUTED", pInfo[playerid][Muted]);
         
         SetPlayerScore(playerid, pInfo[playerid][Score]);
         ResetPlayerMoney(playerid);
         GivePlayerMoney(playerid, pInfo[playerid][Cash]);

         cache_delete(pInfo[playerid][Player_Cache]);
         pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;

         pInfo[playerid][LoggedIn] = true;
         SpawnPlayer(playerid);
      }
      else
      {
         new str[82];

         pInfo[playerid][PasswordFails] += 1;
         printf("%s has been failed to login. (%d)", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);

         if (pInfo[playerid][PasswordFails] >= 3)
         {
            format(str, sizeof(str), "Kick: %s has been kicked Reason: {FF0000}(%d/3) Login fails.", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
            SendClientMessageToAll(0x4270D9FF, str);
            Kick(playerid);
         }
         else
         {
            format(str, sizeof(str), "LOGIN: Wrong password, you have {F42D32}%d{FFFFFF}/{F42D32}3 {FFFFFF}tries.", pInfo[playerid][PasswordFails]);
            SendClientMessage(playerid, -1, str);

            new str1[155];
            format(str1, sizeof(str1), "{FFFFFF}Welcome , %s.\n\n{0099FF}This account is registered.\n\
            {0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
            ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Mexico DeathMatch - Login", str1, "Login", "Leave");
         }
      }
   }
   if(dialogid == DIALOG_REGISTER && response == 1)
   {
      if(strlen(inputtext) < 5 || strlen(inputtext) > 60)
      {
         SendClientMessage(playerid, RED, "ERROR: {FFFFFF}");

         new String[153];

         format(String, sizeof(String), "{FFFFFF}Welcome %s,\n\n{0099FF}Your account is not registered.\n\
         {0099FF}Please, enter your password below to register new account.\n\n", pInfo[playerid][Name]);
         ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Register", String, "Register", "Leave");
      }
      else
      {
         for (new i = 0; i < 10; i++)
         {
            pInfo[playerid][Salt] = random(79) + 47;
         }

         pInfo[playerid][Salt][10] = 0;
         SHA256_PassHash(inputtext, pInfo[playerid][Salt], pInfo[playerid][Password], 65);

         new DB_Query[272];

         mysql_format(Database, DB_Query, sizeof(DB_Query), "INSERT INTO `PLAYERS` (`USERNAME`, `PASSWORD`, `SALT`, `SCORE`, `KILLS`, `CASH`, `DEATHS`,`SKIN`, `ADMIN`, `MUTED`)\
         VALUES ('%e', '%s', '%e', '0', '0', '0', '0', '0', '0', '0')", pInfo[playerid][Name], pInfo[playerid][Password], pInfo[playerid][Salt]);
         mysql_tquery(Database, DB_Query, "OnPlayerRegister", "d", playerid);
      }
   }
        return 1;
}
[/pawn]
Debug iz server_log(ukoliko je u pitanju crashanje servera - crashdetect log):
[19:54:20] [plugins/mysql] cache_set_active: invalid cache id '0'
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_delete: invalid cache id '0'

Slika/video ingame problema(obavezno ako je ingame problem): link slike
Naslov: Odg: MySQL
Poruka od: Darkic poslato Januar 04, 2020, 21:41:45 POSLE PODNE
Izvinjavam se za DP, resio sam. Necu uklanjati sadrzaj teme, vec cu izneti objasnjenje, jer mozda jos neko ima slican problem.
Uglavnom, login dialog je pozivan u publicu OnPlayerRegister, ali je isto tako u tom publicu pozivan i sql_AccountSave u kome se brise cache. Znam, glup sam ko kurac :P

[pawn]
public OnPlayerRegister(playerid)
{
   pInfo[playerid][ID] = cache_insert_id();
   sql_AccountSave(playerid);
   
   new str[128];
   format(str, sizeof(str), "{FFFFFF}Welcome back, %s.\n\n{0099FF}This account is already registered.\n\
   {0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
   ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Mexico DM - Login", str, "Login", "Leave");
   return 1;
}
[/pawn]

[pawn]
public sql_AccountSave(playerid)
{
   Corrupt_Check[playerid]++;
   if(IsPlayerConnected(playerid)) {
      
   new DB_Query[295];
   mysql_format(Database, DB_Query, sizeof(DB_Query), "UPDATE `PLAYERS` SET `SCORE` = '%d', `CASH` = '%d', `KILLS` = '%d', `DEATHS` = '%d', `SKIN` = '%d', `ADMIN` = '%d', `MUTED` = '%d' WHERE `ID` = '%d' LIMIT 1",
   pInfo[playerid][Score], pInfo[playerid][Cash], pInfo[playerid][Kills], pInfo[playerid][Deaths], pInfo[playerid][Skin], pInfo[playerid][Admin], pInfo[playerid][Muted], pInfo[playerid][ID]);
   mysql_tquery(Database, DB_Query);
   printf(DB_Query); }

   if(cache_is_valid(pInfo[playerid][Player_Cache])) {
   cache_delete(pInfo[playerid][Player_Cache]);
   pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE; }
   pInfo[playerid][LoggedIn] = false;
   return 1;
}
[/pawn]
Naslov: Odg: MySQL
Poruka od: __vedran.xyz77 poslato Januar 04, 2020, 22:08:09 POSLE PODNE
Nigdje ne selektujes tabelu iz koje hoces da izvuces to
Naslov: Odg: MySQL
Poruka od: Darkic poslato Januar 04, 2020, 22:52:58 POSLE PODNE
Selektuje pod OnPlayerConnect