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


Фотография

Скрипт респавна ботов, их снаряжение и маршрутные точки


Лучший Ответ hipp0cat , 20 November 2013 - 11:53

Что-то  я не понял, имеется в виду просто спавн или именно респавн? В таком виде боты появятся один раз просто. Или триггер многократно активируешь? Да и как то странно ты createUnit записал, "1" - это что за аргумент такой? Используй вот этот вариант createUnit как описано тут: http://community.bis...reateUnit_array

Далее, sqs - устаревшая штука из Армы 1, надо использовать sqf и писать _handle = [] execVM "script.sqf";

Чтобы поменять ботам снаряжение, можно использовать команды вроде addWeapon, addMagazine, addBackpack, addUniform, addVest и их варианты с remove (т.е. removeWeapon и т.д.). То есть, в твой скрипт можно будет дописать:

removeAllWeapons unit1;unit1 addMagazines ["100Rnd_65x39_caseless_mag",3];unit1 addWeapon "arifle_MX_SW_F";

В таком случае у первого бота отберется все оружие и появится пулемет. Имена классов оружия и магазинов можно посмотреть прямо из редактора из конфиг вьювера (кнопка с шестеренкой такой) в CfgWeapons.

Маршрутные точки создаются при помощи команды addWaypoint и затем настраиваются при помощи setWaypoint... http://community.bis...roup:_Waypoints например

_wp = _group1 addWaypoint [getMarkerPos "wp1",0];_wp setWaypointType "MOVE";

Для зацикливания нужен тип "CYCLE", создаешь этот вейпоинт последним.

Для удаления трупа, можно написать следующее при создании ботов:

unit1 addEventHandler["Killed",{deleteVehicle (_this select 0)}];

(http://community.bis...Handlers#Killed)

Тогда труп будет немедленно удаляться после смерти бота. Если нужна задержка, вызывай из ивент хендлера скрипт, в котором будет использоваться команда sleep (в коде самого ивента ее использовать нельзя).

Писал это все не проверяя параллельно в самой Арме, так что может где-то накосячил.

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


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

#1 OFFLINE   Djon

Djon

    Старшина

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

Отправлено 20 November 2013 - 00:20

Прошу помощи профессионалов, помогите доработать скрипт до желаемого. Вот так он выглядит сейчас: 

 

#create
_group1 = createGroup west;
unit1 = "B_G_soldier_SL_F" createUnit [getMarkerPos "Spawn", _group1,"1"];
_group2 = createGroup west;
unit1 = "B_G_Soldier_A_F" createUnit [getMarkerPos "Spawn_1", _group2,"1"]; .... и так далее
 
      Скрипт спавнит ботов "B_G_soldier_SL_F" и "B_G_Soldier_A_F" в раздельных группах по активации триггера с текстом инициализации: [] exec "AbraKadabra.sqs" (где AbraKadabra.sqs название скрипта), в точке Spawn и Spawn_1 которые являются маркерами и носят данные названия. Расписываю все это чтобы убить двух зайцев, то есть задать вопрос и может кому то еще это пригодится.
      Теперь то что хотел бы узнать я: что добавить в данный скрипт, чтобы поменять каждому боту отдельно полностью снарягу  и задать маршрутные точки с последующим зацикливанием? И еще хотелось бы узнать, возможно ли, что после смерти этих ботов, которые прописаны в скрипте, исчезновение чтоб не напрягать железо своим бесполезным лежанием на земле матушке? 

Сообщение отредактировал Djon: 20 November 2013 - 00:27

  • 0

#2 OFFLINE   hipp0cat

hipp0cat

    Ефрейтор

  • Пользователи
  • 82 сообщений
  • Отряд:OSA

Отправлено 20 November 2013 - 11:53   Лучший Ответ

Что-то  я не понял, имеется в виду просто спавн или именно респавн? В таком виде боты появятся один раз просто. Или триггер многократно активируешь? Да и как то странно ты createUnit записал, "1" - это что за аргумент такой? Используй вот этот вариант createUnit как описано тут: 

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

Далее, sqs - устаревшая штука из Армы 1, надо использовать sqf и писать _handle = [] execVM "script.sqf";

Чтобы поменять ботам снаряжение, можно использовать команды вроде addWeapon, addMagazine, addBackpack, addUniform, addVest и их варианты с remove (т.е. removeWeapon и т.д.). То есть, в твой скрипт можно будет дописать:

removeAllWeapons unit1;unit1 addMagazines ["100Rnd_65x39_caseless_mag",3];unit1 addWeapon "arifle_MX_SW_F";

В таком случае у первого бота отберется все оружие и появится пулемет. Имена классов оружия и магазинов можно посмотреть прямо из редактора из конфиг вьювера (кнопка с шестеренкой такой) в CfgWeapons.

Маршрутные точки создаются при помощи команды addWaypoint и затем настраиваются при помощи setWaypoint... 

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

например

_wp = _group1 addWaypoint [getMarkerPos "wp1",0];_wp setWaypointType "MOVE";

Для зацикливания нужен тип "CYCLE", создаешь этот вейпоинт последним.

Для удаления трупа, можно написать следующее при создании ботов:

unit1 addEventHandler["Killed",{deleteVehicle (_this select 0)}];

(

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

)

Тогда труп будет немедленно удаляться после смерти бота. Если нужна задержка, вызывай из ивент хендлера скрипт, в котором будет использоваться команда sleep (в коде самого ивента ее использовать нельзя).

Писал это все не проверяя параллельно в самой Арме, так что может где-то накосячил.


Сообщение отредактировал hipp0cat: 20 November 2013 - 12:04

  • 1

#3 OFFLINE   Djon

Djon

    Старшина

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

Отправлено 20 November 2013 - 12:29

Что-то  я не понял, имеется в виду просто спавн или именно респавн? В таком виде боты появятся один раз просто. Или триггер многократно активируешь? Да и как то странно ты createUnit записал, "1" - это что за аргумент такой? Используй вот этот вариант createUnit как описано тут: 

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

Далее, sqs - устаревшая штука из Армы 1, надо использовать sqf и писать _handle = [] execVM "script.sqf";

Чтобы поменять ботам снаряжение, можно использовать команды вроде addWeapon, addMagazine, addBackpack, addUniform, addVest и их варианты с remove (т.е. removeWeapon и т.д.). То есть, в твой скрипт можно будет дописать:

removeAllWeapons unit1;unit1 addMagazines ["100Rnd_65x39_caseless_mag",3];unit1 addWeapon "arifle_MX_SW_F";

В таком случае у первого бота отберется все оружие и появится пулемет. Имена классов оружия и магазинов можно посмотреть прямо из редактора из конфиг вьювера (кнопка с шестеренкой такой) в CfgWeapons.

Маршрутные точки создаются при помощи команды addWaypoint и затем настраиваются при помощи setWaypoint... 

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

например

_wp = _group1 addWaypoint [getMarkerPos "wp1",0];_wp setWaypointType "MOVE";

Для зацикливания нужен тип "CYCLE", создаешь этот вейпоинт последним.

Для удаления трупа, можно написать следующее при создании ботов:

unit1 addEventHandler["Killed",{deleteVehicle (_this select 0)}];

(

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

)

Тогда труп будет немедленно удаляться после смерти бота. Если нужна задержка, вызывай из ивент хендлера скрипт, в котором будет использоваться команда sleep (в коде самого ивента ее использовать нельзя).

Писал это все не проверяя параллельно в самой Арме, так что может где-то накосячил.

В любом случае огромное спасибо, информация очень полезна для меня. Сегодня постараюсь все опробовать и обязательно отпишусь по решению этого вопроса. Со скриптами только пытаюсь подружиться, пока что по прежнему с ними на "ВЫ". Судя по примерам в sqf используется тот же самый синтаксис и все правила написания скрипта в целом что и sqs?  И кстати та циферка "1" вроде как означает уровень бота, хотя я могу ошибаться, так как данный скрипт собирал по частям из готовых скриптов.

На счет респавна ты прав с помощью повторяющегося триггера


  • 0

#4 OFFLINE   Avi

Avi

    Капитан

  • Репортеры
  • 1816 сообщений
  • Откуда:Москва

Отправлено 20 November 2013 - 12:37

Судя по примерам в sqf используется тот же самый синтаксис и все правила написания скрипта в целом что и sqs?

 

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

http://arma3.ru/foru...kriptopisaniiu/

Если же вы умеете в английский, то не лишним будет пройтись по первоисточникам,- они содержат ссылки на похожий и относящийся к теме материал. Правда, в БИСовской документации неприлично много ошибок, и зачастую, если просто взять их пример, то работать не будет.

 

P.S. А для тех, кто только-только начинает нырять в скрипты, скоро выйдет самоучитель, от нуля до готового скрипта с объяснениями.


Сообщение отредактировал Avi: 20 November 2013 - 12:37

  • 0

#5 OFFLINE   Djon

Djon

    Старшина

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

Отправлено 20 November 2013 - 14:33

 

 

 

 

P.S. А для тех, кто только-только начинает нырять в скрипты, скоро выйдет самоучитель, от нуля до готового скрипта с объяснениями.

 

Это бы было отлично, я надеюсь он будет тут выложен? 

 

 

 


  • 0

#6 OFFLINE   Avi

Avi

    Капитан

  • Репортеры
  • 1816 сообщений
  • Откуда:Москва

Отправлено 20 November 2013 - 15:32

Это бы было отлично, я надеюсь он будет тут выложен? 

 

Да, разумеется. Он в трёх частях, и первую часть я намерен выложить уже в эти выходные.


  • 0

#7 OFFLINE   Djon

Djon

    Старшина

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

Отправлено 21 November 2013 - 11:20

Да, разумеется. Он в трёх частях, и первую часть я намерен выложить уже в эти выходные.

 

Надеюсь у меня хватит ума, чтобы понять все что там будет изложено и наконец то начать воплощать свои задумки в жизнь)

Кстати по поводу второй моей темы не подскажешь ни чего? по поводу спавна оружия на земле?

Используй вот этот вариант createUnit как описано тут: 

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

 

Подскажи что не так делаю? По указанной ссылке скопировал пример и теперь пытаюсь его подогнать под нужный мне эффект: 

[color=#ff0000;]_grp = createGroup west;[/color]
[color=#ff0000;]_unit1 = _grp createUnit ["B_G_soldier_SL_F", position getMarkerPos, ["Spawn"], 1, "FORM"]; [/color]
мне нужно чтоб бот появился не привязанным к player и вот не могу ни как справиться. 

Странно но вот так

[color=#ff0000;]_group1 = createGroup west;[/color]
[color=#ff0000;]unit1 = "B_G_soldier_SL_F", createUnit [getMarkerPos "Spawn",_group1];[/color]
все получается, бот появляется там где мне нужно, но при написании после этой команды 
[color=#ff0000;]removeAllWeapons unit1[/color];
[color=#ff0000;]unit1 addMagazines [/color]["100Rnd_65x39_caseless_mag",3];
unit1 addWeapon "arifle_MX_SW_F";
абсолютно ни чего не меняется(((
Где я косячу?

А вот сочетание этой команды и 

[color=#ff0000;]_wp = _group1 addWaypoint [getMarkerPos "wp1",0];[/color]

работает привосходно


  • 0

#8 OFFLINE   HarryWorner

HarryWorner

    Лейтенант

  • Модераторы
  • 1035 сообщений

Отправлено 21 November 2013 - 12:04

unit1 = "B_G_soldier_SL_F"[color=rgb(255,0,0);],[/color] createUnit [getMarkerPos "Spawn",_group1];

 

Запятую нужно удалить обязательно, иначе ошибка.

 

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

_group1 = createGroup west;unit1 = "B_G_soldier_SL_F" createUnit [getMarkerPos "Spawn",_group1];sleep 1;removeAllWeapons unit1;unit1 addMagazines ["100Rnd_65x39_caseless_mag",3];unit1 addWeapon "arifle_MX_SW_F";

  • 0

#9 OFFLINE   hipp0cat

hipp0cat

    Ефрейтор

  • Пользователи
  • 82 сообщений
  • Отряд:OSA

Отправлено 21 November 2013 - 13:15

Обычный createUnit вроде как не возвращает значения, поэтому unit1 не определен и соответственно манипуляции с инвентарем не проходят. Нужно использовать createUnit array вот таким образом:

unit1 = _group1 createUnit ["B_G_Soldier_SL_F",getMarkerPos "Spawn",[],0,"FORM"];

ты же написал position getMarkerPos, что никакого смысла не имеет. Запускай Арму с параметром -showscripterrors, тогда будут выводиться сообщения об ошибках в скриптах.


Сообщение отредактировал hipp0cat: 21 November 2013 - 14:54

  • 1

#10 OFFLINE   Djon

Djon

    Старшина

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

Отправлено 21 November 2013 - 14:57

 

unit1 = createUnit ["",getMarkerPos "Spawn",[],0,"FORM"];

 

Выдает ошибку именно вы этой строке. Что-то нужно еще вписывать кроме как ID солдата где ты пустые скобки оставил? Я вставил команду буквально так как ты ее написал и вставил солдата в кавычки и все. Просто для меня не понятно [color=#ff0000;][],0."FORM"];[/color] эта часть. Возможно [координаты], 0 - расстояние до маркера или высота, а вот "FORM" за пределами моей фантазии)))

[color=#ff0000;]unit1 = createUnit ["[/color][color=rgb(255,0,0);font-family:helvetica, arial, sans-serif;]B_G_soldier_SL_F[/color][color=rgb(255,0,0);]",getMarkerPos "Spawn",[],0,"FORM"];[/color]
[color=#ff0000;]removeAllWeapons unit1;[/color]
[color=#ff0000;]unit1 addMagazines ["100Rnd_65x39_caseless_mag",3];[/color]
[color=#ff0000;]unit1 addWeapon "arifle_MX_SW_F";[/color]
[color=#000000;]вот так выглядит то что есть в скрипте по этому вопросу[/color]
_group1 = createGroup west;unit1 = "B_G_soldier_SL_F" createUnit [getMarkerPos "Spawn",_group1];sleep 1;removeAllWeapons unit1;unit1 addMagazines ["100Rnd_65x39_caseless_mag",3];unit1 addWeapon "arifle_MX_SW_F";

 Это увы не помогает(

_group1 = createGroup west;
unit1 = [color=#ff0000;]_group1[/color] createUnit ["B_G_soldier_SL_F",getMarkerPos "Spawn",[],0,"FORM"]; 
removeAllWeapons unit1;
СПАСИБО ОГРОМНОЕ ЗА ПОМОЩЬ)))) Все получилось)))) разобрался :russian:

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


  • 0

#11 OFFLINE   hipp0cat

hipp0cat

    Ефрейтор

  • Пользователи
  • 82 сообщений
  • Отряд:OSA

Отправлено 21 November 2013 - 15:11

Да, извини, из универа пишу, поэтому поторопился и не дописал команду правильно. Отредактировал пост.

По поводу аргументов createUnitArray:

юнит = группа createUnit ["тип_юнита",координаты,[массив маркеров],радиус,"special"];

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

"special" - может быть "NONE" или "FORM". Если стоит "NONE", то юнит появится на выбранном месте. Если стоит "FORM", юнит появится в формации, при этом его перенесет к его тим лидеру (если юнит сам им не является) независимо от места спавна юнита (насчет этого не уверен, но полагаю, что в скриптах это работает так же, как и в редакторе).


Сообщение отредактировал hipp0cat: 21 November 2013 - 15:11

  • 0

#12 OFFLINE   Djon

Djon

    Старшина

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

Отправлено 21 November 2013 - 16:58

Да, извини, из универа пишу, поэтому поторопился и не дописал команду правильно. Отредактировал пост.

 

Да все ОК) Без тебя вообще бы ни чего не получилось у меня) Если не чем заняться будет подскажешь на счет задержки исчезновения ботов, пытаюсь сам сейчас разобраться но чувствую не получится(( Я так понял в скрипте мы присвоили имя боту "Unit1" и это имя можно использовать в дальнейшем? То есть если я сделаю скрипт в котором буду ссылаться на это имя он будет работать? Ну или триггер допустим с [color=#ff0000;]not alive unit1[/color]? Я так понял ты написал что если нужна задержка то после смерти бота нужно вызвать отдельный скрипт в котором будет сначала [color=#ff0000;]sleep[/color] а потом [color=#ff0000;]unit1 [/color]addEventHandler["Killed",{deleteVehicle (_this select 0)}];

 
К примеру делаю триггер по смерти unit1 и активируеющий вот этот скрипт:
[color=#ff0000;]sleep 10;[/color]
[color=#ff0000;]unit1 addEventHandler["Killed",{deleteVehicle (_this select 0)}];[/color]

но увы не работает, хотя триггер видит имя unit1. 

Наверно это слишком просто?))

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

Исправил) триггер с инитом not alive unit1 и активацией скрипта, в скрипте

[color=#ff0000;]sleep 5;[/color]
[color=#ff0000;]deleteVehicle unit1[/color]
Но опять же на каждого бота придется делать отдельные триггеры и скрипты? Или есть другое решение для того чтобы труп через какое то время был удален а  на его месте появился новый unit1

Сообщение отредактировал Djon: 21 November 2013 - 16:10

  • 0

#13 OFFLINE   hipp0cat

hipp0cat

    Ефрейтор

  • Пользователи
  • 82 сообщений
  • Отряд:OSA

Отправлено 21 November 2013 - 18:11

Не нужно делать триггером, делай ивент хэндлером. Ивент хэндлеры (обработчики событий) выполняют код при каких то событиях, например, упомянутый ранее "Killed" выполняется при смерти юнита, и не нужно ставить триггер, который каждую секунду выполянет проверку на состояние здоровья бота.

Каждому боту назначаешь ивент хендлер, как я написал выше: unit1 addEventHandler["Killed",{deleteVehicle (_this select 0)}];

В данном случае, при смерти бота unit1 выполняется код {deleteVehicle (_this select 0)}. Но тебе ничто не мешает выполнять что то другое, например, запустить какой нибудь скрипт: unit1 addEventHandler["Killed",{_handle = _this execVM "bot_killed.sqf"}]; Если напишешь так, при смерти бота будет вызываться скрипт bot_killed, а в качестве аргумента ему будет передаваться массив [убитый_бот, убийца_бота]. Дальше в скрипте bot_killed ты можешь совершать какие угодно действия, добавить ту же задержку, например. Если захочешь, можешь там же создавать новых ботов, которые появлялись бы сразу после смерти старых.

Ну то есть, ты можешь своим ботам задавать при создании ивент хендлер

unit1 addEventHandler["Killed",{_handle = _this execVM "bot_killed.sqf"}];

А потом при помощи блокнота создать файл bot_killed.sqf, закинуть его в папку с твоей миссией (миссии лежат в "Моих документах" в папке Армы), и написать там следующее:

sleep 5;deleteVehicle (_this select 0);

Также в этот скрипт можешь добавить еще что угодно, например сообщение при смерти бота: hint "Bot Killed!";

В общем, посмотри пример,прикрепил к посту.

Прикрепленные файлы


  • 2

#14 OFFLINE   Djon

Djon

    Старшина

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

Отправлено 21 November 2013 - 18:37

[color=rgb(34,34,34);font-family:'Helvetica Neue', Arial, Verdana, sans-serif;font-size:14px;background-color:rgb(255,255,255);]Теперь все просто предельно ясно))) Спасибо в очередной раз))) Больше ни каких триггеров)[/color]


  • 0




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