[POMOC]Save last position

Započeo Nadroj
28. Sep. 2013. Zaključano
417
pregleda
5
postova
ladolez
5
Underboss
28. Sep. 2013.
skripta: moja
opis problema:

naravio sam kad se diskonektuje sta da uradi i kad se konektuje ali tamo kad treba load files tu nzm sta da stavim

evo vam disconect da bi znali malo bolje o cemu se radi
public OnPlayerDisconnect(playerid, reason)
{
new
    Float:x,
    Float:y,
    Float:z;
GetPlayerPos(playerid, x, y, z);
    new INI:File = INI_Open(UserPath(playerid));
    INI_SetTag(File,"data");
    INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
    INI_WriteInt(File,"Admin",PlayerInfo);
    INI_WriteInt(File,"Kills",PlayerInfo);
    INI_WriteInt(File,"Deaths",PlayerInfo);
    INI_WriteFloat(File,"X", x);
    INI_WriteFloat(File,"Y", y);
    INI_WriteFloat(File,"Z", z);
    INI_Close(File);
    return 1;
}
Matorp
5
Underboss
28. Sep. 2013.
Evo nekako sam preveo:
uvođenje
Vidio sam mnogo ljudi ima problema sa štednje , utovar i postavljanju igrača poziciju . Ovaj tutorial će vas naučiti kako možete uštedjeti igrač poziciju u ini datoteci , učitavanje i postavljanje kad je ikra ( povratak na posljednju poziciju na kojoj ste bili kad ste odspojili ) .
Å to vam je potrebno
y_ini -najbrži i najučinkovitiji način za pisanje / čitanje iz datoteke koje Y_Less
Preuzimanje
Preuzimanje YSI poslužitelja uključuje .
Kopirajte / Izrežite " YSI " mapu na svoj ​​" .. pawno \ uključuju " katalog .
pokretanje

Da su y_ini na vrhu naše skripte .

pijun Code :
# uključiti

# Uključiti pojedine smjernice Umeće sadržaj određene datoteke u trenutnoj poziciji u trenutnoj datoteci . Više smjernice mogu se naći ovdje . U našem slučaju ona će se učitati sve kodove na " .. pawno \ \ uključuju YSI \ y_ini.inc " u scenarij , a to je ono što nam treba kako bismo mogli učitati y_ini značajke .

Idemo proglasi neke varijable negdje na vrhu naše skripte :

pijun Code :
novi
    Float : PosX [ MAX_PLAYERS ] ,
    Float : cvijet [ MAX_PLAYERS ] ,
    Float : PosZ [ MAX_PLAYERS ] ,
    Float : Kut [ MAX_PLAYERS ] ,
    Interijer [ MAX_PLAYERS ] ,
    VirtualWorld [ MAX_PLAYERS ]
;

" Novi" ključna riječ novu varijablu . Mi smo koristili unaprijed tag ime pod nazivom " Float ", koji će omogućiti pomičnim zarezom podršku za naše varijabli . Mi proglasio šest polja . Niz jepromjenjiva u kojem možete pohraniti više komada podataka odjednom i pristupiti im dinamično . Svaka varijabla ima niz stanica ( MAX_PLAYERS ) . Prvi će se održatiX koordinata igrača položaju ,drugi će se održatiY koordinata pozicije igrača ,treći će držite Z koordinate igrača položaju ,četvrti će se održati Angle koordinate igrača ,peti će se održati interijera ID igrača , aposljednja će se održati u virtualni svijet ID igrača . Idemo napraviti jednostavni dionica funkciju koja će vratiti direktorij gdjeigrač file ( koji će sadržavati koordinate položaja ) bit će spašen .

pijun Code :
dioničko user_ini_file ( playerid )
{
    novi
        string [ 128 ] ,
        korisničko_ime [ MAX_PLAYER_NAME ]
    ;

    GetPlayerName ( playerid , korisničko_ime , MAX_PLAYER_NAME ) ;
    format ( string , sizeof ( string ) , " % s.ini " , korisničko_ime ) ;
    / * Scriptfiles katalog * /
    povratak
        string ;
}

