Перейти к содержанию
Авторизация  
Sharif

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

Рекомендуемые сообщения

В общем суть такова, есть десант на C-130J к нему идет два Airborne отделения. Так как администрация WOG3 не собирается добавлять мод Backpack on chest или какие-либо другие решения, появилась идея найти/написать скрипт для высадки без потери рюказака/ДВ. Так как я кодер не профессиональный, пошел искать решение на форумах. Нашел скрипт:
http://www.armaholic.com/page.php?id=23113 Лишний функционал вырезал (звуки, хим.светы на касках).
Также на выделенном сервере была проблема при высадке пехоты (все кроме командира отделения телепортировались обратно в самолет после 3 секунд в воздухе). Заменил команду _unit action ["EJECT", _vehicle]; на  moveOut _unit; и проблема решилась.
На данный момент при тесте на выделенном сервере проблем не обнаружил, однако требуется дополнительное тестирование с несколькими игроками (также неизвестно, как поведет себя при высадки 20 человек из одного самолета). В общем, хотел дать данный скрипт на обозрение более опытным скриптерам вога.

Вот код скрипта, который я использовал:

Спойлер

/*
	File: fn_paradrop.sqf
	Version: 1.1
	
	Author(s): cobra4v320 - effects adapted from old halo.sqs, sounds from freesound.org
	
	Description: allows AI units and players to paradrop - fixes AI bug
	
	Parameters:
	0: UNIT    - (object) the unit that will be doing the paradrop
	1: VEHICLE - (object) the vehicle that will be doing the paradrop
	2: (optional) SAVELOADOUT - (boolean) true to save backpack and its contents, and add a "fake" backpack to the front of the unit.
	3: (optional) CHEMLIGHT - (boolean) true if the units will use chemlights
	
	Example(s):
	[this, helo_1, true] call COB_fnc_paradrop
*/
if (!isDedicated) then {

//Parameters
private ["_unit","_vehicle","_saveLoadOut"]; 
_unit 	 	 = [_this, 0, objNull, [objNull]] call BIS_fnc_param;
_vehicle 	 = [_this, 1, objNull, [objNull]] call BIS_fnc_param;
_saveLoadOut = [_this, 2, true, [true]] call BIS_fnc_param;

//Validate parameters
if (isNull _unit) exitWith {"Unit parameter must not be objNull. Accepted: OBJECT" call BIS_fnc_error};
if (isNull _vehicle) exitWith {"Vehicle parameter must not be objNull. Accepted: OBJECT" call BIS_fnc_error};

//create a log entry
["Paradrop function has started"] call BIS_fnc_log;

//save the backpack and its contents, also adds fake pack to front of unit
if (_saveLoadOut && !isNull (unitBackpack _unit)) then {
	private ["_pack","_class","_magazines","_weapons","_items"];
	_pack	   = unitBackpack _unit;
	_class	   = typeOf _pack;
	_magazines = getMagazineCargo _pack;
	_weapons   = getWeaponCargo _pack;
	_items	   = getItemCargo _pack;

	removeBackpack _unit; //remove the backpack
	_unit addBackpack "b_parachute";

	//attach the bacpack to the unit
	[_unit,_class,_magazines,_weapons,_items] spawn {
		private ["_unit","_class","_magazines","_weapons","_items"];
		_unit		= _this select 0;
		_class		= _this select 1;
		_magazines	= _this select 2;
		_weapons 	= _this select 3;
		_items 		= _this select 4;
		
		private "_packHolder";
		_packHolder = createVehicle ["groundWeaponHolder", [0,0,0], [], 0, "can_collide"];
		_packHolder addBackpackCargoGlobal [_class, 1];
				
		waitUntil {animationState _unit == "para_pilot"};
		_packHolder attachTo [vehicle _unit,[-0.07,0.67,-0.13],"pelvis"]; 
		_packHolder setVectorDirAndUp [[0,-0.2,-1],[0,1,0]]; 

		waitUntil {isTouchingGround _unit || (getPos _unit select 2) < 1};
		deleteVehicle _packHolder; //delete the backpack in front
		_unit addBackpack _class; //return the backpack
		clearAllItemsFromBackpack _unit; //clear all gear from new backpack

		for "_i" from 0 to (count (_magazines select 0) - 1) do {
			(unitBackpack _unit) addMagazineCargoGlobal [(_magazines select 0) select _i,(_magazines select 1) select _i]; //return the magazines
		};
		for "_i" from 0 to (count (_weapons select 0) - 1) do {
			(unitBackpack _unit) addWeaponCargoGlobal [(_weapons select 0) select _i,(_weapons select 1) select _i]; //return the weapons
		};
		for "_i" from 0 to (count (_items select 0) - 1) do {
			(unitBackpack _unit) addItemCargoGlobal [(_items select 0) select _i,(_items select 1) select _i]; //return the items
		};
	};
} else {
	if ((backpack _unit) != "b_parachute") then {_unit addBackpack "B_parachute"}; //add the parachute if unit has no backpack
};

//eject from vehicle
[_unit,_vehicle] spawn {
	private ["_unit","_vehicle","_altitude"];
	_unit = _this select 0;
	_vehicle = _this select 1;

	_altitude = (getPos _vehicle select 2);
	_unit allowDamage false; //keep the AI from being injured when in para_pilot, its an AI bug
		
	 moveOut _unit;
	_unit setDir getDir _vehicle;
	_unit setPos [(getPos _vehicle select 0), (getPos _vehicle select 1) - random 15 + random 30, _altitude - 4];
	_unit setVelocity [0,20,-20];

	waitUntil {isTouchingGround _unit || (getPos _unit select 2) < 1}; //wait for unit to touch ground

	if (!isPlayer _unit) then {
		_unit setPos [(getPos _unit select 0), (getPos _unit select 1), 0]; //this removes the unit from the parachute
		_unit setVelocity [0,0,0]; //set speed to zero
		_unit setVectorUp [0,0,1]; //set the unit upright
		sleep 1;
		_unit allowDamage TRUE; //allow unit to be damaged again
	} else {
		_unit allowDamage TRUE; //allow unit to be damaged again
	};
};


//create a log entry
["Paradrop function has completed"] call BIS_fnc_log;

//Return Value
_unit;

};

 

