#include "\a3\editor_f\Data\Scripts\dikCodes.h" #include "../../config_macros.hpp" #include "jumppack_macro.hpp" //if cant sleep if (!canSuspend) exitWith { [] spawn compile preprocessFileLineNumbers 'macro_mod_script_path\jumppack\jumppack.sqf'; }; //This is our jump func macro_grp_fnc_name(jumppack,jump) = { params[["_unit",player,[player]],["_f_velo",0,[0]],["_v_velo",0,[0]],["_dir_angle",0,[0]],["_use_dir",false,[false]]]; _unit_backpack_class=backpack _unit; _has_jumppack=_unit_backpack_class call macro_grp_fnc_name(jumppack,is_jumppack); //check if unit has jumppack if(!_has_jumppack) exitwith{}; //set jump velo _v_hat=getCameraViewDirection _unit; if(!(_use_dir)) then { //non directional jump _v_hat=vectorDir _unit; _v_hat = [_v_hat, _dir_angle] call BIS_fnc_rotateVector2D; (_unit) setVelocity [ ((_v_hat select 0) *(_f_velo)), ((_v_hat select 1) *(_f_velo)), (_v_velo) ]; } else { //directional jump _vertical_sign=(_v_hat select 2)/(abs (_v_hat select 2)); (_unit) setVelocity [ ((_v_hat select 0) *(_f_velo)), ((_v_hat select 1) *(_f_velo)), ((_v_hat select 2) *(_f_velo))+(_v_velo/2) ]; }; _jump_id=_unit getVariable ["RD501_jumppack_jump_id",0];//random [0, 210000 , 420000]; //this jumps id _jump_id=_jump_id+1; _unit setVariable ["RD501_jumppack_jump_id",_jump_id,true]; //player sideChat format ["T:%1 -- ID: %2",time,_jump_id]; _volume=3; _dist=30; _sound_path_start=selectRandom([(configFile >> "CfgVehicles" >> _unit_backpack_class),"RD501_jumppack_sound_ignite",[]] call BIS_fnc_returnConfigEntry); playSound3D [_sound_path_start, _unit,false, getPosASL _unit,_volume,1,_dist];//"RD501_Jumppack\sounds\cdv21Start.ogg" _unit allowDamage false; _unit setVariable ["ace_medical_allowDamage", false,true]; _unit setVariable ["RD501_jumppack_last_jumptime", time,true]; _damage = damage _unit; //player spawn macro_grp_fnc_name(jumppack,add_particle_effects); _unit spawn macro_grp_fnc_name(jumppack,add_landing_effects); //w8 till landed sleep 0.1; waitUntil { //used to prevent death on land _unit allowDamage false; _isOnGround=(isTouchingGround (vehicle _unit)); _isInWater=((surfaceIsWater getPos _unit) && (getPosASL _unit select 2 < 0)); _isDed=!(alive _unit); _diffJumpId=(_jump_id !=(_unit getVariable ["RD501_jumppack_jump_id",-1])); _isBigNull=_unit isEqualTo objNull; (_isOnGround || _isInWater || _isDed || _diffJumpId || _isBigNull)//(vectorMagnitude (velocity _unit))<.1 }; //after landing or exiting wait until //if unit not exists, rip. if((_unit isEqualTo objNull)) exitwith { //leave ,f,but remember to remove effects }; //if ded if(!(alive _unit)) exitwith { _unit setVariable ["ace_medical_allowDamage", true,true]; _unit allowDamage true; }; //if another jump happened, exist this script if(_jump_id !=(_unit getVariable ["RD501_jumppack_jump_id",-1])) exitwith{ //player sideChat format ["T: %1 time line %2 stoped cause time line: %3 started",time,_jump_id,_unit getVariable ["RD501_jumppack_jump_id",-1]]; }; //if in water,w8 untill velocity low then 3m/s (handles 2 and 3rd condition of waituntill) if((surfaceIsWater getPos _unit) && (getPosASL _unit select 2 < 0) ) then { waitUntil { (( vectorMagnitude (velocity _unit)) < 3) }; }; //from here out it means we in land _unit setVariable ["RD501_jumppack_last_jumptime", time,true]; _unit setDamage _damage; _unit spawn macro_grp_fnc_name(jumppack,add_landing_effects); (_unit) setVelocity [0,0,0]; sleep 1; _unit allowDamage true; _unit setVariable ["ace_medical_allowDamage", true,true]; _unit spawn macro_grp_fnc_name(jumppack,remove_effects); }; //remove effects macro_grp_fnc_name(jumppack,remove_effects)= { params["_unit"]; _attached_items=_unit getVariable ["RD501_jumppack_effects",[]]; { detach _x; deleteVehicle _x; } forEach _attached_items; { if((typeOf _x isEqualTo "#lightpoint") || (typeOf _x isEqualTo "#particlesource")) then { detach _x; deleteVehicle _x; }; } forEach attachedObjects _unit; _unit setVariable ["RD501_jumppack_effects",[],true]; }; //this formats the current energy passed macro_grp_fnc_name(jumppack,show_current_energy) = { params["_curr_energy","_total_energy"]; if(_total_energy<=0) exitWith {}; if(_curr_energy<0) exitWith {}; _energy_ratio=_curr_energy/_total_energy; _thres_color="#800080"; [format["Energy Left: %1/%2" +"
"+ "Percent: %3%4",_curr_energy,_total_energy,_energy_ratio*100,"%",_thres_color], ""] call ace_common_fnc_displayTextPicture; }; //Formats energy macro_grp_fnc_name(jumppack,show_energy_recharge) = { params["_curr_energy","_new_energy","_total_energy"]; _old_ratio=_curr_energy/_total_energy; _new_ratio=_new_energy/_total_energy; _result=false; _thres=0; _threshold_list=[.125,.25,.375,.5,.625,.75,.875,1]; _thres_color="#FFFFFF"; _threshold_color_list=["#FF0000","#FF4500","#FF8500","#FFA500","#fff200","#aaff00","#55ff00","#00FFFF"]; if(count _threshold_color_list != count _threshold_list) then { [format["Energy: %1/%2" +"
"+ "Percent: %3%4",_new_energy,_total_energy,'X',"%",'#FF0000'], ""] call ace_common_fnc_displayTextPicture; }; { if(_old_ratio<_x && _new_ratio>=_x) then { _result=true; _thres=_x; _thres_color= _threshold_color_list select _forEachIndex; }; }foreach _threshold_list; if(!_result) exitwith {}; [format["Energy: %1/%2" +"
"+ "Percent: %3%4",_new_energy,_total_energy,_thres*100,"%",_thres_color], ""] call ace_common_fnc_displayTextPicture; }; //Add the script to handle when loadout cahnges macro_grp_fnc_name(jumppack,add_cba_player_loadout_EH) = { _id_loadout_cba_eh = ["loadout",macro_grp_fnc_name(jumppack,handle_loadout_change)] call CBA_fnc_addPlayerEventHandler; }; //add effect macro_grp_fnc_name(jumppack,add_particle_effects) = { params [ ["_unit",player,[player]] ]; _unit_backpack_class=backpack _unit; _effect_script_name =[(configFile >> "CfgVehicles" >> _unit_backpack_class),"RD501_jumppack_jump_effect_script",""] call BIS_fnc_returnConfigEntry; _effect_position =[(configFile >> "CfgVehicles" >> _unit_backpack_class),"RD501_jumppack_effect_points",[]] call BIS_fnc_returnConfigEntry; //if no script or no positions, GG if(_effect_script_name isEqualTo '') exitWith {}; if(count _effect_position ==0) exitWith {}; [_unit,_effect_position] spawn (call compile _effect_script_name); }; //Our recharge script macro_grp_fnc_name(jumppack,add_cba_per_frame) = { params["_unit"]; _delay=1; [ { params["_args","_id"]; //extract data from args. _unit=player; _frame_delay=_args select 0; _unitBackpackClass=backpack _unit; _time_since_last_call=_unit getVariable["RD501_jumppack_last_call_time",time]; _should_recharge = _unit getVariable ["RD501_do_energy_recharge",false]; //if ded or deleted,remove frame EH if(!(alive _unit) || (_unit isEqualTo objNull)) exitwith{ //[_id] call CBA_fnc_removePerFrameHandler; }; //Incase we have to pause the timer at one point. if(typeName _time_since_last_call isEqualTo "BOOL") then { _time_since_last_call=time; }; //Check if this backpack is jumppack. or if we should recharge _has_jumppack=_unitBackpackClass call macro_grp_fnc_name(jumppack,is_jumppack); _should_recharge = _unit getVariable ["RD501_do_energy_recharge",true]; if(!_has_jumppack || !_should_recharge) exitwith{ }; //Get recharge value and then calculate with time difference. _recharge_value=_unitBackpackClass call macro_grp_fnc_name(jumppack,get_recharge_rate); if(_recharge_value<0) exitwith{ }; _energy_to_add=_recharge_value*(time-_time_since_last_call); //Get current energy and max _curr_energy=(unitBackpack _unit) getVariable["RD501_jumppack_energy",0]; _energy_capacity= _unitBackpackClass call macro_grp_fnc_name(jumppack,get_energy_capacity); if(_energy_capacity<0) exitwith{ }; //Calculate total energy _new_energy=_curr_energy+_energy_to_add; if(_new_energy>_energy_capacity) then { _new_energy=_energy_capacity; }; //update new energy and last rechage time (unitBackpack _unit) setVariable["RD501_jumppack_energy",_new_energy,true]; _unit setVariable["RD501_jumppack_last_call_time",time,true]; [_curr_energy,_new_energy,_energy_capacity] spawn macro_grp_fnc_name(jumppack,show_energy_recharge); // diag_log format ["T: %1 ID:%2 D:%3 hurt:%4",time,_unit getVariable ["RD501_jumppack_jump_id",-1],isDamageAllowed player,damage player]; // player sideChat format ["T: %1 ID:%2 D:%3 hurt:%4",time,_unit getVariable ["RD501_jumppack_jump_id",-1],isDamageAllowed player,damage player]; } , _delay, [_delay] ] call CBA_fnc_addPerFrameHandler; }; macro_grp_fnc_name(jumppack,get_energy_capacity) = { params["_backpack_class"]; [(configFile >> "CfgVehicles" >> _backpack_class),"RD501_jumppack_energy_capacity",-1] call BIS_fnc_returnConfigEntry }; macro_grp_fnc_name(jumppack,get_recharge_rate) = { params["_backpack_class"]; ([(configFile >> "CfgVehicles" >> _backpack_class),"RD501_jumppack_recharge",-1] call BIS_fnc_returnConfigEntry) }; macro_grp_fnc_name(jumppack,is_jumppack) = { params["_backpack_class"]; (configFile >> "CfgVehicles" >>_backpack_class >> "RD501_jumppack_is_jumppack") call BIS_fnc_getCfgDataBool }; macro_grp_fnc_name(jumppack,decide_jump) = { params["_unit"]; _unitBackpackClass=backpack _unit; _has_jumppack=_unitBackpackClass call macro_grp_fnc_name(jumppack,is_jumppack); //if no jumppack,no jump if(!_has_jumppack) exitwith { [ format["You dont have a jumppack."], format["ArE YoU StUpId MaTey YoU DoNTY HaBE a JumPPacK OwO???."], .2 ]call macro_grp_fnc_name(jumppack,memeify_test); }; //if captive no jump if( (_unit getVariable ["ace_captives_ishandcuffed",false])) exitwith { [ format["Cant jump while captured."], format["Bitch, where u tryna go."], .2 ]call macro_grp_fnc_name(jumppack,memeify_test); }; //if underwater or on water,no jump. if((eyePos _unit select 2 < 0) ||(underwater _unit) || ((surfaceIsWater getPos _unit) && (getPosASL _unit select 2 < 0))) exitWIth { [ format["No water jumping."], format["Water is too warm :) OwO."], .2 ]call macro_grp_fnc_name(jumppack,memeify_test); }; //If in vehicle,no jump if (!(isNull objectParent _unit))exitWith { [ format["No jumping in vehicle,"], format["Seatbelt on."], .2 ]call macro_grp_fnc_name(jumppack,memeify_test); }; //if spamming,no jump. This is to prevent the issue of where u jump as soon as u land adn then die. _last_jumptime=_unit getVariable ["RD501_jumppack_last_jumptime",0]; // if(((time-_last_jumptime)<.5)) exitWith // { // [format["No Spam Jumping"], ""] call ace_common_fnc_displayTextPicture; // }; _jumppack_data=[(configFile >> "CfgVehicles" >> _unitBackpackClass),"RD501_jumppack_jump_types",[]] call BIS_fnc_returnConfigEntry; //If no jumppack data,no jump if((count _jumppack_data) ==0) exitWith { [format["Script Hab Stroke # Type 1 :("], ""] call ace_common_fnc_displayTextPicture; }; //If not enough energy,no jump _jumppack_jump_index=(unitBackpack _unit) getVariable["RD501_jumppack_selected_jump",0]; _current_energy=(unitBackpack _unit) getVariable["RD501_jumppack_energy",0]; _selected_jump=_jumppack_data select _jumppack_jump_index; _cost=(_selected_jump select 1) select 2; if(_cost>_current_energy ) exitwith { [ format["Not Enough Energy"], format["Not Enough V-Bucks."], .2 ]call macro_grp_fnc_name(jumppack,memeify_test); }; _jump_movement_data=_selected_jump select 1; //get the forward velo,verticle velo and angle of jump _velo_data=[_jump_movement_data select 0,_jump_movement_data select 1,_jump_movement_data select 3]; _prone_flag=_jump_movement_data select 5; _directonal_flag=_jump_movement_data select 4; //If cant prone jump,no jump EDIT: has to be disabled cause phase through floor exploit F _can_prone_jump=(_prone_flag==1); _can_directional_jump=(_directonal_flag==1); if ((stance _unit == "PRONE") && !_can_prone_jump) exitWith { [ format["No prone jump selected."], format["No Grasshopper mode."], .2 ]call macro_grp_fnc_name(jumppack,memeify_test); }; _new_consumed_energy=_current_energy-_cost; (unitBackpack _unit) setVariable ["RD501_jumppack_energy",_new_consumed_energy,true]; //get energy cap and new consumed energy _energy_capacity= _unitBackpackClass call macro_grp_fnc_name(jumppack,get_energy_capacity); [_new_consumed_energy,_energy_capacity] call macro_grp_fnc_name(jumppack,show_current_energy); [_current_energy,_new_consumed_energy,_energy_capacity] spawn macro_grp_fnc_name(jumppack,show_energy_recharge); [player, _velo_data select 0,//f velo _velo_data select 1,//v velo _velo_data select 2,//angle _can_directional_jump ] spawn macro_grp_fnc_name(jumppack,jump); }; macro_grp_fnc_name(jumppack,handle_loadout_change) = { //First we get the last backppack saved_backpack=player getVariable['RD501_jumppack_backpack_class','']; //Then we get current backpack current_backpack=backpack player; //if backpacks are same, dont do anything if(saved_backpack isEqualTo current_backpack) exitwith {}; //if different, update classname and set energy to 0. Also set last recharge time to false so that rehcarge can handle and selected jump reset. //player setVariable ["RD501_jumppack_backpack_class",current_backpack,true]; //player setVariable ["RD501_jumppack_energy",0,true]; player setVariable["RD501_jumppack_last_call_time",false,true]; //(unitBackpack player) setVariable["RD501_jumppack_selected_jump",0,true]; }; macro_grp_fnc_name(jumppack,set_jumptype) = { params["_unit","_inc"]; _unitBackpackClass=backpack _unit; _has_jumppack=_unitBackpackClass call macro_grp_fnc_name(jumppack,is_jumppack); if(!_has_jumppack) exitwith{}; _jumppack_data=[(configFile >> "CfgVehicles" >> _unitBackpackClass),"RD501_jumppack_jump_types",[]] call BIS_fnc_returnConfigEntry; _num_jumps=count _jumppack_data; _jumppack_jump_index=(unitBackpack _unit) getVariable["RD501_jumppack_selected_jump",0]; _a=_jumppack_jump_index+_inc; _b=_num_jumps; _new_index=(_a - (floor(_a/_b))*_b); (unitBackpack _unit) setVariable ["RD501_jumppack_selected_jump",_new_index,true]; //[west, "HQ"] sideChat format["%1 %2 %3",_new_index,time,[_jumppack_jump_index+_inc,_num_jumps]]; //Data for hint _new_selected_jump=(_jumppack_data select _new_index); _jump_name=_new_selected_jump select 0; _jump_cost=(_new_selected_jump select 1) select 2; hint parseText format ["name: %1
Cost: %2
Current Energy:%3",_jump_name,_jump_cost,(unitBackpack _unit) getVariable["RD501_jumppack_energy",0]]; }; //set to 100% energy on existing arsenal macro_grp_fnc_name(jumppack,arsenal_closed) = { params[ ["_unit",player,[player]] ]; //if no jumppack,bye _unit_backpack=backpack _unit; _has_jumppack=_unit_backpack call macro_grp_fnc_name(jumppack,is_jumppack); if(!_has_jumppack) exitwith{}; _energy_capacity= _unit_backpack call macro_grp_fnc_name(jumppack,get_energy_capacity); (unitBackpack _unit) setVariable ["RD501_jumppack_energy",_energy_capacity,true]; [_energy_capacity,_energy_capacity] call macro_grp_fnc_name(jumppack,show_current_energy); _unit setVariable ["RD501_do_energy_recharge",true,true]; }; macro_grp_fnc_name(jumppack,arsenal_opened) = { params[ ["_unit",player,[player]] ]; _unit setVariable ["RD501_do_energy_recharge",false,true]; }; macro_grp_fnc_name(jumppack,memeify_test) = { params[ ["_normal_text","EH RIP MEMEIFY ERROR",["string"]], ["_meme_text","EH RIP MEMEIFY ERROR",["wordsss"]], ["_chance_to_happen",0,[0]] ]; _chance=random 1; _textToShow= _normal_text; if(_chance<_chance_to_happen) then { _textToShow=_meme_text; }; [_textToShow, ""] call ace_common_fnc_displayTextPicture; }; //add keybinds ["RD501 Jumppack","Jump",["Jump","Press to Jump"],{ [player] spawn macro_grp_fnc_name(jumppack,decide_jump); },"",[DIK_Y, [false, true, false]],false] call cba_fnc_addKeybind; ["RD501 Jumppack","Cycle jump type left",["Cycle jump type left","Cycle jump type left"],{ [player, -1] spawn macro_grp_fnc_name(jumppack,set_jumptype); },"",[DIK_G, [false, true, false]],false] call cba_fnc_addKeybind; ["RD501 Jumppack","Cycle jump type right",["Cycle jump type right","Cycle jump type right"],{ [player, 1] spawn macro_grp_fnc_name(jumppack,set_jumptype); },"",[DIK_J, [false, true, false]],false] call cba_fnc_addKeybind; sleep 0.5; //detach arsenal open/close [missionNamespace,"arsenalClosed", { player call macro_grp_fnc_name(jumppack,arsenal_closed); }] call bis_fnc_addScriptedEventhandler; ["ACE_arsenal_displayClosed", { player call macro_grp_fnc_name(jumppack,arsenal_closed); }] call CBA_fnc_addEventHandler; [missionNamespace,"arsenalOpened", { player call macro_grp_fnc_name(jumppack,arsenal_opened); }] call bis_fnc_addScriptedEventhandler; ["ACE_arsenal_displayOpened", { player call macro_grp_fnc_name(jumppack,arsenal_opened); }] call CBA_fnc_addEventHandler; [player] spawn macro_grp_fnc_name(jumppack,add_cba_per_frame); call macro_grp_fnc_name(jumppack,add_cba_player_loadout_EH);