Skip to content

Instantly share code, notes, and snippets.

@bosoy
Last active July 7, 2016 22:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bosoy/e54f0ec17280447e0de7682c9790bfdf to your computer and use it in GitHub Desktop.
Save bosoy/e54f0ec17280447e0de7682c9790bfdf to your computer and use it in GitHub Desktop.
/*
Функция контроля экипажа техники.
Автор: 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"}];
//relCrew=[["бмп"],["танк"],["воздух"]];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment