Как проверить, запущен ли скрипт у данного юнита.
То есть, смысл в чём.. Надо избежать повторного запуска скрипта, если он уже запущен у конкретного юнита.
Сообщение отредактировал 0-0: 18 January 2019 - 21:36
Отправлено 18 January 2019 - 21:00
Как проверить, запущен ли скрипт у данного юнита.
То есть, смысл в чём.. Надо избежать повторного запуска скрипта, если он уже запущен у конкретного юнита.
Сообщение отредактировал 0-0: 18 January 2019 - 21:36
Отправлено 18 January 2019 - 21:07
.
Отправлено 19 January 2019 - 01:03
Суть в чём. Мод на ранения ИИ. Он отслеживает попадания. И иногда, хз почему, запускает скрипт 2 раза от одного попадания. Может быть пуля пробивает например одну часть тела и попадает в другую. И всё это считается как 2 попадания. Я хз.
Вот та часть, которая отвечает за отслеживание и запуск самого скрипта ранения fnc_injured.
_units = []; while { (true) } do { { if ((_x isKindOf "Man") && (!isplayer _x)) then { _uls = lifeState _x; if ((_uls != "INCAPACITATED") && !(_x getVariable ["dam_ignore_injured",false])) then { _units pushBack _x; _x removeAllMPEventHandlers "MPHit"; _x setVariable ["dam_ignore_injured",true]; call compile format["%1 addMPEventHandler ['MPHit',{ if (vehicle %1 == %1) then { _rand = random 100; if (_rand < 50) then { [%1] spawn fnc_injured; }; }; }] ",[_x] call BIS_fnc_objectVar]; }; }; } forEach allUnits; sleep 30; };
Сам скрип ранения юнита, вводит его в состояние INCAPACITATED.
Первой же строчкой в нём, я поставил проверку на состояние. И если оно равно INCAPACITATED, то скрипт выходит. То есть, если один скрипт запустился, то при запуске второго, он должен выйти.
Но даже с таким раскладом, иногда их запускается 2.
И я не могу понять, что не так)
Отправлено 19 January 2019 - 02:14
Самый простой способ проверить запущен ли скрипт, это в начало скрипта поставить проверку переменной(если активна(true) то выходим из скрипта), потом если она не активна ставим её активной, и в конце скрипта где его работа заканчивается снимаем переменную.
Сообщение отредактировал nIkRon: 19 January 2019 - 02:15
Отправлено 19 January 2019 - 12:23
Ну я уже решил. Поставил рандомную задержку на несколько доль секунд перед проверкой. Так она разделяет процесс запуска, да же если он идёт прям совсем параллельно.
Отправлено 19 January 2019 - 12:48
Сообщение отредактировал vlad333000: 19 January 2019 - 12:51
Отправлено 19 January 2019 - 22:38
Как думают? Да просто мало что знают)))) Если бы я спокойно оперировал этим языком, думаю, всё было бы иначе, но пока, как есть)))
Так что, от логически нормального способа не откажусь))
Вообще, код запускается только на сервере))
Так-то в целом, оно работает:
Отправлено 20 January 2019 - 02:38
Сообщение отредактировал vlad333000: 20 January 2019 - 02:40
Отправлено 20 January 2019 - 16:36
Почти всю ночь убил на попытки заменить MPHit. Ничего нормального у меня так и не вышло. Так что даже если оно и обрабатывается не локально, мне не принципиально, главное что в итоге это работает.
И рандомная задержка на проверке, то же стабильно работает, так что пускай будет как будет.
Отправлено 21 January 2019 - 05:17
У бойца много хитпойнтов, и одна пуля может запросто пройти через пару, а то и тройку, каждый из выше означеных 2-3 хитпойнтов вызовет определённое для хитпойнтов событие, получите с одной пули два-три вызова.
Сообщение отредактировал SteelRat: 21 January 2019 - 05:21
Отправлено 21 January 2019 - 13:25
Да, вот именно. А сработка мне нужна одна. И даже если включать переменную после старта скрипта, а в условии поставить, что если эта переменная включена скрипт не запускается. То видимо из-за практически одновременного старта событий, всё равно иногда проходит двойной запуск.
По этому перед проверкой, я ввёл 2 задержки случайным числом. Таким образом получается разделить события попаданий.
И появился у меня новый вопрос. На счёт локальности, как писалось выше. Я, в итоге смог не через MPhit сделать запуск скрипта, а через HITPart.
Но, так как он работает локально, в мультиплеере скрипт стартуют только попадания сервера, у остальных всё отображается, но их попадания его не запускают.
Но HITpart позволяет отследить часть тела в которую попали, а MPhit нет. Вопрос. Как можно и часть тела отследить и сделать сработку от других игроков?
Отправлено 21 January 2019 - 14:19
Сообщение отредактировал vlad333000: 21 January 2019 - 14:21
Отправлено 23 January 2019 - 00:58
Так... я уже перекроил там всё и сам запутался))
Начнём с проверки.
Как я себе это вижу.
Создаём пустой массив.
В начале скрипта делаем проверку, есть ли юнит в массиве.
Если есть выключаем скрипт или пускаем на круг, в зависимости от задачи.
Если нет, то скрипт идёт дальше.
А юнит вноситься в массив. Да бы избежать повторного запуска до завершения.
По завершению скрипта юнит из массива удаляется, что бы была возможность запустить на нём скрипт повторно.
Правильно?
Если да, то как это написать?))) Гуглил разные команды.... и пока получилось только вот так...
Массив = []; IF (Массив find (str _Юнит) == 0) then { hint "Запускаем скрипт"; Массив = Массив + [ str _Юнит]; .................................... .................................... Убираем юнит из массива ( и вот тут я пока не пойму, как это проще всего сделать. };
Сообщение отредактировал 0-0: 23 January 2019 - 01:02
Отправлено 23 January 2019 - 03:03
// Проверка if (_unit getVariable ["MyVariable", false]) exitWith {}; // Начало скрипта _unit setVariable ["MyVariable", true]; ... // Конец скрипта _unit setVariable ["MyVariable", false];
Сообщение отредактировал vlad333000: 23 January 2019 - 03:06
Отправлено 23 January 2019 - 18:00
Спасибо большое. Оно работает.
Но я не понимаю как)))
_unit getVariable ["MyVariable", false];
Как это звучит обычным языком?
Есть ли юнит в массиве - ложь?
Просто если так, то почему мы не запускаем скрипт при таком условии?
И у меня возник ещё один вопрос не по теме.
Как запретить юниту кидать гранаты? Не убирая сами гранаты из инвентаря?
_unit removeWeapon "throw";
Это же должно работать?) Но у меня, почему-то не работает) И на игроке пробовал. То же продолжает кидать гранаты)
Сообщение отредактировал 0-0: 23 January 2019 - 18:04
Отправлено 23 January 2019 - 20:46
Где-то написано что ДОЛЖНО? Может покажете? Далеко не каждое оружие можно "удалить"Это же должно работать?
Получить переменную MyVariable из пространства имен объекта _unit и, если она не определена, получить falseКак это звучит обычным языком?
Отправлено 24 January 2019 - 20:34
По переменной понял)
Так я ж не утверждаю что должно) Я спросил.
То есть только удалять сами гранаты? Другого пути нет?
Сообщение отредактировал 0-0: 24 January 2019 - 20:51
Отправлено 25 January 2019 - 10:33
Сообщение отредактировал vlad333000: 25 January 2019 - 10:36
Отправлено 29 January 2019 - 15:17
Всё, с гранатами я вопрос решил. Всё получилось) Сначала удалил, после завершения скрипта добавил обратно.
для удаленного вызова.
В общем сам я так и не понял, как сделать вот это глобальным:
_x addEventHandler ["hitpart", {(_this select 0) spawn dam_PiR}];
По сути, мне нужны данные в кого попали. И в какую часть тела попали.
И нужно что бы это работало в мультиплеере.
hitpart содержит эти данные. Но он локальный.
MPHit работает в мультиплеере, Но там нет данных о поражённых частях тела.
А как через записать hitpart, что бы оно срабатывало, я так и не разобрался.