edit:
Nowa, ulepszona wersja. Dla wygody działa już z jedym parametrem (objekt/jednostka):
Kod: Zaznacz cały
[westRadar] exec "radar.sqs";
Kod: Zaznacz cały
[westRadar, westRadarTigger, WEST, 2000, 60, 0] exec "radar.sqs";
Kod: Zaznacz cały
_debugLevel = _debugLevelShowRadarStatus;
radar.sqs
Kod: Zaznacz cały
; radar.sqs, wersja 1.2
; Skrypt zbiera informację o jednostkach będących w zasięgu i rozgłasza ich obecność wszystkim jednostką sprzymierzonym.
; aszek, 2009
; Składnia wywołania:
; [_Radar, _Sensor, _FriendlySide, _SensorRange, _SensorRefreshTime, _SensorIdleTime] exec "radar.sqs"
; np: [westRadar, westRadarTigger, WEST, 2000, 60, 0] exec "radar.sqs";
; Parametry wywołania:
; <_Radar>
; Objekt/jednostka mająca udawać radar i symulować zbieranie informacj o wrogich jednostkach.
; Jeśli parametr jest jednostką, to skrypt na bieżąco będzie aktualizował pozycję skojarzonego wyzwalacza.
; Jeśli parametr zostanie zniszczony, to skrypt nie będzie dłużej aktualizował informacji i zakończy działanie.
; Parametr powinien być podany jako jawna nazwa obiektu/jednostki (nie używać 'this').
; <_Sensor>
; Wyzwalacz odpowiedzialny za wykrywanie wroga (aktywacja = ktokolwiek, raz, obecny).
; Parametr powinien być podany jako nazwa wyzwalacza (nie używać 'this'/'thislist', bo skrypt głupieje).
; <_FriendlySide>
; Strona konfliktu na rzecz której radar pracuje, wartość używana do ustalenia sojuszniczych jednostek.
; Parametr powinien przyjmować jedną z wartości stron konfliktu: WEST/EAST/GUER/CIVILIAN (bez cudzysłowów).
; <_SensorRange>
; Dystans do jakiego radar pracuje, jakiekolwiek jednostki z poza dystansu nie będą brane pod uwagę.
; Jeśli parametr ma wartość '0' to żadna z wykrytych przez '_Sensor' jednostek nie będzie pomijana (odsiewana).
; Jeśli parametr ma wartość większą niż promień działania wyzwalacza '_Sensor',
; to siłą rzeczy radar nie będzie wiedział o istnieniu takiej jednostki.
; Parametr służy do zawężania obszaru wykrywania wrogich jednostek.
; Parametr nie wyklucza powiadamienia sprzymierzonych jednostek, z poza zasięgu _SensorRange.
; <_SensorRefreshTime>
; Czas w sekundach pomiędzy kolejnymi aktualizacjami.
; Jeśli parametr ma wartość 0, _Radar po jednorazowym zebraniu informacji i rozgłoszeniu ich - kończy pracę (opcja dla wyzwalaczy wielokrotnych, lub zwiadu na żądanie).
; Wartość '0' pozwala jednokrotnie zebrać informację z pola walki (np: w WP, albo np: przez kanał Alfa),
; po czym radar się natychmiast automatycznie wyłacza.
; Dla ciągłej, nieprzerwanej pracy parametr musi być > '0'. Czas między całkowitym zaniknięciem informacji, wynosi 40-60s.
; <_SensorIdleTime>
; Jeśli przez pewien okres czasu wyrażony wzorem: _SensorIdleTime x _SensorRefreshTime [s], radar nie znajdzie żadnej jednostki, którą zidentyfikował,
; ani nie znajdzie żadnej jedostki sojuszniczej, której mógłby przekazać aktualizację - to po zdefiniowanym tu czasie nastąpi
; automatyczna dezaktywacja radaru. Ma to na celu zapobiegnięciu marnowania zasobów CPU, gdy w strefie działania wyzwalacza nie zostały
; żadne jedostki, które czerpały by korzyść z jego pracy. Wartość _SensorIdleTime powinna być jednak na tyle duża,
; aby skrypt nie wyłączył się zbyt wcześniej (zależy od rozmachu misji).
; Parametr jest opcjonalny (może nie wystąpić). Jeśli parametr nie wystąpi w tablicy parametrów podczas uruchamiania skryptu,
; to skrypt będzie działał poprawnie tak jakby parametr miał wartość '0'.
; Jeśli tu parametr ma wartość '0' automatyczna dezaktywacja skryptu nigdy nie nastąpi (za wyjątkiem sytuacji, gdy '_SensorRefreshTime' == 0).
; Aby skrypt działał poprawnie i wedle wytycznych należy:
; - na mapie umieścić obiekt lub jednostkę mający być radarem, nazwać go.
; - na mapie umieścić wyzwalacz obejmujący swym promieniem cały obszar w którym rozmieszczone są jednostki, np: 1000, nazwać go.
; - podać stronę konfliktu która z radaru korzysta, np: WEST (zachód).
; - podać dystans na jaki wrogie jednostki będą wykrywane, np: 800 [m].
; - podać czas co jaki radar uaktualni swoje działanie, np: 60 [s].
; - podać czas jak długo radar ma pracować, np: 0 [s] jeśli bezprzerwy.
; Jednak skrypt będzie działał poprawnie nawet jeśli nie wszystkie parametry zostały podane.
; Absolutnie wymaganym parametrem jest objekt <_Radar>, reszta jest opcjonalna i jeśli nie została podana, to
; skrypt nada im wartości domyślne, oraz samodzielnie utworzy wyzwalacz niezbedny do swojego działania.
; Domyślnie parametry przyjmują wartości tak jakby skrypt został wywołany jako:
; [_Radar, <jakiś wyzwalacz>, WEST, 2000, 60, 0] exec "radar.sqs"
; Skrypt jest wyposażony w mechanizm obsługi błędów sterowany zmienną '_debugLevel'.
; Dla testów i monitorowania aktywności skryptu, można podnieść poziom informacji jakie podaje skrypt podczas pracy.
; Im wyższa wartość tym informację są bardziej szczegółowe. Jako pierwsze pojawiają się informację o błedach,
; a następnie o tym co robi radar. Dla gotowej misji '_debugLevel' powinien mieć wartość '_debugLevelNone' (0).
private ["_Radar", "_Sensor", "_FriendlySide", "_SensorRange", "_SensorRefreshTime", "_SensorIdleTime", "_SensorIdleScans", "_RadarPos", "_distance"];
private ["_allUnits", "_friendlyUnits", "_knownUnits"];
private ["_allUnitsCount", "_friendlyUnitsCount", "_knownUnitsCount"];
private ["_unit", "_unitPos", "_friendlyUnit", "_knownUnit"];
private ["_index", "_friendlyUnitIndex", "_knownUnitIndex", "_visibleFactor", "_visibleAltitude", "_unitAltitude", "_radarAltitude"];
private ["_gotoBlock", "_ExecError"];
_debugLevelNone = 0;
_debugLevelExecParamErrorCritical = 1;
_debugLevelExecParamErrorWarning = 2;
_debugLevelExecParamErrorHint = 4;
_debugLevelExecParamErrorAll = 8;
_debugLevelShowRadarStatus = 16;
_debugLevel = _debugLevelNone;
#RadarReset
_SensorIdleScans = 0;
_gotoBlock = "getExecParam";
_Radar = objNull;
_Sensor = objNull;
_FriendlySide = NONE;
_SensorRange = 0;
_SensorRefreshTime = 0;
_SensorIdleTime = 0;
_ExecError = 0;
RadarActive = false;
publicVariable "RadarActive";
goto _gotoBlock;
#getExecParam
_paramCount = count _this;
? (_paramCount < 1) : _ExecError = 1; _gotoBlock = "end"; goto "error";
? (_paramCount < 2) : _Radar = _this select 0; _RadarPos = Getpos _Radar; goto "setDefaultParam_Sensor";
? (_paramCount < 3) : _Sensor = _this select 1; goto "setDefaultParam_Side";
? (_paramCount < 4) : _FriendlySide = _this select 2; goto "setDefaultParam_SensorRange";
? (_paramCount < 5) : _SensorRange = _this select 3; goto "setDefaultParam_SensorRefreshTime";
? (_paramCount < 6) : _SensorRefreshTime = _this select 4; goto "setDefaultParam_SensorIdleTime";
? (_paramCount < 7) : _SensorIdleTime = _this select 5;
goto "RadarStart";
#setDefaultParam_Sensor
_Sensor = createTrigger ["EmptyDetector", _RadarPos];
_Sensor setTriggerType "NONE";
_Sensor setTriggerStatements ["this", "", ""];
_Sensor triggerAttachVehicle [_Radar];
_ExecError = 2;
_gotoBlock = "setDefaultParam_Side";
goto "error";
#setDefaultParam_Side
_FriendlySide = WEST;
_ExecError = 3;
_gotoBlock = "setDefaultParam_SensorRange";
goto "error";
#setDefaultParam_SensorRange
_SensorRange = 2000;
_Sensor setTriggerArea [_SensorRange, _SensorRange, 0, false];
_ExecError = 4;
_gotoBlock = "setDefaultParam_SensorRefreshTime";
goto "error";
#setDefaultParam_SensorRefreshTime
_SensorRefreshTime = 30;
_Sensor setTriggerTimeout [_SensorRefreshTime, _SensorRefreshTime, _SensorRefreshTime, false];
_ExecError = 5;
_gotoBlock = "setDefaultParam_SensorIdleTime";
goto "error";
#setDefaultParam_SensorIdleTime
_SensorIdleTime = 0;
_ExecError = 6;
_gotoBlock = "RadarStart";
goto "error";
#RadarIdle
? (_SensorIdleTime > 0) : _SensorIdleScans = _SensorIdleScans + 1;
~1
goto "RadarScan";
#RadarStart
_Sensor setTriggerActivation ["ANY", "PRESENT", (_SensorRefreshTime == 0)];
? (CanMove _Radar) : _Radar SetGroupID ["November", "GroupColor4"];
RadarActive = true;
publicVariable "RadarActive";
_ExecError = 7;
_gotoBlock = "RadarScan";
goto "error";
#RadarScan
? (_SensorIdleScans > _SensorIdleTime) : _ExecError = 10; goto "RadarStop";
? not RadarActive : _ExecError = 11; goto "RadarStop";
? not (Alive _Radar) : _ExecError = 13; goto "RadarStop";
~_SensorRefreshTime
? (CanMove _Radar) : _RadarPos = Getpos _Radar; _Sensor SetPos _RadarPos; "RadarMarker" SetMarkerPos _RadarPos;
_allUnits = list _Sensor;
? (_Radar in _allUnits) : _allUnits = _allUnits - [_Radar];
_allUnitsCount = count _allUnits;
? (_allUnitsCount == 0) : goto "RadarIdle";
_index = 0;
#removeDeadUnits
_unit = _allUnits select _index;
? (not Alive _unit) : {_allUnits = _allUnits - [_unit]; _allUnitsCount = _allUnitsCount - 1; _index = _index - 1};
_index = _index + 1;
? (_index <= _allUnitsCount) : goto "removeDeadUnits";
? (_allUnitsCount == 0) : goto "RadarIdle";
_friendlyUnits = [];
_friendlyUnitsCount = 0;
_knownUnits = [];
_knownUnitsCount = 0;
_index = 0;
#sortUnits
_unit = _allUnits select _index;
_unitPos = GetPos _unit;
? (side _unit == _FriendlySide) : _friendlyUnits = _friendlyUnits + [_unit];
? (_SensorRange == 0) : _distance = 0;
? (_SensorRange != 0) : _distance = _RadarPos distance _unitPos;
? (_SensorRange < _distance) : goto "nextUnit";
? (_SensorRange == 0) : goto "skipcheckvisiblecone";
_visibleFactor = 70 / _SensorRange;
_visibleAltitude = _visibleFactor * _distance;
_unitAltitude = _unitPos select 2;
_radarAltitude = _RadarPos select 2;
? (_unitAltitude > _visibleAltitude - _radarAltitude) : goto "nextUnit";
? (_unitAltitude < -_visibleAltitude + _radarAltitude) : goto "nextUnit";
#skipcheckvisiblecone
? (side _unit == civilian) : goto "nextUnit";
? not (_unit in _knownUnits) : _knownUnits = _knownUnits + [_unit];
goto "nextUnit";
#nextUnit
_index = _index + 1;
? (_index <= _allUnitsCount) : goto "sortUnits";
_friendlyUnitsCount = count _friendlyUnits;
_knownUnitsCount = count _knownUnits;
? (_friendlyUnitsCount == 0) : goto "RadarIdle";
? (_knownUnitsCount == 0) : goto "RadarIdle";
_SensorIdleScans = 0;
_knownUnitIndex = 0;
#selectKnownUnit
_knownUnit = _knownUnits select _knownUnitIndex;
_knownUnitIndex = _knownUnitIndex + 1;
_friendlyUnitIndex = 0;
#selectFriendlyUnit
_friendlyUnit = _friendlyUnits select _friendlyUnitIndex;
_friendlyUnitIndex = _friendlyUnitIndex + 1;
? (_friendlyUnit knowsAbout _knownUnit < 4) : _friendlyUnit reveal _knownUnit;
? (_friendlyUnitIndex <= _friendlyUnitsCount) : goto "selectFriendlyUnit";
? (_knownUnitIndex <= _knownUnitsCount) : goto "selectKnownUnit";
? (_SensorRefreshTime == 0) : _ExecError = 12; goto "RadarStop";
? (_debugLevel < _debugLevelShowRadarStatus) : goto "RadarScan";
_ExecError = 9;
_gotoBlock = "RadarScan";
goto "error";
#error
_errorMessage = "";
? (_debugLevel == _debugLevelNone) : goto "errorReset";
? (_debugLevel < _debugLevelExecParamErrorCritical) : goto "errorReset";
? (_ExecError == 0) : _errorMessage = "Radar.sqs: Nieznany blad"; goto "errorShow";
? (_ExecError == 1) : _errorMessage = "Radar.sqs: Blad krytyczny, objekt _Radar (1) jest wymagany !"; goto "errorShow";
? (_debugLevel < _debugLevelExecParamErrorWarning) : goto "errorReset";
? (_ExecError == 2) : _errorMessage = "Radar.sqs: Ostrzezenie, parametr _Sensor (2) nieobecny - utworzono domyslny wyzwalacz."; goto "errorShow";
? (_ExecError == 3) : _errorMessage = format ["Radar.sqs: Ostrzezenie, parametr _FriendlySide (3) nieobecny - wartosc domyslna: %1", _FriendlySide]; goto "errorShow";
? (_debugLevel < _debugLevelExecParamErrorHint) : goto "errorReset";
? (_ExecError == 4) : _errorMessage = format ["Radar.sqs: Uwaga, parametr _SensorRange (4) nieobecny - wartosc domyslna: %1", _SensorRange]; goto "errorShow";
? (_ExecError == 5) : _errorMessage = format ["Radar.sqs: Uwaga, parametr _SensorRefreshTime (5) nieobecny - wartosc domyslna: %1", _SensorRefreshTime]; goto "errorShow";
? (_debugLevel < _debugLevelExecParamErrorAll) : goto "errorReset";
? (_ExecError == 6) : _errorMessage = format ["Radar.sqs: Uwaga, parametr _SensorIdleTime (6) nieobecny - wartosc domyslna: %1", _SensorIdleTime]; goto "errorShow";
? (_debugLevel < _debugLevelShowRadarStatus) : goto "errorReset";
? (_ExecError == 7) : _errorMessage = "Radar aktywny."; goto "errorShow";
? (_ExecError == 8) : _errorMessage = "Radar dezaktywowany (przyczyna nieokreslona)."; goto "errorShow";
? (_ExecError == 9) : _errorMessage = "Radar skanuje."; goto "errorShow";
? (_ExecError == 10) : _errorMessage = "Radar przekroczyl czas pracy i zostal zdezaktywowany."; goto "errorShow";
? (_ExecError == 11) : _errorMessage = "Radar dezaktywowany zdalnie."; goto "errorShow";
? (_ExecError == 12) : _errorMessage = "Radar jednoprzebiegowy zostal dezaktywowany automatycznie."; goto "errorShow";
? (_ExecError == 13) : _errorMessage = "Radar zostal zniszczony."; goto "errorShow";
goto "errorReset";
#errorShow
? (_errorMessage == "") : goto "errorReset";
hint _errorMessage;
_errorMessage = "";
~5
hint "";
goto "errorReset";
#errorReset
? (_ExecError == 1) : _gotoBlock = "end";
_ExecError = 0;
goto _gotoBlock;
#RadarStop
_gotoBlock = "end";
? (_ExecError == 0) : _ExecError = 8;
goto "error";
#end
RadarActive = false;
publicVariable "RadarActive";
exit;