Перейти к содержимому


Фотография

Проверка запущен ли скрипт.


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 18 January 2019 - 21:00

Как проверить, запущен ли скрипт у данного юнита.

 

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


Сообщение отредактировал 0-0: 18 January 2019 - 21:36

  • 0

#2 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 18 January 2019 - 21:07

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

.


  • 0

#3 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 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.

 

И я не могу понять, что не так)


  • 0

#4 OFFLINE   nIkRon

nIkRon

    Сержант

  • Пользователи
  • 195 сообщений
  • Откуда:Донецк

Отправлено 19 January 2019 - 02:14

Самый простой способ проверить запущен ли скрипт, это в начало скрипта поставить проверку переменной(если активна(true) то выходим из скрипта), потом если она не активна ставим её активной, и в конце скрипта где его работа заканчивается снимаем переменную.


Сообщение отредактировал nIkRon: 19 January 2019 - 02:15

  • 0

#5 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 19 January 2019 - 12:23

Ну я уже решил. Поставил рандомную задержку на несколько доль секунд перед проверкой. Так она разделяет процесс запуска, да же если он идёт прям совсем параллельно.


  • 0

#6 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 19 January 2019 - 12:48

0-0, всегда интересовало: как думают люди использующие:
1. MPHit без проверки на локальность "жертвы" и изменением ее состояния
2. Компилируют код столь странным способом, когда есть логически нормальный способ
3. Решают проблемы какими-то случайными задержками
4. Да и вообще делают что-то с юнитами, не являющимися локальными (Я правильно понимаю, что данный код запускается НЕ ТОЛЬКО на СЕРВЕРЕ?)

Сообщение отредактировал vlad333000: 19 January 2019 - 12:51

  • 0

#7 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 19 January 2019 - 22:38

Как думают? Да просто мало что знают)))) Если бы я спокойно оперировал этим языком, думаю, всё было бы иначе, но пока, как есть)))
Так что, от логически нормального способа не откажусь))
 
Вообще, код запускается только на сервере))
 
Так-то в целом, оно работает:
 



  • 0

#8 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 20 January 2019 - 02:38

0-0, тогда изучайте:
1.

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


2. Как ни странно требует меньших знаний, ведь вся ваша возня с "перекидыванием" объекта в код с использованией десятка команд/функций, заканчивается на такой "магической" переменной _this. Вы когда-нибудь пробовали выводить ее содержимое? Очень советую

Оперирование языком - це фигня, просто очередные имена и скобки, важно понимание сути того, что пишите, ну и неплохо бы иногда читать "документацию" по тому что пишите

Сообщение отредактировал vlad333000: 20 January 2019 - 02:40

  • 0

#9 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 20 January 2019 - 16:36

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

И рандомная задержка на проверке, то же стабильно работает, так что пускай будет как будет.


  • 0

#10 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 21 January 2019 - 05:17

У бойца много хитпойнтов, и одна пуля может запросто пройти через пару, а то и тройку, каждый из выше означеных 2-3 хитпойнтов вызовет определённое для хитпойнтов событие, получите с одной пули два-три вызова.


Сообщение отредактировал SteelRat: 21 January 2019 - 05:21

  • 0

#11 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 21 January 2019 - 13:25

Да, вот именно. А сработка мне нужна одна. И даже если включать переменную после старта скрипта, а в условии поставить, что если эта переменная включена скрипт не запускается. То видимо из-за практически одновременного старта событий, всё равно иногда проходит двойной запуск.

 

По этому перед проверкой, я ввёл 2 задержки случайным числом. Таким образом получается разделить события попаданий.

 

 

И появился у меня новый вопрос. На счёт локальности, как писалось выше. Я, в итоге смог не через MPhit сделать запуск скрипта, а через HITPart.

Но, так как он работает локально, в мультиплеере скрипт стартуют только попадания сервера, у остальных всё отображается, но их попадания его не запускают.

Но HITpart позволяет отследить часть тела в которую попали, а MPhit нет. Вопрос. Как можно и часть тела отследить и сделать сработку от других игроков?


  • 0

#12 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 21 January 2019 - 14:19

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

для удаленного вызова.

