Перейти к содержанию

Поиск сообщества

Показаны результаты для тегов 'StDIABLO&Co'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип контента


Форумы

  • Основной информационный раздел
    • События
    • Гайды
    • Техподдержка
    • Трибунал
  • WOG
    • WOG: Большие Игры
    • Помощь проекту
  • Военно-промышленный комплекс
    • Полигон
    • Мастерская
    • Картостроение
  • Курилка
    • Разговорчики
    • Другие игры
    • Информация о сайте

Новостные блоги

  • Обновления WOG
  • Объявления WOG
  • Гайды
  • Новости wogames.info
  • Архивный блог
  • Обновления WOG GM

Forms

  • Заявка в трибунал WOG
  • Заявка в трибунал WOG³
  • Заявка в трибунал WOG WWII
  • Заявка в трибунал сервера WOG
  • Подача апелляции WOG
  • Подача апелляции WOG³
  • Подача апелляции WOG WWII
  • Подача апелляции сервера WOG

Поиск результатов в...

Поиск результатов, которые содержат...


Дата создания

  • Начало

    Конец


Дата обновления

  • Начало

    Конец


Фильтр по количеству...

Регистрация

  • Начало

    Конец


Группа


Сайт


Discord


Город


Интересы

Найдено: 1 результат

  1. ТЕХНИКУ ЭКИПАЖУ! Описание: Скрипт предназначен для ограничения доступа лиц, не причисленных к экипажу, от управления специализированной техникой. Принцип работы очень прост - вешаем Event Handler (Обработчик событий) на нужную технику/класс техники и каждый раз, когда в указанную вами технику кто то будет садиться, класс-нейм этого человека будет сравниваться с указанным в массиве. Список использованных команд и выражений: worldSize nearEntities ! && forEach addEventHandler moveOut switch assignedVehicleRole Рассмотрим пример: В данном примере рассмотрим принцип реализации скрипта и для наземной техники и для воздушных судов (вертолетов). В init.sqf вставляем следующий код: Разберем его по частям для того, чтобы понять, что за что отвечает: _arrayOfVeh = [worldSize/2,worldSize/2] nearEntities ["Tank", worldSize/sqrt 2]; _arrayOfHeli = [worldSize/2,worldSize/2] nearEntities ["Helicopter", worldSize/sqrt 2]; typesOfVehCrew = ["wog_ksor_sergeant", "wog_ksor_officer_armored", "wog_ksor_driver_armored", "wog_ksor_crew_commander", "wog_ksor_crew_gunner", "wog_ksor_crew_driver", "wog_army_ucp_crew_commander", "wog_army_ucp_crew_gunner", "wog_army_ucp_crew_driver", "wog_army_ucp_squadleader", "wog_army_ucp_officer", "wog_army_ucp_Plsg"]; typesOfVehHeli = ["wog_ru_Helipilot"]; EjectSeat = {if !(typeOf (_this select 1) in typesOfVehCrew) then {moveOut (_this select 1)};}; 1. Зададим 4 массива: а) _arrayOfVeh && _arrayOfHeli - с помощью nearEntities из центра карты будем искать всю технику с родительскими классами "Tank" (это танки, БМПшки и пр.) и "Helicopter" (соответственно вертолеты). Центр карты задаем в виде: [worldSize/2,worldSize/2] где worldSize - это функция (или скорее переменная), которая возвращает длину/ширину карты. Ну и соответственно делим длину и ширину на 2, таким образом получая координаты x и y для центра; последний worldSize/2, который идет в массиве после классов "Tank" и "Helicopter", есть радиус описанной окружности вокруг квадрата: б) Все, с наполнением массивов техникой мы покончили. Теперь зададим вручную два новых массива typesOfVehCrew и typesOfVehHeli. Если честно, сейчас я и не припомню, почему они не приватные. Видимо на момент написания возникали проблемы с их чтением в EH (Event Handler - будет объяснено ниже). В первый массив мы записываем класс-неймы (не путать с названием бойца) бойцов, которые могут управлять боевой наземной техникой с классом "Tank". В данном примере, это офицеры (КО) и непосредственно экипаж. Во второй массив вносим пилотов. 2. Зададим функцию EjectSeat, которая понадобится нам позже. Для тех, кто не совсем понимает, в чем разница между функцией и переменной, попытаюсь на пальцах объяснить разницу не претендуя на преподавательское искусство, ибо сам в некоторых моментах не силен -_- (в конце концов, можете сами почитать =)): Переменная, это такая коробочка на которой написано название. Она хранит в себе какой-то объект (число, массив, символ). Функция - фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы. a = 1; - переменная _b = worldSize; - приватная переменная c = [0,1,2,3]; - переменная doCount = { count с; }; - функция. В ней содержит код, который посчитает кол-во элементов в массиве c Вторая часть: Здесь мы создаем 3 Event Handler'a Если мы обратимся к английскому словарю и дословно переведем Event - событие и Handler - обработчик, то получим Обработчик событий. Принцип его действия в арме довольно таки прост. Товарищи из BIS заранее подготовили для нас список действий, на которые можно повесить Event Hadler, дабы выполнять по завершению указанного действия свой код. Вам нужно зарядить снаряд в РПГ после выстрела? Воспользуйтесь EH на действие Fired. Хотите дать под пятую точку тому, кто не должен сидеть на месте стрелка танка? EH на GetIn в вашем распоряжении! Обращаю ваше внимание на то, что разные EH отрабатывают на разных объектах. Так например EH на действии "GetIn" должен висеть только на технике (таково его изначальное устройство и функционал). А вот если вы будете использовать "GetInMan" , то EH отрабатывать на человеке, а не на технике. Запутались? Это легко! EH "GetIn" в нашем примере работает на массив из техники -> _arrayOfHeli и _arrayOfVeh. Когда любой боец будет залезать в данную технику, EH будет передавать определенный массив данных. Для нас это будет выглядеть так: [класс техники, в которую залез боец, место которое он занял в машине (стрелок, водитель, пассажир), имя бойца, позиция на турели (у каждой техники это разный массив)]. EH "GetInMan" будет работать только на указанного/-ых вами игроков. Вам нужно сделать так, чтобы VIP не мог залезть в технику и уехать? Самое время повесить на него EH! Теперь, самое важное. Как я уже написал выше, когда вы создаете в своей миссии какой-либо EH, то после того, как будет совершено действие, на которое EH повешен, этот самый EH передаст игроку массив данных, которым вы сможете оперировать в своих целях. Разберемся на самом первом EH из примера: { _x addEventHandler ["GetIn", { if (((_this select 1) == "driver") && !((typeOf (_this select 2)) in typesOfVehCrew)) then { moveOut (_this select 2); }; }]; } forEach _arrayOfVeh; Синтаксис для создания EH: объект addEventHandler [Тип, {команда/код на выполнения после действия определенного типа}] _x это зарезервированная переменная для многих команд, в том числе и для команды forEach Таким образом, команда forEach будет перебирать каждый/-е объект/-ы из массива, который будет указан после него. Для того, чтобы нам не подставлять каждый раз класс-нейм техники, мы просто берем каждый класс-нейм автоматически с помощью forEach и подставляем его на место _x. Список таких переменных как _x и соответствующие им команды вы можете глянуть в блоге KK. Итак, создаем (addEventHandler) EH на действие "GetIn" (Войти в технику) и прикрепляем этот EH на все элементы массива _arrayOfVeh, каждый из которых подставится сам вместо _x. Дело за малым. Теперь, когда кто то залез в технику, мы должны понять, есть ли у него разрешение на то, чтобы сесть в эту технику и, если нет, то выгоняем. Еще раз напоминаю вам вид массива, который мы получим конкретно на EH "GetIn": [класс техники в которую залез боец, место которое он занял в машине (стрелок, водитель, пассажир), имя бойца, позиция на турели (у каждой техники это разный массив)] или на англ. [vehicle (object), position, unit, turret] Записываем простенькое условие: if (((_this select 1) == "driver") && !((typeOf (_this select 2)) in typesOfVehCrew)) then { moveOut (_this select 2); }; Если (игрок залез на водителя && игрок не находится в списке typesOfVehCrew) тогда { выкинуть этого игрока из машины}; где && - это символьная альтернатива союзу И; символ "!" является отрицанием, т.е. заменяет собою отрицание "не", _this select цифра - считываем нужный элемент массива. Нумерация элементов во всех массивах начинается с 0. В нашем массиве 4 элемента - [0,1,2,3]. Ну и далее по аналогии делаем тоже самое для вертолетов и для отслеживания на наземной технике момента, чтобы игрок не мог сесть еще и на стрелка. Заключительная часть: Нам осталось разобрать последнюю часть кода, которая отвечает за создание EH на действие "SeatSwitched" (пересесть): { _x addEventHandler ["SeatSwitched", { _assignedVehicleRoleArray = assignedVehicleRole (_this select 1); switch (_assignedVehicleRoleArray select 0) do { case "driver": { //driver call EjectSeat; }; case "Turret": { switch (str (_assignedVehicleRoleArray select 1)) do { case "[0]": { //gunner call EjectSeat; }; default {}; }; }; default {}; //cargo }; }]; } forEach _arrayOfVeh; Создание EH происходит по стандарту. Массив, который выводит EH: [техника на которую закреплен EH, место на которое пересел игрок, некорректно отрабатывающийся параметр] или на англ. [vehicle, unit1, unit2]; [0, 1, 2]; Создадим приватную переменную, в которую по действию "пересесть" будет записываться массив с названием места и номером туррели, на которое пересел игрок (т.к. в вертолете невозможно пересесть со стрелка на пилота и обратно, то данный EH подключаем только на наземную технику). Затем, используем switch. Эта команда будет искать в "case'-ах совпадения и если таковые будут найдены, то будет выполнен код. В нашем случае это работает так: //Переносы строк в представленном описании сделаны для вашего удобства при чтении switch (условие: выбрать 0й элемент массива _assignedVehicleRoleArray, в котором указано название места, на которое пересел игрок) делай { если условие совпадает с "driver" то тогда вызвать функцию EjectSeat, которая проверит, указан ли класс-нейм бойца, за которого играет игрок в качестве экипажа или нет и если нет, то выкинет его из техники }; Тот же самый ход был проделан и со стрелком, но там брали 1й элемент массива, т.к. с 0м при пересадке на стрелка были какие-то проблемы. На этом все. Хотелось охватить и представить как можно больше информации и донести ее доступно, дабы ею могли действительно воспользоваться. Надеюсь, получилось достаточно информативно и в то же время не сильно скомкано. Особую благодарность хотелось бы вынести г-у @StDIABLO, который помог во всем этом деле разобраться. P.S. Не уверен в корректной работе некоторых EH, в частности "SeatSwitched", ибо их работоспособность зависит от BIS'ов. Для более прошареных игроков - используйте альтернативные функции CBA
×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.