Решено проблемы со спавном игрока после смерти

Добро пожаловать!

Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.

Зарегистрироваться!
  • Если Вы желаете помогать развитию проекта, готовы заполнять раздел(-ы) и подсказывать другим пользователям на портале, есть возможность попасть в команду редакторов. Для этого следует обратиться в техническую поддержку
Статус
В этой теме нельзя размещать новые ответы.
Пользователь
Регистрация
23 Май 2024
Сообщения
11
Всем привет. Создаю мод с нуля по гайдам, в своем роде я новичок. Столкнулся с проблемой: после того как я умер, в моем случае, разбился насмерть, я появляюсь не на месте спавна, а на кольце grove в скине CJ.
Подскажите, как эту проблему можно преодолеть? в OnPlayerSpawn я задаю координаты спавна игроку.

onPlayerSpawn:
public OnPlayerSpawn(playerid)
{
        if(!temp_player_info[playerid][pLogged] && !RegSkinChoose[playerid])
        {
                SCM(playerid, COLOR_RED, "[Ошибка] {ffffff}Вы не авторизованы на сервере.");
                return KickPlayer(playerid);
        }
        
        SetPlayerInterior(playerid, 0);
        SetPlayerVirtualWorld(playerid, 0);
        switch(random(2))
        {
                case 0:
                {
                        SetPlayerPos(playerid, 1940.9644, -1288.7435, 15.3792);
                        SetPlayerFacingAngle(playerid, 1.8388);
                }
                case 1:
                {
                        SetPlayerPos(playerid, 1953.0961, -1289.0625, 15.3858);
                        SetPlayerFacingAngle(playerid, 90.0);
                }
                case 2:
                {
                        SetPlayerPos(playerid, 1952.4254, -1280.3700, 15.3858);
                        SetPlayerFacingAngle(playerid, 90.0);
                }
        }
        FreezePlayer(playerid, 2000);
        SetCameraBehindPlayer(playerid);
        SetPlayerSkin(playerid, player_info[playerid][pSkin]);
        SetPlayerScore(playerid, player_info[playerid][pLvl]);
        SetPlayerColor(playerid, NAME_DEFAULT);
}

SpawnInfo при авторизации игрока на сервере есть.
AddPlayerClass в modinit добавил.
 
Решение
Для ответа как решение:
Проблема была в том, что в функции OnPlayerRequestClass не было функции, определяющей дальнейшую информации о спавне.

Решение:
Pawn:
public OnPlayerRequestClass(playerid, classid)
{
    SetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
   
    SpawnPlayer(playerid);
    return 1;
}
Пользователь
Регистрация
23 Май 2024
Сообщения
11
@maxshtorm, то, что мелькает пустота - это нормально. Всегда так было и всегда так будет. Со скином. в OnPlayerRequestClass в SetSpawnInfo можешь поменять ноль на player_info[playerid][pSkin]. Не могу сказать точно, поможет или нет, но все же.

Было:
Pawn:
SetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
Стало:
Pawn:
SetSpawnInfo(playerid, NO_TEAM, player_info[playerid][pSkin], 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
это скорее всего момент, когда игрок спавнится на нулевых после spawninfo, а потом я его перемещаю на свои коорды. сейчас в спавнинфо поставил координаты своего спавна, и этот момент ушел. вообще, нужно ли перед каждый спавном выставлять спавнинфо?
 
Создатель WayDev
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,041
@maxshtorm, вообще, SetSpawnInfo выставляется всего один раз - в OnPlayerRequest.
Если хочешь сделать нормальный код без появления с пустотой - вынеси весь код из OnPlayerSpawn в отдельный сток.
Пример:
Pawn:
stock SetPlayerSpawn(playerid) {
    if(RegSkinChoose[playerid])
    {   
        SetPlayerPos(playerid, 180.0744, -88.2218, 1002.0234);
        SetPlayerFacingAngle(playerid, 90.2070);
        SetPlayerSkin(playerid, RegSkins[player_info[playerid][pSex] - 1][0]);
        SetPlayerInterior(playerid, 18);
        SetPlayerVirtualWorld(playerid, random(100));
        SetPlayerCameraPos(playerid, 175.5338,-88.3811,1001.8047);
        SetPlayerCameraLookAt(playerid, 180.0744, -88.2218, 1002.0234);
    
        for(new i = 0; i < sizeof(TD_RegSkin); i++) TextDrawShowForPlayer(playerid, TD_RegSkin[i]);
        SelectTextDraw(playerid, 0xc74a46AA);
        return 1;
    }
 
    if(temp_player_info[playerid][pRecon])
    {
        SetPlayerInterior(playerid, temp_player_info[playerid][pInt]);
        SetPlayerVirtualWorld(playerid, temp_player_info[playerid][pWorld]);
        SetPlayerPos(playerid, temp_player_position[playerid][0], temp_player_position[playerid][1], temp_player_position[playerid][2]);
        SetPlayerFacingAngle(playerid, temp_player_position[playerid][3]);
        SetCameraBehindPlayer(playerid);
        SetPlayerSkin(playerid, player_info[playerid][pSkin]);
        SetPlayerScore(playerid, player_info[playerid][pLvl]);
        SetPlayerColor(playerid, NAME_DEFAULT);
    
        temp_player_info[playerid][pRecon] = false;
        temp_player_info[playerid][pInt] = 0;
        temp_player_info[playerid][pWorld] = 0;
        for(new i = 0; i < sizeof(temp_player_position[]); i++) temp_player_position[playerid][i] = 0;
        return 1;
    }
 
    SetPlayerInterior(playerid, 0);
    SetPlayerVirtualWorld(playerid, 0);
    switch(random(3))
    {
        case 0:
        {
            SetPlayerPos(playerid, 1940.9644, -1288.7435, 15.3792);
            SetPlayerFacingAngle(playerid, 1.8388);
        }
        case 1:
        {
            SetPlayerPos(playerid, 1953.0961, -1289.0625, 15.3858);
            SetPlayerFacingAngle(playerid, 90.0);
        }
        case 2:
        {
            SetPlayerPos(playerid, 1952.4254, -1280.3700, 15.3858);
            SetPlayerFacingAngle(playerid, 90.0);
        }
    }
    FreezePlayer(playerid, 2000);
    SetCameraBehindPlayer(playerid);
    SetPlayerSkin(playerid, player_info[playerid][pSkin]);
    SetPlayerScore(playerid, player_info[playerid][pLvl]);
    SetPlayerColor(playerid, NAME_DEFAULT);
}

public OnPlayerSpawn(playerid) {
    if(!temp_player_info[playerid][pLogged] && !RegSkinChoose[playerid])
    {
        SCM(playerid, COLOR_RED, "[Ошибка] {ffffff}Вы не авторизованы на сервере.");
        return KickPlayer(playerid);
    }

    //
    SetPlayerSpawn(playerid);
    //
 
    if(player_info[playerid][pAdminLvl] && !temp_player_info[playerid][pAdminAuth])
    {
        if(player_info[playerid][pAdminKey])
        {
            new dialog[104];
            format(dialog, sizeof(dialog),
            "{ffffff}Данный аккаунт является администратором сервера.\n\n\
            Для авторизации прав введите Ваш ключ:");
            SPD(playerid, DIALOG_ADMIN_AUTH, DIALOG_STYLE_PASSWORD, "{ff614f}#2 | {ffffff}Авторизация прав администратора {ff614f}| Ключ", dialog, "Войти", "Отмена");
        }
        else SCM(playerid, COLOR_BLUE, "[Подсказка] {ffffff}Для авторизации прав администратора используйте: {6eb9ff}/alogin{ffffff}.");
    }
    return 1;
}

UPD: в SetPlayerSpawn можешь избавиться от SetPlayerPos и SetPlayerFacingAngle. Создаешь три переменных float-типа и в нужных местах просто устанавливаешь нужное значение для переменной.

Пример:
Pawn:
stock SetPlayerSpawn(playerid) {
    new Float:pos[3], Float:facing_angle;
    switch(random(3))
    {
        case 0:
        {
            pos[0] = 1940.9644, pos[1] = -1288.7435, pos[2] = 15.3792;
            facing_angle = 1.8388;
        }
    }
    SetSpawnInfo(playerid, NO_TEAM, player_info[playerid][pSkin], pos[0], pos[1], pos[2], facing_angle, 0, 0, 0, 0, 0, 0);
    return 1;
}

В OnPlayerSpawn после этого уже устанавливаешь значение нужным тебе переменным. HP, сытость и т.д.
 
Создатель WayDev
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,041
Для ответа как решение:
Проблема была в том, что в функции OnPlayerRequestClass не было функции, определяющей дальнейшую информации о спавне.

Решение:
Pawn:
public OnPlayerRequestClass(playerid, classid)
{
    SetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
   
    SpawnPlayer(playerid);
    return 1;
}
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху