Script d'animation d'une barrière

  • Ce script fait ouvrir une barrière pour le passage de véhicule.

Effet

  • La barrière s'ouvre au passage d'un véhicule d'une unité de la même side, ou de civil (Wiki BIS : side).
  • Le garde salut au passage du véhicule.

Utilisation

  • Il est possible de passer au script plusieurs positions de barrière, d'une même side ou de side différentes. Dans le cas de plusieurs barrières d'une même side, les gardes appartiennent a un seul et même groupe.
  • Différents paramètres sont passés pour chaque barrière :
    • 1er paramètre : Position.
    • 2ème paramètre : Direction.
    • 3ème paramètre : Distance de déclenchement de l'animation.
    • 4ème paramètre : Side.
// [[paramètre 1ère barrière],[paramètre 2ème barrière],...] execVM "nomduscript.sqf";
// Une barrière sur la base nord/ouest du Chernarus
[[[4542.5,9864,0],0,75,west]] execVM "nomduscript.sqf";
 
// Trois barrières, deux sur la base base sud (coté west) et une sur la base nord (coté east) du Takistan
[[[8205.9,2222.5],164,60,west], [[8470,1958],252,75,west], [[6127,11422,0],318,75,east]] execVM "nomduscript.sqf";
  • ATTENTION, l'IA a quelques difficultés pour franchir le passage d'une barrière ouverte.
Optionnel
  • Si l'on ne veut pas que l'unité soit éliminé, on peut rajouter une ligne (ou enlever les slash qui mettent en commentaire une ligne dans le script ci-dessous) qui permet lors d'une attaque de la zone par des IA ENI, qu'ils ne se focalisent pas sur cette unité.
//Captive... (neutre, civil), à rajouter après la récupération de l'unité//
_unit setCaptive true;
 
//Et lui rajouter des NVG, s'il fait parti d'une armée correctement équipée//
if (typeOf _unit != "TK_Soldier_EP1") then {if !(_unit hasWeapon "NVGoggles") then {_unit addWeapon "NVGoggles";};};
 
//Et même invincible... De la même façon que pour rendre la barrière presque indestructible.//
_unit addeventhandler ["HandleDamage",{0}];
  • Dans le cas contraire ou ces lignes ne sont pas ajoutées dans le script ou retirées du script ci-dessous, et que la barrière est détruite, l'unité redevient autonome.
Code
private ["_worldname","_count","_group","_i","_ar","_pos","_barrier","_distance","_side","_guard","_unit","_dir"];
_worldname = tolower worldName;
_count = count _this;
_group = grpNull;
for [{_i = 0},{_i < _count},{_i = _i + 1}] do {
	_ar = _this select _i;
	_pos = _ar select 0;
	_barrier = createVehicle ["ZavoraAnim",_pos,[],0,"NONE"];
	_barrier setPos _pos;
	_barrier setDir (_ar select 1);
	_barrier addEventHandler ["handleDamage", {0}];
	_distance = _ar select 2;
	_side = _ar select 3;
	if (isNull _group) then { 
		_group = createGroup _side;
	} else {
		if (_side != side _group) then {_group = createGroup _side;};
	};
	_guard = switch (_side) do {
		case west : {
			if ((_worldname == "takistan") || (_worldname == "zargabad")) then {"CZ_Special_Forces_DES_EP1";};
			if ((_worldname == "chernarus") || (_worldname == "utes")) then {"CDF_Soldier";};
		};
		case east : {
			if ((_worldname == "takistan") || (_worldname == "zargabad")) then {"TK_Soldier_EP1";};
			if ((_worldname == "chernarus") || (_worldname == "utes")) then {"RU_Soldier";};
		};
		default {_guard = "UN_CDF_Soldier_EP1"};
	};
	_unit = _group createUnit [_guard,getPos _barrier,[],0,"NONE"];
	_dir = [_unit,_barrier] call BIS_fnc_dirTo;
	_unit setDir _dir;
	doStop _unit;
	_unit setSkill ["spotDistance",1.0];
	_unit disableAI "MOVE";
//	_unit setCaptive true;
//	_unit addeventhandler ["HandleDamage",{0;}];
//	if (typeOf _unit != "TK_Soldier_EP1") then {if !(_unit hasWeapon "NVGoggles") then {_unit addWeapon "NVGoggles";};};
	[_barrier,_distance,_unit,_side] spawn {
		private ["_barrier","_distance","_unit","_side","_posunit","_pos","_goodguys","_phase","_anime","_array","_count","_i","_ar","_quidam","_dist"];
		_barrier = _this select 0;
		_distance = _this select 1;
		_unit = _this select 2;
		_side = _this select 3;
		_posunit = getPos _unit;
		_pos = getPos _barrier;
		_goodguys = objNull;
		_phase = 1;
		while {damage _barrier < 0.95} do {
			_anime = _barrier animationPhase "Bargate";
			_array = nearestObjects [_pos,["car","Tank","Motorcycle"],_distance];
			_count = count _array;
			if ((_count) > 0) then {
				_i = 0;
				for [{_i = 0},{_i < _count},{_i = _i + 1}] do {
					_ar = _array select _i;
					_quidam = driver _ar;
					_dist = _goodguys distance _barrier;
					if (((side _quidam == _side) || (side _quidam == civilian)) && (speed _ar != 0)) then {
						_goodguys = _quidam;
						_phase = 0;
						if (alive _unit) then {_unit move _posunit;};
					} else {
						if ((_dist > _distance) && (speed _ar == 0)) then {
							_phase = 1;
						};
					};
				_i = _i + 1;
				sleep 0.001;
				};
			} else {
				_phase = 1;
			};
			if (_phase != _anime) then {
				_barrier animate ["Bargate",_phase];
				if (alive _unit) then {
					_unit enableAI "MOVE";
					if (_phase == 0) then {
						_unit doWatch (getPos _goodguys);
						_unit setBehaviour "SAFE";
						sleep 2;
						_unit action ["SALUTE",_unit];
					} else {
						_unit doWatch objNull;
						doStop _unit;
						sleep 2;
					};
					_unit disableAI "MOVE";
				};
			};
			sleep 3.3;
		};
		if (alive _unit) then {
			_unit enableAI "MOVE";
//			_unit setCaptive false;
//			_unit removeEventHandler ["HandleDamage",0];
		};
	};
};

—- Original : BeTeP

 
scripts/anime_barriere.txt · Dernière modification: 14/01/2012 12:42 par BeTeP
 
Sauf mention contraire, le contenu de ce wiki est placé sous la licence suivante :GNU Free Documentation License 1.2
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki