SA-MP Forums Archive
[Tutorial] Login and Register System - Dialogs - Using Y_INI - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+---- Forum: Tutorials (https://sampforum.blast.hk/forumdisplay.php?fid=70)
+---- Thread: [Tutorial] Login and Register System - Dialogs - Using Y_INI (/showthread.php?tid=273088)

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14


Login and Register System - Dialogs - Using Y_INI - Kush - 31.07.2011

Login and Register System - Dialogs - Using Y_INI


What is this?
A simple tutorial on how to make a Login and Register system using Y_INI.

What is Y_INI?
Y_INI is an extensive .INI based file reader and writer, also known as a 'File Management System' created by ******. This is included in the YSI Library/Directory along with other useful includes such as y_commands (YCMD) and y_groups.


What's the difference between this and my file writer?
Y_INI has not only been said, but has been proven to be one of the fastest and most efficient .INI file readers and writers created. You can read more by visiting: https://sampforum.blast.hk/showthread.php?tid=175565


How to 'install' y_ini?
You must first download y_INI ----> https://sampforum.blast.hk/showthread.php?tid=175565. Once the download has finished, place the YSI folder in your includes folder.


Step I
Add the Y_INI Include at the beginning of the script.
pawn Code:
#include <YSI\y_ini>
This include contains all necessary functions needed to create our Login and Register system.


Step II
Lets define some Dialogs.

pawn Code:
#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_SUCCESS_1 3
#define DIALOG_SUCCESS_2 4

Step III
Defining the 'PATH' of the .INI file.

pawn Code:
#define PATH "/Users/%s.ini"
Step IV
Lets add some colors.

pawn Code:
#define COL_WHITE "{FFFFFF}"
#define COL_RED "{F81414}"
#define COL_GREEN "{00FF22}"
#define COL_LIGHTBLUE "{00CED1}"
Step V
We're going to use an enum, to store our variables.

pawn Code:
enum pInfo
{
    pPass,
    pCash,
    pAdmin,
    pKills,
    pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];
Step VI
Now, we're going to create a function to Load the User's data.


pawn Code:
forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
    INI_Int("Password",PlayerInfo[playerid][pPass]);
    INI_Int("Cash",PlayerInfo[playerid][pCash]);
    INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
    INI_Int("Kills",PlayerInfo[playerid][pKills]);
    INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);
    return 1;
}

Step VII
Lets create a simple stock function.

pawn Code:
stock UserPath(playerid)
{
    new string[128],playername[MAX_PLAYER_NAME];
    GetPlayerName(playerid,playername,sizeof(playername));
    format(string,sizeof(string),PATH,playername);
    return string;
}
The stock function 'UserPath' is merely going to 'grab' the 'PATH' of the User's file.

Step VIII
Add this code below your previous stock function.
pawn Code:
/*Credits to Dracoblue*/
stock udb_hash(buf[]) {
    new length=strlen(buf);
    new s1 = 1;
    new s2 = 0;
    new n;
    for (n=0; n<length; n++)
    {
       s1 = (s1 + buf[n]) % 65521;
       s2 = (s2 + s1)     % 65521;
    }
    return (s2 << 16) + s1;
}
The stock above is a simple 'hasher', and will be used to hash passwords, Credits to Dracoblue.


Step IX
We're going to now use the 'OnPlayerConnect' callback to check whether the player is registered or not.
pawn Code:
public OnPlayerConnect(playerid)
{
    if(fexist(UserPath(playerid)))
    {
        INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_WHITE"Type your password below to login.","Login","Quit");
    }
    else
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Registering...",""COL_WHITE"Type your password below to register a new account.","Register","Quit");
    }
    return 1;
}
We'll be using the native 'fexist' function to search for our file. Parameters are set to our stock function which we've created. If the file exists, you will receive a 'Login' dialog. If it doesn't, you will receive a register dialog.


Step X

pawn Code:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch( dialogid )
    {
        case DIALOG_REGISTER:
        {
            if (!response) return Kick(playerid);
            if(response)
            {
                if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, ""COL_WHITE"Registering...",""COL_RED"You have entered an invalid password.\n"COL_WHITE"Type your password below to register a new account.","Register","Quit");
                new INI:File = INI_Open(UserPath(playerid));
                INI_SetTag(File,"data");
                INI_WriteInt(File,"Password",udb_hash(inputtext));
                INI_WriteInt(File,"Cash",0);
                INI_WriteInt(File,"Admin",0);
                INI_WriteInt(File,"Kills",0);
                INI_WriteInt(File,"Deaths",0);
                INI_Close(File);

                SetSpawnInfo(playerid, 0, 0, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
                SpawnPlayer(playerid);
                ShowPlayerDialog(playerid, DIALOG_SUCCESS_1, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"Great! Your Y_INI system works perfectly. Relog to save your stats!","Ok","");
            }
        }

        case DIALOG_LOGIN:
        {
            if ( !response ) return Kick ( playerid );
            if( response )
            {
                if(udb_hash(inputtext) == PlayerInfo[playerid][pPass])
                {
                    INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
                    GivePlayerMoney(playerid, PlayerInfo[playerid][pCash]);
                    ShowPlayerDialog(playerid, DIALOG_SUCCESS_2, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"You have successfully logged in!","Ok","");
                }
                else
                {
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_RED"You have entered an incorrect password.\n"COL_WHITE"Type your password below to login.","Login","Quit");
                }
                return 1;
            }
        }
    }
    return 1;
}
Instead of using the 'if' statement to define my dialogs, I've used cases as they seem to take less space and are supposedly 'faster'. The (!response) is the function if the first Button hasn't been clicked, it will then kick the player.

The if(!strlen(inputtext)) explains if nothing has been entered into the dialog (input), you would then be prompted to another dialog which shows you 'Incorrect Password'.

If all goes well, the function INI_Open is then 'executed' which loads and opens the Userfile. Once open, the function 'INI_WriteInt' is then called and starts writing the data into the userfile. The udb_hash would generate a hash code from the player's inputtext (what you've typed). And after all this is completed, it is then closed by 'INI_Close' function.

Once finished, you will then be prompted to the 'Login' dialog.


In 'DIALOG_LOGIN', if the response is false (you have clicked 'QUIT), you would then be kicked. If given the correct information (password provided), the INI_Parsefile function would then scan and load your player's data.

Step XI
Don't forget, you would need a way to save those variables. The OnPlayerDisconnect callback simply re-opens the files, write what-ever values which has been stored and then closes it.
pawn Code:
public OnPlayerDisconnect(playerid, reason)
{
    new INI:File = INI_Open(UserPath(playerid));
    INI_SetTag(File,"data");
    INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
    INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
    INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
    INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
    INI_Close(File);
    return 1;
}
Step XII
Finally, add this to OnPlayerDeath to add value(s) to kills and deaths.

pawn Code:
public OnPlayerDeath(playerid, killerid, reason)
{
    PlayerInfo[killerid][pKills]++;
    PlayerInfo[playerid][pDeaths]++;
    return 1;
}
Downloads:
y_ini - https://sampforum.blast.hk/showthread.php?tid=175565
Pastebin - http://pastebin.com/r4htbbcJ

Full Package - http://www.sendspace.com/file/ca1jvf


Credits:
****** - y_ini.



Re: Login and Register System - Dialogs - Using Y_INI - Black_Death - 31.07.2011

Great job


Re: Login and Register System - Dialogs - Using Y_INI - Tyler_Cordwell - 31.07.2011

nice guide i will learn it right now


Re: Login and Register System - Dialogs - Using Y_INI - Kush - 31.07.2011

Thanks!


Re: Login and Register System - Dialogs - Using Y_INI - kingchandio - 31.07.2011

wow very nice i was looking for easy tutorial now i can learn y_ini thank you so much you are helpul guy... how can up ur repu?


Re: Login and Register System - Dialogs - Using Y_INI - Basicz - 31.07.2011

@kingchandio, just press the star button at below of his avatar ( below : Reputation: 10 ).

NICE, now I got my script working again after I used my sucky stock :\

pawn Code:
reputation[ Kush ] ++;
TIP: Explain more parts!


Re: Login and Register System - Dialogs - Using Y_INI - Kush - 31.07.2011

Quote:
Originally Posted by Basicz
View Post
@kingchandio, just press the star button at below of his avatar ( below : Reputation: 10 ).

NICE, now I got my script working again after I used my sucky stock :\

pawn Code:
reputation[ Kush ] ++;
TIP: Explain more parts!
I've done them in the previous tutorial, no one cares but to download the .pwn file.


Re: Login and Register System - Dialogs - Using Y_INI - kingchandio - 31.07.2011

one little problem i have added /kill cmd and i entered 5 times but still my data on dissconnect looks

Quote:

[data]
Password = 104268307
Cash = 0
Admin = 0
Kills = 0
Deaths = 0




Re: Login and Register System - Dialogs - Using Y_INI - Kush - 31.07.2011

Quote:
Originally Posted by kingchandio
View Post
one little problem i have added /kill cmd and i entered 5 times but still my data on dissconnect looks
PHP Code:
CMD:kill(playeridparams[])
{
    
PlayerInfo[playerid][pDeaths]++;
    return 
1;

You have to be killed by a player in order for the value to change.

The command given would be an example of being killed by a player, only in command form


Re: Login and Register System - Dialogs - Using Y_INI - kingchandio - 31.07.2011

oh i see thanks


Re: Login and Register System - Dialogs - Using Y_INI - Dan. - 01.08.2011

Huh, hello again Kush, I keep having problems with your REGISTER/LOGIN scripts, take a look at this:

pawn Code:
(242) : error 017: undefined symbol "UserPath"
(244) : error 017: undefined symbol "UserPath"
(245) : error 017: undefined symbol "DIALOG_LOGIN"
(245) : warning 215: expression has no effect
(245) : error 001: expected token: ";", but found "-string-"
(245) : warning 215: expression has no effect
(245) : error 001: expected token: "-string end-", but found "-identifier-"
(245) : fatal error 107: too many error messages on one line
And here are the lines:

pawn Code:
public OnPlayerConnect(playerid)
{
    if(fexist(UserPath(playerid))) // 242
    {
        INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid); // 244
       ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_WHITE"Type your password below to login.","Login","Quit"); //245
    }
    else
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Registering...",""COL_WHITE"Type your password below to register a new account.","Register","Quit");
    }
    return 1;
}
I guess the errors are because DIALOG_LOGIN and UserPath are not defined, but take a look at this:

