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


Фотография

Выполнить команду в случае убийства юнита.


Лучший Ответ Kludge , 20 December 2015 - 02:29

давно все уже сделал через инициализацию  null = this execVM ""prison\kill.sqf""; ";

Перейти к сообщению


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

#21 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1781 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2015 - 14:32

Вы что хотели показать таким сравнением?

Я попытался сравнить нагрузку на ЦП вашего решение и моего, каким бы "кривым" это сравнение не казалось. Приведите своё сравнение, в чём проблема?
 

Оптимизацией, видимо озабочены только особо одарённые. Им делать больше не чего!

Действительно, давайте решать вещи первым пришедшим на ум решением. Ну и ладно, что разработчики предусмотрели кучу всяких полезностей в виде триггеров, обработчиков событий и т. д. Мы идём своим путём: будем крутить код в отдельных потоках с помощью spawn или execVM, ждать что-либо с помощью waitUntil и т. д.
 

А те кому 100 евант хандлеров не нагрузка, позже начинают высказывать мнения типа, движок г ... но, фризит и лагает!

Странно, я такое слышал только от тех, у кого куча кода исполняется в отдельных потоках.


  • 0

#22 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 18 July 2015 - 15:42

будем крутить код в отдельных потоках с помощью spawn ... ждать что-либо с помощью waitUntil

Чем же так плохи waitUntil и spawn? И что за

кучу всяких полезностей

которые заменяют их?

Сообщение отредактировал vlad333000: 18 July 2015 - 15:43

  • 0

#23 OFFLINE   Kludge

Kludge

    Ефрейтор

  • Заблокированные
  • 94 сообщений

Отправлено 18 July 2015 - 16:06

Последняя реплика,

Как мне показалось, основную нагрузку создают юниты, а не навешанные на них обработчики событий.

 

Когда вы спавните бота, инициализируются скрипты FSM формата, они моделируют, дополнительно к тому что в движке, поведение бота.

Вы что хотели показать таким сравнением? Что мало кому ведомо сколько ресурсов процессора берёт AI армы, это не знает только ленивый.

Плюс вы сунули в спавн 100 ботов инициализирующий код, плюс ещё нагрузка, которая будет зависеть от объёма исполняемого кода.

 

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

 

Оптимизацией, видимо озабочены только особо одарённые. Им делать больше не чего!

 

А те кому 100 евант хандлеров не нагрузка, позже начинают высказывать мнения типа, движок г ... но, фризит и лагает!

С чего бы так?

 

Нагрузка вообще не как непоменялась что с юнитами что без них у меня далеко не пенек первый для сервера и там кроме него только форум который по сути вообще ничего не жрет да и кстати с выходом новой эпохи и арма 1.48 у всех фпс просел вдвое и без юнитов. Столько напостили а адекватного ничего, почему то любая тема на форуме созданая мной или пост превращаеться в общественное мерянье членами я просил простой ответ в помощи:

 

Вот так работает:

 

Инициализация юнита: 

[this] exec "kill.sqs";

Сам скрипт kill.sqs:

d6 = _this select 0
@(!alive d6)
player setPos [8487.2188,25250.588,0];
hint parseText format["<t align='center' size='1.8' color='#3b4b2e'>ТЮРЕМНЫЙ ОСТРОВ</t><br/><t size='1.2' color='#3b4b2e'>¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯<br/>Вы направлены на тюремный остров за убийство члена дружественной группировки<br/>"];
exit

Почему вот так неработает и как написать чтоб заработало в таком же формате не привязываю к имени юнита, а просто скрипт исполнялся у любого юнита у которого есть вышеупомянутая строка в инициализации, локальная переменная _ARMY = _this select 0  должна определять любого юнита вместо конкретного с инициализауией вызова данного скрипта.

_ARMY = _this select 0
@(!alive _ARMY)
player setPos [8487.2188,25250.588,0];
hint parseText format["<t align='center' size='1.8' color='#3b4b2e'>ТЮРЕМНЫЙ ОСТРОВ</t><br/><t size='1.2' color='#3b4b2e'>????????????????????????<br/>Вы направлены на тюремный остров за убийство члена дружественной группировки<br/>"];
exit

