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


Фотография

Нужна помощь со спавном ботов.


Лучший Ответ vlad333000 , 03 May 2017 - 11:40

Paprikar, вы присвоили переменную юниту, а вы уверены что данный юнит существует, когда вызывается второй участок кода? И уверены что на втором участке кода у всех юнитов будет определена данная переменная? Почитайте лог, наверняка там написано что-то подобное: undefined variable in expression; zero division... - все это соответствует неопредленной переменной

PS Хранить информацию о юните в самом юните, который может уже и не существовать когда эта информация потребуется - бред, воспользуйтесь глобальной переменной-массивом или логическими объектами

myArray = [
  [<className>, <position>, <loadout>],
  ...
];
{
  private _className = _x select 0;
  private _position = _x select 1;
  private _loadout = _x select 2;

  ...
} forEach myArray
Перейти к сообщению


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

#1 OFFLINE   Paprikar

Paprikar

    Ефрейтор

  • Пользователи
  • 51 сообщений
  • Откуда:Россия
  • Отряд:TaskForce141

Отправлено 02 May 2017 - 03:44

Сразу скажу, что в миссии присутствует модуль ace, и всех дальнейших проблем можно избежать, если я узнаю, как "вернуть к жизни" убитого бота. Но, на сколько я понял, setDamege с эйсом не дружит, оно и понятно...

Ну а теперь перейдём к основному вопросу. (Пытаюсь сделать что-то похожее на Баттлзону) У нас есть триггер, например, в Лакке. В его зоне находятся боты. При запуске миссии все эти боты прячутся (hideObject, enableSimulation), и как только мы приступаем к заданию на Лакке, мы должны (по моему видению и плану) сохранить местоположения всех ботов и показать их обратно, далее убить и завершить задание. Далее, после завершения другого задания, мы спавним тех же ботов с той же снарягой на тех же местах, что мы сохранили ранее. И как мне всё это реализовать? Только сегодня я узнал о команде forEach... О скриптах по большому счету ничего не знаю. Буду благодарен любой идее.

P.S. Я в данной миссии уделяю внимание на хорошее и хитрое местоположение ботов. Ни как в той же баттлзоне, кинув в поле...

И есть ли возможность заспавнить заранее подготовленный пресет, который можно создать в редакторе (Композиции -> Пользовательские)????


Сообщение отредактировал Paprikar: 02 May 2017 - 05:09

  • 0

#2 OFFLINE   Zlobot

Zlobot

    Мл.сержант

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

Отправлено 02 May 2017 - 18:21

Сразу отвечу, что реализовать подобные предложения с наскока у Вас не выйдет. Тем более, что если Вы только вчера узнали о команде forEach. :) С такого же уровня я  шел пару месяцев вывиха мозга и еще довольно долго тестировали на сервере. Но это все было скриптами, без редактора. Как там сделать в редакторе подобное, я не представляю, хотя наверное это возможно. А в скриптах это пара страниц кода и умение все это еще запустить))


  • 0

#3 OFFLINE   Paprikar

Paprikar

    Ефрейтор

  • Пользователи
  • 51 сообщений
  • Откуда:Россия
  • Отряд:TaskForce141

Отправлено 02 May 2017 - 18:31

Думаю нужно сохранять в массивы список всех объектов и триггере, позиции всех юнитов в триггере, затем снарягу тоже в массив.
В итоге имеем 3 массива - для имён, позиций и для снаряги (с ней сложно может быть).
И будем спавнить юнитов с 1-го по N (Кол-во юнитов в триггере), и при вызове спавна, например, первого бота, обращаться к 1-м ячейкам массивов.
Как это в коде реализовать? В итоге ведь не много писать надо...


Сообщение отредактировал Paprikar: 02 May 2017 - 18:31

  • 0

#4 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 02 May 2017 - 19:22

Paprikar, можно работать с группами, а позиции и снаряжение сохранять в персонажей:

{
	_leader = _x;

	{
		_x enableSimulation false;
		_x hideObject true;

		_x setVariable ["position", position _x];
		_x setVariable ["loadout", getUnitLoadout _x];
	} forEach (units (group _leader));
} forEach [
	leader1,
	leader2,
	...
];

Восстанавливать состояние персонажей так:

_x setPosition (_x getVariable "position");
_x setUnitLoadout (_x getVariable "loadout");

  • 0

#5 OFFLINE   Paprikar

Paprikar

    Ефрейтор

  • Пользователи
  • 51 сообщений
  • Откуда:Россия
  • Отряд:TaskForce141

Отправлено 02 May 2017 - 20:09

Хммм. Заработало. Только с некоторыми поправками:
В триггере, охватывающем нужных нам ботов, в строке активация прописал следующее:

arr = (units leader1);
{ _x enableSimulation false; _x hideObject true; 
  _x setVariable ["position", position _x]; 
  _x setVariable ["loadout", getUnitLoadout _x];
} forEach arr;

Для проверки возврата всех юнитов на свои места поставил триггер, который при моём входе в него делает это:

{_x setPos (_x getVariable "position"); 
_x setUnitLoadout (_x getVariable "loadout");
_x hideObject false;
_x enableSimulation true;
} forEach arr;

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


  • 0

#6 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 02 May 2017 - 21:08

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

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

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

Сначала нужно создать группу (

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

), потом добавить к ней юниты (первый юнит -- лидер).

И тогда надо иметь массив вида

[
	[<position1>, <loadout1>],
	[<position2>, <loadout2>],
	...
]

