Advertisement
ZumeZero

Gamemode MySQL R39-2 base.

Jan 25th, 2015
536
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 11.43 KB | None | 0 0
  1. // This is a comment
  2. // uncomment the line below if you want to write a filterscript
  3. //#define FILTERSCRIPT
  4.  
  5. #include <a_samp>
  6. #include <a_mysql>
  7. // MACROS
  8. #define PlayerLogged(%0) \
  9.                             ((PlayerInfo[playerid][pLogged] && IsPlayerConnected(playerid)) ? (true) : (false))
  10.  
  11.  
  12. enum E_INFO{
  13.     pID,
  14.     pLogged,
  15.     pInterior,
  16.     pVirtualworld,
  17.     pSkin,
  18.     Float:pPos[4]
  19. };
  20. new PlayerInfo[MAX_PLAYERS][E_INFO],
  21.     gTunel, // Aqui almacenaremos el ID que tomara nuestra conexion.
  22.     bool:pRegisterLast[MAX_PLAYERS];  // Usada para comprobar si se acaba de registrar asi no usar dos funciones distintas.
  23.  
  24. // DIALOGOS
  25. #define D_LOGIN     1
  26. #define D_REGISTER  2
  27.  
  28. // THREADS
  29. #define THREAD_CHECK_ACCOUNT    1
  30. #define THREAD_CHECK_PASS       2
  31. #define THREAD_LOAD_DATA        3
  32.  
  33. // MYSQL DATA
  34. #define MySQL_Host      "127.0.0.1"
  35. #define MySQL_Usuario   "root"
  36. #define MySQL_BD        "ServidorMySQL"
  37. #define MySQL_Pass      ""
  38.  
  39.  
  40. main()
  41. {
  42.     print("\n----------------------------------");
  43.     print(" Blank Gamemode by your name here");
  44.     print("----------------------------------\n");
  45. }
  46.  
  47. public OnGameModeInit()
  48. {
  49.     gTunel = mysql_connect(MySQL_Host, MySQL_Usuario, MySQL_BD, MySQL_Pass);
  50.    
  51.     if(mysql_errno(gTunel) != 0) // En caso de usar MySQL R7 usen mysql_ping
  52.     {
  53.         return print("La conexion a la base de datos fallo!");
  54.     }
  55.     else
  56.     {
  57.         print("La conexion a la base de datos se realizo!");
  58.     }
  59.     //AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
  60.     return 1;
  61. }
  62.  
  63. public OnGameModeExit()
  64. {
  65.     return 1;
  66. }
  67.  
  68. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  69. {
  70.     switch(dialogid)
  71.     {
  72.         case D_LOGIN:
  73.         {
  74.             if (!response){ // Si selecciona 'Salir'
  75.                 return Kick(playerid); // .. Lo expulsa del servidor,
  76.             }
  77.             else{
  78.                 if(!IsPlayerConnected(playerid) || PlayerLogged(playerid)) // Nos devuelve si el jugador no es una ID valida o ya esta logeado no hara nada.
  79.                     return 0; // Retornamos 0
  80.  
  81.                 if(inputtext[0] == '\0')
  82.                     return Kick(playerid); // Si no envia nada a la caja del dialogo de LOGIN lo expulsa del servidor.
  83.                    
  84.                 new
  85.                     query[160]
  86.                     ;
  87.                 format(query, sizeof(query), "SELECT `id` FROM `users` WHERE `name` = '%s' AND `pass` = '%s'", _getNameEx(playerid), inputtext);
  88.                 mysql_function_query(gTunel, query, true, "QueryCheckAccount", "dd", playerid, THREAD_CHECK_PASS);
  89.             }
  90.         }
  91.         case D_REGISTER:
  92.         {
  93.             if (!response){
  94.                 return Kick(playerid);
  95.             }
  96.             else{
  97.                 if(inputtext[0] == '\0')
  98.                     return Kick(playerid);
  99.                    
  100.                 pRegisterLast[playerid] = true;
  101.                 // Registrado
  102.                 SQL_CreateAccount(playerid, _getNameEx(playerid), inputtext);
  103.                 SendToLogin(playerid);
  104.             }
  105.         }
  106.     }
  107.     return 1;
  108. }
  109.  
  110. SQL_CreateAccount(playerid, username[], password[])
  111. {
  112.     new query[129+120];
  113.     format(query, sizeof(query), "INSERT INTO `users` (`name`, `pass`) VALUES('%s', '%s')", username, password);
  114.     mysql_function_query(gTunel, query, false, "CrearCuenta", "d", playerid);
  115. }
  116.  
  117. forward CrearCuenta(playerid); public  CrearCuenta(playerid)
  118. {
  119.     PlayerInfo[playerid][pID] = cache_insert_id(gTunel);
  120.     return 1;
  121. }
  122.  
  123. stock CheckAccount(playerid)
  124. {
  125.     SetSpawnInfo( playerid, 0, 0, 1958.33, 1343.12, 15.36, 269.15, -1, -1, -1, -1, -1, -1); /* <- Es muy importante,
  126.     .. de no tenerlo tendriamos el bug de que nos kickea el servidor al spawnear ..
  127.         La razon es por que es asi, el servidor te expulsa si no tienes un Spawn determinado antes de hacerlo . */
  128.     TogglePlayerControllable(playerid, false); // Congelamos al jugador
  129.     SendToLogin(playerid); // Hacemos que se muestre lo demas ..
  130.     return 1;
  131. }
  132.  
  133. SendToLogin(playerid)
  134. {
  135.     if(playerid == INVALID_PLAYER_ID)
  136.         return 0;
  137.  
  138.     new query[120]; // Definimos el array para almacenar lo del format, a deduccion pienso que es lo que usaremos.
  139.     format(query, sizeof(query), "SELECT id, name FROM `users` WHERE `name` = '%s' LIMIT 1", _getNameEx(playerid));
  140.     /* Situamos a query la consulta formateada con el nombre del jugador ..
  141.         -> SELECT - SELECCIONAMOS
  142.                 -> id, name - SELECCIONAMOS LA FILA id y name ..
  143.         -> FROM - DE
  144.                 -> SELECCIONAMOS FILA id y name DE LA TABLA users
  145.         -> WHERE - WHERE
  146.                 -> SELECCIONAMOS FILA id y name DE LA TABLA users QUE CUMPLAN CON LA CONDICION name LIMITANDO A 1 RESULTADO.
  147.     ------------------------------------------------------------------------------------------------------------------------ */
  148.     mysql_function_query(gTunel, query, true, "QueryCheckAccount", "dd", playerid, THREAD_CHECK_ACCOUNT); /* Ejecutamos ..
  149.         La consulta.
  150.  
  151.         -> El primer argumento hara ejecutar la consulta a la conexion que tengamos almacenada en gTunel
  152.         -> El segundo ... agrega la consulta que ejecutaremos, la que esta mas arriba explicada.
  153.         -> El ter ... habilitamos el cache ..
  154.         -> El c .. Hacemos que nos envie los datos a dicha callback.
  155.         -> El q .. Situamos los argumentos del formato, en este caso d por que seria para "playerid" */
  156.  
  157.     return 1;
  158. }
  159.  
  160. stock _getNameEx(playerid)
  161. {
  162.     new
  163.         name[MAX_PLAYER_NAME + 1];
  164.  
  165.     GetPlayerName(playerid, name, sizeof(name));
  166.     return name;
  167. }
  168.  
  169. stock ShowPlayerDialogEx(playerid, dialogid, style, caption[], info[], button1[], button2[], {Float,_}:...)
  170. {
  171.     static
  172.         string[1024],
  173.         start,
  174.         end;
  175.  
  176.     if (numargs() > 7)
  177.     {
  178.         #emit ADDR.pri button2
  179.         #emit STOR.pri start
  180.  
  181.         for (end = start + (numargs() << 2) - 28; end > start; end -= 4)
  182.         {
  183.             #emit LREF.pri end
  184.             #emit PUSH.pri
  185.         }
  186.         #emit PUSH.S info
  187.         #emit PUSH.C 1024
  188.         #emit PUSH.C string
  189.  
  190.         #emit LOAD.S.pri 8
  191.         #emit CONST.alt 16
  192.         #emit SUB
  193.         #emit PUSH.pri
  194.  
  195.         #emit SYSREQ.C format
  196.         #emit LCTRL 5
  197.         #emit SCTRL 4
  198.  
  199.         ShowPlayerDialog(playerid, dialogid, style, caption, string, button1, button2);
  200.     }
  201.     else
  202.     {
  203.         ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
  204.     }
  205.     return 1;
  206. }
  207.  
  208. cache_get_field_int(row, const field_name[])
  209. {
  210.     new str[12];
  211.     cache_get_field_content(row, field_name, str, gTunel);
  212.     return strval(str);
  213. }
  214.  
  215. stock Float:cache_get_field_float(row, const field_name[])
  216. {
  217.     new str[16];
  218.     cache_get_field_content(row, field_name, str, gTunel);
  219.     return floatstr(str);
  220. }
  221.  
  222. forward QueryCheckAccount(playerid, option); public QueryCheckAccount(playerid, option){
  223.     new rows, fields;
  224.  
  225.     if(playerid == INVALID_PLAYER_ID)
  226.         return 0;
  227.  
  228.     switch(option)
  229.     {
  230.         case THREAD_CHECK_ACCOUNT:
  231.         {
  232.            
  233.             cache_get_data(rows, fields, gTunel);
  234.             if(rows)
  235.             {
  236.                 SendClientMessage(playerid, -1, "Ingresa tu Password para identificarte");
  237.                 PlayerInfo[playerid][pID] = cache_get_field_int(0, "id"); // Situamos al index del array el ID que tiene en la base de datos.
  238.                 ShowPlayerDialogEx(playerid, D_LOGIN, DIALOG_STYLE_PASSWORD, "Inicio", "Ingresa tu pass para identificarte ->", "Aceptar", "Salir");
  239.             }
  240.             else
  241.             {
  242.                 ShowPlayerDialogEx(playerid, D_REGISTER, DIALOG_STYLE_PASSWORD, "Registro", "Ingresa tu pass para registrarte ->", "Aceptar", "Salir");
  243.             }
  244.             return 1;
  245.         }
  246.         case THREAD_CHECK_PASS:
  247.         {
  248.             cache_get_data(rows, fields, gTunel);
  249.             if (!rows) // Password incorrecta!
  250.             {
  251.                 Kick(playerid); // Lo expulsa del servidor.
  252.             }
  253.             else // Password correcta!
  254.             {
  255.                 // Cargamos sus datos.
  256.                 new
  257.                     query[160];
  258.  
  259.                 format(query, sizeof(query), "SELECT * FROM `users` WHERE `name` = '%s'", _getNameEx(playerid));
  260.                 mysql_function_query(gTunel, query, true, "QueryCheckAccount", "dd", playerid, THREAD_LOAD_DATA);
  261.             }
  262.             return 1;
  263.         }
  264.         case THREAD_LOAD_DATA:
  265.         {
  266.             cache_get_data(rows, fields, gTunel);
  267.             if (!rows)
  268.             {
  269.                 return 0;
  270.             }
  271.             else
  272.             {
  273.                 PlayerInfo[playerid][pLogged] = true;
  274.                 PlayerInfo[playerid][pInterior] = cache_get_field_int(0, "interior");
  275.                 PlayerInfo[playerid][pVirtualworld] = cache_get_field_int(0, "vw");
  276.                 PlayerInfo[playerid][pSkin] = cache_get_field_int(0, "skin");
  277.                 PlayerInfo[playerid][pPos][0] = cache_get_field_float(0, "x");
  278.                 PlayerInfo[playerid][pPos][1] = cache_get_field_float(0, "y");
  279.                 PlayerInfo[playerid][pPos][2] = cache_get_field_float(0, "z");
  280.                 PlayerInfo[playerid][pPos][3] = cache_get_field_float(0, "a");
  281.  
  282.                 SendClientMessage(playerid, -1, "Bienvenido al servidor!");
  283.                 SpawnPlayerEx(playerid);
  284.             }
  285.         }
  286.     }
  287.     return 0;
  288. }
  289.  
  290. stock SpawnPlayerEx(playerid)
  291. {
  292.     if(!IsPlayerConnected(playerid))
  293.         return 0;
  294.        
  295.     TogglePlayerSpectating(playerid, false); // Quitamos el modo espectador, que lo hara spawnear.
  296.     if(pRegisterLast[playerid] == true)
  297.     {
  298.         pRegisterLast[playerid] = false;
  299.         SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
  300.         SetPlayerSkin(playerid, 274);
  301.         SetPlayerVirtualWorld(playerid, 0);
  302.         SetPlayerInterior(playerid, 0);
  303.     }
  304.     return 1;
  305. }
  306.  
  307. stock SaveAccount(playerid)
  308. {
  309.     if (!PlayerLogged(playerid))
  310.         return 0;
  311.  
  312.     new query[2400];
  313.  
  314.     if (GetPlayerState(playerid) != PLAYER_STATE_SPECTATING)
  315.     {
  316.         PlayerInfo[playerid][pInterior] = GetPlayerInterior(playerid);
  317.         PlayerInfo[playerid][pVirtualworld] = GetPlayerVirtualWorld(playerid);
  318.         PlayerInfo[playerid][pSkin] = GetPlayerSkin(playerid);
  319.  
  320.         GetPlayerPos(playerid,PlayerInfo[playerid][pPos][0],PlayerInfo[playerid][pPos][1],PlayerInfo[playerid][pPos][2]);
  321.         GetPlayerFacingAngle(playerid, PlayerInfo[playerid][pPos][3]);
  322.     }
  323.  
  324.     format(query, sizeof(query), "UPDATE `users` SET `interior` = '%d', `vw` = '%d', `skin` = '%d'",
  325.         PlayerInfo[playerid][pInterior],
  326.         PlayerInfo[playerid][pVirtualworld],
  327.         PlayerInfo[playerid][pSkin]
  328.     );
  329.  
  330.     format(query, sizeof(query), "%s, `x` = '%.4f', `y` = '%.4f', `z` = '%.4f', `a` = '%.4f' WHERE `id` = '%d'",
  331.         query,
  332.         PlayerInfo[playerid][pPos][0],
  333.         PlayerInfo[playerid][pPos][1],
  334.         PlayerInfo[playerid][pPos][2],
  335.         PlayerInfo[playerid][pPos][3],
  336.         PlayerInfo[playerid][pID]
  337.     );
  338.     mysql_function_query(gTunel, query, false, "EnviarConsulta", "");
  339.     return 1;
  340. }
  341.  
  342. public OnPlayerSpawn(playerid)
  343. {
  344.     if(!IsPlayerConnected(playerid))
  345.         return 0;
  346.  
  347.     SetPlayerPos(playerid, PlayerInfo[playerid][pPos][0], PlayerInfo[playerid][pPos][1], PlayerInfo[playerid][pPos][2]);
  348.     SetPlayerFacingAngle(playerid, PlayerInfo[playerid][pPos][3]);
  349.     SetPlayerVirtualWorld(playerid, PlayerInfo[playerid][pVirtualworld]);
  350.     SetPlayerInterior(playerid, PlayerInfo[playerid][pInterior]);
  351.     SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]);
  352.     return 1;
  353. }
  354.  
  355. public OnPlayerRequestClass(playerid, classid)
  356. {
  357.     if(IsPlayerNPC(playerid))
  358.     { // Retorna si es un NPC, si van a usar NPC provoquen su spawn
  359.         // TogglePlayerControllable(playerid, false);
  360.         return 1; // Retorna uno, valga la redundancia lo que retorne a excepcion de que quieran hacer algo especial.
  361.     }
  362.     if(PlayerLogged(playerid))
  363.     { // Condicion para aplicar una funcion si el jugador llega a esta callback y ya esta logueado.
  364.         SpawnPlayer(playerid); // Si ya esta logueado y llega aqui lo hacemo spawnear.
  365.     }
  366.     else
  367.     { // Pero si no lo esta ..
  368.         TogglePlayerSpectating(playerid, true); // Le ponemos en modo espectador para evitar los botones de la callback ..
  369.         CheckAccount(playerid); // Llamamos a CheckAccount a que nos muestre el dialogo y aplique cambios para inicio de sesion ..
  370.     }
  371.     return 1;
  372. }
  373.  
  374. public OnPlayerConnect(playerid)
  375. {
  376.     return 1;
  377. }
  378.  
  379. public OnPlayerDisconnect(playerid, reason)
  380. {
  381.     SaveAccount(playerid);
  382.     return 1;
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement