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

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

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

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

FAQ Шлагбаумы

plakapenka

Специалист
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!

Хотел я вообщем-то немного упростить работу со шлагбаумами. Можете посмотреть что из этого вышло.
Ну а я продолжу тему в ключе "Как создать шлагбаум"

Все это пихаем себе в начало мода
PHP:
#define MAX_GATES 1


enum slak_
{
    gates_obj,
    gates_area,
    gates_stat,
}
new gates[MAX_GATES][slak_];

stock create_gate(gate_id, obj_id)
{
    new Float:x, Float:y, Float:z;
    Streamer_GetFloatData(STREAMER_TYPE_OBJECT, obj_id, E_STREAMER_X, x);
    Streamer_GetFloatData(STREAMER_TYPE_OBJECT, obj_id, E_STREAMER_Y, y);
    Streamer_GetFloatData(STREAMER_TYPE_OBJECT, obj_id, E_STREAMER_Z, z);

    gates[gate_id][gates_obj]     = obj_id;
    gates[gate_id][gates_area]     = CreateDynamicSphere(x,y,z, 10.0);
}
stock open_gate(gate_id, time=0)
{
    if(!gates[gate_id][gates_stat])
    {// если шлагбаум закрыт
        gates[gate_id][gates_stat] = true;

        new Float:x, Float:y, Float:z, Float:Rx, Float:Ry, Float:Rz;
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_X, x);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_Y, y);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_Z, z);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_R_X, Rx);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_R_Y, Ry);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_R_Z, Rz);
           
        MoveDynamicObject(gates[gate_id][gates_obj], x, y+0.2, z, 0.2, Rx, 0, Rz);

        if(time)
        {
            SetTimerEx("close_gate", time, 0, "d", gate_id);
        }
       
    }
}
forward close_gate(gate_id);
public close_gate(gate_id)
{
    if(gates[gate_id][gates_stat])
    {// если шлагбаум открыт
        gates[gate_id][gates_stat] = false;

        new Float:x, Float:y, Float:z, Float:Rx, Float:Ry, Float:Rz;
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_X, x);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_Y, y);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_Z, z);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_R_X, Rx);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_R_Y, Ry);
        Streamer_GetFloatData(STREAMER_TYPE_OBJECT, gates[gate_id][gates_obj], E_STREAMER_R_Z, Rz);
           
        MoveDynamicObject(gates[gate_id][gates_obj], x, y-0.2, z, 0.2, Rx, 90, Rz);
    }
}
Дальше рассмотрим непосредственно само создание рабочего шлагбаума, через эту приблуду
Первое, что нам нужно сделать - это увеличить MAX_GATES, на количество шлагбаумов сервера
PHP:
#define MAX_GATES 1
Второе - добавить дефайн для нумерации нашего шлагбаума, дабы удобнее было и не хранить в голове рандомные числа
PHP:
#define GATE_DRIVING_SCHOOL 0
// так как шлагбаум у меня первый, его ид будет 0
Третье - создание так сказать экземпляра
Перед этим у вас должен быть уже сам объект шлагбаум
PHP:
new tmp_obj = CreateDynamicObject(968, -2074.739014, -87.579002, 34.956001, 0.000000, 90.000000, -90.000000, -1, -1, -1, STREAMER_OBJECT_SD, STREAMER_OBJECT_DD);
create_gate(GATE_DRIVING_SCHOOL, tmp_obj);
// tmp просто временная переменная чтобы передать наш объект в функцию
// GATE_DRIVING_SCHOOL наш ид шлагбаума который мы задефайнили до этого
Ну вот и все)
Есть две функции, open_gate и close_gate. Из названия думаю все понятно.

Так же для проверки рядом игрок со шлагбаумом или нет можно использовать

PHP:
if(IsPlayerInDynamicArea(playerid, gates[GATE_DRIVING_SCHOOL][gates_area]))
Го разберем на примере, как сделать чтобы наш созданный шлагбаум открывался по сигналу
C++:
if(PRESSED(2) && IsPlayerInAnyVehicle(playerid))
    {// если чел нажал H и он в машине

        if(IsPlayerInDynamicArea(playerid, gates[GATE_DRIVING_SCHOOL][gates_area]))
        {// человек стоит перед шлагбаумом автошколы
            open_gate(GATE_DRIVING_SCHOOL, 5000);
            // где первый аргумент ид шлагбаума
            // второй время на которое он откроется ( в мс )
            // если время не указывать будет открыт пока не закроешь черезе close_gate
        }
    }
А можно еще вот так, и он откроется просто когда к нему подъедешь
C++:
public OnPlayerEnterDynArea(playerid, areaid)
{
    if(areaid == gates[GATE_DRIVING_SCHOOL][gates_area] && IsPlayerInAnyVehicle(playerid))
    {// человек подъехал к шлагбауму автошколы
        open_gate(GATE_DRIVING_SCHOOL, 5000);
        // где первый аргумент ид шлагбаума
        // второй время на которое он откроется ( в мс )
        // если время не указывать будет открыт пока не закроешь черезе close_gate
        return 1;
    }
    return 1;
}

Нужно вообще это все, или нет, решайте сами. Так то шлагбаумы не каждый день создаются, можно и ручками везде координаты вписать. Так что не знаю.
Тема написана просто для того чтобы написать.

Жду критику и предложения ( только не про стиль кода плс )
 
Последнее редактирование модератором:
Сверху Снизу