Проблема с записью/чтением координат из файла.
#1

Вообщем решил недавно написать сохранение позиции игрока при выходе, т.е где игрок вышел там и появился. Собственно вот код:
PHP код:
public OnPlayerDisconnect(playeridreason)
{
    new 
pl[MAX_PLAYER_NAME];
    new 
str[256];
    new 
Float:X,Float:Y,Float:Z;
    
GetPlayerName(playerid,pl,MAX_PLAYER_NAME);
    
GetPlayerPos(playerid,X,Y,Z);
    
format(str,sizeof(str),"/pos/%s.ini",pl);
    new 
ini_createFile (str);
    if(
0)
        {
            
ini_openFile(str);
        }
    if(
>= 0)
        {
            new 
Float:PosX X;
            new 
Float:PosY Y;
            new 
Float:PosZ Z;
            
ini_setFloat(f,"X",PosX);
            
ini_setFloat(f,"Y",PosY);
            
ini_setFloat(f,"Z",PosZ);
            
ini_closeFile(f);
        }

PHP код:
public OnPlayerSpawn(playerid)
{
    new 
X,Y,Z;
    new 
pl[MAX_PLAYER_NAME];
    new 
str[256];
    
format(str,sizeof(str),"/pos/%s.ini",pl);
    new 
ini_openFile(str);
    new 
Float:PosX X;
    new 
Float:PosY Y;
    new 
Float:PosZ Z;
    
ini_getFloat(f,"X",PosX);
    
ini_getFloat(f,"Y",PosY);
    
ini_getFloat(f,"Z",PosZ);
    
ini_closeFile(f);
    
SetPlayerPos(playerid,X,Y,Z);
    
SpawnPlayer(playerid);
    
SetCameraBehindPlayer(playerid);
    return 
1;

Проверял, координаты записываются, но почему то игрок спавнится в нулевых координатах (в деревне Блуббери на поле). Пытался исправить, не получилось, все равно в нулевые координаты улетает. Помогите разобраться.
Reply
#2

Ах да, использую mxINI.
Reply
#3

а зачем ты в ключе и в значении записываешь координаты ? зачем это new X,Y,Z; , а потом зачем так делать?

new Float:PosX = X;
new Float:PosY = Y;
new Float:PosZ = Z;
и вот тут SetPlayerPos(playerid,X,Y,Z); почему ты не используешь SetPlayerPos(playerid,PosX,PosY,PosZ);
Reply
#4

Mr.Brooks, а как тогда по другому записать? Раз это не правильно:
Quote:

new Float:PosX = X;
new Float:PosY = Y;
new Float:PosZ = Z

Reply
#5

Help, все еще актуально. Помогите пожалуйста
Reply
#6

PHP код:
public OnPlayerDisconnect(playeridreason)
{
    new 
pl[MAX_PLAYER_NAME];
    new 
str[256];
    new 
Float:X,Float:Y,Float:Z;
    
GetPlayerName(playerid,pl,MAX_PLAYER_NAME);
    
GetPlayerPos(playerid,X,Y,Z);
    
format(str,sizeof(str),"/pos/%s.ini",pl);
    new 
ini_createFile (str);
    if(
0)
        {
            
ini_openFile(str);
        }
    if(
>= 0)
        {
            new 
Float:PosX X;
            new 
Float:PosY Y;
            new 
Float:PosZ Z;
            
ini_setFloat(f,"X",PosX);
            
ini_setFloat(f,"Y",PosY);
            
ini_setFloat(f,"Z",PosZ);
            
ini_closeFile(f);
        }

PHP код:
public OnPlayerSpawn(playerid)
{
    new 
pl[MAX_PLAYER_NAME];
    new 
str[256];
    
format(str,sizeof(str),"/pos/%s.ini",pl);
    new 
ini_openFile(str);
    new 
Float:PosX;
    new 
Float:PosY;
    new 
Float:PosZ;
    
ini_getFloat(f,"X",PosX);
    
ini_getFloat(f,"Y",PosY);
    
ini_getFloat(f,"Z",PosZ);
    
ini_closeFile(f);
    
SetPlayerPos(playerid,PosX,PosY,PosZ);
    
SpawnPlayer(playerid);
    
SetCameraBehindPlayer(playerid);
    return 
1;

Reply
#7

Проблема так и не решена, при успешной авторизации меня не спавнит, если нажать кнопку "Spawn", то спавнит в нулевый координатах. Что делать, что бы все было нормально? Меня по началу вообще кикало, но поставил SetSpawnInfo, перестало.
Reply
#8

А mxINI работает с директориями? Не, не слышал.
Reply
#9

Путь к файлу задан не правильно, слэш вначале означает путь от корня раздела.
Далее, в OnPlayerSpawn такая лажа: format(str,sizeof(str),"/pos/%s.ini",pl); где pl пустое значение...
Вот, улучшил:
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    new pl[MAX_PLAYER_NAME],
        str[256];
    GetPlayerName(playerid,pl,MAX_PLAYER_NAME);
    format(str,sizeof(str),"pos/%s.ini",pl);
    new f = ini_createFile(str);
    if(f < 0)
    {
        f = ini_openFile(str);
    }
    if(f >= 0)
    {
        new Float:pos[3];
        GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
        ini_setFloat(f,"X",pos[0]);
        ini_setFloat(f,"Y",pos[1]);
        ini_setFloat(f,"Z",pos[2]);
        ini_closeFile(f);
    }
}

public OnPlayerSpawn(playerid)
{
    new pl[MAX_PLAYER_NAME],
        str[256],
        Float:pos[3];
    GetPlayerName(playerid,pl,MAX_PLAYER_NAME);
    format(str,sizeof(str),"pos/%s.ini",pl);
    new f = ini_openFile(str);
    ini_getFloat(f,"X",pos[0]);
    ini_getFloat(f,"Y",pos[1]);
    ini_getFloat(f,"Z",pos[2]);
    ini_closeFile(f);
    SetPlayerPos(playerid,pos[0],pos[1],pos[2]);
   
    // совсем не нужны в данном примере
    //SpawnPlayer(playerid);
    //SetCameraBehindPlayer(playerid);
    return 1;
}
Reply
#10

PHP код:
public OnPlayerDisconnect(playeridreason)
{
    new
        
name[MAX_PLAYER_NAME],
        
string[MAX_PLAYER_NAME+10]; // почему "+10" ? потому что "pos/%s.ini" с полной выкладкой не займет больше чем 34 символа
        
    
GetPlayerNameplayeridnameMAX_PLAYER_NAME ); // узнаем как зовут игрока
    
formatstringsizeof( string ),"pos/%s.ini"name ); // задаем путь к файлу
    
    
new
        
iniKey ini_createFile( string ); // пытаемся создать файл
    
    
if( iniKey INI_OK iniKey ini_openFile( string ); // если код ошибки меньше чем OK, то пытаемся открыть файл
    
    
if( iniKey >= INI_OK // если код ошибки больше или OK, то ошибок нет (:
    
{
        new
            
FloatplayerPos[4];
            
        
GetPlayerPosplayeridplayerPos[0], playerPos[1], playerPos[2] ); // получаем координаты
        
GetPlayerFacingAngleplayeridplayerPos[3] ); // получаем угол поворота головы
        
        
ini_setFloatiniKey,    "X",        playerPos[0] ); // запишем в файл...
        
ini_setFloatiniKey,    "Y",        playerPos[1] ); // запишем в файл...
        
ini_setFloatiniKey,    "Z",        playerPos[2] ); // запишем в файл...
        
ini_setFloatiniKey,    "R",        playerPos[3] ); // запишем в файл...
        
ini_setIntegeriniKey,    "isUse",     true ); // запишем в файл флаг, информирующий о том что игрок покинул сервер
    
}
    
    
ini_closeFileiniKey ); // убиваем ключ, сохраняем файл
    
    
return 1;
}
public 
OnPlayerSpawn(playerid)
{
    new
        
name[MAX_PLAYER_NAME],
        
string[MAX_PLAYER_NAME+10], // почему "+10" ? потому что "pos/%s.ini" с полной выкладкой не займет больше чем 34 символа
        
f_use// флаг использования функции
    
GetPlayerNameplayeridnameMAX_PLAYER_NAME ); // узнаем как зовут игрока
    
formatstringsizeof( string ),"pos/%s.ini"name ); // задаем путь к файлу
    
    
new
        
iniKey ini_openFile( string ); // пытаемся открыть файл
    
if( iniKey INI_OK ) goto quit_s// если код ошибки меньше чем OK, то уходим в конец функции методом goto;
    
    
ini_getIntegeriniKey"isUse"f_use ); // получим флаг
    
    
if( f_use // если игок только зашел на сервер, и еще не спавнился ->
    
{
        new
            
FloatplayerPos[4];
        
ini_getFloatiniKey,    "X",        playerPos[0] ); // получаем из файла...
        
ini_getFloatiniKey,    "Y",        playerPos[1] ); // получаем из файла...
        
ini_getFloatiniKey,    "Z",        playerPos[2] ); // получаем из файла...
        
ini_getFloatiniKey,    "R",        playerPos[3] ); // получаем из файла...
        
SetPlayerPosplayeridplayerPos[0], playerPos[1], playerPos[2] ); // перемещаем игрока
        
SetPlayerFacingAngleplayeridplayerPos[3] ); // поворачиваем голову
        
        
ini_setIntegeriniKey"isUse"false ); // ! установим флаг чтобы игрок больше не спавнился на этих координатах (эффект будет только при перезаходе)
    
}
    
    
quit_s// метод goto;
    
ini_closeFileiniKey ); // убиваем ключ, сохраняем файл
    
return 1;

Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)