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

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

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

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

    Регистрация:
    02.05.2015
    Сообщения:
    7
    Симпатии:
    0
    Репутация:
    0
    Автор: Darge

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

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

    // "Одет" ли наш игрок?
    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, чтобы не какать в коллбэках.

    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).

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

    Теперь нам надобно показать все, что мы сделали игроку. Пойдем опять же 'чистым' путем.
    Создадим функцию, в которой будут различные проверки и т.д. и т.п.
    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.
    Например:
    if(GetPVarInt(playerid, "Logged") == 0)
    {
        // над чем мы выполняем условие.
        return true;
    }
    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). В итоге у нас получится что то типа этого:
    public OnPlayerSpawn(playerid)
    {
        SetPlayerSpawn(playerid);
        return true;
    }
    Теперь заставим 'пробел' работать на нас. Ищем OnPlayerKeyStateChange(playerid, newkeys, oldkeys) и добавляем
    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
    stock ClearInfo(playerid)
    {
        PlayerSkin[playerid]    = 0;
        SelectSkin[playerid]    = 0;
    } 
    и в OnPlayerConnect(playerid) мы добавим имя этой функции. Выйдет примерно

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

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

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

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

    Регистрация:
    19.01.2015
    Сообщения:
    44
    Симпатии:
    2
    Репутация:
    0
    Что за описание такое?

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