Jump to content


Photo

Вопросы по скриптингу

Arma3 как плотформа для созда Скритпы

  • Please log in to reply
1486 replies to this topic

#121 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 13 December 2014 - 17:59

Не работает, вот например провел эксперимент - создал троих людей (не водителей) и вписал им unit setFace "classname_WhiteHead_06*"; , у всех разные лица

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


 

можно ли как нибудь задать одно лицо пилоту самолета? Что бы оно не менялось с каждым раундом

unit

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

"classname_головы*";
[sloiler2='*Полный список не нашёл, но можно поизвращаться:']
1. Создаешь профиль в Arma 3
2. Выбираешь для этого профиля нужное лицо
3. Сохраняешь изменения в профиле
4. Идешь: мои документы -> Arma 3 - Other Profiles -> "имя_профиля" -> "имя_профиля".Arma3Profile (Открыть блокнотом/notepad++)
5. В 6 строке face="classname_нужной_головушки"[/spoiler2]
 

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

А в чем проблема обратиться напрямую к водителю?
(

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

unit) 

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

 "classname_головушки";

 

(driver Heli) setFace "WhiteHead_02"

  • 0

#122 OFFLINE   Sandefend

Sandefend

    Ефрейтор

  • Пользователи
  • 40 posts

Posted 13 December 2014 - 18:18

не работает.

 

 

вопрос решен. создаем пилота, и пустой самолет с именем samolet.  Потом это копируем в инит пилота this setFace "WhiteHead_11"; this moveindriver samolet    


Edited by Sandefend, 13 December 2014 - 21:43.

  • 0

#123 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 14 December 2014 - 18:03

не работает.

 

 

вопрос решен. создаем пилота, и пустой самолет с именем samolet.  Потом это копируем в инит пилота this setFace "WhiteHead_11"; this moveindriver samolet    

Если не работает это

(driver Heli) setFace "WhiteHead_02"

То это, в том виде в каком написано работать и не будет.

heli - имя которое надо дать вертолёту, самолёту, машине, банке с пивом!

  • 0

#124 OFFLINE   Djon

Djon

    Старшина

  • Пользователи
  • 433 posts

Posted 16 December 2014 - 09:43

Здравствуйте уважаемые участники форума! С циклами вожусь и нужна помощь опытного человека, чтоб позже не переделывать кучу материала.

 while {player distance unit>20} do {if (player distance unit<20) then {hint "Сработал"}};

Этот цикл по задумке должен ожидать игрока и сработать всего один раз запустив некий код. Но тут происходит две проверки на одно действие.

waitUntil {player distance unit<20}; 
hint "Сработал";

В этом вроде нет ни чего лишнего но вот допустим Блендер писал 

Насчет циклов - немного результатов теста, которые я проводил в свое время:
Для тестов было взято числовое значение 100'000.
 
Цикл while обработал итерацию за 1.08398 секунды
Цикл for "_i" from 0 to 10000 за 0.0549316 секунды
Цикл for [{ _i = 0 }, { _i <= 10000 }, { _i = _i + 1 }] за 1.17102 секунды
 
Теже тесты но со значением в 1'000'000 циклов:
while за 10.975 с
for "_i"... за 0.457031 с
for [{ _i... за 11.816 с
 
Таким образом использование цикла for "_i"... дает двадцатикратное преимущество по производительности над остальными вариантами циклов!

Таким образом цикл for по идее будет выполняться быстрее всего и давать наименьшую нагрузку на игровой процесс?

Только как его использовать в моей ситуации?

 

Подскажите что выбрать и как лучше поступить в этой ситуации. Циклов будет очень много и хочу минимизировать нагрузку.


Edited by Djon, 16 December 2014 - 11:26.

  • 0

#125 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 19 December 2014 - 16:58

 

Здравствуйте уважаемые участники форума! С циклами вожусь и нужна помощь опытного человека, чтоб позже не переделывать кучу материала.

 while {player distance unit>20} do {if (player distance unit<20) then {hint "Сработал"}};

Этот цикл по задумке должен ожидать игрока и сработать всего один раз запустив некий код. Но тут происходит две проверки на одно действие.

waitUntil {player distance unit<20}; 
hint "Сработал";

В этом вроде нет ни чего лишнего но вот допустим Блендер писал 

Насчет циклов - немного результатов теста, которые я проводил в свое время:
Для тестов было взято числовое значение 100'000.
 
Цикл while обработал итерацию за 1.08398 секунды
Цикл for "_i" from 0 to 10000 за 0.0549316 секунды
Цикл for [{ _i = 0 }, { _i <= 10000 }, { _i = _i + 1 }] за 1.17102 секунды
 
Теже тесты но со значением в 1'000'000 циклов:
while за 10.975 с
for "_i"... за 0.457031 с
for [{ _i... за 11.816 с
 
Таким образом использование цикла for "_i"... дает двадцатикратное преимущество по производительности над остальными вариантами циклов!

Таким образом цикл for по идее будет выполняться быстрее всего и давать наименьшую нагрузку на игровой процесс?

Только как его использовать в моей ситуации?

 

Подскажите что выбрать и как лучше поступить в этой ситуации. Циклов будет очень много и хочу минимизировать нагрузку.

 

 

сделай так и не парься

waitUntil {sleep 0.1; player distance unit<20}; 
hint "Сработал";

минимум нагрузки, максимум эффективности, для данного сценария.

Sleep можешь выставить сколько угодно, хоть 10 сек, зависит от того, какая необходима скорость срабатывания триггера, это триггер, да!

 

По поводу Блендера, это для других случаев, это когда надо перелопатить гигантские массивы с данными.

Цикл for "_i" from 0 to 10000

При таких сценариях даёт наибольшую скорость при переборе - итерации массива данных, на саму скорость обработки данных это не влияет.


  • 0

#126 OFFLINE   Djon

Djon

    Старшина

  • Пользователи
  • 433 posts

Posted 19 December 2014 - 20:00

SteelRat, Спасибо, теперь ясно. Я просто не сразу понял, что  в таких случаях все, что после строки

waitUntil {sleep 0.1; player distance unit<20};   

не будет выполняться до тех пор, пока не выполнится условие 

player distance unit<20

  • 0

#127 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 20 December 2014 - 05:14

 

SteelRat, Спасибо, теперь ясно. Я просто не сразу понял, что  в таких случаях все, что после строки

waitUntil {sleep 0.1; player distance unit<20};   

не будет выполняться до тех пор, пока не выполнится условие 

player distance unit<20

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

Код всегда должен быть впереди проверки!


  • 0

#128 OFFLINE   Djon

Djon

    Старшина

  • Пользователи
  • 433 posts

Posted 20 December 2014 - 07:08

SteelRat, Мне тут еще говорили, что цикл waitUntil и while не являются бесконечными циклами? У них есть запас на 100 000 итераций?  Таким образом если ставить sleep 1 секунда то цикл исчерпает свои итерации через 28 часов. Если миссия будет затяжной то как поступать? Если перезапустить цикл через определенное время то он перезапустится или продублируется? 

Пример:

waitUntil {sleep 1; 100 - 1};
перезапуск, работает еще не доработавший и уже вновь запущеный
waitUntil {sleep 1; 100 - 1};
waitUntil {sleep 1; 100 - 1};
итог 100 - 2 в секунду.

Так ли это будет или если запустить его снова то арма поймет, что это тот же цикл просто вновь запущенный?

И еще когда запас итераций кончается то код расположенный после цикла остается не исполненным? Если в последней итерации условие false?


  • 0

#129 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 20 December 2014 - 12:41

Мне тут еще говорили, что цикл waitUntil и while не являются бесконечными циклами?

Если быть точнее:
"In non-scheduled environment, while do loop is limited to 10000 iterations, after which it exits even if condition is still true. In scheduled environment no such limit exists."
Тоесть только while в какомто не-заплонированном прострнстве (прм. GoogleTranslate) ограничен 100 000 итерациями
и исходя из этого можно спокойно делать циклы хоть на 100 лет работы

Edited by vlad333000, 20 December 2014 - 12:42.

  • 0

#130 OFFLINE   Djon

Djon

    Старшина

  • Пользователи
  • 433 posts

Posted 20 December 2014 - 15:58

vlad333000, Чет немного не понял. Только цикл while имеет ограничение 100 000 итераций? Тот же waitUntil является вечным циклом? 

Или я снова не правильно понял значение термина "Итерация"? Вот как я понимаю что такое итерация на вот этом примере

waitUntil {sleep 0.1; player distance unit<20}; 
hint "Сработал";

Тут итерацией является выполнение следующего: задержка 0.1 сек; проверка условия; далее в зависимости от того true или false условие происходит действие и либо цикл выполнен либо переход на следующую итерацию. Так ли это? 

Если так и в случае с циклом while возьмем задержку равную 1 секунде то можем посчитать что число возможных итераций закончится через 69,4 дней. 

(100 000 / 60 минут) / 24 часа = 69,4 дней.

Я конечно дико сомневаюсь, что мне под силу миссия с такой продолжительностью, но тем не менее если частота проверки будет необходима более высокая, к примеру 0.1 то речь уже пойдет о 6,9 дней а такая продолжительность вполне реальна. 

Влад подскажите пожалуйста где и что я не правильно понял, просто вы говорите о продолжительности цикла 100 лет и мне кажется, что я снова что то не уловил)


  • 0

#131 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 20 December 2014 - 18:38

 

Или я снова не правильно понял значение термина "Итерация"?

 

Перебор - то есть, пролистать страницы книги, это на простом смертном)

Итерация - это то же самое, но не на простом смертном


  • 0

#132 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 20 December 2014 - 18:43

 

Мне тут еще говорили, что цикл waitUntil и while не являются бесконечными циклами?

Если быть точнее:
"In non-scheduled environment, while do loop is limited to 10000 iterations, after which it exits even if condition is still true. In scheduled environment no such limit exists."
Тоесть только while в какомто не-заплонированном прострнстве (прм. GoogleTranslate) ограничен 100 000 итерациями
и исходя из этого можно спокойно делать циклы хоть на 100 лет работы

 

 

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

 

То есть, если вы вызвали подобный код

// Это вечный цикл в не планируемой среде исполнения кода,
// то есть, в данной среде исполнения невозможно прервать исполнение кода, 
// для исполнения некой другой более важной задачи, с фризами знакомы?)
// В данное среде исполнения кода, команда While будет иметь ограничение по кол-ву циклов
//
// мы говорим о работе движка армы

[] call {
   While {true} do {};
};

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

[] spawn {
   While {true} do {};
};

[] execVM "Cicle.sqf";

Edited by SteelRat, 20 December 2014 - 19:40.

  • 0

#133 OFFLINE   Djon

Djon

    Старшина

  • Пользователи
  • 433 posts

Posted 20 December 2014 - 19:33

 

 

Или я снова не правильно понял значение термина "Итерация"?

 

Перебор - то есть, пролистать страницы книги, это на простом смертном)

Итерация - это то же самое, но не на простом смертном

 

И если говорить другими простыми словами то я термин итерация понял правильно))) И пример привел правильно)  А из ссылки указанной в следующем сообщении я так полагаю почерпнул то, что вы хотели донести))) 

"your script will run until it has finished, no matter how long it takes"

И там речь шла как раз и о waitUntil в том числе))) Как всегда при много благодарен и SteelRat-у и Vlad333000-у !!!


  • 0

#134 OFFLINE   Djon

Djon

    Старшина

  • Пользователи
  • 433 posts

Posted 20 December 2014 - 20:24

SteelRat, Всё ясно теперь. Короче увлекаться ни чем не стоит безмерно.  


  • 0

#135 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 28 December 2014 - 21:26

во время создания миссии обнаружил косяк БИС'ов:

_EHIndex01 = _unit addEventHandler ["fired"...... // handl прекрасно добавляется и работает
... // тут код, который "ждет"
_unit removeEventHandler ["fired", _EHIndex01] // ни в какую не удаляется!

У кого-нибудь, вообще, такая схема работает?

Пока, удаляется только:

_unit removeAllEventHandles "fired"

Но мне нужно не все удалить, а только один (из 2)


Edited by vlad333000, 28 December 2014 - 21:30.

  • 0

#136 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 28 December 2014 - 23:53

во время создания миссии обнаружил косяк БИС'ов:

_EHIndex01 = _unit addEventHandler ["fired"...... // handl прекрасно добавляется и работает
... // тут код, который "ждет"
_unit removeEventHandler ["fired", _EHIndex01] // ни в какую не удаляется!

У кого-нибудь, вообще, такая схема работает?

Пока, удаляется только:

_unit removeAllEventHandles "fired"

Но мне нужно не все удалить, а только один (из 2)

 

В неком месте добавляем

_EHIndex_fired_01 = _unit addEventHandler ["fired", {}];
_unit setVariable ["EHIndex_fired_01", _EHIndex_fired_01];

В неком месте удаляем

_EHIndex_fired_01 = _unit getVariable ["EHIndex_fired_01", nil];
if (!isNil "_EHIndex_fired_01") then {
	_unit removeEventHandler ["fired", _EHIndex_fired_01];
};

  • 0

#137 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 29 December 2014 - 00:51

SteelRat, теперь арма стопорит и ругается на _EHIndex_fired_01, раньше функция хоть шла себе дальше, незамечая этой команды
PS Может арма у меня косячная?


Edited by vlad333000, 29 December 2014 - 11:27.

  • 0

#138 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 29 December 2014 - 11:27

SteelRat,  проблема решена, у меня почему то addEventHandler сошёл с ума и стал возвращать не просто  индекс, а индекс + 1Б из-за чего конечно и не удалялся хандл


  • 0

#139 OFFLINE   Tachi

Tachi

    Ефрейтор

  • Пользователи
  • 33 posts

Posted 31 December 2014 - 14:59

Не работает:

_i = primaryWeaponItems player;
{ createVehicle [_x, position player, [], 0, "none"]; } forEach _i;

Тоже не работает:

_i = primaryWeaponItems player;
{ _v = createVehicle [_x, position player, [], 0, "none"]; } forEach _i;

В чём проблема? Может быть аттачи от оружия надо спаунить както по другому?

 

Вопрос отпал:

 

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


Edited by Tachi, 31 December 2014 - 15:12.

  • 0

#140 OFFLINE   BLEKWORT

BLEKWORT

    Рядовой

  • Пользователи
  • 9 posts

Posted 30 January 2015 - 14:18

Извиняюсь что не в тему...
Помогите с (нубским) вопросом про скрипт.
Вот у меня есть скрипт создающий ботов (respawn). (sqf)

 

_group = createGroup CIVILIAN;
bot1 = _group createUnit ["Лунтик",getMarkerPos "Луна",[моё проблемное место],0,"NONE"];
bot1 addEventHandler ["Killed",{_hndl = _this execVM "Лунтик_Повесился.sqf"}];
 
Вот как прописать этому "Лунтику" инициализацию скрипта скажем "Zlo.sqf". Чтобы при появлении данного существа, инициализировался этот скрипт и воздействовал на него и так каждый раз при его появлении.
(Да я нуб)
Читал множество форумов и туторов (в том числе Бисовский форум, но так ничего и не понял. Помогите если не трудно.

  • 0




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