pawn Code:
// Register system things
#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_SUCCESS_1 3
#define DIALOG_SUCCESS_2 4

#define UserPath "/Users/%s.ini"
The #define UserPath was "PATH" before.. changed it but still the same thing, so maybe you could help. And dont offer me your pastebin version, not going to copy my whole script into there, so some help, please.


Re: Login and Register System - Dialogs - Using Y_INI - Snowman12 - 01.08.2011

Nice tutorial but i dont know if i missed anything but when the player registers he can play once logged in but when he goes t login a second time the password come up wrong time and time again can you help?

Thanks


Re: Login and Register System - Dialogs - Using Y_INI - Shockey HD - 01.08.2011

Quote:
Originally Posted by Snowman12
View Post
Nice tutorial but i dont know if i missed anything but when the player registers he can play once logged in but when he goes t login a second time the password come up wrong time and time again can you help?

Thanks
Are you sure you have your scriptfile correctly?


Re: Login and Register System - Dialogs - Using Y_INI - Shockey HD - 01.08.2011

Quote:
Originally Posted by Dan.
View Post
Huh, hello again Kush, I keep having problems with your REGISTER/LOGIN scripts, take a look at this:

pawn Code:
(242) : error 017: undefined symbol "UserPath"
(244) : error 017: undefined symbol "UserPath"
(245) : error 017: undefined symbol "DIALOG_LOGIN"
(245) : warning 215: expression has no effect
(245) : error 001: expected token: ";", but found "-string-"
(245) : warning 215: expression has no effect
(245) : error 001: expected token: "-string end-", but found "-identifier-"
(245) : fatal error 107: too many error messages on one line
And here are the lines:

pawn Code:
public OnPlayerConnect(playerid)
{
    if(fexist(UserPath(playerid))) // 242
    {
        INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid); // 244
       ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_WHITE"Type your password below to login.","Login","Quit"); //245
    }
    else
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Registering...",""COL_WHITE"Type your password below to register a new account.","Register","Quit");
    }
    return 1;
}
I guess the errors are because DIALOG_LOGIN and UserPath are not defined, but take a look at this:

