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

Best Answer 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, в которых хранятся вещи убитых, и ещё какой-то, но я их не рассматривал.

#1
OFFLINE
Posted 14 September 2015 - 10:32
#2
OFFLINE
Posted 14 September 2015 - 11:17
Алгоритм следующий:
1 На карте расставляем маркеры.
2 В цикле проходим эти маркеры и проверяем, нет ли на его месте оружия. Если нет, то создаём.
3 "Засыпаем" на 20 мин.
4 Повторяем алгоритм с п. 2.
#3
OFFLINE
Posted 14 September 2015 - 11:37
#4
OFFLINE
Posted 14 September 2015 - 12:24 Best Answer
а как это сделать?
Довольно просто:
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, в которых хранятся вещи убитых, и ещё какой-то, но я их не рассматривал.
Edited by Schatten, 14 September 2015 - 12:26.
#5
OFFLINE
Posted 14 September 2015 - 13:30
#6
OFFLINE
Posted 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;
Edited by Schatten, 14 September 2015 - 14:23.
#7
OFFLINE
Posted 14 September 2015 - 16:06
allowedWeapons = [
"arifle_Mk20C_F",
"arifle_TRG20_F",
"arifle_MXC_F",
"arifle_Katiba_C_F",
...
]; это весь массив или тут что то еще писать надо?
#8
OFFLINE
Posted 14 September 2015 - 16:15
Это пример! Этот массив (allowedWeapons) вы формируете сами согласно правилам SQF.
#9
OFFLINE
Posted 14 September 2015 - 16:21
#10
OFFLINE
Posted 14 September 2015 - 16:25
я не совсем, но все таки нуб в скриптах
Похоже, что совсем, поэтому изучаем это: http://arma3.ru/foru...kriptopisaniiu/.
Edited by Schatten, 14 September 2015 - 16:26.
#11
OFFLINE
Posted 14 September 2015 - 16:47
#12
OFFLINE
Posted 14 September 2015 - 17:13
_weaponHolder setPosATL _this; // ... и устанавливаем на позицию, ...
Рекомендую оперировать командами
getPosWorld setPosWorld
иначе получите косяк по позициям, если как пример, позиция для спавна будет находиться на пирсе, то бишь над уровнем моря.
Я уже наступал на такие грабли)