Dioničko funkcija jefunkcija kojapijun parser mora uključiti u program kada se koristi i da to jednostavno može " maknuti " iz programa ( bez upozorenja ) , kada se ne koristi . Da proglasiti dionica funkciju , prefiks funkcijsku ime s ključnom riječi skladištu . Javne funkcije i autohtoni funkcije ne može biti proglašen ' stock' .

Mi izjavljujemo niz zove string 128 stanica velike i još jednom zove korisničko_ime MAX_PLAYER_NAME stanice velika ( što znači 24 ( maksimalno ime igrača dužina u SA : MP ) ) . Mi smo dobili playerid ime GetPlayerName koristeći funkciju i pohraniti imena igrača u varijablu korisničko_ime , možemo oblikovati put i pohraniti ga u varijablu string , na kraju smo se vratili uzicu . Budući dase put spominje kao " % s.ini " ,korisnik će datoteka biti spremljena u " .. scriptfiles " direktorij .

Idemo napraviti jednostavni javnu funkciju za učitavanje korisničkih podataka iz spisa :

pijun Code :
prema naprijed @ load_user_position ( playerid , ime [ ] , value [ ] ) ;

@ load_user_position ( playerid , ime [ ] , value [ ] )
{
    INI_Float ( " PositionX " , PosX [ playerid ] ) ;
    INI_Float ( " PositionY " , cvijet [ playerid ] ) ;
    INI_Float ( " PositionZ " , PosZ [ playerid ] ) ;
    INI_Float ( " Angle " , Kut [ playerid ] ) ;
    INI_Int ( " unutarnjih " , Interijer [ playerid ] ) ;
    INI_Int ( " VirtualWorld " , VirtualWorld [ playerid ] ) ;
    povratak ( 1 ) ;
}

Javne funkcije mogu biti prefiksom strane ili javna @ ,@ znakova , kada se koristi , postaje dio naziva funkcije . INI_Float sprema prošao vrijednost kao float ako je ime utakmice , INI_Int -podaci proslijeđeni na utovar povratni kao string , to će ga pretvoriti u cijeli broj . Mi ćemo spasiti igrač položaj , interijer i virtualnom svijetu kada je rastaviti pa neka je pomaknite prema dolje do OnPlayerDisconnect por .

pijun Code :
javni OnPlayerDisconnect ( playerid , razlog )
{
    GetPlayerPos ( playerid , PosX [ playerid ] , cvijet [ playerid ] , PosZ [ playerid ] ) ;
    GetPlayerFacingAngle ( playerid , Kut [ playerid ] ) ;
    
    Novi INI : File = INI_Open ( user_ini_file ( playerid ) ) ;
    INI_SetTag ( datoteka , " pozicija" ) ;
    INI_WriteFloat ( datoteka , " PositionX " , PosX [ playerid ] ) ;
    INI_WriteFloat ( datoteka , " PositionY " , cvijet [ playerid ] ) ;
    INI_WriteFloat ( datoteka , " PositionZ " , PosZ [ playerid ] ) ;
    INI_WriteFloat ( datoteka , " Angle " , Kut [ playerid ] ) ;
    INI_WriteInt ( datoteka , " unutarnjih " , GetPlayerInterior ( playerid ) ) ;
    INI_WriteInt ( datoteka , " VirtualWorld " , GetPlayerVirtualWorld ( playerid ) ) ;
    INI_Close ( File ) ;
    povratak ( 1 ) ;
}

OnPlayerDisconnect povratni poziv se zove kadigrač prekida od poslužitelja , playerid jeid od igrača koji su napustili , a razlog id od razloga zašto su napustili .

Mi koristimo GetPlayerPos funkciju dobiti trenutnu poziciju igrača i spremite u varijabli " PosX , buket cvijeća i PosZ " . Mi koristimo GetPlayerFacingAngle funkciju dobiti kut smjeruigrač okrenut i pohraniti ga u varijablu " Angle " . Otvaramo / stvoriti korisničko datoteku koristeći INI_Open i naše dionice kao parametar . Pišemo na korisničkom " PositionX " odjeljakvrijednost pohranjena u varijablu PosX , pišemo na korisnika " PositionY " odjeljak vrijednost spremljenu u varijablu cvijet , na " PositionZ " odjeljakvrijednost pohranjena u varijablu " i " PosZ na "Angle " odjeljakvrijednost pohranjena u varijablu kuta , na " unutarnjih " odjeljakvrijednosti vraćene od strane GetPlayerInterior funkcije , na " VirtualWorld " diovrijednosti koju vraća GetPlayerVirtualWorld funkciji . Nakon što su vrijednosti je pisani smo zatvorili korisnički datoteku koristeći INI_Close , možemo vratiti pravu vrijednost . Moramo učitati korisnički poziciju iz spisa kad spaja pa neka je pomicanje na OnPlayerConnect por .

pijun Code :
javni OnPlayerConnect ( playerid )
{
    PosX [ playerid ] = 0;
    Cvijet [ playerid ] = 0;
    PosZ [ playerid ] = 0;
    Kut [ playerid ] = 0 ;
    Interijer [ playerid ] = 0 ;
    VirtualWorld [ playerid ] = 0;
    
    INI_ParseFile ( user_ini_file ( playerid ) , " load_user_ % s " , bextra = istina , pomoćni = playerid . . ) ;
    povratak ( 1 ) ;
}

OnPlayerConnect povratni poziv se zove kadigrač spoji na server , playerid jeID od igrača koji je spajao . Mi resetiranje uređaja varijable prvi , e koristiti INI_ParseFile da izdvoji svoje ini datoteku ( učitavanje svoje podatke ) , kad se mrijesti trebamo postaviti svoj ​​položaj , interijer i virtualni svijet pa neka je pomaknite prema dolje do OnPlayerSpawn povratni poziv .

pijun Code :
javni OnPlayerSpawn ( playerid )
{
    if ( PosX [ playerid ] ! = 0 && cvijet [ playerid ] ! = 0 && PosZ [ playerid ] ! = 0 && Kut [ playerid ] ! = 0 )
    {
        SetPlayerPos ( playerid , PosX [ playerid ] , cvijet [ playerid ] , PosZ [ playerid ] ) ;
        SetPlayerFacingAngle ( playerid , Kut [ playerid ] ) ;
        SetPlayerInterior ( playerid , Interijer [ playerid ] ) ;
        SetPlayerVirtualWorld ( playerid , VirtualWorld [ playerid ] ) ;
        SendClientMessage ( playerid , -1 , " DobrodoÅ¡li na zadnjem mjestu " ) ;
    }
    povratak ( 1 ) ;
}

OnPlayerSpawn povratni poziv se zove kadigrač mrijesti , playerid jeID od igrača koji izrodile .

Kada jeprvi igrač spoji na server , njegov PosX , buket cvijeća , PosZ i kut varijable će biti 0 . Operator " ! = " Znači " nije jednako lijeva na desno " . Mi smo provjerili naše varijable nije jednaka 0 , ako je tako možemo postaviti igrač položaj koristeći SetPlayerPos funkciju , postavili smo svoj ​​kut pomoću SetPlayerFacingAngle funkciju , postavili smo svoju unutrašnjost koristeći SetPlayerInterior funkciju , postavili smo svoj ​​virtualni svijet koristeći SetPlayerVirtualWorld funkciju , a mi ga poslati jednostavna poruka pomoću SendClientMessage funkciju .

To je sve , tvoj scenarij bi trebao izgledati ovako :

pijun Code :
# uključiti
# uključiti

novi
    Float : PosX [ MAX_PLAYERS ] ,
    Float : cvijet [ MAX_PLAYERS ] ,
    Float : PosZ [ MAX_PLAYERS ] ,
    Float : Kut [ MAX_PLAYERS ] ,
    Interijer [ MAX_PLAYERS ] ,
    VirtualWorld [ MAX_PLAYERS ]
;

