380 lines
13 KiB
Plaintext
380 lines
13 KiB
Plaintext
|
scriptName "modules_e\Functions\objects\fn_HALO.sqf";
|
||
|
uiSleep 0.01;
|
||
|
|
||
|
//--- HALO -------------------------------------------------------------------------------------------------------------------------------------
|
||
|
if (typename _this == typename objnull) then {
|
||
|
|
||
|
_unit = _this;
|
||
|
|
||
|
//--- Eject!
|
||
|
waituntil {(vehicle _unit) iskindof "ParachuteBase" || !isnil {_unit getvariable "bis_fnc_halo_now"}};
|
||
|
if (!local _unit) exitwith {};
|
||
|
|
||
|
//--- Delete parachute
|
||
|
_parachute = vehicle _unit;
|
||
|
if (_parachute != _unit) then {
|
||
|
deletevehicle _parachute;
|
||
|
};
|
||
|
|
||
|
//--- Init
|
||
|
_dir = ([[0,0,0],velocity _unit] call bis_fnc_dirto);
|
||
|
_unit setdir _dir;
|
||
|
[objNull, player, rSwitchMove,"HaloFreeFall_non"] call RE;
|
||
|
player switchmove "HaloFreeFall_non";
|
||
|
|
||
|
//--- Key controls
|
||
|
if (_unit == player) then {
|
||
|
//--- PLAYER ------------------------------------------------
|
||
|
|
||
|
_brightness = 0.99;
|
||
|
_pos = [player] call FNC_GetPos;
|
||
|
_parray = [
|
||
|
/* 00 */ ["\Ca\Data\ParticleEffects\Universal\Universal", 16, 12, 13, 0],
|
||
|
/* 01 */ "",
|
||
|
/* 02 */ "Billboard",
|
||
|
/* 03 */ 1,
|
||
|
/* 04 */ 3,
|
||
|
/* 05 */ [0,0,-200],
|
||
|
/* 06 */ wind,
|
||
|
/* 07 */ 0,
|
||
|
/* 08 */ 1.275,
|
||
|
/* 09 */ 1,
|
||
|
/* 10 */ 0,
|
||
|
/* 11 */ [100],
|
||
|
/* 12 */ [
|
||
|
[_brightness,_brightness,_brightness,0],
|
||
|
[_brightness,_brightness,_brightness,0.01],
|
||
|
[_brightness,_brightness,_brightness,0.10],
|
||
|
[_brightness,_brightness,_brightness,0]
|
||
|
],
|
||
|
/* 13 */ [1000],
|
||
|
/* 14 */ 0,
|
||
|
/* 15 */ 0,
|
||
|
/* 16 */ "",
|
||
|
/* 17 */ "",
|
||
|
/* 18 */ player
|
||
|
];
|
||
|
bis_fnc_halo_clouds = "#particlesource" createVehicleLocal _pos;
|
||
|
bis_fnc_halo_clouds setParticleParams _parray;
|
||
|
bis_fnc_halo_clouds setParticleRandom [0, [100, 100, 0], [0, 0, 0], 0, 0, [0, 0, 0, 0], 0, 1];
|
||
|
bis_fnc_halo_clouds setParticleCircle [00, [00, 00, 00]];
|
||
|
bis_fnc_halo_clouds setDropInterval (0.4 - (0.3 * overcast));
|
||
|
|
||
|
|
||
|
//--- Effects
|
||
|
bis_fnc_halo_ppRadialBlur = ppeffectcreate ["RadialBlur",464];
|
||
|
bis_fnc_halo_ppRadialBlur ppEffectAdjust [0.01,0.01,0.3,0.3];
|
||
|
bis_fnc_halo_ppRadialBlur ppEffectCommit 0.01;
|
||
|
bis_fnc_halo_ppRadialBlur ppEffectEnable true ;
|
||
|
bis_fnc_halo_soundLoop = time;
|
||
|
playsound "BIS_HALO_Flapping";
|
||
|
|
||
|
bis_fnc_halo_action = _unit addaction [localize "STR_HALO_OPEN_CHUTE", "custom\fn_halo.sqf",[],1,true,true,"Eject"];
|
||
|
|
||
|
bis_fnc_halo_keydown = {
|
||
|
_key = _this select 1;
|
||
|
|
||
|
//--- Forward
|
||
|
//if (_key in (actionkeys 'HeliForward')) then {
|
||
|
if (_key in (actionkeys 'MoveForward')) then {
|
||
|
if (bis_fnc_halo_vel < +bis_fnc_halo_velLimit) then {bis_fnc_halo_vel = bis_fnc_halo_vel + bis_fnc_halo_velAdd};
|
||
|
};
|
||
|
|
||
|
//--- Backward
|
||
|
//if (_key in (actionkeys 'HeliBack')) then {
|
||
|
if (_key in (actionkeys 'MoveBack')) then {
|
||
|
if (bis_fnc_halo_vel > -bis_fnc_halo_velLimit) then {bis_fnc_halo_vel = bis_fnc_halo_vel - bis_fnc_halo_velAdd};
|
||
|
};
|
||
|
|
||
|
//--- Left
|
||
|
//if (_key in (actionkeys 'HeliCyclicLeft')) then {
|
||
|
if (_key in (actionkeys 'TurnLeft')) then {
|
||
|
if (bis_fnc_halo_dir > -bis_fnc_halo_dirLimit) then {bis_fnc_halo_dir = bis_fnc_halo_dir - bis_fnc_halo_dirAdd};
|
||
|
};
|
||
|
|
||
|
//--- Right
|
||
|
//if (_key in (actionkeys 'HeliCyclicRight')) then {
|
||
|
if (_key in (actionkeys 'TurnRight')) then {
|
||
|
if (bis_fnc_halo_dir < +bis_fnc_halo_dirLimit) then {bis_fnc_halo_dir = bis_fnc_halo_dir + bis_fnc_halo_dirAdd};
|
||
|
};
|
||
|
};
|
||
|
bis_fnc_halo_keydown_eh = (finddisplay 46) displayaddeventhandler ["keydown","_this call bis_fnc_halo_keydown;"];
|
||
|
|
||
|
//--- Loop
|
||
|
bis_fnc_halo_vel = 0;
|
||
|
bis_fnc_halo_velLimit = 0.2;
|
||
|
bis_fnc_halo_velAdd = 0.03;
|
||
|
bis_fnc_halo_dir = 0;
|
||
|
bis_fnc_halo_dirLimit = 1;
|
||
|
bis_fnc_halo_dirAdd = 0.06;
|
||
|
|
||
|
[] spawn {
|
||
|
_time = time - 0.1;
|
||
|
while {alive player && vehicle player == player && isnil {player getvariable "bis_fnc_halo_terminate"} && (([player] call FNC_GetPos) select 2) > DZE_HaloOpenChuteHeight} do {
|
||
|
|
||
|
//--- FPS counter
|
||
|
_fpsCoef = ((time - _time) * 60) / acctime; //Script is optimized for 60 FPS
|
||
|
_time = time;
|
||
|
|
||
|
bis_fnc_halo_velLimit = 0.2 * _fpsCoef;
|
||
|
bis_fnc_halo_velAdd = 0.03 * _fpsCoef;
|
||
|
bis_fnc_halo_dirLimit = 1 * _fpsCoef;
|
||
|
bis_fnc_halo_dirAdd = 0.06 * _fpsCoef;
|
||
|
|
||
|
//--- Dir
|
||
|
bis_fnc_halo_dir = bis_fnc_halo_dir * 0.98;
|
||
|
_dir = direction player + bis_fnc_halo_dir;
|
||
|
player setdir _dir;
|
||
|
|
||
|
//--- Velocity
|
||
|
_vel = velocity player;
|
||
|
bis_fnc_halo_vel = bis_fnc_halo_vel * 0.96;
|
||
|
player setvelocity [
|
||
|
(_vel select 0) + (sin _dir * bis_fnc_halo_vel),
|
||
|
(_vel select 1) + (cos _dir * bis_fnc_halo_vel),
|
||
|
(_vel select 2)
|
||
|
];
|
||
|
|
||
|
//--- Animation system
|
||
|
_anim = "HaloFreeFall_non";
|
||
|
_v = bis_fnc_halo_vel;
|
||
|
_h = bis_fnc_halo_dir;
|
||
|
|
||
|
_vLimit = 0.1;
|
||
|
_hLimit = 0.3;
|
||
|
if ((abs _v) > _vLimit || (abs _h) > _hLimit) then {
|
||
|
_vAnim = "";
|
||
|
if (_v > +_vLimit) then {_vAnim = "F"};
|
||
|
if (_v < -_vLimit) then {_vAnim = "B"};
|
||
|
_hAnim = "";
|
||
|
if (_h > +_hLimit) then {_hAnim = "R"};
|
||
|
if (_h < -_hLimit) then {_hAnim = "L"};
|
||
|
_anim = "HaloFreeFall_" + _vAnim + _hAnim;
|
||
|
};
|
||
|
|
||
|
player playmovenow _anim;
|
||
|
|
||
|
//--- Sound
|
||
|
if ((time - bis_fnc_halo_soundLoop) > 4.5) then {
|
||
|
playsound "BIS_HALO_Flapping";
|
||
|
bis_fnc_halo_soundLoop = time;
|
||
|
};
|
||
|
|
||
|
//--- Effects
|
||
|
/*
|
||
|
bis_fnc_halo_ppRadialBlur ppEffectAdjust [0.02,0.02,0.3 - (bis_fnc_halo_vel/7)/_fpsCoef,0.3 - (bis_fnc_halo_vel/7)/_fpsCoef];
|
||
|
bis_fnc_halo_ppRadialBlur ppEffectCommit 0.01;
|
||
|
*/
|
||
|
if (DZE_HaloAltitudeMeter && !isNil "Dayz_loginCompleted") then {
|
||
|
titleText [
|
||
|
format [
|
||
|
localize "str_halo_altitude_speed",
|
||
|
str(round(([player] call FNC_GetPos) select 2)) + " m",
|
||
|
str(abs(round(speed(vehicle player)))) + " " + localize "str_lib_info_unit_kilometers_per_hour"
|
||
|
],"PLAIN DOWN",0.01
|
||
|
];
|
||
|
};
|
||
|
|
||
|
uiSleep 0.01;
|
||
|
};
|
||
|
//--- End
|
||
|
player removeaction bis_fnc_halo_action;
|
||
|
(finddisplay 46) displayremoveeventhandler ["keydown",bis_fnc_halo_keydown_eh];
|
||
|
ppeffectdestroy bis_fnc_halo_ppRadialBlur;
|
||
|
deletevehicle bis_fnc_halo_clouds;
|
||
|
|
||
|
bis_fnc_halo_clouds = nil;
|
||
|
bis_fnc_halo_vel = nil;
|
||
|
bis_fnc_halo_velLimit = nil;
|
||
|
bis_fnc_halo_velAdd = nil;
|
||
|
bis_fnc_halo_dir = nil;
|
||
|
bis_fnc_halo_dirLimit = nil;
|
||
|
bis_fnc_halo_dirAdd = nil;
|
||
|
bis_fnc_halo_action = nil;
|
||
|
bis_fnc_halo_keydown = nil;
|
||
|
bis_fnc_halo_keydown_eh = nil;
|
||
|
|
||
|
if (!alive player) then {
|
||
|
[objNull, player, rSwitchMove,"adthppnemstpsraswrfldnon_1"] call RE;
|
||
|
player switchmove "adthppnemstpsraswrfldnon_1";
|
||
|
player setvelocity [0,0,0];
|
||
|
} else {
|
||
|
if (DZE_HaloOpenChuteHeight > -1 && isNil "bis_fnc_halo_para_dirAbs") then {
|
||
|
//Auto open chute
|
||
|
[player] spawn BIS_fnc_Halo;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
} else {
|
||
|
//--- AI ------------------------------------------------
|
||
|
while {(([_unit] call FNC_GetPos) select 2) > 100} do {
|
||
|
_destination = expecteddestination _unit select 0;
|
||
|
_unitPosition = [_unit] call FNC_GetPos;
|
||
|
if ((_destination distance [(_unitPosition select 0),(_unitPosition select 1),0]) > 10) then {
|
||
|
_vel = velocity _unit;
|
||
|
_dirTo = [_unit,_destination] call bis_fnc_dirto;
|
||
|
if (player distance _unit > 500) then {
|
||
|
_unit setdir _dirTo;
|
||
|
};
|
||
|
_unit setvelocity [
|
||
|
(_vel select 0) + (sin _dirTo * 0.2),
|
||
|
(_vel select 1) + (cos _dirTo * 0.2),
|
||
|
(_vel select 2)
|
||
|
];
|
||
|
};
|
||
|
uiSleep 0.01;
|
||
|
};
|
||
|
|
||
|
//--- Open
|
||
|
[_unit] spawn bis_fnc_halo;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
//--- PARA -------------------------------------------------------------------------------------------------------------------------------------
|
||
|
if (typename _this == typename []) then {
|
||
|
|
||
|
_unit = _this select 0;
|
||
|
if (!local _unit) exitwith {};
|
||
|
|
||
|
//--- Free fall
|
||
|
if (count _this == 2) exitwith { //Fresh spawn calling from player_monitor.fsm
|
||
|
_alt = _this select 1;
|
||
|
_unit call fn_exitSwim;
|
||
|
_unit setvariable ["bis_fnc_halo_now",true];
|
||
|
_unit spawn bis_fnc_halo;
|
||
|
};
|
||
|
//-------------
|
||
|
|
||
|
_para = objnull;
|
||
|
_vel = [];
|
||
|
_unit allowDamage false; //Prevent glitch death when opening chute
|
||
|
_paraPosition1 = [_unit] call FNC_GetPos;
|
||
|
_para = createVehicle ["ParachuteWest", _paraPosition1, [], 0, "CAN_COLLIDE"];
|
||
|
//_para = "BIS_Steerable_Parachute" createVehicle position _unit;
|
||
|
_para setpos _paraPosition1;
|
||
|
_para setdir direction _unit;
|
||
|
_vel = velocity _unit;
|
||
|
_unit moveindriver _para;
|
||
|
//_unit moveingunner _para;
|
||
|
_para lock false;
|
||
|
|
||
|
bis_fnc_halo_para_dirAbs = direction _para;
|
||
|
_unit allowDamage true;
|
||
|
|
||
|
//--- Key controls
|
||
|
if (_unit == player) then {
|
||
|
_para setvelocity [(_vel select 0),(_vel select 1),(_vel select 2)*1];
|
||
|
|
||
|
/*
|
||
|
bis_fnc_halo_DynamicBlur = ppeffectcreate ["DynamicBlur",464];
|
||
|
bis_fnc_halo_DynamicBlur ppEffectEnable true;
|
||
|
bis_fnc_halo_DynamicBlur ppEffectAdjust [8.0];
|
||
|
bis_fnc_halo_DynamicBlur ppEffectCommit 0;
|
||
|
bis_fnc_halo_DynamicBlur ppEffectAdjust [0.0];
|
||
|
bis_fnc_halo_DynamicBlur ppEffectCommit 1;
|
||
|
*/
|
||
|
|
||
|
bis_fnc_halo_para_vel = 0;
|
||
|
bis_fnc_halo_para_velLimit = 0.5;
|
||
|
bis_fnc_halo_para_velAdd = 0.01;
|
||
|
bis_fnc_halo_para_dir = 0;
|
||
|
bis_fnc_halo_para_dirLimit = 1.5;
|
||
|
bis_fnc_halo_para_dirAdd = 0.03;
|
||
|
|
||
|
bis_fnc_halo_para_keydown = {
|
||
|
_key = _this select 1;
|
||
|
|
||
|
//--- Forward
|
||
|
if (_key in (actionkeys 'MoveForward')) then {
|
||
|
if (bis_fnc_halo_para_vel < +bis_fnc_halo_para_velLimit) then {bis_fnc_halo_para_vel = bis_fnc_halo_para_vel + bis_fnc_halo_para_velAdd};
|
||
|
};
|
||
|
|
||
|
//--- Backward
|
||
|
if (_key in (actionkeys 'MoveBack')) then {
|
||
|
if (bis_fnc_halo_para_vel > -bis_fnc_halo_para_velLimit*0) then {bis_fnc_halo_para_vel = bis_fnc_halo_para_vel - bis_fnc_halo_para_velAdd};
|
||
|
};
|
||
|
|
||
|
//--- Left
|
||
|
if (_key in (actionkeys 'TurnLeft')) then {
|
||
|
if (bis_fnc_halo_para_dir > -bis_fnc_halo_para_dirLimit) then {bis_fnc_halo_para_dir = bis_fnc_halo_para_dir - bis_fnc_halo_para_dirAdd};
|
||
|
};
|
||
|
|
||
|
//--- Right
|
||
|
if (_key in (actionkeys 'TurnRight')) then {
|
||
|
if (bis_fnc_halo_para_dir < +bis_fnc_halo_para_dirLimit) then {bis_fnc_halo_para_dir = bis_fnc_halo_para_dir + bis_fnc_halo_para_dirAdd};
|
||
|
};
|
||
|
};
|
||
|
bis_fnc_halo_para_loop_time = time - 0.1;
|
||
|
bis_fnc_halo_para_velZ = velocity _para select 2;
|
||
|
bis_fnc_halo_para_loop = {
|
||
|
if (!isnil {player getvariable "bis_fnc_halo_terminate"}) exitwith {};
|
||
|
if (time == bis_fnc_halo_para_loop_time) exitwith {}; //--- FPS too high
|
||
|
|
||
|
_para = vehicle player;
|
||
|
|
||
|
//--- FPS counter
|
||
|
_fpsCoef = ((time - bis_fnc_halo_para_loop_time) * 20) / acctime; //Script is optimized for 20 FPS
|
||
|
bis_fnc_halo_para_loop_time = time;
|
||
|
|
||
|
//_fpsCoef = _fpsCoef / 3;
|
||
|
bis_fnc_halo_para_velLimit = 0.3 * _fpsCoef;
|
||
|
bis_fnc_halo_para_velAdd = 0.002 * _fpsCoef;
|
||
|
bis_fnc_halo_para_dirLimit = 1.5 * _fpsCoef;
|
||
|
bis_fnc_halo_para_dirAdd = 0.03 * _fpsCoef;
|
||
|
|
||
|
//--- Dir
|
||
|
bis_fnc_halo_para_dir = bis_fnc_halo_para_dir * 0.98;
|
||
|
bis_fnc_halo_para_dirAbs = bis_fnc_halo_para_dirAbs + bis_fnc_halo_para_dir;
|
||
|
_para setdir bis_fnc_halo_para_dirAbs;
|
||
|
_dir = direction _para;
|
||
|
|
||
|
//--- Crash
|
||
|
_velZ = velocity _para select 2;
|
||
|
//if ((_velZ - bis_fnc_halo_para_velZ) > 7 && (getposatl _para select 2) < 100) then {player setdamage 1;debuglog ["Log::::::::::::::",(_velZ - bis_fnc_halo_para_velZ)];};
|
||
|
bis_fnc_halo_para_velZ = _velZ;
|
||
|
|
||
|
//--- Pos
|
||
|
_para setposasl [
|
||
|
(getposasl _para select 0) + (sin _dir * (0.1 + bis_fnc_halo_para_vel)),
|
||
|
(getposasl _para select 1) + (cos _dir * (0.1 + bis_fnc_halo_para_vel)),
|
||
|
(getposasl _para select 2) - 0.01 - 0.1 * abs bis_fnc_halo_para_vel
|
||
|
];
|
||
|
|
||
|
[
|
||
|
_para,
|
||
|
(-bis_fnc_halo_para_vel * 75) + 0.5*(sin (time * 180)),
|
||
|
(+bis_fnc_halo_para_dir * 25) + 0.5*(cos (time * 180))
|
||
|
] call bis_fnc_setpitchbank;
|
||
|
};
|
||
|
|
||
|
bis_fnc_halo_para_mousemoving_eh = (finddisplay 46) displayaddeventhandler ["mousemoving","_this call bis_fnc_halo_para_loop;"];
|
||
|
bis_fnc_halo_para_mouseholding_eh = (finddisplay 46) displayaddeventhandler ["mouseholding","_this call bis_fnc_halo_para_loop;"];
|
||
|
|
||
|
uiSleep 4;
|
||
|
|
||
|
// ppeffectdestroy bis_fnc_halo_DynamicBlur;
|
||
|
bis_fnc_halo_para_keydown_eh = (finddisplay 46) displayaddeventhandler ["keydown","_this call bis_fnc_halo_para_keydown;"];
|
||
|
|
||
|
//--- End
|
||
|
//waituntil {vehicle player == player};
|
||
|
player setvariable ["bis_fnc_halo_terminate",nil];
|
||
|
waituntil {(([(vehicle player)] call FNC_GetPos) select 2) < 2 || !isnil {player getvariable "bis_fnc_halo_terminate"}};
|
||
|
(finddisplay 46) displayremoveeventhandler ["keydown",bis_fnc_halo_para_keydown_eh];
|
||
|
(finddisplay 46) displayremoveeventhandler ["mousemoving",bis_fnc_halo_para_mousemoving_eh];
|
||
|
(finddisplay 46) displayremoveeventhandler ["mouseholding",bis_fnc_halo_para_mouseholding_eh];
|
||
|
|
||
|
bis_fnc_halo_para_vel = nil;
|
||
|
bis_fnc_halo_para_velLimit = nil;
|
||
|
bis_fnc_halo_para_velAdd = nil;
|
||
|
bis_fnc_halo_para_dir = nil;
|
||
|
bis_fnc_halo_para_dirLimit = nil;
|
||
|
bis_fnc_halo_para_dirAdd = nil;
|
||
|
bis_fnc_halo_para_keydown = nil;
|
||
|
bis_fnc_halo_para_loop = nil;
|
||
|
bis_fnc_halo_para_keydown_eh = nil;
|
||
|
bis_fnc_halo_para_mousemoving_eh = nil;
|
||
|
bis_fnc_halo_para_mouseholding_eh = nil;
|
||
|
bis_fnc_halo_para_dirAbs = nil;
|
||
|
};
|
||
|
};
|