Skip to content

Instantly share code, notes, and snippets.

@bosoy
Last active June 22, 2016 21:01
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/52d852112948e9bd4f433111f90ebf73 to your computer and use it in GitHub Desktop.
Save bosoy/52d852112948e9bd4f433111f90ebf73 to your computer and use it in GitHub Desktop.
#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