Question

Когда игрок впервые респавнится, его выкидывает в выбор класса, хотя я везде проставил TogglePlayerSpectating. После того, как он заспавнится, у него сбрасывается админка(SetPlayerTeam) и несколько переменных(PVar). После этого игрок нормально респавнится с сохранением всех параметров. Но когда игрок делает смену класса через F4 игрок зависает и показывается надпись Loading...

Доп вопрос: что быстрее работает, PVar или Enum?

 

Спойлер

public OnPlayerConnect(playerid)
{
    new playername[MAX_PLAYER_NAME], string[128], victim;
    GetPlayerName(playerid, playername, MAX_PLAYER_NAME);
    for(new i; i < 20; i++) if(!strcmp(playername, sessionbanlist[i], true))
    {
        SendClientMessage(playerid, COLOR_DENY, "Âû çàáàíåíû íà ýòîì ñåðâåðå!");
        GameTextForPlayer(playerid, "You are banned!"30006);
        return SetTimerEx("KickTimer"10000"d", playerid);
    }
    for(new i; i < 10; i++) SetPlayerMapIcon(playerid, i, mapmarkers[i][0], mapmarkers[i][1], 0, mapmarkers[i][2], -1);
    IncPVarInt(playerid, PVAR_LOGIN_ATTEMPTS); // макрос который заменяет PlayerInfo[pid]++
    TogglePlayerSpectating(playerid, true);
    victim = RandomPlayer();
    if(victim != -1) PlayerSpectatePlayer(playerid, victim);
    SendClientMessage(playerid, RandomColor(0xAA), "Äîáðî ïîæàëîâàòü íà LSF!");
    SetSpawnInfo(playerid, 000000000000);
    format(string, 128"HNS1/players/%s.ini", playername);
    if(fexist(string)) return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Àâòîðèçàöèÿ""Äîáðî ïîæàëîâàòü!\nÂàø àêêàóíò åñòü â áàçå äàííûõ.\nÂâåäèòå ñâîé ïàðîëü.""Èãðàòü""Õ");
    else return ShowPlayerDialog(playerid, DIALOG_REGISTRATION, DIALOG_STYLE_INPUT, "Ðåãèñòðàöèÿ""Äîáðî ïîæàëîâàòü!\nÂàøåãî àêêàóíòà íåò â áàçå äàííûõ.\n\
    Ââåäèòå ïàðîëü äëÿ ðåãèñòðàöèè.\n í¸ì ìîæåò áûòü îò 8 äî 63 ñèìâîëîâ.""Èãðàòü""Õ");
}

public OnPlayerRequestClass(playerid, classid) return SpawnPlayer(playerid);

public OnPlayerSpawn(playerid)
{
    SetPlayerColor(playerid, RandomColor(0x99));
    TogglePlayerSpectating(playerid, false);
    SetPlayerPos(playerid, spawn[0], spawn[1], spawn[2]);
    return SetPlayerSkin(playerid, random(312));
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == DIALOG_LOGIN)
    {
        if(response) LoginPlayer(playerid, inputtext);
        else Kick(playerid);
    }
    else if(dialogid == DIALOG_REGISTRATION)
    {
        if(response) RegisterPlayer(playerid, inputtext);
        else Kick(playerid);
    }
    ...
}


 

Спойлер

stock LoginPlayer(playerid, password[])
{
    if(!LoadPlayer(playerid)) return 1;
    new pass[64];
    GetPVarString(playerid, PVAR_PASS, pass, 64);
    if(!strcmp(password, pass) && strlen(password) > 7) SpawnPlayer(playerid);
    else
    {
        if(GetPVarInt(playerid, PVAR_LOGIN_ATTEMPTS) < LOGIN_MAX_ATTEMPTS)
        {
            IncPVarInt(playerid, PVAR_LOGIN_ATTEMPTS);
            new msg[144];
            format(msg, 144"Ïàðîëü íåâåðåí!\nÓ âàñ îñòàëîñü åù¸ %d ïîïûòîê äî òîãî, êàê âû áóäåòå êèêíóòû.", (LOGIN_MAX_ATTEMPTS + 1) - GetPVarInt(playerid, PVAR_LOGIN_ATTEMPTS));
            return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Àâòîðèçàöèÿ", msg, "Èãðàòü""Õ");
        }
        SetTimerEx("KickTimer"10000"d", playerid);
        GameTextForPlayer(playerid, "Busted"50002);
        return ShowInfo(playerid, "Àâòîðèçàöèÿ""Ïàðîëü íåâåðåí\nÂû êèêíóòû çà ïîäáîð ïàðîëÿ.");
    }
    return GameTextForPlayer(playerid, "Welcome to LSF!"30006);
}