Инициализация в init.sqf. Actionmenu выдается только тем, кто внутри C-130J при определенной скорости и высоте самолета. (спасибо [SW] Lex)

Спойлер

if !(isDedicated) then {
	_jumpCondition = "(((getPos (vehicle player)) select 2) >= 240) && !((vehicle player) isEqualTo player) && (typeOf (vehicle player) == 'RHS_C130J') && (((getPos (vehicle player)) select 2) <= 400) && (speed vehicle player <= 300)";   
	actionHandle = player addAction ["<t color='#FF0000'>PARADROP</t>", "[player, vehicle player, true] call COB_fnc_paradrop", "", 6, false, true, "", _jumpCondition];
};

 

Также надо было определить функцию в description.ext
 

Спойлер

class CfgFunctions 
{
	class COB 
	{
		class functions 
		{
			class paradrop {file = "COB_HALO\functions\fn_paradrop.sqf"};
		};
	};
};

 

 

Изменено пользователем Sharif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я делал примерно так

Спойлер

 

 

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

Изменено пользователем grafon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, Sharif сказал:

Так как администрация WOG3 не собирается добавлять мод Backpack on chest или какие-либо другие решения

Ставишь любой ящик, скидываешь туда дв, через эйс меню грузишь в вертолет (самолет), взлетаешь, так же через эйс меню сбрасываешь ящик, при посадке он помечается желтыми дымами. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
15 минут назад, Merans сказал:

Ставишь любой ящик, скидываешь туда дв, через эйс меню грузишь в вертолет (самолет), взлетаешь, так же через эйс меню сбрасываешь ящик, при посадке он помечается желтыми дымами. 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
23 часа назад, Merans сказал:

Ставишь любой ящик, скидываешь туда дв, через эйс меню грузишь в вертолет (самолет), взлетаешь, так же через эйс меню сбрасываешь ящик, при посадке он помечается желтыми дымами. 

сам понимаешь - проблемно это довольно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@krech Думаю в конце недели найду время, соберу волю и соотрядников и потестирую с записью. За предложение спасибо, думаю лучшей помощью будет подкинуть идей для стресс теста, может я пропущу что-то, что надо протестировать. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть несколько вопросов по коду в init.sqf:

1. Зачем вообще нужна пауза 5 секунд?

sleep 5;

2. Что это вообще за извращение?

for "_i" from 0 to 1 step 0 do

Попытка сделать бесконечный цикл? Для этого есть оператор while:

while {true} do {
	//код
};

Если это копипаст, то вопросов тогда нет, и советую эту писанину переписать на что-то подобное:

if !(isDedicated) then {
	_jumpCondition = "(((getPos (vehicle player)) select 2) >= 240) && !((vehicle player) isEqualTo player) && (typeOf (vehicle player) == 'RHS_C130J') && (((getPos (vehicle player)) select 2) <= 400) && (speed vehicle player <= 300)";   
	actionHandle = player addAction ["<t color='#FF0000'>PARADROP</t>", "[player, vehicle player, true] call COB_fnc_paradrop", "", 6, false, true, "", _jumpCondition];
};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видео тестов, все были сделаны на выделенном сервере.
 

Спойлер

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Sharif @grafon решена ли проблема дюпа снаряжения в рюкзаках, в этом скрипте?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@JackReign при тестах с игроками и в одиночку такой проблемы не было. Думаю окончательно можно будет сказать после использования на играх.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.