dioničko user_ini_file ( playerid )
{
    novi
        string [ 128 ] ,
        korisničko_ime [ MAX_PLAYER_NAME ]
    ;

    GetPlayerName ( playerid , korisničko_ime , MAX_PLAYER_NAME ) ;
    format ( string , sizeof ( string ) , " % s.ini " , korisničko_ime ) ;
    / * Scriptfiles katalog * /
    povratak
        string ;
}

prema naprijed @ load_user_position ( playerid , ime [ ] , value [ ] ) ;

@ load_user_position ( playerid , ime [ ] , value [ ] )
{
    INI_Float ( " PositionX " , PosX [ playerid ] ) ;
    INI_Float ( " PositionY " , cvijet [ playerid ] ) ;
    INI_Float ( " PositionZ " , PosZ [ playerid ] ) ;
    INI_Float ( " Angle " , Kut [ playerid ] ) ;
    INI_Int ( " unutarnjih " , Interijer [ playerid ] ) ;
    INI_Int ( " VirtualWorld " , VirtualWorld [ playerid ] ) ;
    povratak ( 1 ) ;
}

javni OnPlayerDisconnect ( playerid , razlog )
{
    GetPlayerPos ( playerid , PosX [ playerid ] , cvijet [ playerid ] , PosZ [ playerid ] ) ;
    GetPlayerFacingAngle ( playerid , Kut [ playerid ] ) ;
    
    Novi INI : File = INI_Open ( user_ini_file ( playerid ) ) ;
    INI_SetTag ( datoteka , " pozicija" ) ;
    INI_WriteFloat ( datoteka , " PositionX " , PosX [ playerid ] ) ;
    INI_WriteFloat ( datoteka , " PositionY " , cvijet [ playerid ] ) ;
    INI_WriteFloat ( datoteka , " PositionZ " , PosZ [ playerid ] ) ;
    INI_WriteFloat ( datoteka , " Angle " , Kut [ playerid ] ) ;
    INI_WriteInt ( datoteka , " unutarnjih " , GetPlayerInterior ( playerid ) ) ;
    INI_WriteInt ( datoteka , " VirtualWorld " , GetPlayerVirtualWorld ( playerid ) ) ;
    INI_Close ( File ) ;
    povratak ( 1 ) ;
}

javni OnPlayerConnect ( playerid )
{
    PosX [ playerid ] = 0;
    Cvijet [ playerid ] = 0;
    PosZ [ playerid ] = 0;
    Kut [ playerid ] = 0 ;
    Interijer [ playerid ] = 0 ;
    VirtualWorld [ playerid ] = 0;
    
    INI_ParseFile ( user_ini_file ( playerid ) , " load_user_ % s " , bextra = istina , pomoćni = playerid . . ) ;
    povratak ( 1 ) ;
}

javni OnPlayerSpawn ( playerid )
{
    if ( PosX [ playerid ] ! = 0 && cvijet [ playerid ] ! = 0 && PosZ [ playerid ] ! = 0 )
    {
        SetPlayerPos ( playerid , PosX [ playerid ] , cvijet [ playerid ] , PosZ [ playerid ] ) ;
        SetPlayerFacingAngle ( playerid , Kut [ playerid ] ) ;
        SetPlayerInterior ( playerid , Interijer [ playerid ] ) ;
        SetPlayerVirtualWorld ( playerid , VirtualWorld [ playerid ] ) ;
        SendClientMessage ( playerid , -1 , " DobrodoÅ¡li na zadnjem mjestu " ) ;
    }
    povratak ( 1 ) ;
}

File ini korisnik će izgledati ovako :

Å ifra :
[ Položaj ]
PositionX = 171.252197
PositionY = -72,037948
PositionZ = 2.210306
Angle = 150.401428
Interijer = 3
VirtualWorld = 0
Matorp
5
Underboss
28. Sep. 2013.
I jel si uspio?
ladolez
5
Underboss
28. Sep. 2013.
ali ovo je drugacije od onoga sto ja imam.
//Credits to Y_Less, Dracoblue and Kush.

#include
#include

#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}"

enum pInfo
{
    pPass,
    pCash,
    pAdmin,
    pKills,
    pDeaths,
    pX,
    pY,
    pZ
}
new PlayerInfo;

forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
    INI_Int("Password",PlayerInfo);
    INI_Int("Cash",PlayerInfo);
    INI_Int("Admin",PlayerInfo);
    INI_Int("Kills",PlayerInfo);
    INI_Int("Deaths",PlayerInfo);
    INI_Float("X",PlayerInfo);
    INI_Float("Y",PlayerInfo);
    INI_Float("Z",PlayerInfo);
    return 1;
}

stock UserPath(playerid)
{
    new string,playername;
    GetPlayerName(playerid,playername,sizeof(playername));
    format(string,sizeof(string),PATH,playername);
    return string;
}

/*Credits to Dracoblue*/
stock udb_hash(buf[]) {
    new length=strlen(buf);
    new s1 = 1;
    new s2 = 0;
    new n;
    for (n=0; n    {
      s1 = (s1 + buf) % 65521;
      s2 = (s2 + s1)    % 65521;
    }
    return (s2 << 16) + s1;
}

main()
{
        print("\n----------------------------------");
        print(" Blank Gamemode by your name here");
        print("----------------------------------\n");
}

public OnGameModeInit()
{
        SetGameModeText("Golden Bomb v1.0.0");
        return 1;
}

public OnGameModeExit()
{
        return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
        return 1;
}

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"Ukucajte sifru da se ulogujete.","Login","Quit");
    }
    else
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Registrovanje...",""COL_WHITE"Ukucajte sifru da se registrujete.","Register","Quit");
    }
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
new
    Float:x,
    Float:y,
    Float:z;
GetPlayerPos(playerid, x, y, z);
    new INI:File = INI_Open(UserPath(playerid));
    INI_SetTag(File,"data");
    INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
    INI_WriteInt(File,"Admin",PlayerInfo);
    INI_WriteInt(File,"Kills",PlayerInfo);
    INI_WriteInt(File,"Deaths",PlayerInfo);
    INI_WriteFloat(File,"X", x);
    INI_WriteFloat(File,"Y", y);
    INI_WriteFloat(File,"Z", z);
    INI_Close(File);
    return 1;
}

public OnPlayerSpawn(playerid)
{
        return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    PlayerInfo++;
    PlayerInfo++;
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
        return 1;
}

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

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

public OnPlayerCommandText(playerid, cmdtext[])
{
        if (strcmp("/mycommand", cmdtext, true, 10) == 0)
        {
                // Do something here
                return 1;
        }
        return 0;
}

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[])
{
    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, 1721.8395, -1629.8204, 20.2139, 269.15, 0, 0, 0, 0, 0, 0);
                SpawnPlayer(playerid);
                ShowPlayerDialog(playerid, DIALOG_SUCCESS_1, DIALOG_STYLE_MSGBOX,""COL_WHITE"Uspesno!",""COL_GREEN"Sledi tutorial!","Ok","");
                }
        }

        case DIALOG_LOGIN:
        {
            if ( !response ) return Kick ( playerid );
            if( response )
            {
                if(udb_hash(inputtext) == PlayerInfo)
                {
                    INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
                    GivePlayerMoney(playerid, PlayerInfo);
                    ShowPlayerDialog(playerid, DIALOG_SUCCESS_2, DIALOG_STYLE_MSGBOX,""COL_WHITE"Uspesno!",""COL_GREEN"Uspesno ste se ulogovali!","Ok","");
                }
                else
                {
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_RED"Pogresna sifra.\n"COL_WHITE"Ukucajte sifru da se ulogujete.","Login","Quit");
                }
                return 1;
            }
        }
    }
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
        return 1;
}
ladolez
5
Underboss
28. Sep. 2013.
bump

Morate biti prijavljeni da biste odgovorili na ovu temu.

Prijava

© 2026 SmartShark. All rights reserved.

Powered by Momentum|v2026.3.001 Alpha