stock RegisterPlayer(playerid, password[])
{
    if(IsPlayerConnected(playerid))
    {
        if(strlen(password) < 8 || strlen(password) > 63)
        {
            SetTimerEx("KickTimer"10000"d", playerid);
            GameTextForPlayer(playerid, "Busted"50002);
            return ShowInfo(playerid, "Îøèáêà""Ïàðîëü áîëüøå 63 èëè ìåíüøå 8 ñèìâîëîâ!");
        }
        new playername[MAX_PLAYER_NAME], string[64];
        GetPlayerName(playerid, playername, MAX_PLAYER_NAME);
        format(string, 64"HNS1/players/%s.ini", playername);
        new iniFile = ini_createFile(string);
        if(iniFile < 0)
        {
            iniFile = ini_openFile(string);
        }
        if(iniFile >= 0)
        {
            ini_setString(iniFile, "password", password);
            ini_closeFile(iniFile);
        }
        SendClientMessage(playerid, RandomColor(0xAA), "Âû óñïåøíî çàðåãèñòðèðîâàëèñü è ìîæåòå èãðàòü!");
        SpawnPlayer(playerid);
        GameTextForPlayer(playerid, "Welcome to LSF!"30006);
        GivePlayerMoney(playerid, 1000);
        SetPVarInt(playerid, PVAR_MEDS, 3);
        SetPVarInt(playerid, PVAR_REPS, 3);
        SavePlayer(playerid);
    }
    return 1;
}

stock SavePlayer(pid)
{
    if(IsPlayerConnected(pid))
    {
        new playername[MAX_PLAYER_NAME], string[64];
        GetPlayerName(pid, playername, MAX_PLAYER_NAME);
        format(string, 64"HNS1/players/%s.ini", playername);
        new ini = ini_createFile(string);
        if(ini < 0)
        {
            ini = ini_openFile(string);
        }
        if(ini >= 0)
        {
            ini_setInteger(ini, "money",        GetPlayerMoney(pid));
            ini_setInteger(ini, "score",        GetPlayerScore(pid));
            ini_setInteger(ini, "medicine_kit", GetPVarInt(pid, PVAR_MEDS));
            ini_setInteger(ini, "repair_kit",   GetPVarInt(pid, PVAR_REPS));
            ini_setInteger(ini, "weather_wand", GetPVarInt(pid, PVAR_WEAS));
            ini_setInteger(ini, "time_wand",    GetPVarInt(pid, PVAR_TIMS));
            ini_setInteger(ini, "fav01",        GetPVarInt(pid, PVAR_FAV_01));
            ini_setInteger(ini, "fav02",        GetPVarInt(pid, PVAR_FAV_02));
            ini_setInteger(ini, "fav03",        GetPVarInt(pid, PVAR_FAV_03));
            ini_setInteger(ini, "fav04",        GetPVarInt(pid, PVAR_FAV_04));
            ini_setInteger(ini, "fav05",        GetPVarInt(pid, PVAR_FAV_05));
            ini_setInteger(ini, "fav06",        GetPVarInt(pid, PVAR_FAV_06));
            ini_setInteger(ini, "fav07",        GetPVarInt(pid, PVAR_FAV_07));
            ini_setInteger(ini, "fav08",        GetPVarInt(pid, PVAR_FAV_08));
            ini_setInteger(ini, "fav09",        GetPVarInt(pid, PVAR_FAV_09));
            ini_setInteger(ini, "fav10",        GetPVarInt(pid, PVAR_FAV_10));
            ini_closeFile(ini);
        }
        return 1;
    }
    else return 0;
}

stock LoadPlayer(pid)
{
    if(IsPlayerConnected(pid))
    {
        new playername[MAX_PLAYER_NAME], string[64];
        GetPlayerName(pid, playername, MAX_PLAYER_NAME);
        format(string, 64"HNS1/players/%s.ini", playername);
        new ini = ini_createFile(string);
        if(ini < 0)
        {
            ini = ini_openFile(string);
        }
        if(ini >= 0)
        {
            new money, score, meds, reps, weas, tims, pass[64];
            new fav01, fav02, fav03, fav04, fav05, fav06, fav07, fav08, fav09, fav10;
            ini_getInteger(ini, "money", money);        GivePlayerMoney(pid, money);
            ini_getInteger(ini, "score", score);        SetPlayerScore(pid, score);
            ini_getInteger(ini, "medicine_kit", meds);  SetPVarInt(pid, PVAR_MEDS, meds);
            ini_getInteger(ini, "repair_kit", reps);    SetPVarInt(pid, PVAR_REPS, reps);
            ini_getInteger(ini, "weather_wand", weas);  SetPVarInt(pid, PVAR_WEAS, weas);
            ini_getInteger(ini, "time_wand", tims);     SetPVarInt(pid, PVAR_TIMS, tims);
            ini_getString (ini, "password", pass);      SetPVarString(pid, PVAR_PASS, pass);
            ini_getInteger(ini, "fav01", fav01);        SetPVarInt(pid, PVAR_FAV_01, fav01);
            ini_getInteger(ini, "fav02", fav02);        SetPVarInt(pid, PVAR_FAV_02, fav02);
            ini_getInteger(ini, "fav03", fav03);        SetPVarInt(pid, PVAR_FAV_03, fav03);
            ini_getInteger(ini, "fav04", fav04);        SetPVarInt(pid, PVAR_FAV_04, fav04);
            ini_getInteger(ini, "fav05", fav05);        SetPVarInt(pid, PVAR_FAV_05, fav05);
            ini_getInteger(ini, "fav06", fav06);        SetPVarInt(pid, PVAR_FAV_06, fav06);
            ini_getInteger(ini, "fav07", fav07);        SetPVarInt(pid, PVAR_FAV_07, fav07);
            ini_getInteger(ini, "fav08", fav08);        SetPVarInt(pid, PVAR_FAV_08, fav08);
            ini_getInteger(ini, "fav09", fav09);        SetPVarInt(pid, PVAR_FAV_09, fav09);
            ini_getInteger(ini, "fav10", fav10);        SetPVarInt(pid, PVAR_FAV_10, fav10);
            ini_closeFile(ini);
        }
        return 1;
    }
    else return 0;
}

 

 

