How to save previous position? (Y_INI)
#1

Creating a new script, how do I save players previous position?
Here's what I have as a script already;

pawn Код:
#include <a_samp>
#include <YSI\y_ini>

native WP_Hash(buffer[],len,const str[]);

enum pInfo
{
    Pass[129],
    pAdmin,
    pVIP,
    pMoney,
    pScore,
    pKills,
    pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];

forward loadaccount_user(playerid, name[], value[]);
public loadaccount_user(playerid, name[], value[])
{
    INI_String("Password", PlayerInfo[playerid][Pass],129);
    INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
    INI_Int("VIP",PlayerInfo[playerid][pVIP]);
    INI_Int("Money",PlayerInfo[playerid][pMoney]);
    INI_Int("Score",PlayerInfo[playerid][pScore]);
    INI_Int("Kills",PlayerInfo[playerid][pKills]);
    INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);
    return 1;
}

#define DIALOG_REGISTER                     (1)
#define DIALOG_LOGIN                        (2)
#define UserPath "Users/%s.ini"

main()
{
    print("\n----------------------------------");
    print(" Changeme");
    print("----------------------------------\n");
}

public OnGameModeInit()
{
    SetGameModeText("L:RP v0.1");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

public OnPlayerConnect(playerid)
{
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    if(fexist(Path(playerid)))
    {
        INI_ParseFile(Path(playerid),"loadaccount_%s", .bExtra = true, .extra = playerid);
        ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Welcome back. This account is registered. \nInsert your password to login to your account","Login","Quit");
    }
    else
    {
        ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Register","Welcome! This account is not registered.\nEnter your own password to create a new account.","Register","Quit");
        return 1;
    }
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
        new INI:file = INI_Open(Path(playerid));
        INI_SetTag(file,"Player's Data");
        INI_WriteInt(file,"Admin",PlayerInfo[playerid][pAdmin]);
        INI_WriteInt(file,"VIP",PlayerInfo[playerid][pVIP]);
        INI_WriteInt(file,"Money",GetPlayerMoney(playerid));
        INI_WriteInt(file,"Scores",GetPlayerScore(playerid));
        INI_WriteInt(file,"Kills",PlayerInfo[playerid][pKills]);
        INI_WriteInt(file,"Deaths",PlayerInfo[playerid][pDeaths]);
        INI_Close(file);
        return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    PlayerInfo[killerid][pKills]++;
    PlayerInfo[playerid][pDeaths]++;
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == DIALOG_REGISTER)
    {
        if(!response) return Kick(playerid);
        if(response)
        {
            if(!strlen(inputtext))
            {
                ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Register","Welcome! This account is not registered.\nEnter your own password to create a new account.\nPlease enter the password!","Register","Quit");
                return 1;
            }
            new hashpass[129];
            WP_Hash(hashpass,sizeof(hashpass),inputtext);
            new INI:file = INI_Open(Path(playerid));
            INI_SetTag(file,"Player's Data");
            INI_WriteString(file,"Password",hashpass);
            INI_WriteInt(file,"Admin",0);
            INI_WriteInt(file,"VIP",0);
            INI_WriteInt(file,"Money",0);
            INI_WriteInt(file,"Score",0);
            INI_WriteInt(file,"Kills",0);
            INI_WriteInt(file,"Deaths",0);
            INI_Close(file);
            SendClientMessage(playerid,-1,"You have been successfully registered");
            return 1;
        }
    }
    if(dialogid == DIALOG_LOGIN)
    {
        if(!response) return Kick(playerid);
        if(response)
        {
            new hashpass[129];
            WP_Hash(hashpass,sizeof(hashpass),inputtext);
            if(!strcmp(hashpass, PlayerInfo[playerid][Pass], false))
            {
                INI_ParseFile(Path(playerid),"loadaccount_%s",.bExtra = true, .extra = playerid);
                SetPlayerScore(playerid,PlayerInfo[playerid][pScore]);
                GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
                SendClientMessage(playerid,-1,"Welcome back! You have successfully logged in");
            }
            else
            {
                ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Welcome back. This account is registered. \nInsert your password to login to your account.\nIncorrect password!","Login","Quit");
                return 1;
            }
        }
    }
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

stock Path(playerid)
{
    new str[128],name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(str,sizeof(str),UserPath,name);
    return str;
}
Reply
#2

You need to take some more considerations into account such as.

Player logged in? Save stats else do nothing.
Is INI a good choice? mysql/sqlite is the better choice.
Reply
#3

Do you mean like Save, Load, and Set Player Position ? ;

Like This :-

You'll need Y_INI Includes,
Код:
#include <YSI\y_ini>
New Variable,
pawn Код:
new
    Float: PosX[ MAX_PLAYERS ],
    Float: PosY[ MAX_PLAYERS ],
    Float: PosZ[ MAX_PLAYERS ],
    Float: Angle[ MAX_PLAYERS ],
    Interior[ MAX_PLAYERS ],
    VirtualWorld[ MAX_PLAYERS ]
;
Stock Function,
pawn Код:
stock user_ini_file(playerid)
{
    new
        string[ 128 ],
        user_name[ MAX_PLAYER_NAME ]
    ;

    GetPlayerName( playerid, user_name, MAX_PLAYER_NAME );
    format( string, sizeof ( string ), "%s.ini", user_name );
    /* scriptfiles directory */
    return
        string;
}
Simple Public Function to Load the User Data from File,
pawn Код:
forward @load_user_position( playerid, name[], value[] );

@load_user_position( playerid, name[], value[] )
{
    INI_Float( "PositionX", PosX[ playerid ] );
    INI_Float( "PositionY", PosY[ playerid ] );
    INI_Float( "PositionZ", PosZ[ playerid ] );
    INI_Float( "Angle", Angle[ playerid ] );
    INI_Int( "Interior", Interior[ playerid ] );
    INI_Int( "VirtualWorld", VirtualWorld[ playerid ] );
    return ( 1 );
}
On OnPlayerDisconnect Callback,
pawn Код:
public OnPlayerDisconnect( playerid, reason )
{
    GetPlayerPos( playerid, PosX[ playerid ], PosY[ playerid ], PosZ[ playerid ] );
    GetPlayerFacingAngle( playerid, Angle[ playerid ] );
   
    new INI:File = INI_Open( user_ini_file( playerid ) );
    INI_SetTag( File, "position" );
    INI_WriteFloat( File, "PositionX", PosX[ playerid ] );
    INI_WriteFloat( File, "PositionY", PosY[ playerid ] );
    INI_WriteFloat( File, "PositionZ", PosZ[ playerid ] );
    INI_WriteFloat( File, "Angle", Angle[ playerid ] );
    INI_WriteInt( File, "Interior", GetPlayerInterior( playerid ) );
    INI_WriteInt( File, "VirtualWorld", GetPlayerVirtualWorld( playerid ) );
    INI_Close( File );
    return ( 1 );
}
On OnPlayerConnect Callback,
pawn Код:
public OnPlayerConnect( playerid )
{
    PosX[ playerid ] = 0;
    PosY[ playerid ] = 0;
    PosZ[ playerid ] = 0;
    Angle[ playerid ] = 0;
    Interior[ playerid ] = 0;
    VirtualWorld[ playerid ] = 0;
   
    INI_ParseFile( user_ini_file( playerid ), "load_user_%s", .bExtra = true, .extra = playerid );
    return ( 1 );
}
On OnPlayerSpawn Callback,
pawn Код:
public OnPlayerSpawn( playerid )
{
    if ( PosX[ playerid ] != 0 && PosY[ playerid ] != 0 && PosZ[ playerid ] != 0 )
    {
        SetPlayerPos( playerid, PosX[ playerid ], PosY[ playerid ], PosZ[ playerid ] );
        SetPlayerFacingAngle( playerid, Angle[ playerid ] );
        SetPlayerInterior( playerid, Interior[ playerid ] );
        SetPlayerVirtualWorld( playerid, VirtualWorld[ playerid ] );
        SendClientMessage( playerid, -1, "welcome to your last position" );
    }
    return ( 1 );
}
The "user.ini" File will look something like this :-
Код:
[position]
PositionX = 171.252197
PositionY = -72.037948
PositionZ = 2.210306
Angle = 150.401428
Interior = 3
VirtualWorld = 0
For More Information, Go Here :-
[Tutorial] Save, load and set player position - using y_ini
Reply
#4

Quote:
Originally Posted by [uL]Pottus
Посмотреть сообщение
You need to take some more considerations into account such as.

Player logged in? Save stats else do nothing.
Is INI a good choice? mysql/sqlite is the better choice.
I'm doing either INI or SQLite. Is SQLite the better choice?
Reply
#5

SQLite is by far the better choice of course INI is useful too and would work for this but your best to avoid it and just learn MySQL or SQLite I've said this a few times I wouldn't even consider using INI for anything anymore unless it really makes sense to use it. Once you get the taste for MySQL/SQLite you'll laugh at the fact you ever thought of using INI. But that doesn't mean I don't use the standard file functions fopen/fwrite for importing/exporting.

If you have a lot of static data to load at server start up then INI makes more sense for user stuff no thanks nothing beats queries.
Reply
#6

Quote:
Originally Posted by [uL]Pottus
Посмотреть сообщение
SQLite is by far the better choice of course INI is useful too and would work for this but your best to avoid it and just learn MySQL or SQLite I've said this a few times I wouldn't even consider using INI for anything anymore unless it really makes sense to use it. Once you get the taste for MySQL/SQLite you'll laugh at the fact you ever thought of using INI. But that doesn't mean I don't use the standard file functions fopen/fwrite for importing/exporting.

If you have a lot of static data to load at server start up then INI makes more sense for user stuff no thanks nothing beats queries.
Wow thanks for the information, so I can also use SQLite for Dynamic Doors and businesses and things like that?

Also, can you create a UCP or link player stats to a website with SQLite or do you need MySQL?
Reply
#7

SQLite is absolutely perfect for dynamic systems please read Konstantinos tutorial here

https://sampforum.blast.hk/showthread.php?tid=449536

I highly recommend using SQLitei (It's a absolute must have if your using SQLite)

https://sampforum.blast.hk/showthread.php?tid=303682

I think your taking the right direction, and better to take it early and learn this stuff then make a INI system you don't like and want to change to later that is a logical approach is it not?
Reply
#8

Quote:
Originally Posted by [uL]Pottus
Посмотреть сообщение
SQLite is absolutely perfect for dynamic systems please read Konstantinos tutorial here

https://sampforum.blast.hk/showthread.php?tid=449536

I highly recommend using SQLitei (It's a absolute must have if your using SQLite)

https://sampforum.blast.hk/showthread.php?tid=303682

I think your taking the right direction, and better to take it early and learn this stuff then make a INI system you don't like and want to change to later that is a logical approach is it not?
Yes of course it is. Thanks alot for the information, helps alot. I'd +rep you if I could.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)