// В начале скрипта, после includes
new BarrierState[MAX_PLAYERS]; // 0 - закрыт, 1 - открыт
new Float:BarrierCoords[][6] = {
{x1, y1, z1, rx1, ry1, rz1}, // координаты вашего шлагбаума
// добавьте больше шлагбаумов если нужно
};
// Организации которые могут управлять шлагбаумом
new AllowedFactions[] = {1, 2, 3, 4, 5}; // ID ваших организаций
public OnGameModeInit()
{
// Создаем объект шлагбаума
CreateObject(968, BarrierCoords[0][0], BarrierCoords[0][1], BarrierCoords[0][2],
BarrierCoords[0][3], BarrierCoords[0][4], BarrierCoords[0][5]);
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
// Проверяем нажатие H или ALT
if((newkeys & KEY_CTRL_BACK) || (newkeys & KEY_WALK)) // H или ALT
{
// Проверяем находится ли игрок рядом со шлагбаумом
if(IsPlayerNearBarrier(playerid, 0)) // 0 - индекс шлагбаума
{
// Проверяем принадлежность к организации
if(IsPlayerInAllowedFaction(playerid))
{
ToggleBarrier(playerid, 0);
}
else
{
SendClientMessage(playerid, 0xFF0000AA, "Ошибка: У вас нет доступа к управлению шлагбаумом!");
}
}
}
return 1;
}
// Функция проверки расстояния до шлагбаума
IsPlayerNearBarrier(playerid, barrierid)
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
new Float:distance = GetPlayerDistanceFromPoint(playerid,
BarrierCoords[barrierid][0], BarrierCoords[barrierid][1], BarrierCoords[barrierid][2]);
return (distance < 3.0); // радиус взаимодействия 3 метра
}
// Функция проверки принадлежности к организации
IsPlayerInAllowedFaction(playerid)
{
// Замените эту функцию на вашу систему фракций
new playerFaction = GetPlayerFaction(playerid); // ваша функция получения фракции игрока
for(new i = 0; i < sizeof(AllowedFactions); i++)
{
if(playerFaction == AllowedFactions)
{
return 1;
}
}
return 0;
}
// Функция управления шлагбаумом
ToggleBarrier(playerid, barrierid)
{
if(BarrierState[playerid] == 0) // если закрыт
{
// Открываем шлагбаум
MoveObject(GetBarrierObjectID(barrierid),
BarrierCoords[barrierid][0], BarrierCoords[barrierid][1], BarrierCoords[barrierid][2] - 2.0,
2.0); // поднимаем на 2 единицы
BarrierState[playerid] = 1;
SendClientMessage(playerid, 0x00FF00AA, "Шлагбаум открыт!");
}
else // если открыт
{
// Закрываем шлагбаум
MoveObject(GetBarrierObjectID(barrierid),
BarrierCoords[barrierid][0], BarrierCoords[barrierid][1], BarrierCoords[barrierid][2],
2.0); // опускаем обратно
BarrierState[playerid] = 0;
SendClientMessage(playerid, 0x00FF00AA, "Шлагбаум закрыт!");
}
}
// Функция получения ID объекта шлагбаума
GetBarrierObjectID(barrierid)
{
// Возвращает ID объекта для конкретного шлагбаума
// Вам нужно будет адаптировать эту функцию под вашу систему объектов
return barrierid + 1000; // пример
}
Настройка под вашу систему
Замените координаты: В массиве BarrierCoords укажите реальные координаты вашего шлагбаума
Настройте организации: В массиве AllowedFactions укажите ID ваших 5 организаций
Адаптируйте проверку фракций: Функция IsPlayerInAllowedFaction должна использовать вашу систему фракций
Настройте ID объектов: Функция GetBarrierObjectID должна возвращать реальный ID вашего объекта шлагбаума
(Надеюсь я вам помог, тк писал эту систему 2 часа)