Имхо должно работать.

 

А вы поперли обработчики килов засовывывать которые ненужны, в инициализацию игрока полезли которую трогать нельзя в моем случае. И единственным решением как бы я обозначил написанние массивов именованных юнитов и прикручивание данного к скрипту где переменная _ARMY = массиву именованных юнитов. Это избавляет как бы от наличия 150 одинаковых скриптов. Я спросил как сделать именгно в таком формате а не придумывать неподходящие пути, данный метод взят из инциклопедии по скриптописанию.

По поводу арма движков все мы прекрасно знаем насколько они глючные кривые и с нулевой оптимизацией тут можно не выгараживать богемию не целовать ее в очко, и не надо говорить что 150 юнитов дают нагрузку больше чем 5000 деревьяев или 10 000 000 единиц травы. Существует параметр как дальность прорисовки и если б окружение не рисовалось вокруг юнита а прорисовывалось все сразу то мы бы с вами охренели. 150 юниттов из которых бегают от силы по точкам 50 не придел возможностей игрового мира, а стоящий тупо у костра юнит мало чем отличаеться от стоящего дерева.


Сообщение отредактировал Kludge: 18 July 2015 - 16:15

  • 0

#24 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1781 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2015 - 16:07

 

будем крутить код в отдельных потоках с помощью spawn ... ждать что-либо с помощью waitUntil

Чем же так плохи waitUntil и spawn? И что за

кучу всяких полезностей

которые заменяют их?

 

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


  • 0

#25 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1781 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2015 - 16:14

d6 = _this select 0
@(!alive d6)
player setPos [8487.2188,25250.588,0];
hint parseText format["<t align='center' size='1.8' color='#3b4b2e'>ТЮРЕМНЫЙ ОСТРОВ</t><br/><t size='1.2' color='#3b4b2e'>¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯<br/>Вы направлены на тюремный остров за убийство члена дружественной группировки<br/>"];
exit

не работает из-за глобальной переменной d6.

 

Код

_ARMY = _this select 0
@(!alive _ARMY)
player setPos [8487.2188,25250.588,0];
hint parseText format["<t align='center' size='1.8' color='#3b4b2e'>ТЮРЕМНЫЙ ОСТРОВ</t><br/><t size='1.2' color='#3b4b2e'>????????????????????????<br/>Вы направлены на тюремный остров за убийство члена дружественной группировки<br/>"];
exit

вообще-то должен работать. По крайней мере, переделка под стандарты SQF у меня работает.

 

Чем вас не устраивает это решение?


Сообщение отредактировал Schatten: 18 July 2015 - 16:15

  • 0

#26 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 18 July 2015 - 16:15

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

Например?
  • 0

#27 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1781 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2015 - 16:16

 

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

Например?

 

Триггер.


  • 0

#28 OFFLINE   Kludge

Kludge

    Ефрейтор

  • Заблокированные
  • 94 сообщений

Отправлено 18 July 2015 - 16:19

d6 = _this select 0
@(!alive d6)
player setPos [8487.2188,25250.588,0];
hint parseText format["<t align='center' size='1.8' color='#3b4b2e'>ТЮРЕМНЫЙ ОСТРОВ</t><br/><t size='1.2' color='#3b4b2e'>¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯<br/>Вы направлены на тюремный остров за убийство члена дружественной группировки<br/>"];
exit

не работает из-за глобальной переменной d6.

 

Код

_ARMY = _this select 0
@(!alive _ARMY)
player setPos [8487.2188,25250.588,0];
hint parseText format["<t align='center' size='1.8' color='#3b4b2e'>ТЮРЕМНЫЙ ОСТРОВ</t><br/><t size='1.2' color='#3b4b2e'>????????????????????????<br/>Вы направлены на тюремный остров за убийство члена дружественной группировки<br/>"];
exit

вообще-то должен работать. По крайней мере, переделка под стандарты SQF у меня работает.

 

Чем вас не устраивает это решение?

 

Особеностями построения моего сервера, с d6 работает но только соответственно для юнита d6, неработает второй код где имя юниту задавать не нужно а он автоматом становиться данным юнитом без имени имея инициализацию вот этой строчкой в скрипте _ARMY = _this select 0.


  • 0

#29 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 18 July 2015 - 16:26

Schatten, ну ок:
- триггер - проверка 2 раза в секунду, запускается только после старта миссии (По моим подсчетам: спустя 1 секунду после конца экрана загрузки или его создания при помощи скриптов)
- waitUntil {} - проверка каждый кадр, запускать можно где угодно и когда угодно, + можно регулировать командой sleep частоту проверки (Вплоть до 1 раза в минуту и т д )

Думаю тут и объяснять ничего не нужно:
//Один из многочисленных примеров БИС'ов , которые по вашим словам придумали замену
waituntil {!isnil "bis_fnc_preload_init"};

Сообщение отредактировал vlad333000: 18 July 2015 - 16:33

  • 0

#30 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1781 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2015 - 16:28

 

Особеностями построения моего сервера

Интересные особенности: вы имеете доступ к карте, где в поле Init игрока впихиваете "[this] exec "kill.sqs";", но не можете (не хотите) сделать два триггера.

 

 

с d6 работает но только соответственно для юнита d6

d6 каждый раз будет присваиваться новый юнит. Т. е. код сработает только если будет убит ОДИН юнит, однако код сработает МНОГО раз.


Сообщение отредактировал Schatten: 18 July 2015 - 17:27

  • 0

#31 OFFLINE   Kludge

Kludge

    Ефрейтор

  • Заблокированные
  • 94 сообщений

Отправлено 18 July 2015 - 16:31

 

 

Особеностями построения моего сервера

Интересные особенности: вы имеете доступ к карте, где в поле Init игрока впихиваете "[this] exec "kill.sqs";", но не можете (не хотите) сделать два триггера.

 

 

с d6 работает но только соответственно для юнита d6

d6 каждый раз будет присваиватся новый юнит. Т. е. код сработает только если будет убит ОДИН юнит, однако код сработает МНОГО раз.

 

 

Нельзя назвать 100 юнитов d6. поэтому используеться локальная переменная _ARMY которая не отрабатывает причина почему мне не ясна.
 

_ARMY = _this select 0
@(!alive _ARMY)
player setPos [8487.2188,25250.588,0];
hint parseText format["<t align='center' size='1.8' color='#3b4b2e'>ТЮРЕМНЫЙ ОСТРОВ</t><br/><t size='1.2' color='#3b4b2e'>????????????????????????<br/>Вы направлены на тюремный остров за убийство члена дружественной группировки<br/>"];
exit

  • 0

#32 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1781 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2015 - 16:32

Думаю тут и объяснять ничего не нужно:

 

//Один из примеров БИС'ов 
waituntil {!isnil "bis_fnc_preload_init"};

Естественно, здесь без waitUntil не обойтись. Никто для этого триггер создавать не будет.

Но извините, когда создаётся код на проверку наличия юнита в зоне вместо создания триггера...


  • 0

#33 OFFLINE   Kludge

Kludge

    Ефрейтор

  • Заблокированные
  • 94 сообщений

Отправлено 18 July 2015 - 16:38

 

Думаю тут и объяснять ничего не нужно:

 

//Один из примеров БИС'ов 
waituntil {!isnil "bis_fnc_preload_init"};

Естественно, здесь без waitUntil не обойтись. Никто для этого триггер создавать не будет.

Но извините, когда создаётся код на проверку наличия юнита в зоне вместо создания триггера...

 

Ты помоему просто непонимаешь о чем я говорю и что спрашиваю.

Здесь конкретно описано то что я использую как раз этот самый код с переменной _ARMY

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


Сообщение отредактировал Kludge: 18 July 2015 - 16:39

  • 0

#34 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1781 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2015 - 16:40

 

поэтому используеться локальная переменная _ARMY которая не отрабатывает причина почему мне не ясна.

 

переделка под стандарты SQF у меня работает.

Есть какие-нибудь записи в RPT-файле?

 

Попробуйте в Init добавить это:

null = this execVM "kill.sqf";

kill.sqf

waitUntil {
	sleep 0.1;

	!(alive _this)
};

player setPos [8487.2188,25250.588,0];

