daivi › Понедельник
› 21.04.2014
› 20:18
› Сообщение #
1
Рядовой
В увольнительной
Группа:
Пользователи
Сообщений:
4
Столкнулся с одной особенностью на своем сервере. Мне нужно на карте поставить около 400 триггеров радиации. Вписывать в файл мисси очень не удобно, так как нужно треггеры постоянно добавлять-удалять. Поэтому пытаюсь триггеры расставить скриптом например вот так: Код
_st_trigger1 = createTrigger ["EmptyDetector", [5832.2871, 2194.574]]; _st_trigger1 setTriggerArea [5, 5, 0, false]; _st_trigger1 setTriggerStatements ["true", "XC=[thistrigger,5]execvm ""Scripts\Radiation.sqf"";", ""]; _st_trigger1 setTriggerActivation ["ANY", "PRESENT", true]; _st_trigger2 = createTrigger ["EmptyDetector", [5873.4912, 2205.2087]]; _st_trigger2 setTriggerArea [5, 5, 0, false]; _st_trigger2 setTriggerStatements ["true", "XC=[thistrigger,5]execvm ""Scripts\Radiation.sqf"";", ""]; _st_trigger2 setTriggerActivation ["ANY", "PRESENT", true]; _st_trigger3 = createTrigger ["EmptyDetector", [5858.8174, 2157.855, 0]]; _st_trigger3 setTriggerArea [5, 5, 0, false]; _st_trigger3 setTriggerStatements ["true", "XC=[thistrigger,5]execvm ""Scripts\Radiation.sqf"";", ""]; _st_trigger3 setTriggerActivation ["ANY", "PRESENT", true];
В редакторе все прекрасно работает, но на сервере скрипт запущщеный таким образом полностью не отрабатывается. Например не работает детектор радиации. Скрипт радиации:
private ["_vfxstate","_dmg","_pdmg","_dstate","_epicenter","_DynamicBlur"]; _epicenter = _this select 0; _range = _this select 1; _vfxstate = 0; _dstate = 0; _pdmg = 0; _dmg = 0; while {true} do { _objects=list _epicenter; if (count _objects>0) then { {if ((!alive _x) or (!(_x isKindOf "MAN")) or (_x isKindOf "bloodsucker") or (_x isKindOf "gsc_scientist1")or (_x isKindOf "gsc_scientist2"))then {_objects=_objects-[_x];};}ForEach _objects; { if ((_x distance _epicenter)<_range) then { if (local _x) then { _dmg = (_x getVariable "DAP_RADIATION_DAMAGE"); if (isNil("_dmg")) then {_dmg = 0; _x setVariable ["DAP_RADIATION_DAMAGE",0];}; _dmg = (_dmg + 0.025); if (_x == player) then {_pdmg = _pdmg + 0.025}; _x setVariable ["DAP_RADIATION_DAMAGE",_dmg]; _x setDammage ((damage _x)+0.025); }; }; }ForEach _objects; }; _pos = (_epicenter modelToWorld [0,0,0]); _manpos = (player modelToWorld [0,0,0]); _dist=(player distance [_pos select 0, _pos select 1, _manpos select 2]); if (_dist<=(_range+25) and (player hasWeapon "DAP_DETECTOR") and (_dstate==0)) then { _epicenter setVariable ["DAP_DETECTOR_STATE",1]; [_epicenter,_range,1] execVM "DAPANOMALIES\Scripts\Detector.sqf"; _dstate=1; }; if (_dist>(_range+25) and (player hasWeapon "DAP_DETECTOR") and (_dstate==1)) then { _epicenter setVariable ["DAP_DETECTOR_STATE",0]; _dstate=0; }; if ((_dist<=_range) and (!(player isKindOf "DAP_MutantBase")) and (!(player isKindOf "DAP_ZombieBase"))) then { if (_vfxstate==0) then { _DynamicBlur = ppEffectCreate ["dynamicBlur", 465]; _DynamicBlur ppEffectEnable true; _DynamicBlur ppEffectCommit 0.1; _vfxstate=1; }; _fxb=(_pdmg*3); _DynamicBlur ppEffectCommit 0.1; _DynamicBlur ppEffectAdjust [_fxb]; }; if ((_dist>_range) and (!(player isKindOf "DAP_MutantBase"))and (!(player isKindOf "DAP_ZombieBase")) and (_vfxstate==1)) then { ppEffectDestroy _DynamicBlur; _vfxstate = 0; _pdmg = 0; }; sleep 1; };
Скрипт детектора:
private ["_state","_dist","_range"]; _epicenter = _this select 0; _range = _this select 1; _type = _this select 2; _beepcount=_range; _state = _epicenter getVariable "DAP_DETECTOR_STATE"; if (_type==0) then { While {(_state==1)} do { _state = _epicenter getVariable "DAP_DETECTOR_STATE"; _pos = (_epicenter modelToWorld [0,0,0]); _manpos = (player modelToWorld [0,0,0]); _dist=(player distance [_pos select 0, _pos select 1, _manpos select 2]); _beepcount=_beepcount+2.5; if (_dist<=(_range+25) and (_beepcount>=_dist)and (player hasWeapon "DAP_DETECTOR")) then {PlaySound "dap_beep_detector";_beepcount=_range;}; sleep 0.25; }; }; if (_type==1) then { While {(_state==1)} do { _state = _epicenter getVariable "DAP_DETECTOR_STATE"; _pos = (_epicenter modelToWorld [0,0,0]); _manpos = (player modelToWorld [0,0,0]); _dist=(player distance [_pos select 0, _pos select 1, _manpos select 2]); _beepcount=_beepcount+2.5; if (_dist<=(_range+25) and (_beepcount>=_dist)and (player hasWeapon "DAP_DETECTOR")) then {PlaySound "dap_beep_geiger";_beepcount=_range;}; sleep 0.25; }; };
Буду признателен за подсказку, почему детектор не видет скриптовый триггер? Тогда как триггер прописанный в миссии работает отлично.
Slon › Понедельник
› 21.04.2014
› 20:39
› Сообщение #
2
Генералиссимус
В увольнительной
Группа:
Модератор
Сообщений:
3709
Титул:
Спец по скриптам
daivi › Понедельник
› 21.04.2014
› 20:55
› Сообщение #
3
Рядовой
В увольнительной
Группа:
Пользователи
Сообщений:
4
Использование триггера в данном случае обусловлено например возможностью задания разного радиуса для радиации.
Slon › Понедельник
› 21.04.2014
› 22:20
› Сообщение #
4
Генералиссимус
В увольнительной
Группа:
Модератор
Сообщений:
3709
Титул:
Спец по скриптам
радиус можно задать в параметры контроля сканер https://community.bistudio.com/wiki/nearEntities позволит не проверять жизнь объекта. _ms =[ [[координаты],радиус] [[100, 100], 250], [[150, 500], 300] ]; { _all = (_x select 0) nearEntities ["All", _x select 1]; ........ } forEach _ms;
daivi › Пятница
› 25.04.2014
› 19:05
› Сообщение #
5
Рядовой
В увольнительной
Группа:
Пользователи
Сообщений:
4
Спасибо! Буду пробовать. Добавлено (25.04.2014, 19:05) --------------------------------------------- Не судите строго, но хочу уточнить правильно ли я понимаю скрипт: _ms =[ //создаем массив для переменной _ms [[координаты],радиус] //елемент массива 0 [[100, 100], 250], //елемент массива 1 [[150, 500], 300] //елемент массива 2 ]; { //цикл _all = (_x select 0) nearEntities ["All", _x select 1]; // _all = определяем элемент массива // ищем в заданном радиусе "all" //переменную _all используем далее произвольно } forEach _ms; //повторить цикл для каждого элемента массива