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

Статус
В этой теме нельзя размещать новые ответы.

Darge

Новичок
Автор темы
5
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);
    }
}

image.php


Но у нас может возникнуть некий баг, который будет заключаться в том, что если игрок с 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;
}
 
Последнее редактирование:

0pc0d3R

Потрачен
550
269
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
"используя макрос MAX_PLAYERS" :ROFLMAO: Подобных систем в паблике море, понт ещей сюда. Лучше бы что-то интересное замутил. Кода хуевая туча ради одного рандомного скина.
 

clicore

Известный
170
124
Что за описание такое?

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