Jump to content
Sign in to follow this  
Sharif

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

Recommended Posts

В общем суть такова, есть десант на 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"};
		};
	};
};

 

 

Edited by Sharif

Share this post


Link to post
Share on other sites

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

Спойлер

 

 

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

Edited by grafon

Share this post


Link to post
Share on other sites
2 часа назад, Sharif сказал:

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

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

Share this post


Link to post
Share on other sites
15 минут назад, Merans сказал:

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

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

Share this post


Link to post
Share on other sites
23 часа назад, Merans сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Есть несколько вопросов по коду в 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];
};

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.