Szia!
Gondolom már megvan, de én azért neked megírtam dinibe is ;)
-Létre kell hoznod a scriptfiles nevű mappába egy users mappád más dolgod nincs.
-A lényeg a kódban van:
#include <a_samp>
#include <dini>
new egyszer = 1; //Ha az érték 0 akkor minden egyes spawnolásnál oda rakja, ha 1 akkor csak csatlakozás után követő spawnolásnál
new File[128];
new spawn[MAX_PLAYERS];
public OnPlayerDisconnect(playerid)
{
format(File, sizeof(File), \"users/%s.ini\", pName(playerid));
if(!dini_Exists(File)) { dini_Create(File); }
new Float:x,Float:y,Float:z, interior;
GetPlayerPos(playerid,x,y,z); interior = GetPlayerInterior(playerid);
dini_IntSet(File,\"sx\",floatround(x));
dini_IntSet(File,\"sy\",floatround(y));
dini_IntSet(File,\"sz\",floatround(z));
dini_IntSet(File,\"sint\",interior);
dini_IntSet(File,\"swld\",GetPlayerVirtualWorld(playerid));
return 1;
}
public OnFilterScriptInit()
{
for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
{
spawn = 0;
}
return 1;
}
public OnPlayerConnect(playerid)
{
spawn[playerid]=0;
return 1;
}
public OnPlayerSpawn(playerid)
{
if(egyszer == 0 || (spawn[playerid] == 0 && egyszer == 1))
{
format(File, sizeof(File), \"users/%s.ini\", pName(playerid));
if(dini_Int(File,\"sx\") != 0)
{
SetPlayerPos(playerid,float(dini_Int(File,\"sx\")),float(dini_Int(File,\"sy\")),float(dini_Int(File,\"sz\")));
SetPlayerInterior(playerid,(dini_Int(File,\"sint\"))); SetPlayerVirtualWorld(playerid, (dini_Int(File,\"swld\")));
}
spawn[playerid]=1;
}
return 1;
}
stock pName(playerid)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
return name;
}
nem azért, de a dini-ben is van float mentés...felesleges a floatround.
szimplán dini_FloatSet
plusz a spawn-nál nem lesz pontos, mivel az int csak egész számokkal dolgozik (bár ez nem biztos.)..ott is dini_Float....
az meg, hogy minden játékosnak minden spawn-nál lekérdezze a fájlból az adatokat, az egy felesleges luxus, ami laggosítani fog...
és a GetPlayerPoolSize is felesleges, mivel valszeg nem menetközben fogja betölteni, hogy mentsen, hanem a szerver indulásakor, amikor még nincs játékos...
#include <a_samp>
#include <dini>
new fs[MAX_PLAYERS], Float:sX[MAX_PLAYERS], Float:sY[MAX_PLAYERS], Float:sZ[MAX_PLAYERS], Float:sAngle[MAX_PLAYERS], vw[MAX_PLAYERS], int[MAX_PLAYERS];
new pFile[64];
public OnPlayerSpawn(playerid)
{
switch(fs[playerid])
{
case 1:
{
SetPlayerPos(playerid, sX[playerid], sY[playerid], sZ[playerid]), SetPlayerFacingAngle(playerid, sAngle[playerid]);//csak akkor spawnolja a mentett pozícióra, mikor te akarod.
SetPlayerVirtualWorld(playerid, vw[playerid]), SetPlayerInterior(playerid, int[playerid]);
}
}
fs[playerid] = 0;//ez csak azért, ha pl van máshol SetPlayerPos, ami valszeg van, ne rakja át a játékost megint erre a pontra.
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
fs[playerid] = 1; //halál után a mentett helyre spawnol
return 1;
}
public OnPlayerConnect(playerid)
{
LoadData(playerid);
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
new Float:X, Float:Y, Float:Z, Float:Angle;
GetPlayerPos(playerid, X, Y, Z), GetPlayerFacingAngle(playerid, Angle);
format(pFile, sizeof(pFile), \"/users/%s.ini\", pName(playerid));
dini_FloatSet(pFile, \"spawnx\", X);
dini_FloatSet(pFile, \"spawny\", Y);
dini_FloatSet(pFile, \"spawnz\", Z);
dini_FloatSet(pFile, \"spawnangle\", Angle);
dini_IntSet(pFile, \"vw\", GetPlayerVirtualWorld(playerid));
dini_IntSet(pFile, \"int\", GetPlayerInterior(playerid));
printf(\"%s pozicióadatai sikeresen mentődtek!\", pName(playerid));
return 1;
}
stock LoadData(playerid)
{
format(pFile, sizeof(pFile), \"/users/%s.ini\", pName(playerid));
if(dini_Exists(pFile))
{
sX[playerid] = dini_Float(pFile, \"spawnx\");
sY[playerid] = dini_Float(pFile, \"spawny\");
sZ[playerid] = dini_Float(pFile, \"spawnz\");
sAngle[playerid] = dini_Float(pFile, \"spawnangle\");
int[playerid] = dini_Int(pFile, \"int\");
vw[playerid] = dini_Int(pFile, \"vw\");
}else
{
dini_Create(pFile);
}
return 1;
}
stock pName(playerid)
{
new name[32];
GetPlayerName(playerid, name, sizeof(name));
return name;
}