Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Система мусорных баков

#pragma

Компетентный
Доброго времени суток форум!
Хочу поделиться с вами системой мусорных баков.
Суть такова. Игрок подходит к мусорному баку, нажимает кнопку ALT, и рандомно находит еду, чем собственно пополняет сытость или здоровье.


ПРИСТУПИМ



​
Ко всем переменным добавим переменную таймера, которая будут хранить его ID.
PHP:
new TrashTimer[MAX_PLAYER];
Далее добавим макросы для удобства.

PHP:
#define TRASH_TEXT "Мусорный бак\nНажмите [ ALT ]"
#define MAX_TRASH (7)
#define TRASH_OBJECT (1345)
В начало мода добавим массив, которых хранит в себе координаты мусорных баков.
PHP:
static const TrashInfo[MAX_TRASH][4] = {
    /* X             Y          Z             A*/
    {1162.66504, -1761.55530, 13.34980,     89.99999},
    {1410.96045, -1716.00952, 13.29405,     84.17999},
    {1764.65918, -1906.39929, 13.30363,     179.99995},
    {1974.91711, -1451.63123, 13.33228,     0.00000},
    {-1980.91663, 121.65891,  27.43907,     -90.42000},
    {-2634.46484, 630.87225,  14.20443,     0.00000},
    {2794.02686,  1303.98474, 10.65669,     180.05995}
};
Далее в OnGameModeInit Добавим загрузку мусорных баков из массива.
PHP:
for(new index; index < sizeof(TrashInfo); index++) // Пеербераем массив TrashInfo
{
    CreateObject(TRASH_OBJECT, TrashInfo[index][0], TrashInfo[index][1], TrashInfo[index][2], 0.00000, 0.00000, TrashInfo[index][3]); // Создаем объект мусорки
    Create3DTextLabel(TRASH_TEXT, -1, TrashInfo[index][0], TrashInfo[index][1], TrashInfo[index][2]+1, 5.0, 0); // Создаем текст над мусоркой
}
Далее в OnPlayerKeyStateChange добавим действие по нажатию клавиши ALT (KEY_WALK)
PHP:
if(newkeys & KEY_WALK)
{
    for(new index; index < sizeof(TrashInfo); index++)
    {
        if(!IsPlayerInRangeOfPoint(playerid, 1.5, TrashInfo[index][0], TrashInfo[index][1], TrashInfo[index][2])) continue; // Проверяем находится ли игрок рядом с баком

        if(/* Ваш массив сытости или здоровья */ >= 100)
            return SendClientMessage(playerid, -1, "Вы не голодны!");

        if(GetPVarInt(playerid, "eat_time") > gettime())
            return SendClientMessage(playerid, -1, "Бесплатная еда доступна раз в минуту"); // Ограничение использование бака раз в минуту.

        TrashTimer[playerid] = SetTimerEx("@_random_foods", 1000*5, false, "i", playerid); // Запускаем таймер на 5 секунд
        ApplyAnimation(playerid, "GANGS", "smkcig_prtl" , 4.1, 0, 0, 0, 0, 0, 0); // Проигрываем анимацию.
        SetPlayerFacingAngle(playerid, TrashInfo[index][3]); // Поворачиваем игрока по направлению бака.

        SetPlayerChatBubble(playerid, "копается в мусорном баке", -1, 30.0, 10000); // Выводим сообщения над игроком
    }
}
В OnPlayerDisconnect добавим уничтожения таймера если тот запущен.
PHP:
if(TrashTimer[playerid])
{
    KillTimer(TrashTimer[playerid]);
    TrashTimer[playerid] =-1;
}
Код:
И где-нибудь в конце скрипта добавим паблик @_random_foods
PHP:
@_random_foods(playerid);
@_random_foods(playerid)
{
    static const // Массив с названием содержимого мусорного бака.
        random_messsage_food[][] =
        {
            "Гнилую капусту",
            "Тухлые помидоры",
            "Пиццу с муравьями",
            "Кусочек хлеба",
            "Сало",
            "Марковь"
        };
    new
        string[73],
        rand = random(sizeof(random_messsage_food)); // Рандомно выбираем, содержимое из массива random_messsage_food

    KillTimer(TrashTimer[playerid]);
    TrashTimer[playerid] =-1;

    format(string, sizeof(string), "%s находит в мусорном баке %s", /* Массив с именем игрока */, random_messsage_food[rand]); // Выводим сообщения в чат
    ProxDetector(playerid, 20.0, -1, string);

    ApplyAnimation(playerid, "FOOD", "EAT_Burger", 4.0, 0, 0, 0, 0, 0, 1); // Проигрываем анимацию
  


    /* Тут ваш массив сытости или здоровья */ += 25.0; // Дабаваляем сытости игроку.
    // Пример PlayerInfo[playerid][pSatiety] += 25.0;

    PlayerPlaySound(playerid, 32200, 0.0, 0.0, 0.0); // Проигрываем звук.
    SetPVarInt(playerid, "eat_time", gettime()+60); // Дабавляем время в Pvar, у меня здесь +60 сек, то есть минута.
    return true;
}
PHP:
ProxDetector(playerid, Float:max_range, color, const string[], Float:max_ratio = 1.6)
{
    new
        Float:pos_x,
        Float:pos_y,
        Float:pos_z,
        Float:range,
        Float:range_ratio,
        Float:range_with_ratio,
        clr_r, clr_g, clr_b,
        Float:color_r, Float:color_g, Float:color_b;

    if (!GetPlayerPos(playerid, pos_x, pos_y, pos_z)) {
        return false;
    }

    color_r = float(color >> 24 & 0xFF);
    color_g = float(color >> 16 & 0xFF);
    color_b = float(color >> 8 & 0xFF);
    range_with_ratio = max_range * max_ratio;

    foreach (new i : Player) {
        if (!IsPlayerStreamedIn(playerid, i)) {
            continue;
        }

        range = GetPlayerDistanceFromPoint(i, pos_x, pos_y, pos_z);
        if (range > max_range) {
            continue;
        }

        range_ratio = (range_with_ratio - range) / range_with_ratio;
        clr_r = floatround(range_ratio * color_r);
        clr_g = floatround(range_ratio * color_g);
        clr_b = floatround(range_ratio * color_b);

        SendClientMessage(i, (color & 0xFF) | (clr_b << 8) | (clr_g << 16) | (clr_r << 24), string);
    }

    SendClientMessage(playerid, color, string);
    return true;
}

Скриншоты



Вот собственно и всё)
 
Последнее редактирование:
Сверху Снизу