Share this post


Link to post

3 answers to this question

  • 0
8 часов назад, KlasterK сказал:

что быстрее работает, PVar или Enum

Работа с переменными всегда быстрее, чем с нативными функциями, которые, вдобавок, под капотом скрывают ассоциативный массив.

 

8 часов назад, KlasterK сказал:

public OnPlayerSpawn(playerid)
{
    SetPlayerPos(playerid, spawn[0], spawn[1], spawn[2]);

}

Это неправильный подход. Перед тем, как возрождать игрока посредством spawnPlayer (либо неявными путями), вы должны установить параметры этого возрождения, используя SetSpawnInfo

 

8 часов назад, KlasterK сказал:

игрок зависает и показывается надпись Loading

Есть такой косяк у игры, что описанная ситуация возникает при ряде обстоятельств. Чаще всего помогает добавление класса по умолчанию. Если в OnGameModeInit нет вызова следующей функции, добавьте. Понятия не имею, почему это происходит и как это работает, но обычно помогает. А вообще процесс входа в игру и возрождения полон чудес...

AddPlayerClass(00.00.00.00.0000000);

 

Share this post


Link to post
  • 0

@Cawfee 

Оказалось, что в проблеме с PVar оказался mxINI, не знаю как так получилось. Теперь при нажатии F4 появляется насыщенность и кнопки << >> Spawn. При нажатии последней, игрок нормально спавнится. Проблему с админкой буду решать, используя PVar.

 

Еще вопрос есть: когда я ввожу строку, то компилятор ругается на Input line too long. Я этого избегаю, используя массив, а потом загружаю его в обычную строку в OnGameModeInit. Можно ли как-то удалить этот массив строк?  Есть другие способы?

#define Load(%0for(new i; i < sizeof _%0; i++) strcat(%0, _%0[i])

static const _problem_stroka[][] =
{
    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n",
    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n",
    "ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n"
}
static problem_stroka;

public OnGameModeInit()
{
    Load(problem_stroka);
}

CMD:stroka(playerid, params[])
{
    return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Problem Stroka", problem_stroka, "X""X");
}

 

Share this post


Link to post
  • 0

@KlasterK, у стандартного компилятора есть лимит на длину строки. Используйте компилятор от Zeex, где этот лимит увеличен. И тогда сможете писать следующим образом:

static const TOO_LONG_TEXT[] = !"\
    П Е Р В А Я  С Т Р О К А  С Л И Ш К О М  Д Л И Н Н О Г О  М А С С И В А  Т Е К С Т А\
    В Т О Р А Я  С Т Р О К А  С Л И Ш К О М  Д Л И Н Н О Г О  М А С С И В А  Т Е К С Т А\
    Т Р Е Т Ь Я  С Т Р О К А  С Л И Ш К О М  Д Л И Н Н О Г О  М А С С И В А  Т Е К С Т А\
\
    П Е Р В А Я  С Т Р О К А  С Л И Ш К О М  Д Л И Н Н О Г О  М А С С И В А  Т Е К С Т А\
    В Т О Р А Я  С Т Р О К А  С Л И Ш К О М  Д Л И Н Н О Г О  М А С С И В А  Т Е К С Т А\
    Т Р Е Т Ь Я  С Т Р О К А  С Л И Ш К О М  Д Л И Н Н О Г О  М А С С И В А  Т Е К С Т А\
\
    П Е Р В А Я  С Т Р О К А  С Л И Ш К О М  Д Л И Н Н О Г О  М А С С И В А  Т Е К С Т А\
    В Т О Р А Я  С Т Р О К А  С Л И Ш К О М  Д Л И Н Н О Г О  М А С С И В А  Т Е К С Т А\
    Т Р Е Т Ь Я  С Т Р О К А  С Л И Ш К О М  Д Л И Н Н О Г О  М А С С И В А  Т Е К С Т А\
";

 

Share this post


Link to post
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • phizlfs
      By phizlfs
      Привет! У меня небольшая проблема. Дело в том, что когда я подключаюсь к серверу у меня вылетает текстдрав, а точнее только box(черная, прозрачная штука). Я в коннект вписал скрытие всех текстдравов игроку - не помогло, пробовал делать это стоком - не помогло, пробовал вместо for(new i... просто в столбик по порядку всё писать - не помогло. Кто знает, в чем может быть проблема? Заранее огромное спасибо.