hint parseText format ["<t align='center' size='1.8' color='#3b4b2e'>ТЮРЕМНЫЙ ОСТРОВ</t><br/><t size='1.2' color='#3b4b2e'>????????????????????????</t><br/>Вы направлены на тюремный остров за убийство члена дружественной группировки<br/>"];

У меня работает.


 

Ты помоему просто непонимаешь о чем я говорю и что спрашиваю.

Там мы отошли от темы.

Кстати, неверная ссылка.


Сообщение отредактировал Schatten: 18 July 2015 - 16:40

  • 0

#35 OFFLINE   Kludge

Kludge

    Ефрейтор

  • Заблокированные
  • 94 сообщений

Отправлено 18 July 2015 - 16:40

 

 

поэтому используеться локальная переменная _ARMY которая не отрабатывает причина почему мне не ясна.

 

переделка под стандарты SQF у меня работает.

Есть какие-нибудь записи в RPT-файле?

 

Попробуйте в Init добавить это:

null = this execVM "kill.sqf";

kill.sqf

waitUntil {
	sleep 0.1;

	!(alive _this)
};

player setPos [8487.2188,25250.588,0];

hint parseText format ["<t align='center' size='1.8' color='#3b4b2e'>ТЮРЕМНЫЙ ОСТРОВ</t><br/><t size='1.2' color='#3b4b2e'>????????????????????????</t><br/>Вы направлены на тюремный остров за убийство члена дружественной группировки<br/>"];

У меня работает.

 

Попробую только вот null = this execVM "kill.sqf"; будет работать таким методом любой игрок вошедший на сервер даже не убивая данного юнита будет лететь на остров я пробовал что то подбное только немного  иначе.


Сообщение отредактировал Kludge: 18 July 2015 - 16:41

  • 0

#36 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1781 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2015 - 16:44

 

только вот null = this execVM "kill.sqf"; будет работать таким методом любой игрок вошедший на сервер даже не убивая данного юнита будет лететь на остров

Не уверен. Попробую позже проверить.

 

Т. е. вы решили задать 100 AI Init вместо создания двух триггеров?


  • 0

#37 OFFLINE   Kludge

Kludge

    Ефрейтор

  • Заблокированные
  • 94 сообщений

Отправлено 18 July 2015 - 16:55

 

 

только вот null = this execVM "kill.sqf"; будет работать таким методом любой игрок вошедший на сервер даже не убивая данного юнита будет лететь на остров

Не уверен. Попробую позже проверить.

 

Т. е. вы решили задать 100 AI Init вместо создания двух триггеров?

 

:) :) :) спасибо отрабатывает,  100 инитов позволяет мне более конкретно и точно решать данную задачу.  Ура !!! наконец то. Триггер не совсем подходит для решения данной задачи имхо в скрипте нужно будет конкретно указывать тип юнитов.

Так что вопрос решен)

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

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

_epoch_mod

Теперь я могу сегодня спокойно начать строительство тюрьмы и переделку инитов юнитов в которых я мальца и так накосячил с вещами.
 


Сообщение отредактировал Kludge: 18 July 2015 - 16:57

  • 0

#38 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1781 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2015 - 17:04

Да, всё работает.

Вот ещё обновление:

if (!isDedicated) then {null = this execVM "kill.sqf"};

Это исключит запуск kill.sqf на сервере, где переменная player не определена.


Сообщение отредактировал Schatten: 18 July 2015 - 22:28

  • 0

#39 OFFLINE   Kludge

Kludge

    Ефрейтор

  • Заблокированные
  • 94 сообщений

Отправлено 18 July 2015 - 17:08

Да, всё работает. Вот ещё обновление:

 

if (!isDedicated) then {null = this execVM "kill.sqf"};

Это исключит запуск kill.sqf на сервере, где переменная player не существует.

Еще раз спасибо это вот именно то что я и искал так бы и сразу)))


  • 0

#40 OFFLINE   Kludge

Kludge

    Ефрейтор

  • Заблокированные
  • 94 сообщений

Отправлено 20 December 2015 - 02:29   Лучший Ответ

давно все уже сделал через инициализацию  null = this execVM ""prison\kill.sqf""; ";


  • 0




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