Last active
June 22, 2016 21:01
-
-
Save bosoy/52d852112948e9bd4f433111f90ebf73 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
#define PROJECT_PREFIX SerP | |
#define COMPONENT_NAME blnd | |
#define PSGVAR(VAR1,VAR2) (player setVariable ['PROJECT_PREFIX##_##COMPONENT_NAME##_var_##VAR1',VAR2,true]) | |
#define OSGVAR(VAR1,VAR2,VAR3) (VAR1 setVariable ['PROJECT_PREFIX##_##COMPONENT_NAME##_var_##VAR2',VAR3,true]) | |
dim_MR_array_KC=_this select 0; //массив КСов | |
ongrouparray=_this select 1; // массив командиров отделений которые можно передвигать | |
onspecgrouparray= if (count (_this)>2) then{_this select 2}else{nil}; // массив командиров отделений (по типу СПН, но не обязательно) и подмассив маркеров для каждого отделения в которых можно расположить отделения | |
arraymarker=[]; | |
arraymarkerveh=[]; | |
if (!isnil {missionNameSpace getVariable "respsidepower"} && {(missionNameSpace getVariable "respsidepower") == count (dim_MR_array_KC)}) exitwith {}; | |
//================================ block admin ================================= | |
_fnc_blockbutton = { | |
0=[] spawn { | |
if (!isserver) then | |
{ | |
waitUntil | |
{ | |
if (!isNull findDisplay 53) exitWith | |
{ | |
disableserialization; | |
(findDisplay 53 displayCtrl 1) ctrlEnable false; | |
true | |
}; | |
false | |
}; | |
}else{ | |
waitUntil | |
{ | |
if (!isNull findDisplay 52) exitWith | |
{ | |
disableserialization; | |
(findDisplay 52 displayCtrl 1) ctrlEnable false; | |
true | |
}; | |
false | |
}; | |
}; | |
}; | |
}; | |
[] call _fnc_blockbutton; | |
//========================================== CLIENT ===============================================================================================// | |
if hasinterface then | |
{ | |
// - маркеры на все отряды своей стороны | |
{ | |
_leader=leader _x; | |
_pos =getposatl _leader; | |
if (side (group player) == side (group _leader) && {({If (markerText _x == (str group _leader)) exitwith {1};}count arraymarker == 0)}) then // проверка на сторону КО и клиента | |
{ | |
_arrvehnew=[]; | |
_arrvehnew = _pos nearEntities [['LandVehicle', 'Air', 'StaticWeapon','ReammoBox_F','ReammoBox'], 20]; | |
{ | |
if ((isnil {_x getvariable 'vehgroup'})) then | |
{ | |
_x setvariable ['vehgroup',_leader,false]; | |
}; | |
_marker = str(_x); | |
createMarkerLocal[_marker, getpos _x]; | |
_marker setMarkerShapeLocal "ICON"; | |
_marker setMarkerTypeLocal "mil_dot"; | |
_name = getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "displayName"); | |
_picture = getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "picture"); | |
_marker setMarkerTextLocal _name; | |
_marker setMarkerColorLocal "ColorYellow"; | |
if ((isnil {_x getvariable 'vehmark'})) then | |
{ | |
_x setvariable ['vehmark',_marker,false]; | |
}; | |
arraymarkerveh set [count arraymarkerveh, _marker]; | |
} foreach _arrvehnew; | |
_marker = format ['markerblue%1',(random 1000)]; | |
_marker = createMarkerlocal[_marker, _pos]; | |
_marker setMarkerShapelocal 'ICON'; | |
_marker setMarkerTypelocal 'mil_dot'; | |
_marker setmarkercolorlocal 'ColorOrange'; | |
_marker setMarkerTextlocal (str group _leader); // в текст маркера вписываем название группы | |
arraymarker set [count arraymarker, _marker]; // добавляем в массив маркеров arraymarker | |
}; | |
}foreach allgroups; | |
if (call compile format["(missionNameSpace getVariable 'dim_on_group_%1')>0",side group player]) then | |
{ | |
zapros_mark=player; | |
publicvariableserver "zapros_mark"; | |
}; | |
"otvet_mark" addPublicVariableEventHandler { | |
{ | |
_marker=(_x select 0); | |
_pos=(_x select 1); | |
{ | |
If (markerText _x == _marker) then {_x setMarkerPosLocal _pos;}; | |
} foreach arraymarker; | |
} foreach ((_this select 1) select 0); | |
_index=[]; | |
{ | |
_marker=(_x select 0); | |
_pos=(_x select 1); | |
{ | |
If (markerText _x == _marker && {!(_forEachIndex in _index)}) exitwith {_x setMarkerPosLocal _pos; _index set [count _index,_forEachIndex];}; | |
} foreach arraymarkerveh; | |
} foreach ((_this select 1) select 1); | |
_index resize 0; | |
}; | |
"client_game_start" addPublicVariableEventHandler { | |
{ deleteMarkerLocal _x } forEach arraymarker; | |
{ deleteMarkerLocal _x } forEach arraymarkerveh; | |
MR = 1; | |
[] call compile preProcessFileLineNumbers "SerP\postInit.sqf"; | |
if (serverCommandAvailable "#kick") then | |
{ | |
disableserialization; | |
(findDisplay 53 displayCtrl 1) ctrlEnable true; // отключение блокировки "Далее" в брифинге у админа/сервера | |
}; | |
}; | |
// - обработчик синхронного перемещения маркеров среди клиентов одной стороны перемещаемых отделений | |
"marker_pos" addPublicVariableEventHandler { | |
if (!isnil {((_this select 1) select 2)}) then | |
{ | |
{ | |
if (!(isnil {(_x select 0) getvariable 'vehside'}) && {((_x select 0) getvariable 'vehside') == side (group player)}) then | |
{ | |
_veh=(_x select 0); | |
_pos =(_x select 1); | |
_name = getText (configFile >> "CfgVehicles" >> (typeOf _veh) >> "displayName"); | |
if ({If (markerText _x == _name && (!isnil {_veh getvariable 'vehmark'}) && {(_veh getvariable 'vehmark')==_x}) exitwith {1};}count arraymarkerveh == 0) then // проверяем создан ли маркер для этого отделения, если нет то создаем | |
{ | |
_marker = str(_veh); | |
createMarkerLocal[_marker, _pos]; | |
_marker setMarkerShapeLocal "ICON"; | |
_marker setMarkerTypeLocal "mil_dot"; | |
_picture = getText (configFile >> "CfgVehicles" >> (typeOf _veh) >> "picture"); | |
_marker setMarkerTextLocal _name; | |
_marker setMarkerColorLocal "ColorYellow"; | |
if ((isnil {_veh getvariable 'vehmark'})) then | |
{ | |
_veh setvariable ['vehmark',_marker,false]; | |
}; | |
arraymarkerveh set [count arraymarkerveh, _marker]; | |
}else{ | |
{ | |
if (markerText _x==_name && (!isnil {_veh getvariable 'vehmark'}) && {(_veh getvariable 'vehmark')==_x}) exitwith // если текст маркера совпадает с название группы | |
{ | |
_x setMarkerPosLocal _pos; // перемещаем именно этот маркер | |
}; | |
} foreach arraymarkerveh; | |
}; | |
}; | |
} foreach ((_this select 1) select 2); | |
}; | |
if (side (group player) == side (group ((_this select 1) select 0))) then // проверка на сторону КО и клиента | |
{ | |
_leader=((_this select 1) select 0); | |
_pos =((_this select 1) select 1); | |
if ({If (markerText _x == (str group _leader)) exitwith {1};}count arraymarker == 0) then // проверяем создан ли маркер для этого отделения, если нет то создаем | |
{ | |
_marker = format ['markerblue%1',(random 1000)]; | |
_marker = createMarkerlocal[_marker, _pos]; | |
_marker setMarkerShapelocal 'ICON'; | |
_marker setMarkerTypelocal 'mil_dot'; | |
call { | |
if (side (group _leader)==west) exitwith { _marker setmarkercolorlocal 'Colorblue';}; | |
if (side (group _leader)==east) exitwith { _marker setmarkercolorlocal 'Colorred';}; | |
if (side (group _leader)==resistance) exitwith { _marker setmarkercolorlocal 'Colorgreen';}; | |
_marker setmarkercolorlocal 'Colorblack'; | |
}; | |
_marker setMarkerTextlocal (str group _leader); // в текст маркера вписываем название группы | |
arraymarker set [count arraymarker, _marker]; // добавляем в массив маркеров arraymarker | |
}else{ // если создан уже то просто перемещаем на новую позицию | |
{ | |
if (markerText _x==(str group _leader)) exitwith // если текст маркера совпадает с название группы | |
{ | |
_x setMarkerPosLocal _pos; // перемещаем именно этот маркер | |
}; | |
} foreach arraymarker; | |
}; | |
}; | |
}; | |
// - обработчик который перемещает Клиента на клиентской машине и его клиентских ботов, если таковые есть | |
"moveunit" addPublicVariableEventHandler { | |
_unit=((_this select 1) select 0); | |
_pos=((_this select 1) select 1); | |
_dir= ((_this select 1) select 2); | |
_stroy = if (count ((_this select 1)) > 3) then {((_this select 1) select 3)}else{nil}; // массив позиций для ботов | |
if (side (group player)== side (group _unit)) then // проверяем на сторону ??? | |
{ | |
call { | |
if (player == leader (group player) && !isserver) exitwith // если игрок является лидером своей группы КО | |
{ | |
player setposatl _pos; // перемещаем игрока-клиента КО | |
player setdir (_dir +90); | |
PSGVAR(SpawnPosition,_pos); | |
//player setVariable ["A3A_var_teleportObject", [getDir player, _pos], true]; | |
{ | |
if (!(isPlayer _x)) then // если член группы не живой игрок - бот | |
{ | |
_x setposatl (_stroy select (_forEachIndex +1)); //перемещаем локального бота на позицию согласно его индексу в массиве | |
_x setDir (_dir +90); | |
OSGVAR(_x,SpawnPosition,(_stroy select (_forEachIndex +1))); | |
}; | |
} foreach (units (group player)); //прогоняем массив всех членов группы | |
}; | |
player setPosATL _pos; // перемещаем игрока не КО | |
player setdir (_dir +90); | |
PSGVAR(SpawnPosition,_pos); | |
//player setVariable ["A3A_var_teleportObject", [getDir player, _pos], true]; | |
}; | |
}; | |
}; | |
//=============================== запускаем брифинг ================================================================================================== | |
//[] call compile preprocessFileLineNumbers "SerP\briefing.sqf"; | |
//==================================================== KC ========================================================================= | |
if ({if(player in _x) exitwith {1};} count dim_MR_array_KC > 0) then // если игрок из массива dim_MR_array_KC | |
{ | |
//============================== FUNCTION KC ============================================================================== | |
KK_fnc_arrayReverse = // функция перегонки массива слева-направо - нужна для правильного отображения списка перемещаемых отделений в брифинге КС | |
{ | |
private ["_i","_j","_tmp"]; | |
for [ | |
{_i = 0; _j = count _this - 1}, | |
{_i < _j}, | |
{_i = _i + 1; _j = _j - 1} | |
] do { | |
_tmp = _this select _i; | |
_this set [_i, _this select _j]; | |
_this set [_j, _tmp]; | |
}; | |
_this | |
}; | |
fnc_dim_showResp = // функция добавления списа перемещаемых отделений в брифинг КС и их функциональность | |
{ | |
if (!isnil {player getvariable "kc_show_resp"} && {(player getvariable "kc_show_resp")==0}) then | |
{ | |
player setvariable ["kc_show_resp",1,true]; | |
_arr=_this select 0; // массив командиров перемещаемых основных отделений своей стороны | |
_arr1=if (count (_this)>1) then{_this select 1}else{nil}; // массив командиров перемещаемых СПН отделений своей стороны | |
if (call compile format["(missionNameSpace getVariable 'dim_on_group_%1')<=1",side group player]) then | |
{ | |
call compile format["missionNameSpace setVariable ['dim_on_group_%1', 1];publicVariable 'dim_on_group_%1';",side group player]; | |
if (!isnil "_arr1") then | |
{ | |
{ | |
player createDiaryRecord [ | |
"TU_actions", | |
[ | |
format["СПН %1",group _x], | |
format ["Действие: [<execute expression='[%1] call fnc_dim_respawnClick'>Выбрать место респа</execute>]<br/>", _x] | |
] | |
]; | |
} foreach _arr1; | |
}; | |
{ | |
player createDiaryRecord [ | |
"TU_actions", | |
[ | |
format["Отделение %1",group _x], | |
format ["Действие: [<execute expression='[%1] call fnc_dim_respawnClick'>Выбрать место респа</execute>]<br/>", _x] | |
] | |
]; | |
} foreach _arr; | |
}; | |
}; | |
}; | |
fnc_dim_hideResp = // функция отключения функциональности Расстановки отрядов | |
{ | |
if (!isnil {player getvariable "kc_hide_resp"} && {(player getvariable "kc_hide_resp")==0}) then | |
{ | |
player setvariable ["kc_hide_resp",1,true]; | |
if (call compile format["(missionNameSpace getVariable 'dim_on_group_%1')<2",side group player]) then | |
{ | |
call compile format["missionNameSpace setVariable ['dim_on_group_%1', 2];publicVariable 'dim_on_group_%1';",side group player]; | |
server_game_start=round random 10; //ЛЮБОЕ ЦЕЛОЕ ЧИСЛО просто так | |
publicVariableserver "server_game_start"; // отправляем серверу сообщение что нажато "Завершить растановку" | |
}; | |
}; | |
}; | |
fnc_dim_respawnClick={ // функция обработки клика мыши КСом на карте | |
if (call compile format["(missionNameSpace getVariable 'dim_on_group_%1')<=1",side group player]) then // если клавиша "Выбрать место респа" не отключена | |
{ // отправляем на сервер имя нажавшего и позицию клика мыши на карте для обработки данных | |
_this onMapSingleClick " | |
scanrespawn=[(_this select 0),_pos]; | |
if (call compile format['(missionNameSpace getVariable ""dim_on_group_%1"")<=1',side group (_this select 0)]) then | |
{ | |
publicVariableserver 'scanrespawn'; | |
}; | |
true"; | |
}; | |
}; | |
call compile format["arrleadergroup_%1 = [];arrleaderSPNgroup_%1 = [];arrleaderSPNmarker_%1 = [];",side group player]; // создаем для КС массивы КО осн. отделений, СПН и маркеров для каждого СПН своей стороны | |
//======================================== создаем массив лидеров групп своей стороны ===================================================== | |
{ | |
call { | |
if ( (count (ongrouparray) ==0 && {side _x == side (group player)}) /* || ((count (ongrouparray) >0 && {side _x == side (group player)} && {!((leader _x) in ongrouparray)})) */ ) exitwith // если массив перемещаемых основных отделений пуст то берутся все КО отделений кроме КО СПН | |
{ | |
if((!isnil "onspecgrouparray" && {!((leader _x) in onspecgrouparray)}) || (isnil "onspecgrouparray")) then | |
{ | |
call compile format["arrleadergroup_%1 set [count arrleadergroup_%1, (leader _x)];",side group player]; // заносим в массив КО осн. отделений. | |
}; | |
}; | |
if ( count (ongrouparray) >0 && {side _x == side (group player)} && {(leader _x) in ongrouparray}) exitwith // если массив перемещаемых основных отделений не пуст то берутся только нужные КО отделений, кроме КО СПН | |
{ | |
call compile format["arrleadergroup_%1 set [count arrleadergroup_%1, (leader _x)];",side group player]; // заносим в массив указанных КО осн. отделений. | |
}; | |
if (!isnil "onspecgrouparray" && {count (onspecgrouparray) >0} && {side _x == side (group player)} && {!((leader _x) in ongrouparray)}) exitwith // если массив перемещаемых СПН отделений не пуст то берутся только нужные КО отделений СПН | |
{ | |
_leader=leader _x; | |
{ | |
if (_leader in _x) then | |
{ | |
call compile format["arrleaderSPNgroup_%1 set [count arrleaderSPNgroup_%1, _leader];",side group player]; // массив КО СПН | |
call compile format["arrleaderSPNmarker_%1 set [count arrleaderSPNmarker_%1, _x select 1];",side group player]; // массив маркеров для СПН | |
}; | |
} foreach onspecgrouparray; | |
}; | |
}; | |
} foreach allgroups; // пересматриваем весь массив групп в игре | |
//================================================================================================================================================= | |
player createDiarySubject ["TU_actions", "Действия"]; | |
//создаем меню расстановки отделений для КС | |
if (!isnil {player getvariable "kc_hide_resp"} && {(player getvariable "kc_hide_resp")==0}) then | |
{ | |
player setvariable ["kc_show_resp",0,true]; | |
}; | |
if (!isnil "onspecgrouparray") then | |
{ | |
call compile format["{_x call KK_fnc_arrayReverse} foreach [arrleadergroup_%1,arrleaderSPNgroup_%1,arrleaderSPNmarker_%1];",side group player]; | |
player createDiaryRecord ["TU_actions", ["Расстановка отделений", | |
format ["Действие: [<execute expression='[arrleadergroup_%1,arrleaderSPNgroup_%1] call fnc_dim_showResp'>Запустить</execute>] [<execute expression='player call fnc_dim_hideResp'>Завершить</execute>]<br/>",side group player] | |
]]; | |
}else{ | |
call compile format["arrleadergroup_%1 call KK_fnc_arrayReverse;",side group player]; | |
player createDiaryRecord ["TU_actions", ["Расстановка отделений", | |
format ["Действие: [<execute expression='[arrleadergroup_%1] call fnc_dim_showResp'>Запустить</execute>] [<execute expression='player call fnc_dim_hideResp'>Завершить</execute>]<br/>",side group player] | |
]]; | |
}; | |
}; | |
}; | |
//===================================================== SERVER ================================================================================================ | |
if isserver then | |
{ | |
{ | |
call compile format["missionNameSpace setVariable ['dim_on_group_%1', 0];publicVariable 'dim_on_group_%1';",side group (_x select 0)]; | |
(_x select 0) setvariable ["kc_show_resp",0,true]; | |
(_x select 0) setvariable ["kc_hide_resp",0,true]; | |
} forEach dim_MR_array_KC; | |
missionNameSpace setVariable ["respsidepower", 0]; | |
publicVariable "respsidepower"; | |
"zapros_mark" addPublicVariableEventHandler { | |
_arraymarker=[]; | |
_arraymarkerveh=[]; | |
{ | |
_arraymarker set [_foreachindex,[markerText _x,markerpos _x]]; | |
}foreach arraymarker; | |
{ | |
_arraymarkerveh set [_foreachindex,[markerText _x,markerpos _x]]; | |
}foreach arraymarkerveh; | |
otvet_mark=[_arraymarker,_arraymarkerveh]; | |
(owner (_this select 1)) publicvariableclient "otvet_mark"; | |
}; | |
"server_game_start" addPublicVariableEventHandler { | |
with missionNamespace do {respsidepower = respsidepower + 1;}; | |
publicVariable "respsidepower"; | |
if ((missionNameSpace getVariable "respsidepower") == count (dim_MR_array_KC)) then | |
{ | |
MR = 1; | |
{ deleteMarkerLocal _x } forEach arraymarker; | |
{ deleteMarkerLocal _x } forEach arraymarkerveh; | |
[] call compile preProcessFileLineNumbers "SerP\postInit.sqf"; | |
if hasinterface then | |
{ | |
disableserialization; | |
(findDisplay 52 displayCtrl 1) ctrlEnable true; // отключение блокировки "Далее" в брифинге у админа/сервера | |
}; | |
client_game_start = round random 10; | |
publicVariable "client_game_start"; | |
}; | |
}; | |
//=============================================================== FUNCTION ================================================================================ | |
fn_inarrayMarker = { //функция проверки нахождения позиции в массиве маркеров | |
private ["_arraymrk","_mrkarea","_posx","_posy","_tarea","_tx","_ty","_tdir","_tshape","_in"]; | |
_arraymrk = _this select 0; | |
_position = _this select 1; | |
_scalarresult = if (count _this > 2) then {_this select 2} else {false}; | |
{ | |
_posx = getMarkerPos _x select 0; | |
_posy = getMarkerPos _x select 1; | |
_mrkarea = getMarkerSize _x; | |
_tx = _mrkarea select 0; | |
_ty = _mrkarea select 1; | |
_tdir = markerDir _x; | |
_tshape = markerShape _x; | |
_in = false; | |
if (_tshape == "RECTANGLE") then | |
{ | |
//--- RECTANGLE | |
_difx = (_position select 0) - _posx; | |
_dify = (_position select 1) - _posy; | |
_dir = atan (_difx / _dify); | |
if (_dify < 0) then {_dir = _dir + 180}; | |
_relativedir = _tdir - _dir; | |
_adis = abs (_tx / cos (90 - _relativedir)); | |
_bdis = abs (_ty / cos _relativedir); | |
_borderdis = _adis min _bdis; | |
_positiondis = _position distance getMarkerPos _x; | |
_in = if (_scalarresult) then { | |
_positiondis - _borderdis; | |
} else { | |
if (_positiondis < _borderdis) then {true} else {false}; | |
}; | |
}; | |
if (_tshape == "ELLIPSE") then | |
{ | |
//--- ELLIPSE | |
_e = sqrt(_tx^2 - _ty^2); | |
_posF1 = [_posx + (sin (_tdir+90) * _e),_posy + (cos (_tdir+90) * _e)]; | |
_posF2 = [_posx - (sin (_tdir+90) * _e),_posy - (cos (_tdir+90) * _e)]; | |
_total = 2 * _tx; | |
_dis1 = _position distance _posF1; | |
_dis2 = _position distance _posF2; | |
_in = if (_scalarresult) then { | |
(_dis1+_dis2) - _total; | |
} else { | |
if (_dis1+_dis2 < _total) then {true} else {false;}; | |
}; | |
}; | |
if _in exitwith { true}; | |
} foreach _arraymrk; | |
_in | |
}; | |
ffa_func_line_algorithm = { //функция выстраивания прямых линий из позиций между точками | |
line_algorithm = { | |
private ["_pos", "_this", "_end", "_angle", "_xstart", "_ystart", "_xend", "_yend", "_dx", "_dy", "_ind", "_incx", | |
"_incy", "_pdx", "_pdy", "_es", "_el", "_x", "_y", "_err", "_arr"]; | |
_pos = (_this select 0) select 0; | |
_end = (_this select 0) select 1; | |
_step = _this select 1; | |
_ind = 0; | |
_angle =[_pos, _end] call BIS_fnc_dirTo; | |
_xstart = _pos select 0; | |
_ystart = _pos select 1; | |
_xend = _end select 0; | |
_yend = _end select 1; | |
_dx = _xend - _xstart;//проекция на ось икс | |
_dy = _yend - _ystart;//проекция на ось игрек | |
if (_dx < 0) then { | |
_incx =-1; | |
}else{ | |
_incx =1; | |
}; | |
/* | |
* Определяем, в какую сторону нужно будет сдвигаться. Если dx < 0, т.е. отрезок идёт | |
* справа налево по иксу, то incx будет равен -1. | |
* Это будет использоваться в цикле постороения. | |
*/ | |
if (_dy < 0) then { | |
_incy =-1; | |
}else{ | |
_incy =1; | |
}; | |
/* | |
* Аналогично. Если рисуем отрезок снизу вверх - | |
* это будет отрицательный сдвиг для y (иначе - положительный). | |
*/ | |
_dx = abs _dx; | |
_dy = abs _dy; | |
if (_dx > _dy) then | |
//определяем наклон отрезка: | |
{ | |
/* | |
* Если dx > dy, то значит отрезок "вытянут" вдоль оси икс, т.е. он скорее длинный, чем высокий. | |
* Значит в цикле нужно будет идти по икс (строчка el = dx;), значит "протягивать" прямую по иксу | |
* надо в соответствии с тем, слева направо и справа налево она идёт (pdx = incx;), при этом | |
* по y сдвиг такой отсутствует. | |
*/ | |
_pdx = _incx; _pdy = 0; | |
_es = _dy; _el = _dx; | |
} | |
else//случай, когда прямая скорее "высокая", чем длинная, т.е. вытянута по оси y | |
{ | |
_pdx = 0; _pdy = _incy; | |
_es = _dx; _el = _dy;//тогда в цикле будем двигаться по y | |
}; | |
_x = _xstart; | |
_y = _ystart; | |
_err = _el/2; | |
_arr=[]; | |
for "_i" from 0 to (_el-1) do | |
{ | |
_err =_err - _es; | |
if (_err < 0) then | |
{ | |
_err =_err + _el; | |
_x=_x + _incx;//сдвинуть прямую (сместить вверх или вниз, если цикл проходит по иксам) | |
_y=_y + _incy;//или сместить влево-вправо, если цикл проходит по y | |
} | |
else | |
{ | |
_x =_x + _pdx;//продолжить тянуть прямую дальше, т.е. сдвинуть влево или вправо, если | |
_y =_y + _pdy;//цикл идёт по иксу; сдвинуть вверх или вниз, если по y | |
}; | |
_ind =_ind +1; | |
if (_ind == _step) then { | |
_arr set [count _arr,[_x,_y,_angle]]; _ind = 0;}; | |
}; | |
_arr | |
}; | |
private ["_arr1"]; | |
_arr1 = []; | |
{ | |
if (_forEachIndex != (count (_this select 0) - 1)) then { | |
//_arr1 set [count _arr1,([[_x, (_this select 0) select (_forEachIndex +1)],(_this select 1)] call line_algorithm)]; | |
_arr1=_arr1 + ([[_x, (_this select 0) select (_forEachIndex +1)],(_this select 1)] call line_algorithm); | |
}; | |
} foreach (_this select 0); | |
_arr1 | |
}; | |
Dim_fnc_nearRoad = { // функция посика ближайшего дорожного сегмента | |
_roadpos=[]; | |
_newpos=[]; | |
for [{_i=0},{true},{_i=_i+1}] do | |
{ | |
_roadpos = _this nearRoads _i; | |
if ((count _roadpos)>0) exitwith {_newpos=(_roadpos select 0);_newpos}; | |
}; | |
_newpos | |
}; | |
//======================================================== addPublicVariableEventHandlers ==================================================== | |
"scanrespawn" addPublicVariableEventHandler | |
{ // - обработчик обработки данных от КС о имени КО и места клика мыши на карте | |
_player=((_this select 1) select 0); //КО | |
_pos=((_this select 1) select 1); // место клика мыши на карте | |
_arrunits=[]; // массив для членов отделения КО | |
{ | |
_arrunits set [_forEachIndex,_x]; | |
} foreach (units group _player); | |
_arrunits set [0,objNull]; //обнуляем КО в этом массиве | |
_arrunits=_arrunits-[objNull]; // удаляем КО из этого массива | |
_newpos=_pos call Dim_fnc_nearRoad; // находим позицию ближайшего дорожного сегмента | |
//==== работаем с найденными дорожными элементами ===========// | |
_connectedRoads = roadsConnectedTo _newpos; // находим массив дорожных сегментов с которым контактирует найденный дорожный сегмент [1 контактирующий, 2 контактирующий] | |
if (count (_connectedRoads) >1) then // если найдено больше одного | |
{ | |
_connectedRoads2= roadsConnectedTo (_connectedRoads select 1); // то к второму найденному находим с кем он контактирует | |
_connectedRoads set [2,_connectedRoads select 1]; // дублируем 2 найденный дорожный массив на 3 позицию в массиве [1 контактирующий, 2 контактирующий, 2 контактирующий] | |
_connectedRoads set [1,_newpos]; //основной дорожный сегмент вставляем на вторую позицию в массиве - таким образом выстраиваем последовательный отрезок и 3 позиций [1 контактирующий, основной, 2 контактирующий] | |
//============= перебираем второй массив найденных контактирующих дорог ======// | |
{ | |
if (_x != _newpos) then // так как во втором массиве один из элементов основной дорожный сегмент, то он нам не нужен | |
{ | |
_connectedRoads set [count _connectedRoads,_x]; // добавляем в основной массив еще один новый дорожный сегмент - сделано для удлинения участка на котором расставляется отделение.[1 контактирующий, основной, 2 контактирующий, 3 контактирующий] | |
}; | |
} foreach _connectedRoads2; | |
}else{ //если найден один | |
_connectedRoads2= roadsConnectedTo (_connectedRoads select 0); // то тогда к первому найденному находим с кем он контактирует | |
_connectedRoads set [2,_newpos]; //основной дорожный сегмент вставляем на 3 позицию в массиве - таким образом выстраиваем последовательный отрезок и 2 позиций [1 контактирующий, основной, основной] | |
_connectedRoads set [1,_connectedRoads select 1]; //дублируем 1 найденный дорожный массив на 2 позицию в массиве [1 контактирующий, 1 контактирующий, основной] | |
//============= перебираем второй массив найденных контактирующих дорог ======// | |
{ | |
if (_x != _newpos) then // так как во втором массиве один из элементов основной дорожный сегмент, то он нам не нужен | |
{ | |
_connectedRoads set [0,_x]; // добавляем в основной массив еще один новый дорожный сегмент - сделано для удлинения участка на котором расставляется отделение.[2 контактирующий,1 контактирующий, основной] | |
}; | |
} foreach _connectedRoads2; | |
}; | |
//======================= работаем с созданными отрезками =============================================// | |
_arrayroads=[]; //массив позиций дорожных сегментов | |
{ | |
_arrayroads set [count _arrayroads,getposatl _x]; // перебираем дорожные сегменты и заносим в новый массив их позиции | |
} foreach _connectedRoads; | |
{ | |
_x set [2,0]; | |
} foreach _arrayroads; // выставляем в массиве позиций высоту 0 | |
//============================================ проверка на занятость выбранных дорожных сегментов ===================================// | |
/* if ({if((count (_x nearEntities [["Man","LandVehicle", "Air", "StaticWeapon"], 2])) > 0) exitwith {1};} count _arrayroads == 0) then // перебираем расположение дорожных сегментов и нахождение кого-либо в радиусе 20 м от позиции и если никого нет т.е. 0 то даем добро | |
{ */ | |
if (!isnil "onspecgrouparray") then | |
{ | |
_lastIndex=-1; // переменная индекс | |
call compile format["{if (_x == _player) exitwith {_lastIndex = _forEachIndex;};} foreach arrleaderSPNgroup_%1;",side group _player]; // находим какой индекс занимает КО СПН в массиве КО СПН - для определения какой массив маркеров предназначен для этого КО СПН | |
}; | |
//======================================================= проверяем на различные условия и если что сходится даем добро =========================================// | |
if ( | |
( | |
((_player in ongrouparray) || ({if(_player in _x) exitwith {1};} count dim_MR_array_KC > 0) || (call compile format["_player in arrleadergroup_%1;",side group _player])) && // игрок должен находиться в списке перемещаемых КО и | |
( | |
call compile format["(count (onmarkerarray_%1) ==0) && (count (offmarkerarray_%1) ==0)",side group _player] || // массивы маркеров осн. отделений пусты или | |
call compile format["(count (offmarkerarray_%1) >0 && {!([offmarkerarray_%1,getposatl _newpos] call fn_inarrayMarker)} && {count (onmarkerarray_%1) == 0 || ( count (onmarkerarray_%1) >0 && {([onmarkerarray_%1,getposatl _newpos] call fn_inarrayMarker)})})",side group _player] || // массив маркеров куда нельзя перемещать не пуст и проверка позиции клика мыши на нахождение в массиве этих маркеров | |
call compile format["( count (onmarkerarray_%1) >0 && {([onmarkerarray_%1,getposatl _newpos] call fn_inarrayMarker)} && {count (offmarkerarray_%1) ==0 || (count (offmarkerarray_%1) >0 && {!([offmarkerarray_%1,getposatl _newpos] call fn_inarrayMarker)})})",side group _player] | |
) | |
) | |
|| // если игрок не находится в списке перемещаемых КО, а находится в списке перемещаемых КО СПН | |
( !isnil "onspecgrouparray" && {( | |
call compile format["(_player in arrleaderSPNgroup_%1) && {count (arrleaderSPNmarker_%1) >0} && {([arrleaderSPNmarker_%1 select _lastIndex,getposatl _newpos] call fn_inarrayMarker)}",side group _player]) // если игрок есть КО СПН и массив маркеров для СПН не пуст и позиция клика мыши совпадает с расположением с одним из маркеров | |
}) | |
) then | |
{ | |
_stroy=[_arrayroads,1] call ffa_func_line_algorithm; // теперь из массива позиций дорожных сегментов выстраиваем линию и разбиваем ее на позиции с дистанцией в 1м | |
{ | |
_x set [2,0]; | |
} foreach _stroy; // высоту позиций на ноль | |
_arrveh=[]; // массив техники привязанной к КО | |
_arrvehnew=[]; // массив для поиска не привязанной техники | |
_arrvehnew = _pos nearEntities [['LandVehicle', 'Air', 'StaticWeapon','ReammoBox'], 20]; // находим технику в радиусе 15м от КО | |
_arraysizeof=[]; // массив размеров этой техники | |
{ | |
if ((isnil {_x getvariable 'vehgroup'})) then // если техника не имеет привязку к КО | |
{ | |
_x setvariable ['vehgroup',_player,true]; // то привязываем ее к КО | |
}; | |
} foreach _arrvehnew; | |
//прогоняем весь массив техники в миссии | |
{ | |
if (!(isnil {_x getvariable 'vehgroup'}) && {(_x getvariable 'vehgroup')==_player}) then // если привязка к КО равна КО | |
{ | |
_arrveh set [count _arrveh,_x]; // то заганяем технику в массив техники привязанной к отделению | |
}; | |
} foreach vehicles; | |
//прогоняем массив техники отделения | |
{ | |
_s=ceil (abs (sizeOf (typeof _x))); // примерный размер техники | |
_arraysizeof set [count _arraysizeof,_s]; //собираем массив из размеров | |
} foreach _arrveh; | |
_summa=0; | |
{ | |
_summa=_summa + _x; // длина всей техники в отделении | |
} foreach _arraysizeof; | |
_sizemax=0; // размер | |
if ((_summa + (count (units group _player))) <= (count _stroy)) then // перебираем расположение дорожных сегментов и нахождение кого-либо в радиусе 20 м от позиции и если никого нет т.е. 0 то даем добро | |
{ | |
_stroy resize (_summa + (count (units group _player))); | |
if ({if((count (_x nearEntities [["AllVehicles"], (_summa + (count (units group _player)))/ 2])) > 0) exitwith {1};} count [_stroy select 0, _stroy select (count (_stroy)-1)] == 0) then // если общая длина техники + кол-во членов в отделении меньше или равно ко-ва массива позиций для расстановки отделения | |
//if (count ((_stroy select (round (count (_stroy)/ 2))) nearEntities [["AllVehicles"], (_summa + (count (units group _player)))]) == 0) then // если общая длина техники + кол-во членов в отделении меньше или равно ко-ва массива позиций для расстановки отделения | |
{ | |
_dir=[_newpos, (_connectedRoads select 0)] call BIS_fnc_dirTo; // узнаем направление дороги | |
//================================================================== | |
call { | |
if (isPlayer _player && {_player== leader (group _player)}) exitwith // если КО есть клиент и КО - лидер то | |
{ | |
moveunit=[_player,(_stroy select 0),_dir,_stroy]; // массив [КО, первая позиция в массиве _stroy, направление дороги, массив позиций ] | |
(owner _player) publicVariableclient 'moveunit'; // передаем этт массив данных клиенту КО | |
_player setposatl (_stroy select 0); // если КО - бот то премещаем его на сервере куда хотим | |
_player setDir (_dir +90); | |
OSGVAR(_player,SpawnPosition,(_stroy select 0)); | |
}; | |
if (!(isPlayer _player) && {_player== leader (group _player)}) exitwith // если КО есть клиент и КО - лидер то | |
{ | |
_player setposatl (_stroy select 0); // если КО - бот то премещаем его на сервере куда хотим | |
_player setDir (_dir +90); | |
OSGVAR(_player,SpawnPosition,(_stroy select 0)); | |
}; | |
//_player setVariable ["A3A_var_teleportObject", [getDir _player, (_stroy select 0)], true]; | |
}; | |
//============================= перебираем массив техники отделения ===================================== | |
_vehdistance = 0; | |
{ | |
if (_forEachIndex==0) then // берем первую технику в массиве | |
{ | |
_sizemax=(ceil (abs (sizeOf (typeof _x))))*0.5; // ее размер режим вдвое - нужо для того чтобы центр техники занял позицию посередине на тех дистанции | |
_vehdistance=_vehdistance+_sizemax; // назначаем тех дистанцию | |
(_stroy select ((count _arrunits) + _vehdistance)) set [2,0]; // высоту на ноль ???? | |
_x setposatl (_stroy select ((count _arrunits) + _vehdistance)); // пермещаем эту технику на позицию с дистанцией равной кол-ву членов отделения + тех дистанция | |
_x setDir (_dir +180); // поворачиваем вдоль дороги, задом к отделению | |
//_x setVariable ["A3A_var_teleportObject", [getDir _x, (_stroy select ((count _arrunits) + _vehdistance))], true]; | |
}else{ | |
_sizemax=ceil (abs (sizeOf (typeof _x))); //размер техники | |
_vehdistance=_vehdistance+_sizemax; //// назначаем тех дистанцию (техдистанция с предыдущей техники + размер этой техники | |
(_stroy select ((count _arrunits)+_vehdistance)) set [2,0]; // высоту на ноль ???? | |
_x setposatl (_stroy select ((count _arrunits)+_vehdistance)); // пермещаем эту технику на позицию с дистанцией равной кол-ву членов отделения + тех дистанция | |
_x setDir (_dir +180); // поворачиваем вдоль дороги, задом к отделению | |
//_x setVariable ["A3A_var_teleportObject", [getDir _x, (_stroy select ((count _arrunits)+_vehdistance))], true]; | |
}; | |
/* _veh=_x; | |
{ | |
if (markerText _x==(str _veh) && (!isnil {_veh getvariable 'vehmark'}) && {(_veh getvariable 'vehmark')==_x}) exitwith | |
{ | |
_x setMarkerPosLocal (getpos _veh); | |
}; | |
} foreach arraymarkerveh; */ | |
} foreach _arrveh; | |
//========================== перебираем членов отделения ======================================== | |
{ | |
if (isPlayer _x) then // если член отделения есть клиент | |
{ | |
moveunit=[_x,(_stroy select (_forEachIndex +1)),_dir]; // массив [КО, позиция в массиве _stroy, направление дороги] | |
(owner _x) publicVariableclient 'moveunit'; // передаем этт массив данных клиенту КО | |
_x setposatl (_stroy select (_forEachIndex +1)); // перемещение работает если КО - бот и член отделения тоже бот | |
_x setDir (_dir +90); | |
OSGVAR(_x,SpawnPosition,(_stroy select (_forEachIndex +1))); | |
//_x setVariable ["A3A_var_teleportObject", [getDir _x, (_stroy select (_forEachIndex +1))], true]; | |
}else{ | |
_x setposatl (_stroy select (_forEachIndex +1)); // перемещение работает если КО - бот и член отделения тоже бот | |
_x setDir (_dir +90); | |
OSGVAR(_x,SpawnPosition,(_stroy select (_forEachIndex +1))); | |
//_x setVariable ["A3A_var_teleportObject", [getDir _x, (_stroy select (_forEachIndex +1))], true]; | |
}; | |
} foreach _arrunits; | |
//================= создание маркера и перемещение на сервере ================================================= | |
{ | |
_name = getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "displayName"); | |
_veh= _x; | |
{ | |
if (markerText _x==_name && (!isnil {_veh getvariable 'vehmark'}) && {(_veh getvariable 'vehmark')==_x}) then | |
{ | |
_x setMarkerPosLocal (getposatl _veh); | |
}; | |
} foreach arraymarkerveh; | |
} foreach _arrveh; | |
if ({If (markerText _x == (str group _player)) exitwith {1};}count arraymarker == 0) then | |
{ | |
_marker = format ['markerblue%1',(random 1000)]; | |
_marker = createMarkerlocal[_marker, (getposatl _newpos)]; | |
_marker setMarkerShapelocal 'ICON'; | |
_marker setMarkerTypelocal 'mil_dot'; | |
_marker setmarkercolorlocal 'ColorOrange'; | |
_marker setMarkerTextlocal (str group _player); | |
arraymarker set [count arraymarker, _marker]; | |
}else{ | |
{ | |
if (markerText _x==(str group _player)) exitwith | |
{ | |
_x setMarkerPosLocal (getposatl _newpos); | |
}; | |
} foreach arraymarker; | |
}; | |
{ | |
_arrveh set [_foreachindex,[_x, getposatl _x]]; | |
}foreach _arrveh; | |
//============================================================================================================ | |
marker_pos=if (count (_arrveh) >0) then {[_player,(getposatl _newpos),_arrveh];}else{[_player,(getposatl _newpos)];}; // массив [КО, (_stroy select 0)] | |
publicVariable "marker_pos"; // сообшаем всем о новой позиции маркера для синхронизации | |
onMapSingleClick ''; | |
}; | |
}; | |
}; | |
/* }; */ | |
}; | |
//======================================= массивы для сервера с привязкой к сторонам =============================// | |
{ | |
call compile format["arrleadergroup_%1 = [];arrleaderSPNgroup_%1 = [];arrleaderSPNmarker_%1 = [];offmarkerarray_%1 = [];onmarkerarray_%1 = [];",_x]; | |
} forEach [EAST,WEST,RESISTANCE,CIVILIAN]; | |
//=================== создаем массивы лидеров групп на все стороны ===================================== | |
{ | |
_leader=leader _x; | |
call { | |
if ( count (ongrouparray) ==0) exitwith | |
{ | |
{ | |
call compile format["arrleadergroup_%1 set [count arrleadergroup_%1, _leader];",_x]; | |
} forEach [east,west,resistance,civilian]; | |
}; | |
if ( count (ongrouparray) >0 && {(leader _x) in ongrouparray}) exitwith | |
{ | |
{ | |
call compile format["arrleadergroup_%1 set [count arrleadergroup_%1, _leader];",_x]; | |
} forEach [east,west,resistance,civilian]; | |
}; | |
if (!isnil "onspecgrouparray" && {count (onspecgrouparray) >0} && {!((leader _x) in ongrouparray)}) exitwith | |
{ | |
_leader=leader _x; | |
{ | |
_spn=_x; | |
if (_leader in _spn) then | |
{ | |
{ | |
call compile format["arrleaderSPNgroup_%1 set [count arrleaderSPNgroup_%1, _leader];",_x]; | |
} forEach [east,west,resistance,civilian]; | |
{ | |
call compile format["arrleaderSPNmarker_%1 set [count arrleaderSPNmarker_%1, _spn select 1];",_x]; | |
} forEach [east,west,resistance,civilian]; | |
}; | |
} foreach onspecgrouparray; | |
}; | |
}; | |
//========================= | |
_unit=(leader _x); | |
_arrvehnew=[]; | |
_arrvehnew = (getpos _unit) nearEntities [['LandVehicle', 'Air', 'StaticWeapon','ReammoBox_F','ReammoBox'], 10]; | |
{ | |
if ((isnil {_x getvariable 'vehgroup'})) then | |
{ | |
_x setvariable ['vehgroup',_unit,true]; | |
}; | |
if hasinterface then | |
{ | |
_marker = str(_x); | |
createMarkerLocal[_marker, getpos _x]; | |
_marker setMarkerShapeLocal "ICON"; | |
_marker setMarkerTypeLocal "mil_dot"; | |
_name = getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "displayName"); | |
_picture = getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "picture"); | |
_marker setMarkerTextLocal _name; | |
_marker setMarkerColorLocal "ColorYellow"; | |
if ((isnil {_x getvariable 'vehmark'})) then | |
{ | |
_x setvariable ['vehmark',_marker,false]; | |
}; | |
arraymarkerveh set [count arraymarkerveh, _marker]; | |
}; | |
if ((isnil {_x getvariable 'vehside'})) then | |
{ | |
_x setvariable ['vehside',side (group _unit),true]; | |
}; | |
} foreach _arrvehnew; | |
} foreach allgroups; | |
{ | |
if (count (_x) > 2) then | |
{ | |
call compile format["offmarkerarray_%1 = offmarkerarray_%1 + (_x select 2);",side group (_x select 0)]; | |
}; | |
if (count (_x) > 1) then | |
{ | |
call compile format["onmarkerarray_%1 = onmarkerarray_%1 + (_x select 1);",side group (_x select 0)]; | |
}; | |
}forEach dim_MR_array_KC; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment