Гайд Система определения скина

Тема в разделе "PAWN", создана пользователем Darge, 2 май 2015.

Статус темы:
Закрыта.
  1. Darge

    Darge Пользователь

    Регистрация:
    02.05.15
    Сообщения:
    7
    Лайки:
    0
    Репутация:
    0
    Автор: Darge

    Приветствую тебя, пользователь или гость. Хочу, так сказать, презентовать «систему определения скина». Что же значит "определения скина"? Это значит, что игрок не сам выбирает скин, он всего лишь получает его и не может его изменить во время выбора. Как говорится: "все уже предопределено". Система очень проста и разъяснять что и зачем, думаю, нет смысла. Система предназначается для death match серверов. Почему для них? Ответ прост. Когда игрок заходит на DM сервер, то он просто хочет расслабиться и я не стал его мучать, сделав определения скина за него. От туда же и клавиша "пробел", она большая и не промажешь :D Как выглядит система вы увидите на скринах(см. внизу).

    Добавим переменные, ко всем вашим переменным
    обычно это начало мода, сразу же после подключения инклюдов

    Код (PHP):
    // "Одет" ли наш игрок?
    new SelectSkin[MAX_PLAYERS];
    // Скин игрока
    new PlayerSkin[MAX_PLAYERS];
    // This is TextDraaaaaw.
    new Text:TD_start_game[MAX_PLAYERS][3];

    // Это у нас 'случайные' скины.
    new skin_id[16] ={
        6,
        10,
        11,
        14,
        15,
        21,
        23,
        47,
        48,
        53,
        54,
        60,
        65,
        73,
        86,
        144
    };

    // Спавны, куда мы будем отправлять игрока.
    new Float:SetBomjSpawn[15][4] = {
        {2437.9370,2152.0835,10.6719,180.84610},
        {-2741.8105,76.0795,4.6552,272.3497000},
        {1217.5394,198.5352,19.5469,276.465900},
        {1934.2500,-1694.3750,13.9022,0.000000},
        {284.8631,-1539.0864,24.5955,177.97290},
        {1433.5531,2652.1636,11.3926,0.1361000},
        {2825.7407,683.0803,26.7957,65.7584000},
        {2115.0928,2108.0674,10.6683,359.48960},
        {2005.9174,-1812.8058,13.3828,95.01900},
        {1742.9259,-1849.5238,13.5813,191.9153},
        {1700.5647,-1838.6420,13.5446,93.23010},
        {1176.3174,-1995.2849,69.0078,350.1873},
        {1185.3276,-2245.2124,30.7917,181.2249},
        {363.3900,-1658.9065,32.8831,239.63220},
        {-67.7387,-1119.9521,1.0781,154.524100}
    };
    Далее нам просто необходимо добавить наши TD(TextDraw'ы). Как вы наверно заметили, я создал переменную, используя макрос MAX_PLAYERS. То есть, я сделал эту переменную индивидуальной для использования. В коллбэке OnGameModeInit() использование таких переменных будет затруднительным, поэтому все наши TD буду загружаться при подключении игрока, т.е. мы запихнем наши TD в OnPlayerConnect(playerid). Я советую использовать stock, чтобы не какать в коллбэках.

    Код (PHP):
    stock ThisIsSelectPlayerSkin(playerid)
    {
        // Во время выбора скина при коннекте
        TD_start_game[playerid][0] = TextDrawCreate(394.650360, 398.224884, "usebox");
        TextDrawLetterSize(TD_start_game[playerid][0], 0.000000, -0.183332);
        TextDrawTextSize(TD_start_game[playerid][0], 235.000030, 0.000000);
        TextDrawAlignment(TD_start_game[playerid][0], 1);
        TextDrawColor(TD_start_game[playerid][0], 0);
        TextDrawUseBox(TD_start_game[playerid][0], true);
        TextDrawBoxColor(TD_start_game[playerid][0], -288382570);
        TextDrawSetShadow(TD_start_game[playerid][0], 0);
        TextDrawSetOutline(TD_start_game[playerid][0], 0);
        TextDrawFont(TD_start_game[playerid][0], 0);

        TD_start_game[playerid][1] = TextDrawCreate(228.199996, 381.937469, "This is your random skin");
        TextDrawLetterSize(TD_start_game[playerid][1], 0.334500, 1.442499);
        TextDrawAlignment(TD_start_game[playerid][1], 1);
        TextDrawColor(TD_start_game[playerid][1], -1);
        TextDrawSetShadow(TD_start_game[playerid][1], 1);
        TextDrawSetOutline(TD_start_game[playerid][1], 0);
        TextDrawBackgroundColor(TD_start_game[playerid][1], 255);
        TextDrawFont(TD_start_game[playerid][1], 2);
        TextDrawSetProportional(TD_start_game[playerid][1], 1);

        TD_start_game[playerid][2] = TextDrawCreate(292.449493, 403.187164, "~k~~PED_SPRINT~");
        TextDrawLetterSize(TD_start_game[playerid][2], 0.342649, 1.290686);
        TextDrawAlignment(TD_start_game[playerid][2], 1);
        TextDrawColor(TD_start_game[playerid][2], -1);
        TextDrawUseBox(TD_start_game[playerid][2], true);
        TextDrawBoxColor(TD_start_game[playerid][2], 0);
        TextDrawSetShadow(TD_start_game[playerid][2], 1);
        TextDrawSetOutline(TD_start_game[playerid][2], 0);
        TextDrawBackgroundColor(TD_start_game[playerid][2], 255);
        TextDrawFont(TD_start_game[playerid][2], 1);
        TextDrawSetProportional(TD_start_game[playerid][2], 1);
    }
    А вот теперь мы добавим ThisIsSelectPlayerSkin(playerid) в OnPlayerConnect(playerid).

    Код (PHP):
    public OnPlayerConnect(playerid)
    {
        // любой другой код
        ThisIsSelectPlayerSkin(playerid);
        return true;
    }
    Можно исполь и напрямую, но выйдет не красиво :(

    Теперь нам надобно показать все, что мы сделали игроку. Пойдем опять же 'чистым' путем.
    Создадим функцию, в которой будут различные проверки и т.д. и т.п.
    Код (PHP):
    stock SetPlayerSpawn(playerid)
    {
        if(<авторизованность> == 0)
        {
            ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"{FF6347}! {FFFFFF}Ошибка","{FFFFFF}Вы не можете начать игру, если вы не авторизовались / зарегистрировались", "Закрыть","");
            Kick(playerid);
            return true;
        }
        else
        {
            if(SelectSkin[playerid] == 0)
            {
                TogglePlayerControllable(playerid, 0);
                SetPlayerVirtualWorld(playerid,playerid+1);
                SetPlayerHealth(playerid,100);
                SetPlayerSkin(playerid,skin_id[random(sizeof(skin_id))]);
                TextDrawShowForPlayer(playerid, TD_start_game[playerid][0]);
                TextDrawShowForPlayer(playerid, TD_start_game[playerid][1]);
                TextDrawShowForPlayer(playerid, TD_start_game[playerid][2]);
                SetPlayerPos(playerid, 2000.9159,1539.7922,13.5859);
                SetPlayerFacingAngle(playerid,359.3946);
                SetPlayerCameraPos(playerid, 2002.6771, 1544.1106, 13.8058);
                SetPlayerCameraLookAt(playerid, 2002.3423, 1543.1702, 13.8308);
                SendClientMessage(playerid, -1, " {FFFF00}Мы рады, что ты зашел к нам на сервер!");
                SendClientMessage(playerid, -1, " {FFFF00}Это твой рандомный скин, если он тебе {FFFFFF}не понравился, {FFFF00}то сменить его ты сможешь в настройках.");
                SendClientMessage(playerid, -1, " {FFFF00}Для начала игры нажмите {FFFFFF}на пробел{FFFF00}.");
                SetPVarInt(playerid,"PST",1);
            }
            else
            {
                if(GetPVarInt(playerid, "PST") == 1)
                {
                    TextDrawHideForPlayer(playerid, TD_start_game[playerid][0]);
                    TextDrawHideForPlayer(playerid, TD_start_game[playerid][1]);
                    TextDrawHideForPlayer(playerid, TD_start_game[playerid][2]);
                }
                SetPlayerVirtualWorld(playerid,0);
                SetPlayerPos(playerid, SetBomjSpawn[random(sizeof(SetBomjSpawn))][0], SetBomjSpawn[random(sizeof(SetBomjSpawn))][1], SetBomjSpawn[random(sizeof(SetBomjSpawn))][2]);
                SetPlayerFacingAngle(playerid, SetBomjSpawn[random(sizeof(SetBomjSpawn))][3]);
                SetCameraBehindPlayer(playerid);
                SetPlayerHealth(playerid,100);
                // тут можно выдавать и оружие
                SetPlayerSkin(playerid,PlayerSkin[playerid]);
                TogglePlayerControllable(playerid, 1);
            }
        }
        return true;
    }
    <авторизованность> - это у нас как бы условия, что игрок авторизовался. Можно использовать или переменную, или PVar. Я использую обычно PVar.
    Например:
    Код (PHP):
    if(GetPVarInt(playerid, "Logged") == 0)
    {
        // над чем мы выполняем условие.
        return true;
    }
    Код (PHP):
    stock SetPlayerSpawn(playerid)
    {
        if(SelectSkin[playerid] == 0)
        {
            TogglePlayerControllable(playerid, 0);
            SetPlayerVirtualWorld(playerid,playerid+1);
            SetPlayerHealth(playerid,100);
            SetPlayerSkin(playerid,skin_id[random(sizeof(skin_id))]);
            TextDrawShowForPlayer(playerid, TD_start_game[playerid][0]);
            TextDrawShowForPlayer(playerid, TD_start_game[playerid][1]);
            TextDrawShowForPlayer(playerid, TD_start_game[playerid][2]);
            SetPlayerPos(playerid, 2000.9159,1539.7922,13.5859);
            SetPlayerFacingAngle(playerid,359.3946);
            SetPlayerCameraPos(playerid, 2002.6771, 1544.1106, 13.8058);
            SetPlayerCameraLookAt(playerid, 2002.3423, 1543.1702, 13.8308);
            SendClientMessage(playerid, -1, " {FFFF00}Мы рады, что ты зашел к нам на сервер!");
            SendClientMessage(playerid, -1, " {FFFF00}Это твой рандомный скин, если он тебе {FFFFFF}не понравился, {FFFF00}то сменить его ты сможешь в настройках.");
            SendClientMessage(playerid, -1, " {FFFF00}Для начала игры нажмите {FFFFFF}на пробел{FFFF00}.");

            SetPVarInt(playerid,"PST",1);
        }
        else
        {
            if(GetPVarInt(playerid, "PST") == 1)
            {
                TextDrawHideForPlayer(playerid, TD_start_game[playerid][0]);
                TextDrawHideForPlayer(playerid, TD_start_game[playerid][1]);
                TextDrawHideForPlayer(playerid, TD_start_game[playerid][2]);
            }
            SetPlayerPos(playerid, SetBomjSpawn[random(sizeof(SetBomjSpawn))][0], SetBomjSpawn[random(sizeof(SetBomjSpawn))][1], SetBomjSpawn[random(sizeof(SetBomjSpawn))][2]);
            SetPlayerFacingAngle(playerid, SetBomjSpawn[random(sizeof(SetBomjSpawn))][3]);
            SetCameraBehindPlayer(playerid);
            SetPlayerHealth(playerid,100);
            GivePlayerWeapon(playerid, 46, 1);
            SetPlayerLevel(playerid);
            SetPlayerSkin(playerid,pInfo[playerid][pSkin]);
            SetPlayerScore(playerid, pInfo[playerid][pLevel]);
            TogglePlayerControllable(playerid, 1);
        }
        return true;
    }

    И в OnPlayerSpawn(playerid) мы добавляем SetPlayerSpawn(playerid). В итоге у нас получится что то типа этого:
    Код (PHP):
    public OnPlayerSpawn(playerid)
    {
        SetPlayerSpawn(playerid);
        return true;
    }
    Теперь заставим 'пробел' работать на нас. Ищем OnPlayerKeyStateChange(playerid, newkeys, oldkeys) и добавляем
    Код (PHP):
    if(SelectSkin[playerid] == 0)
    {
        if(newkeys == KEY_SPRINT)
        {
            PlayerSkin = GetPlayerSkin(playerid);
            SetPlayerInterior(playerid, 0);
            SetPlayerVirtualWorld(playerid, 0);
            TogglePlayerControllable(playerid, 1);
            // <Выдадим авторизованность>
            SelectSkin[playerid] = 1;
            SpawnPlayer(playerid);
        }
    }

    [​IMG]

    Но у нас может возникнуть некий баг, который будет заключаться в том, что если игрок с ID, например, 228 вышел, а за ним зашел другой игрок, который получил бы этот же ID, то скин он тоже получит. Чтобы этого не присходило, давайте обнулим переменные. Опять же 'чистым' образом.
    Как вы могли заметить, я люблю расписывать, даже наипростейшие вещи :D
    Код (PHP):
    stock ClearInfo(playerid)
    {
        PlayerSkin[playerid]    = 0;
        SelectSkin[playerid]    = 0;
    }
    и в OnPlayerConnect(playerid) мы добавим имя этой функции. Выйдет примерно

    Код (PHP):
    public OnPlayerConnect(playerid)
    {
        ThisIsSelectPlayerSkin(playerid);
        ClearInfo(playerid);
        return true;
    }
     
    #1
    Последнее редактирование: 2 май 2015
  2. 0pc0d3R

    0pc0d3R Заблокирован

    Регистрация:
    27.12.14
    Сообщения:
    551
    Лайки:
    271
    Репутация:
    118
    "используя макрос MAX_PLAYERS" :rofl: Подобных систем в паблике море, понт ещей сюда. Лучше бы что-то интересное замутил. Кода хуевая туча ради одного рандомного скина.
     
    #2
  3. Morj

    Morj Активный пользователь

    Регистрация:
    19.01.15
    Сообщения:
    42
    Лайки:
    1
    Репутация:
    0
    Что за описание такое?

    Код (Text):
    // "Одет" ли наш игрок?
    new SelectSkin[MAX_PLAYERS];
    Это переменная! Она никак не может проверять, одет ли игрок. Я уверен, что автор данного мануала не ты.
     
    #3
Статус темы:
Закрыта.