по которому "пробегаться" с помощью forEach.

Для удаления юнитов можно "пройтись" по юнитам группы, которая создавалась ранее.


  • 0

#7 OFFLINE   Paprikar

Paprikar

    Ефрейтор

  • Пользователи
  • 51 сообщений
  • Откуда:Россия
  • Отряд:TaskForce141

Отправлено 03 May 2017 - 00:02

Ничего не пойму, в триггере с юнитами добавил строку "_x setVariable ["unit", typeOf _x]" и на проверочном триггере  в поле активация записано это:

_group = createGroup west;
{
_x getVariable "unit" createUnit [_x getVariable "position",_group,{this setUnitLoadout (_x getVariable "loadout"); this hideObject false; this enableSimulation true;}]
} forEach arr;

При запуске триггера вылетает ошибка (решетка перед createUnit).


  • 0

#8 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 03 May 2017 - 11:40   Лучший Ответ

Paprikar, вы присвоили переменную юниту, а вы уверены что данный юнит существует, когда вызывается второй участок кода? И уверены что на втором участке кода у всех юнитов будет определена данная переменная? Почитайте лог, наверняка там написано что-то подобное: undefined variable in expression; zero division... - все это соответствует неопредленной переменной

PS Хранить информацию о юните в самом юните, который может уже и не существовать когда эта информация потребуется - бред, воспользуйтесь глобальной переменной-массивом или логическими объектами
myArray = [
  [<className>, <position>, <loadout>],
  ...
];
{
  private _className = _x select 0;
  private _position = _x select 1;
  private _loadout = _x select 2;

  ...
} forEach myArray

  • 0

#9 OFFLINE   Paprikar

Paprikar

    Ефрейтор

  • Пользователи
  • 51 сообщений
  • Откуда:Россия
  • Отряд:TaskForce141

Отправлено 07 May 2017 - 04:23

Прошу прощения за моё долгое отсутствие, не мог залогиниться... Однако проблему решил.

Триггер у юнитов:

xA = [];
{
 xA = xA + [[typeOf _x] + [getPos _x] + [vectorDir _x] + [getUnitLoadout _x]]; deleteVehicle _x
} forEach thisList;

Триггер активации:
 

_grp = createGroup west;
{
(_x select 0) createUnit [(_x select 1), _grp, 
"this setVectorDir (_x select 2); this setUnitLoadout (_x select 3);"];
} forEach xA;

Однако при дальнейшем создании миссии наткнулся на очередную проблему.
Допустим, что есть массив MissionsArray = [["Miss1", "Мисс1"], ["Miss2", "Мисс2"], и т.д...]
Нулевое значение каждого подмассива - это название маркера, охватывающего группу юнитов. ((MissionsArray select 0, 1 и т.д...) select 0)
Далее мне нужно создать триггер на месте этого маркера:
 

{
	_tmpMarker = _x select 0;
	_tmpMarker call compile format ["%1 = _this; publicVariable '%1'", _tmpTriggerArr];
	
	tMissionsArray = createTrigger ["EmptyDetector", getMarkerPos _tmpMarker];
	tMissionsArray setTriggerArea [(getMarkerSize _tmpMarker) select 0, (getMarkerSize _tmpMarker) select 1, 0, false];
	tMissionsArray setTriggerType "NONE";
	tMissionsArray setTriggerActivation ["WEST", "PRESENT", false];
	tMissionsArray setTriggerStatements ["true", "_tmpTriggerArr = []; { _tmpTriggerArr = _tmpTriggerArr + [[typeOf _x] + [getPos _x] + [vectorDir _x] + [getUnitLoadout _x]]; deleteVehicle _x} forEach thisList", ""];
} forEach MissionsArray;

И, как я понял, _tmpTriggerArr = "Miss1"... Как же мне сдедать так, чтобы _tmpTriggerArr принял значение Miss1, вернее как получить Miss1 из "Miss1"???


Сообщение отредактировал Paprikar: 07 May 2017 - 04:31

  • 0

#10 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 07 May 2017 - 12:26

Paprikar, если нужно как переменную:
missionNamespace setVariable ["Miss1", value];
missionNamespace getVariable "Miss1";
missionNamespace getVariable ["Miss1", valueDefault];

Сообщение отредактировал vlad333000: 07 May 2017 - 12:26

  • 0

#11 OFFLINE   Paprikar

Paprikar

    Ефрейтор

  • Пользователи
  • 51 сообщений
  • Откуда:Россия
  • Отряд:TaskForce141

Отправлено 07 May 2017 - 19:12

Ну теперь уж я понял, как работают setVariable и getVariable. Спасибо! В итоге участок кода выглядит вот так:

{
	tmpTrigger = _x select 0;
	tMissionsArray = createTrigger ["EmptyDetector", getMarkerPos tmpTrigger];
	tMissionsArray setTriggerArea [(getMarkerSize tmpTrigger) select 0, (getMarkerSize tmpTrigger) select 1, 0, false];
	tMissionsArray setTriggerType "NONE";
	tMissionsArray setTriggerActivation ["EAST", "PRESENT", false];
	tMissionsArray setTriggerStatements ["true", "tmpTriggerArr = []; { tmpTriggerArr = tmpTriggerArr + [[typeOf _x] + [getPos _x] + [vectorDir _x] + [getUnitLoadout _x]]; deleteVehicle _x} forEach thisList; missionNamespace setVariable [tmpTrigger, tmpTriggerArr, true];", ""];
} forEach MissionsArray;

  • 0




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