Last active
July 7, 2016 22:03
-
-
Save bosoy/e54f0ec17280447e0de7682c9790bfdf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Функция контроля экипажа техники. | |
Автор: Dimon UA | |
Параметры: | |
0. _this - по умолчанию | |
1. - места что блокируются | |
"driver" | |
"gunner" | |
"commander" - блокировка места командира - разрешено только для arrRelCommander | |
"crew" - блокировка всей техники (вкл. пассажиров) | |
"vehcrew" - блокировка всей техники (кроме пассажиров): сам экипаж + все туррели | |
[0,1] - блокировка туррели | |
2. - "balcaoff"/"balcaon" -выкл/ вкл BalCa (опционально) | |
3. - "east"/"west"/"guer"/"civ"/"" - проверка игрока на сторону (опционально) | |
Примеры запуска в ините | |
_=[this,"driver","gunner"] execvm "SerP\isCrew.sqf"; | |
_=[this,"driver","gunner"] execvm "SerP\isCrew.sqf"; | |
_=[this,"driver","gunner","commander"] execvm "SerP\isCrew.sqf"; | |
_=[this,"driver","gunner","commander",BalCaon] execvm "SerP\isCrew.sqf"; | |
_=[this,"driver","gunner","commander","balcaoff",weST] execvm "SerP\isCrew.sqf"; | |
_=[this,"driver","gunner","commander","balcaon","east"] execvm "SerP\isCrew.sqf"; | |
Добавление дополнительных классов в init.sqf | |
if (!isDedicated) then { | |
relCrew = []; | |
relCommander = []; | |
}; | |
*/ | |
#define CfgAir (configFile >> "CfgVehicles" >>(typeOf _unitToCheck) >> "ace_ispilot") | |
#define CfgVeh (configFile >> "CfgVehicles" >>(typeOf _unitToCheck) >> "ace_iscrew") | |
#define transportsoldier (getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "transportsoldier") >= 3) | |
fnc_CrewControl = { | |
private ["_typeIn", "_place", "_veh", "_move", "_warningMsgPlace"]; | |
if (crewIndex) exitwith {}; | |
crewIndex = true; | |
_positions = _this select 0; | |
_closeturrets = _this select 1; | |
_place = assignedVehicleRole player; | |
_veh = (vehicle player); | |
_move = false; | |
_warningMsgPlace = localize "STR_UnauthorisedPlace"; | |
while {alive player && {player in _veh}} do { | |
_place = assignedVehicleRole player; | |
sleep 1; | |
if (!([_place,assignedVehicleRole player] call BIS_fnc_areEqual)) then | |
{ | |
_move =(toLower((assignedVehicleRole player) select 0) in _positions) | |
|| (((assignedVehicleRole player) select 0) == "Turret" && {{if ([_x,((assignedVehicleRole player) select 1)] call BIS_fnc_areEqual) exitwith {1}} count (_closeturrets) > 0}); | |
if _move then | |
{ | |
call { | |
if ((_place select 0) in ["commander","gunner","driver"]) exitwith {player action [format ["moveTo%1",(_place select 0)], _veh]}; | |
if ((_place select 0) == "cargo") exitwith {player action ["moveTocargo", _veh,0]}; | |
if ((_place select 0) == "Turret") exitwith {player action ["moveToTurret", _veh,(_place select 1)]}; | |
}; | |
_move = false; | |
hint format ["%1", _warningMsgPlace]; | |
}; | |
}; | |
}; | |
crewIndex = false; | |
}; | |
fnc_inCrewFilter = { | |
private ["_fromEH", "_type", "_vehicle", "_unitToCheck", "_balca", "_balcaPower", "_side", "_warningMsgCrew", "_warningMsgSide", "_state"]; | |
_vehicle = _this select 0; | |
_unitToCheck = _this select 2; | |
_blockpositions = _vehicle getVariable "BLOCKPOS"; | |
_positions = _blockpositions select 0; | |
_closeturrets = _blockpositions select 1; | |
_side = _blockpositions select 2; | |
_balca =_blockpositions select 3; | |
_exit = false; | |
_position= assignedVehicleRole _unitToCheck; | |
if (isNil {_vehicle getVariable "CREW_GETININDEX"}) then {_vehicle setVariable ["CREW_GETININDEX", _type, true];}; | |
if !(local _unitToCheck) exitWith {}; | |
_warningMsgCrew = localize "STR_UnauthorisedCrew"; | |
_warningMsgSide = localize "STR_UnauthorisedSide"; | |
if (count(_side)>0 && {!(toLower(str(side(group _unitToCheck))) in _side)}) exitwith {moveOut _unitToCheck; hint format ["%1",_warningMsgSide];}; | |
//==================================================================== | |
call { | |
if (((_vehicle isKindOf "landvehicle" && (getNumber CfgVeh == 1 || typeOf _unitToCheck in arrRelCommander || ((!transportsoldier && {typeOf _unitToCheck in (arrRelCrew select 1)}) || ((transportsoldier && {typeOf _unitToCheck in (arrRelCrew select 0)}))))) || (_vehicle isKindOf "air" && {(getNumber CfgAir == 1 || typeOf _unitToCheck in (arrRelCrew select 2))}))) exitwith {_balcaPower = (_unitToCheck == gunner _vehicle)}; | |
_exit = (toLower(_position select 0) in _positions) | |
|| ((_position select 0) == "Turret" && {{if ([_x,(_position select 1)] call BIS_fnc_areEqual) exitwith {1}} count (_closeturrets) > 0}) | |
|| (_unitToCheck in (crew _vehicle) && {"crew" in _positions}); | |
if _exit exitwith { | |
moveOut _unitToCheck; | |
hint format ["%1", _warningMsgCrew]; | |
_exit = false; | |
}; | |
_blockpositions spawn fnc_CrewControl; | |
_balcaPower = (_unitToCheck == gunner _vehicle); | |
}; | |
if (count(_balca)>0 && {_balcaPower}) then { | |
_state = c_balca_balca_enabled; | |
call { | |
if (isNil "c_balca_balca_enabled") exitwith { | |
if ("balcaon" in _balca) then { | |
c_balca_balca_enabled = true; | |
hint "BalCa on"; | |
} else { | |
c_balca_balca_enabled = false; | |
hint "BalCa off"; | |
}; | |
}; | |
if (!isNil "c_balca_balca_enabled" && {c_balca_balca_enabled} && {"balcaoff" in _balca}) exitwith { | |
c_balca_balca_enabled = false; | |
hint "BalCa off"; | |
}; | |
if (!isNil "c_balca_balca_enabled" && {!c_balca_balca_enabled} && {"balcaon" in _balca}) exitwith { | |
c_balca_balca_enabled = true; | |
hint "BalCa on"; | |
}; | |
}; | |
call { | |
if (!isNil "_state") exitWith { | |
[_state] spawn { | |
private ["_stateOn"]; | |
_stateOn = _this select 0; | |
waitUntil {sleep 1; !alive player || player == vehicle player}; | |
call { | |
if _stateOn exitwith {c_balca_balca_enabled = true;}; | |
if !_stateOn exitwith {c_balca_balca_enabled = false;}; | |
}; | |
hint "BalCa by default"; | |
}; | |
}; | |
if (isNil "_state") exitWith { | |
[] spawn { | |
waitUntil {sleep 1; !alive player || player == vehicle player}; | |
c_balca_balca_enabled = nil; | |
hint "BalCa by default"; | |
}; | |
}; | |
}; | |
}; | |
}; | |
KK_fnc_commonTurrets = { | |
private ["_arr","_trts"]; | |
_arr = []; | |
_trts = configFile / "CfgVehicles" / typeOf _this / "Turrets"; | |
for "_i" from 0 to count _trts - 1 do { | |
_arr set [count _arr, [_i]]; | |
for "_j" from 0 to count ( | |
_trts / configName (_trts select _i) / "Turrets" | |
) - 1 do { | |
_arr set [count _arr, [_i, _j]]; | |
}; | |
}; | |
_arr | |
}; | |
fnc_format = { | |
private ["_array"]; | |
_array = []; | |
{ | |
if (!([_x,_this select 0] call BIS_fnc_areEqual)) then { | |
if (typeName _x != "STRING") then { _x = str _x}; | |
_array set [count _array, toLower (_x)]; | |
}; | |
} foreach _this; | |
_array | |
}; | |
private ["_object", "_closePos", "_result", "_side", "_balca"]; | |
_object = _this select 0; //фиксируем обьект | |
_allturrets = _object call KK_fnc_commonTurrets; | |
_blockpos=[[],[],[],[]]; | |
_this = _this call fnc_format; | |
{ | |
_xx=_x; | |
call { | |
if (typeName _xx == "ARRAY" && {{if ([_x,_xx] call BIS_fnc_areEqual) exitwith {1}} count (_allturrets) > 0}) exitwith {(_blockpos select 1) set [count (_blockpos select 1),_xx]}; | |
if (typeName _xx == "STRING" && {_xx in ["west","east","guer","civ"]}) exitwith {(_blockpos select 2) set [count (_blockpos select 2),_xx]}; | |
if (typeName _xx == "STRING" && {_xx in ["balcaon","balcaoff"]}) exitwith {(_blockpos select 3) set [count (_blockpos select 3),_xx]}; | |
if (typeName _xx == "STRING" && {_xx == "driver"}) exitwith {(_blockpos select 0) set [count (_blockpos select 0),_xx]}; | |
if (typeName _xx == "STRING" && {_xx == "crew"}) exitwith {(_blockpos select 0) set [count (_blockpos select 0),_xx]}; | |
if (typeName _xx == "STRING" && {_xx == "gunner"}) exitwith {(_blockpos select 1) set [count (_blockpos select 1),[0]]}; | |
if (typeName _xx == "STRING" && {_xx == "commander"}) exitwith {(_blockpos select 1) set [count (_blockpos select 1),[0,0]]}; | |
}; | |
} foreach _this; | |
if ("vehcrew" in _this) then | |
{ | |
_blockpos set [0,["driver"]]; | |
_blockpos set [1,_allturrets]; | |
}; | |
_object setVariable ["BLOCKPOS", _blockpos,true]; | |
_object addEventHandler ["GetIn",{_this call fnc_inCrewfilter}]; | |
_object addEventHandler ["killed",{(_this select 0) removeAllEventHandlers "Getin";(_this select 0) removeAllEventHandlers "killed"}]; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//relCrew=[["бмп"],["танк"],["воздух"]]; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment