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