GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Segítségkérés => A témát indította: BarnyBoy - 2015. szeptember 02. - 19:42:31

Cím: Dini utolsó pozi mentése és betöltése
Írta: BarnyBoy - 2015. szeptember 02. - 19:42:31
Sziasztok!
Úgy szeretném megoldani, hogy ha egy játékos kilép, akkor elmentse a helyét, és amikor visszalép oda dobja vissza!
Cím: Dini utolsó pozi mentése és betöltése
Írta: ZyZu. - 2015. szeptember 02. - 23:10:45
MySQL nem lenne jobb?
Cím: Dini utolsó pozi mentése és betöltése
Írta: BarnyBoy - 2015. szeptember 03. - 18:31:30
Fogalmam sincs, hogy hogyan kell használni. :(
Amúgy miért jobb?
Cím: Dini utolsó pozi mentése és betöltése
Írta: zsoolt997 - 2015. szeptember 03. - 18:52:28
Egyszer
Kétszer
Ezeknél van újabb verzió is már, a Google a barátod. :)
Cím: Dini utolsó pozi mentése és betöltése
Írta: _[G]M[K]_Sh1ft_ - 2015. szeptember 03. - 22:46:55
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;
}
Cím: Dini utolsó pozi mentése és betöltése
Írta: huhboy - 2015. szeptember 03. - 23:57:10
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;
}
Cím: Dini utolsó pozi mentése és betöltése
Írta: _[G]M[K]_Sh1ft_ - 2015. szeptember 04. - 16:32:07
Idézetet írta: JustaCube date=1441317430\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"57615\" data-ipsquote-contentclass=\"forums_Topic
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...
Tisztelettel, de ez az állítás szerintem nem állja meg a helyét, mivel tesztelés céljából bármikor bárki használhatja.
A többi jogos és valóban nem laggoltatja annyira. ()
 
nem azért, de a dini-ben is van float mentés...felesleges a floatround. [/quote]
Igen tudok róla, csak egy scriptemből vettem ki és nem figyeltem oda :shurg: Csak szerettem volna a kérdésre választ adni.
További szép napot! / Jó hétvégét! ;)