PS Значит вы неправильно сделали условие, которое ограничиывает множественный вызов обработчика событий. SQF выполняет свой код посследовательно (никакого паралельно работающего кода нету) и в незапланированной среде (в которой и вызываются обработчики событий) - ни один другой скрипт не может даже начать своб работу, пока не завершиться предыдущий. Поэтому никакие задержки не нужны вовсе, нужно просто правил но написать условие.

Сообщение отредактировал vlad333000: 21 January 2019 - 14:21

  • 0

#13 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 23 January 2019 - 00:58

Так... я уже перекроил там всё и сам запутался))

Начнём с проверки.


Как я себе это вижу.

Создаём пустой массив.
В начале скрипта делаем проверку, есть ли юнит в массиве.
Если есть выключаем скрипт или пускаем на круг, в зависимости от задачи.

Если нет, то скрипт идёт дальше.
А юнит вноситься в массив. Да бы избежать повторного запуска до завершения.

По завершению скрипта юнит из массива удаляется, что бы была возможность запустить на нём скрипт повторно.

Правильно?

Если да, то как это написать?))) Гуглил разные команды.... и пока получилось только вот так...

Массив = [];

IF (Массив find (str _Юнит) == 0) then {

hint "Запускаем скрипт";

Массив = Массив + [ str _Юнит];

....................................
....................................


Убираем юнит из массива ( и вот тут я пока не пойму, как это проще всего сделать.

};

Сообщение отредактировал 0-0: 23 January 2019 - 01:02

  • 0

#14 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 23 January 2019 - 03:03

0-0, а зачем вы имена юнитов заталкиваете в массив, а не сами юниты?
Проще придумать и нельзя (Код с учетом того, что будет запускаться в незапланированной среде):
// Проверка
if (_unit getVariable ["MyVariable", false]) exitWith {};

// Начало скрипта
_unit setVariable ["MyVariable", true];

...

// Конец скрипта
_unit setVariable ["MyVariable", false];

Сообщение отредактировал vlad333000: 23 January 2019 - 03:06

  • 0

#15 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 23 January 2019 - 18:00

Спасибо большое. Оно работает.

 

Но я не понимаю как)))

 

_unit getVariable ["MyVariable", false];

 

Как это звучит обычным языком?

 

Есть ли юнит в массиве - ложь?

Просто если так, то почему мы не запускаем скрипт при таком условии?

 

 

 

 

И у меня возник ещё один вопрос не по теме.

Как запретить юниту кидать гранаты? Не убирая сами гранаты из инвентаря?

 

_unit removeWeapon "throw";

 

Это же должно работать?) Но у меня, почему-то не работает) И на игроке пробовал. То же продолжает кидать гранаты)


Сообщение отредактировал 0-0: 23 January 2019 - 18:04

  • 0

#16 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 23 January 2019 - 20:46

Это же должно работать?

Где-то написано что ДОЛЖНО? Может покажете? Далеко не каждое оружие можно "удалить"

Как это звучит обычным языком?

Получить переменную MyVariable из пространства имен объекта _unit и, если она не определена, получить false
  • 0

#17 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 24 January 2019 - 20:34

По переменной понял)

 

 

Так я ж не утверждаю что должно) Я спросил.

То есть только удалять сами гранаты? Другого пути нет?


Сообщение отредактировал 0-0: 24 January 2019 - 20:51

  • 0

#18 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 25 January 2019 - 10:33

0-0, не вижу проблемы: игроки у ИИ и не заметят отсутствие гранат, а для самих игроков вы можете обосновать то, что у них отбирают гранаты (ну не наличие же гранат и инвалидность "не кидаются гранаты")

Сообщение отредактировал vlad333000: 25 January 2019 - 10:36

  • 0

#19 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 29 January 2019 - 15:17

Всё, с гранатами я вопрос решил. Всё получилось) Сначала удалил, после завершения скрипта добавил обратно.

 

 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

для удаленного вызова.
 

 

 

В общем сам я так и не понял, как сделать вот это глобальным:

             _x addEventHandler ["hitpart", {(_this select 0) spawn dam_PiR}];

По сути, мне нужны данные в кого попали. И в какую часть тела попали.

И нужно что бы это работало в мультиплеере.

 

hitpart содержит эти данные. Но он локальный.

MPHit работает в мультиплеере, Но там нет данных о поражённых частях тела.

 

 

А как через

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

записать hitpart, что бы оно срабатывало, я так и не разобрался.


  • 0




Яндекс.Метрика