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


Фотография

спавн рандомного оружия и его респавн


Лучший Ответ Schatten , 14 September 2015 - 12:24

а как это сделать?

Довольно просто:

while {true} do {
	for "_i" from 1 to 20 do {
		_position = getMarkerPos ("weaponsSpawnMarker" + (str _i));

		_nearestWeaponHolder = nearestObject [_position, "GroundWeaponHolder"]; // Ищем "держатель оружия" в радиусе 50 м

		if ((isNull _nearestWeaponHolder) or {(_position distance _nearestWeaponHolder) > 5}) then { // Если "держатель оружия" не найден или находится на расстоянии более 5 м, то ...
			_position spawn {
				_weaponHolder = createVehicle ["GroundWeaponHolder", _this, [], 0, "CAN_COLLIDE"]; // ... создаём "держатель оружия", ...

				_weaponHolder setDir (floor (random 360)); // ... поворачиваем его на какой-нибудь угол ...
				_weaponHolder setPosATL _this; // ... и устанавливаем на позицию, ...

				_weapon = allowedWeapons call BIS_fnc_selectRandom; // ... выбираем из РАНЕЕ ОБЪЯВЛЕННОГО массива разрешённого оружия какое-нибудь название класса, ...

				_magazines = getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines"); // ... извлекаем массив совместимых магазинов, ...

				_magazine = _magazines select 0; // ... выбираем первое название класса, ...

				_weaponHolder addWeaponCargoGlobal [_weapon, 1]; // ... дабавляем один ствол ...
				_weaponHolder addMagazineCargoGlobal [_magazine, [3, 5] call BIS_fnc_randomInt]; // ... и от 3-х до 5-и магазинов.
			};
		};
	};

	sleep (20 * 60); // "Засыпаем" на 20 мин
};

Подразумевается, что маркеры имеют название "weaponsSpawnMarkerN", где N = 1...20.
Вещи на земле хранятся в т. н. "держателях оружия" - GroundWeaponHolder. Есть ещё weaponHolderSimulated, в которых хранятся вещи убитых, и ещё какой-то, но я их не рассматривал.

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


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

#1 OFFLINE   IIIYT

IIIYT

    Рядовой

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

Отправлено 14 September 2015 - 10:32

Нужен скрипт наподобие как в dayz. Нужно чтобы скрип в определенных координатах спавнил рандомно оружие и предметы выбирая из списка разрешенных для спавна, а после того как данный предмет был поднят респавнил на том же месте минут эдак через 20 тем же образом.пожалуйста поподробнее, я не совсем, но все таки нуб в скриптах
  • 0

#2 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 14 September 2015 - 11:17

Алгоритм следующий:
1 На карте расставляем маркеры.
2 В цикле проходим эти маркеры и проверяем, нет ли на его месте оружия. Если нет, то создаём.
3 "Засыпаем" на 20 мин.
4 Повторяем алгоритм с п. 2.


  • 0

#3 OFFLINE   IIIYT

IIIYT

    Рядовой

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

Отправлено 14 September 2015 - 11:37

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

#4 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 14 September 2015 - 12:24   Лучший Ответ

а как это сделать?

Довольно просто:

while {true} do {
	for "_i" from 1 to 20 do {
		_position = getMarkerPos ("weaponsSpawnMarker" + (str _i));

		_nearestWeaponHolder = nearestObject [_position, "GroundWeaponHolder"]; // Ищем "держатель оружия" в радиусе 50 м

		if ((isNull _nearestWeaponHolder) or {(_position distance _nearestWeaponHolder) > 5}) then { // Если "держатель оружия" не найден или находится на расстоянии более 5 м, то ...
			_position spawn {
				_weaponHolder = createVehicle ["GroundWeaponHolder", _this, [], 0, "CAN_COLLIDE"]; // ... создаём "держатель оружия", ...

				_weaponHolder setDir (floor (random 360)); // ... поворачиваем его на какой-нибудь угол ...
				_weaponHolder setPosATL _this; // ... и устанавливаем на позицию, ...

				_weapon = allowedWeapons call BIS_fnc_selectRandom; // ... выбираем из РАНЕЕ ОБЪЯВЛЕННОГО массива разрешённого оружия какое-нибудь название класса, ...

				_magazines = getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines"); // ... извлекаем массив совместимых магазинов, ...

				_magazine = _magazines select 0; // ... выбираем первое название класса, ...

				_weaponHolder addWeaponCargoGlobal [_weapon, 1]; // ... дабавляем один ствол ...
				_weaponHolder addMagazineCargoGlobal [_magazine, [3, 5] call BIS_fnc_randomInt]; // ... и от 3-х до 5-и магазинов.
			};
		};
	};

	sleep (20 * 60); // "Засыпаем" на 20 мин
};

Подразумевается, что маркеры имеют название "weaponsSpawnMarkerN", где N = 1...20.
Вещи на земле хранятся в т. н. "держателях оружия" - GroundWeaponHolder. Есть ещё weaponHolderSimulated, в которых хранятся вещи убитых, и ещё какой-то, но я их не рассматривал.


Сообщение отредактировал Schatten: 14 September 2015 - 12:26

  • 0

#5 OFFLINE   IIIYT

IIIYT

    Рядовой

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

Отправлено 14 September 2015 - 13:30

_weaponHolder = createVehicle ["GroundWeaponHolder", _this, [], 0, "CAN_COLLIDE"]; как полагаю, где то после этого должен находится список разрешенного оружия ? И как он должен примерно выглядеть чтобы нормально взаимодействовать с этим скриптом ? И насколько понимаю это надо прописать в инит? P.s не серчайте на нуба ))
  • 0

#6 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 14 September 2015 - 14:15

И насколько понимаю это надо прописать в инит?

Да, но так, чтобы он запускался только с сервера.
Лучше всего сохранить этот код в файл, например, weaponsSpawning.sqf, и запускать его из initServer.sqf так:

execVM "weaponsSpawning.sqf";

_weaponHolder = createVehicle ["GroundWeaponHolder", _this, [], 0, "CAN_COLLIDE"]; как полагаю, где то после этого должен находится список разрешенного оружия ?

Где-то до цикла while.
Если вы будете делать так, как я написал выше, то до запуска weaponsSpawning.sqf.
 

И как он должен примерно выглядеть чтобы нормально взаимодействовать с этим скриптом ?

Вот так:

allowedWeapons = [
	"arifle_Mk20C_F",
	"arifle_TRG20_F",
	"arifle_MXC_F",
	"arifle_Katiba_C_F",
	...
];

Если же этот массив больше не будет нигде использоваться, то его можно вставить прямо в weaponsSpawning.sqf:

_weapon = [
	"arifle_Mk20C_F",
	"arifle_TRG20_F",
	"arifle_MXC_F",
	"arifle_Katiba_C_F",
	...
] call BIS_fnc_selectRandom;

Сообщение отредактировал Schatten: 14 September 2015 - 14:23

  • 0

#7 OFFLINE   IIIYT

IIIYT

    Рядовой

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

Отправлено 14 September 2015 - 16:06

Почему то не работает, все сделал в точь точь по инструкции, перепробывал кучу вариантов, ничего не появляется.
allowedWeapons = [
"arifle_Mk20C_F",
"arifle_TRG20_F",
"arifle_MXC_F",
"arifle_Katiba_C_F",
...
]; это весь массив или тут что то еще писать надо?
  • 0

#8 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 14 September 2015 - 16:15

Это пример! Этот массив (allowedWeapons) вы формируете сами согласно правилам SQF.


  • 0

#9 OFFLINE   IIIYT

IIIYT

    Рядовой

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

Отправлено 14 September 2015 - 16:21

Не убивайте...))6 но как это? Я не знаю программирование, только начинаю познавать, этот мир..)
  • 0

#10 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 14 September 2015 - 16:25

я не совсем, но все таки нуб в скриптах

Похоже, что совсем, поэтому изучаем это: http://arma3.ru/foru...kriptopisaniiu/.


Сообщение отредактировал Schatten: 14 September 2015 - 16:26

  • 0

#11 OFFLINE   IIIYT

IIIYT

    Рядовой

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

Отправлено 14 September 2015 - 16:47

Спасибо, давно искал что то подобное.)
  • 0

#12 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 14 September 2015 - 17:13

_weaponHolder setPosATL _this; // ... и устанавливаем на позицию, ...

Рекомендую оперировать командами

getPosWorld
setPosWorld

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

Я уже наступал на такие грабли)


  • 0




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