pawn Code:
// Register system things
#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_SUCCESS_1 3
#define DIALOG_SUCCESS_2 4

#define UserPath "/Users/%s.ini"
The #define UserPath was "PATH" before.. changed it but still the same thing, so maybe you could help. And dont offer me your pastebin version, not going to copy my whole script into there, so some help, please.
I will show you mine.

pawn Code:
#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_SUCCESS_1 3
#define DIALOG_SUCCESS_2 4

#define PATH "/Users/%s.ini"

#define COL_WHITE "{FFFFFF}"
#define COL_RED "{F81414}"
#define COL_GREEN "{00FF22}"
#define COL_LIGHTBLUE "{00CED1}"
#define COLOR_RED 0xAA3333AA
#define COLOR_LIGHTBLUE 0x00BFFFFF
pawn Code:
public OnPlayerConnect(playerid)
{
    if(fexist(UserPath(playerid)))
    {
        INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_WHITE"Type your password below to login.","Login","Quit");
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Registering...",""COL_WHITE"Type your password below to register a new account.","Register","Quit");
    }
    return 1;
}
Make sure you have your includes correct.

pawn Code:
#include <YSI\y_ini>
Only an idiot cant fuck this up.


Re: Login and Register System - Dialogs - Using Y_INI - Kush - 01.08.2011

Quote:
Originally Posted by Dan.
View Post
Huh, hello again Kush, I keep having problems with your REGISTER/LOGIN scripts, take a look at this:

pawn Code:
(242) : error 017: undefined symbol "UserPath"
(244) : error 017: undefined symbol "UserPath"
(245) : error 017: undefined symbol "DIALOG_LOGIN"
(245) : warning 215: expression has no effect
(245) : error 001: expected token: ";", but found "-string-"
(245) : warning 215: expression has no effect
(245) : error 001: expected token: "-string end-", but found "-identifier-"
(245) : fatal error 107: too many error messages on one line
And here are the lines:

pawn Code:
public OnPlayerConnect(playerid)
{
    if(fexist(UserPath(playerid))) // 242
    {
        INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid); // 244
       ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_WHITE"Type your password below to login.","Login","Quit"); //245
    }
    else
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Registering...",""COL_WHITE"Type your password below to register a new account.","Register","Quit");
    }
    return 1;
}
I guess the errors are because DIALOG_LOGIN and UserPath are not defined, but take a look at this:

pawn Code:
// Register system things
#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_SUCCESS_1 3
#define DIALOG_SUCCESS_2 4

#define UserPath "/Users/%s.ini"
The #define UserPath was "PATH" before.. changed it but still the same thing, so maybe you could help. And dont offer me your pastebin version, not going to copy my whole script into there, so some help, please.
The main idea for this tutorial was to explain the uses of each method used, including the different callbacks, functions, and responses. This is the same tutorial as my SII, only it's done in Y_INI and a few things has been changed. Either download the .pwn and see how everything is placed, or actually READ what I have written.


Re: Login and Register System - Dialogs - Using Y_INI - jot16 - 02.08.2011

I got this error.
Quote:

C:\Users\Jot\Desktop\SAMP Server\gamemodes\Banda.pwn(4) : fatal error 100: cannot read from file: "YSI\y_ini"

Compilation aborted.Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase


1 Error.

here are my includes.





Re: Login and Register System - Dialogs - Using Y_INI - Shockey HD - 02.08.2011

Quote:
Originally Posted by jot16
View Post
I got this error.


here are my includes.


Make sure you open the .pwn file from the correct Compiler. So instead of double clicking .pwn go to Pawno.exe then open the .pwn


Re: Login and Register System - Dialogs - Using Y_INI - jot16 - 02.08.2011

I don't want to open but fix my error.i just showed the pic's to show my includes.


Re: Login and Register System - Dialogs - Using Y_INI - Shockey HD - 02.08.2011

Quote:
Originally Posted by jot16
View Post
I don't want to open but fix my error.i just showed the pic's to show my includes.
Did i just tell you a way to fix it?

Make sure you open the .pwn file from the correct Compiler. So instead of double clicking .pwn go to Pawno.exe then open the .pwn


Re: Login and Register System - Dialogs - Using Y_INI - jot16 - 02.08.2011

i want u to fix my warnings.plz