|
|
Модератор форума: Slon |
Форум » РЕДАКТОР - ArmA 2 » Скрипты » создание НПЦ |
создание НПЦ |
› Пятница
› 04.07.2014
› 15:43
› Сообщение #
В общем суть в том что создается юнит и ему вешается диалог через kbAddTopic то же самое на игрока. Ну вернее на юнита вешается *.bikb и fsm'ка обработчик а на игрока та же *.bikb и компилируется event_handler. В редакторе все просто - подходим к нпц на скроле появляется диалог, при выборе определенного пункта происходит какое то действие - получаем задание какое то например.
В мультиплеере пробовал несколько вариантов: Создаем юнита на стороне сервера в mission.sqf вешаем на него глобальную переменную. По принципу подключения ботов - подключаем скрипт в server_monitor там где на глобальную переменную коей является наш юнит вешаем kbAddTopic. Дальше идут различия: в первом варианте: в скрипте который вызывается из server_monitor делаем проверку на наличие рядом игроков и потом в цикле форич вешаем им kbAddTopic. В результате ничего не работает =( во втором варианте пробовал ставить по позиции НПЦ тригер который при активации вешает на игрока его активировавшего kbAddTopic. В результате так же ничего не работает. При чем пробовал в скрипт который я компилирую в kbAddTopic ставить хинт - не хинтит. Вот и задаюсь вопросом кто то вообще замарачивался созданием диалогов по средством kbAddTopic в мультиплеере? Я понимаю конечно то можно все это сделать с кучей проверок через addaction но это все писать же с нуля снова =( Или там переработать скрипт торговцев под нпц но хотелось бы уже через kbAddTopic если он вообще в мультике работает. Написал все на словах по сколько нет скриптов под рукой, попробую примерно накидать от руки: mission.sqf: Код _unit_81 = objNull; if (true) then { _this = createAgent ["Dr_Annie_Baker_EP1", [11472.008, 11370.638], [], 0, "CAN_COLLIDE"]; _unit_81 = _this; _this setDir 208.20467; _this setVehicleInit "this allowDammage false; this disableAI 'MOVE'; this disableAI 'AUTOTARGET'; this disableAI 'TARGET'; this setBehaviour 'CARELESS'; this forceSpeed 0;"; _this setUnitAbility 0.60000002; _this allowDammage false; _this disableAI 'MOVE'; _this disableAI 'AUTOTARGET'; _this disableAI 'TARGET'; _this setBehaviour 'CARELESS'; _this forceSpeed 0;_this enableSimulation false; npc = _this; publicvariable "npc"; }; server_monitor: Код [] ExecVM "\z\addons\dayz_server\npc\npc.sqf"; allowConnection = true; npc.sqf (1 вариант): может что то не совсем так написал, пишу по памяти Код while {true} do { [] spawn { while {true} do { _list = npc nearEntities ["MAN", 10]; { if (!(isPlayer _x)) then {_list = _list - (_list-[_x])}; }foreach _list; {_x kbAddtopic["speech", "\z\addons\dayz_server\npc\speech.bikb", "", {call compile preprocessFileLineNumbers "\z\addons\dayz_server\npc\speech.sqf"}]; [] spawn { while {true} do { if ((_x distance npc) > 10) exitwith {_x kbRemoveTopic "speech";}; sleep 1; }; }; }foreach _list; }; }; waituntil {sleep 1; count _list > 0}; npc kbAddtopic["speech", "\z\addons\dayz_server\npc\speech.bikb", "\z\addons\dayz_server\npc\npc.fsm"]; waituntil {sleep 1; count _list == 0}; npc kbRemoveTopic "speech"; }; npc.sqf (2 вариант): Код while {true} do { waituntil { sleep 1; _list = npc nearEntities ["MAN", 10]; { if (!(isPlayer _x)) then {_list = _list - (_list-[_x])}; }foreach _list; coun _list > 0 }; npc kbAddtopic["speech", "\z\addons\dayz_server\npc\speech.bikb", "\z\addons\dayz_server\npc\npc.fsm"]; waituntil { sleep 1; _list = npc nearEntities ["MAN", 10]; { if (!(isPlayer _x)) then {_list = _list - (_list-[_x])}; }foreach _list; coun _list == 0 }; npc kbRemoveTopic "speech"; }; во втором варианте по координатам спауна нпц в mission.sqm вешается триггер где при активации происходит Код player kbAddtopic["speech", "npc\speech.bikb", "", {call compile preprocessFileLineNumbers "npc\speech.sqf"}]; при деактивации Код player kbRemoveTopic "speech"; Ну плюс хинтов раскидал для проверки, по хинтам все должно работать, все скрипті все правильно хинтит, единственное что kbAddtopic не работает. В общем как то так =( |
| |||
| |||
Чат сайта |