Модостроение. Спавн и логика
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Спавн и логика Создание объектов на локации и логика поведения этих объектов Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7
Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML [cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл: 1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R]) 2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx" 3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо) Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#" Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]
[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти? Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда. Для того чтоб найти LOG необходимо зайти вот сюда:
В Win хр лог находится:
C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs
Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.
В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs
Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка: ... $app_data_root$ = true | false| $fs_root$| users\(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx) ... $logs$ = true| false| $app_data_root$| logs\(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи) ... [/cut][cut=Получение более подробной информации о вылете (ХОВАН)] Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...) Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так: Code function abort(fmt, ...) local reason = string.format(fmt, ...) error_log(reason) end Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией
Первый: Code Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil) Второй: Code Expression : 0 Function : ErrorLog File : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp Line : 49 Description : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic' [/cut]
Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы, статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 08.09.2013, 23:34 | Сообщение # 646 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый Вечер. Интересует следующий вопрос. Через рестриктор нужно вызвать эффект опьянения ГГ. Какой функцией можно воспользоваться для этой цели?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 09.09.2013, 00:19 | Сообщение # 647 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, сначала прописать ГГ водку в рюкзак, а затем заставить его её выпить:
Прописываем в рюкзак =give_item(vodka_script:actor)
Заставляем выпить =eat_vodka_script()
Между этими функциями нужно сделать небольшую паузу, чтобы объект vodka_script успел проспавниться.
Можно сделать одной функцией ( =gg_buxoy() ) и тогда пауза не нужна ( колбэк сам отследит это ):
function gg_buxoy(actor, npc) alife():create("vodka_script" , actor:position(), actor:level_vertex_id(), actor:game_vertex_id(), actor:id() ) level.add_call( function () if actor:object("vodka_script") ~= nil then return true end end, function () actor:eat(actor:object("vodka_script")) end ) end
Терпение...... И все получится!
Сообщение отредактировал makdm - Пн, 09.09.2013, 00:48 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
Volk66 | Дата: Пн, 09.09.2013, 19:04 | Сообщение # 648 |
Отмычка
Пользователи
Сообщений: 34
| а как заспавнить НПС на новых локациях?
|
|
|
Эти 0 пользователя(ей) поблагодарили Volk66 за это полезное сообщение: |
|
|
FantomICW | Дата: Пн, 09.09.2013, 19:07 | Сообщение # 649 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| Volk66, читаем уроки КМБ.
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
Volk66 | Дата: Пн, 09.09.2013, 19:12 | Сообщение # 650 |
Отмычка
Пользователи
Сообщений: 34
| FantomICW, А как мутантов заспавнить? Да и как координаты вычеслить?
|
|
|
Эти 0 пользователя(ей) поблагодарили Volk66 за это полезное сообщение: |
|
|
strelok200 | Дата: Пн, 09.09.2013, 19:20 | Сообщение # 651 |
Бывалый
Свобода
Сообщений: 126
| Цитата (Volk66) FantomICW, А как мутантов заспавнить? Да и как координаты вычеслить? Такое в сдк желательно проделывать, если по глобальному заселяешь.Добавлено (09.09.2013, 19:20) ---------------------------------------------
Цитата (Volk66) а как заспавнить НПС на новых локациях? смотрим уроки по СДК
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
Volk66 | Дата: Пн, 09.09.2013, 19:21 | Сообщение # 652 |
Отмычка
Пользователи
Сообщений: 34
| strelok200, я в нём не умею работать
|
|
|
Эти 0 пользователя(ей) поблагодарили Volk66 за это полезное сообщение: |
|
|
strelok200 | Дата: Пн, 09.09.2013, 19:23 | Сообщение # 653 |
Бывалый
Свобода
Сообщений: 126
| Обязательно надо научиться. Тем более если ты работаешь Цитата (Volk66) на новых локациях Посмотри уроки от Андрея Непряхина
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
Volk66 | Дата: Пн, 09.09.2013, 19:25 | Сообщение # 654 |
Отмычка
Пользователи
Сообщений: 34
| strelok200, да у меня на это времени нету. Я занят. Времени хватает только на добавление от 1 до 3 новых локаций.
|
|
|
Эти 0 пользователя(ей) поблагодарили Volk66 за это полезное сообщение: |
|
|
FantomICW | Дата: Пн, 09.09.2013, 19:46 | Сообщение # 655 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| sergej5500, я думаю, можно самым обычным способом: Код [logic] active = sr_idle@wait
[sr_idle@wait] on_info = {=actor_in_zone(рестриктор) +инфопорция_1} sr_no_weapon@hide_wpn
[sr_no_weapon@hide_wpn] on_info = {+инфопорция_2} sr_idle@restore_wpn
[sr_idle@restore_wpn] По GPS, они ведь прописаны в коллбеках использования предметов в sgm_callbacks.script: [cut=Код]Код elseif find_in_string(item_name,"guidebook_") then if level.name()=="zaton" or level.name()=="jupiter" or level.name()=="pripyat" or level.name()=="escape" or level.name()=="marsh" or level.name()=="agroprom" or level.name()=="red_forest" or level.name()=="darkvalley" or level.name()=="military" then if item_name=="guidebook_mono" then sgm_flags.value_guidebook_type=1 else sgm_flags.value_guidebook_type=2 end give_info("guidebook_active") run_dynamic_element(ui_mod_guidebook.guidebook(),false) else game_hide_menu() if item_name=="guidebook_mono" then sgm_flags.value_guidebook_type=1 else sgm_flags.value_guidebook_type=2 end give_object_to_actor(item_name) game.start_tutorial("about_guidebook_lock_use") end [/cut] Думаю, здесь можно разнообразить строки запуска проверкой на инфопорцию.
Сообщение отредактировал FantomICW - Пн, 09.09.2013, 19:46 |
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
makdm | Дата: Пн, 09.09.2013, 20:00 | Сообщение # 656 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, самое простое, что пришло в голову сделать так.
Логика рестриктора
[sr_idle@control] on_info = {+поршень_1} sr_idle@control_1 %=stop_weapon_and_guidebook%
[sr_idle@control_1] on_info = %=stop_weapon_and_guidebook% on_info2 = {+поршень_2} sr_idle@control_2
[sr_idle@control_2 ]
Теперь сама функция в xr_effects.script
[cut=Функкция]function stop_weapon_and_guidebook( actor, npc ) if actor:item_in_slot( 2 ) ~= nil then local active_item = actor:item_in_slot( 2 ) local actor_weapon = alife():object(active_item:id()) local section_name = actor_weapon:section_name() local rukzak_weapon = alife():create( section_name, actor:position(), actor:level_vertex_id(), actor:game_vertex_id(), actor:id() ) rukzak_weapon:clone_addons(actor_weapon) local sobj = active_item and active_item:id() and alife():object(active_item:id()) alife():release( sobj, true ) end if actor:item_in_slot( 3 ) ~= nil then local active_item = actor:item_in_slot( 3 ) local actor_weapon = alife():object(active_item:id()) local section_name = actor_weapon:section_name() local rukzak_weapon = alife():create( section_name, actor:position(), actor:level_vertex_id(), actor:game_vertex_id(), actor:id() ) rukzak_weapon:clone_addons(actor_weapon) local sobj = active_item and active_item:id() and alife():object(active_item:id()) alife():release( sobj, true ) end local hud = get_hud() hud:HideActorMenu() end[/cut]
Здесь оружие из слотов перемещается в рюкзак. А рюкзак ГГ становится недоступным ( т.е. оружие в слот не вставить и проводник не активировать)
Можно дополнительно добавить проверку на нож и гранаты. Если нужно, то сделаю.
Терпение...... И все получится!
Сообщение отредактировал makdm - Пн, 09.09.2013, 20:09 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 15.09.2013, 19:03 | Сообщение # 657 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый День. Заинтересовал такой вопрос. В СГМ есть базы наёмников, бандитов, Рассвета и Монолита. Предусмотрена опция respawn_bases_permition = true ;(true или false) - Производить ли респаун баз(вносимых модом), после их частичного разгрома. Например базы бандитов. Мне почему то кажется, что эта фишка не работает. Провёл ряд экспериментов. На базе Чапая для чистоты опыта оставил только часовых, которые могут брать деньги за проход. Вхожу на базу, заплатив за проход, и спавню 10 кабанов, которые валят часовых. По истечению определённого времени база должна заспавниться по новой, но этого не происходит. Задействованные файлы: [cut=sgm_respawn] function respawn_main() if dont_has_alife_info("opt_disable_abandoned") then respawn_abandoned() end if has_alife_info("opt_more_monsters") then respawn_monster() end if has_alife_info("pri_zone_cleaning_start") and dont_has_alife_info("pri_zone_cleaning_interrupted") then if find_in_string(read_string("freeplay_config","levels","respawn\\respawn_freeplay.ltx"),level.name()) then respawn_freeplay() end end if r_mod_params("bool","respawn_bases_permition",true) then respawn_base() end end function respawn_abandoned() local level_name=level.name() local hours,minutes,day=level.get_time_hours(),level.get_time_minutes(),level.get_time_days() local ini=ini_file("respawn\\respawn_abandoned.ltx") for k,v in pairs(sgm_flags.table_mod_respawn["respawn_abandoned"]) do if string.sub(level_name,1,3)==string.sub(v,1,3) then local section=v local target_smart=to_string(sgm_functions.check_section_condlist(ini,section,"target_smart","nil")) local place=sgm_functions.check_section_comma(ini,section,"place",nil,5) local section_layers=to_number(sgm_functions.check_section_condlist(ini,section,"section_layers",0)) local cond_bool=to_string(sgm_functions.check_section_condlist(ini,section,"cond","true")) local born_info=to_string(sgm_functions.check_section_condlist(ini,section,"born_info","")) local reload_info=to_string(sgm_functions.check_section_condlist(ini,section,"reload_info","none")) local respawn_radius=to_number(sgm_functions.check_section_condlist(ini,section,"respawn_radius",2)) local time_of_the_day=to_string(sgm_functions.check_section_condlist(ini,section,"time_of_the_day","")) local precond_night=(level.get_time_hours()>=22 or level.get_time_hours()<=6) and time_of_the_day=="night" local precond_day=(level.get_time_hours()>6 and level.get_time_hours()<22) and time_of_the_day=="day" local precond_dist=db.actor:position():distance_to(vector():set(tonumber(place[1]),tonumber(place[2]),tonumber(place[3])))>=145 local precond_smart=(target_smart=="nil" or (target_smart~="nil" and sgm_functions.is_smart_empty(target_smart)==true)) local get_random_sections local sections_params={} if section_layers>0 then get_random_sections=math.random(1,section_layers) else get_random_sections=0 end if section_layers==0 then sections_params.sections=sgm_functions.cfg_get_string(ini,section,"sections","nil") sections_params.sections_tbl=utils.parse_spawns(sections_params.sections) else for m=1,section_layers do sections_params["sections_"..m]=sgm_functions.cfg_get_string(ini,section,"sections_"..m,"nil") sections_params["sections_"..m.."_tbl"]=utils.parse_spawns(sections_params["sections_"..m]) end end if reload_info~="none" and has_alife_info(born_info) and has_alife_info(reload_info) then if time_of_the_day=="night" and (level.get_time_hours()>6 and level.get_time_hours()<22) then disable_info(born_info,reload_info) elseif time_of_the_day=="day" and (level.get_time_hours()>=22 or level.get_time_hours()<=6) then disable_info(born_info,reload_info) end end if exists(sections_params.sections) then if (precond_day or precond_night) and cond_bool=="true" and precond_smart and precond_dist and dont_has_alife_info(born_info) then for q,w in pairs(sections_params.sections_tbl) do for i=1,w.prob do if has_alife_info(w.section.."_death") then disable_info(w.section.."_death") end create(w.section,tonumber(place[1])+math.random(-respawn_radius,respawn_radius),tonumber(place[2]),tonumber(place[3])+math.random(-respawn_radius,respawn_radius),tonumber(place[4]),tonumber(place[5])) end end give_info(born_info) end else if (precond_day or precond_night) and cond_bool=="true" and precond_smart and precond_dist and dont_has_alife_info(born_info) then for q,w in pairs(sections_params["sections_"..get_random_sections.."_tbl"]) do for i=1,w.prob do create(w.section,tonumber(place[1])+math.random(-respawn_radius,respawn_radius),tonumber(place[2]),tonumber(place[3])+math.random(-respawn_radius,respawn_radius),tonumber(place[4]),tonumber(place[5])) end end sgm_functions.check_section_condlist(ini,section,"backup_deaths") give_info(born_info) end end end end end function respawn_freeplay() local level_name=level.name() local hours,minutes=level.get_time_hours(),level.get_time_minutes() local ini=ini_file("respawn\\respawn_freeplay.ltx") for k,v in pairs(sgm_flags.table_mod_respawn["respawn_freeplay"]) do local section=v local place=sgm_functions.check_section_comma(ini,section,"place",nil,5) local spawn_info=to_string(sgm_functions.check_section_condlist(ini,section,"spawn_info","")) local creatures=sgm_functions.cfg_get_string(ini,section,"creatures","") local creatures_table=utils.parse_spawns(creatures) if dont_has_alife_info(spawn_info) then for m,n in pairs(creatures_table) do for i=1,n.prob do create(n.section,tonumber(place[1])+math.random(-8,8),tonumber(place[2]),tonumber(place[3])+math.random(-8,8),tonumber(place[4]),tonumber(place[5])) end end give_info(spawn_info) end end end function respawn_monster() local level_name=level.name() local hours,minutes=level.get_time_hours(),level.get_time_minutes() local ini=ini_file("respawn\\respawn_monster.ltx") for k,v in pairs(sgm_flags.table_mod_respawn["respawn_monster"]) do local section=v local cond_bool=to_string(sgm_functions.check_section_condlist(ini,section,"cond","true")) local reload_info=to_string(sgm_functions.check_section_condlist(ini,section,"reload_info","")) local activate_place=sgm_functions.check_section_comma(ini,section,"activate_place",nil,5) local activate_time=sgm_functions.check_section_comma(ini,section,"activate_time","0,30",2) local monster_layers=to_number(sgm_functions.check_section_condlist(ini,section,"monster_layers",0)) local precond_dist=db.actor:position():distance_to(vector():set(tonumber(activate_place[1]),tonumber(activate_place[2]),tonumber(activate_place[3])))>=145 local precond_time=((level.get_time_hours()==tonumber(activate_time[1]) and level.get_time_minutes()==tonumber(activate_time[2])) or check_difference_missed_time(tonumber(activate_time[1]),tonumber(activate_time[2]),section)) local get_random_sections local sections_params={} if monster_layers>0 then get_random_sections=math.random(1,monster_layers) else get_random_sections=0 end if monster_layers==0 then sections_params.monster_sects=sgm_functions.cfg_get_string(ini,section,"monster_sects","") sections_params.monster_sects_tbl=utils.parse_spawns(sections_params.monster_sects) else for m=1,monster_layers do sections_params["monster_sects_"..m]=sgm_functions.cfg_get_string(ini,section,"monster_sects_"..m,"nil") sections_params["monster_sects_"..m.."_tbl"]=utils.parse_spawns(sections_params["monster_sects_"..m]) end end if hours~=to_number(activate_time[1]) and has_alife_info(reload_info) then disable_info(reload_info) end if exists(sections_params.monster_sects) then if precond_time and cond_bool=="true" and precond_dist and dont_has_alife_info(reload_info) then for m,n in pairs(sections_params.monster_sects_tbl) do if r_mod_params("number","monster_respawn_multiplier",1)==1 then for i=1,n.prob do create(n.section,tonumber(activate_place[1]),tonumber(activate_place[2]),tonumber(activate_place[3]),tonumber(activate_place[4]),tonumber(activate_place[5])) end else for z=1,r_mod_params("number","monster_respawn_multiplier",1) do for i=1,n.prob do create(n.section,tonumber(activate_place[1]),tonumber(activate_place[2]),tonumber(activate_place[3]),tonumber(activate_place[4]),tonumber(activate_place[5])) end end end end use_difference_missed_time(section) give_info(reload_info) end else if precond_time and cond_bool=="true" and precond_dist and dont_has_alife_info(reload_info) then for m,n in pairs(sections_params["monster_sects_"..get_random_sections.."_tbl"]) do if r_mod_params("number","monster_respawn_multiplier",1)==1 then for i=1,n.prob do create(n.section,tonumber(activate_place[1]),tonumber(activate_place[2]),tonumber(activate_place[3]),tonumber(activate_place[4]),tonumber(activate_place[5])) end else for z=1,r_mod_params("number","monster_respawn_multiplier",1) do for i=1,n.prob do create(n.section,tonumber(activate_place[1]),tonumber(activate_place[2]),tonumber(activate_place[3]),tonumber(activate_place[4]),tonumber(activate_place[5])) end end end end use_difference_missed_time(section) give_info(reload_info) end end end end function respawn_base() local hours,minutes=level.get_time_hours(),level.get_time_minutes() local ini=ini_file("respawn\\respawn_base.ltx") for k,v in pairs(sgm_flags.table_mod_respawn["respawn_base"]) do local section=v local cond_bool=to_string(sgm_functions.check_section_condlist(ini,section,"cond","false")) local place=sgm_functions.check_section_comma(ini,section,"place",nil,5) local recoil_time=sgm_functions.check_section_comma(ini,section,"recoil_time","0,10",2) local reload_info=to_string(sgm_functions.check_section_condlist(ini,section,"reload_info","")) local base_members=sgm_functions.cfg_get_string(ini,section,"base_members","") local precond_dist=db.actor:position():distance_to(vector():set(tonumber(place[1]),tonumber(place[2]),tonumber(place[3])))>=145 local members_table=utils.parse_spawns(base_members) if hours~=recoil_time[1] and has_alife_info(reload_info) then disable_info(reload_info) end if cond_bool=="true" and ((hours==tonumber(recoil_time[1]) and minutes==tonumber(recoil_time[2])) or check_difference_missed_time(tonumber(recoil_time[1]),tonumber(recoil_time[2]),section)) and precond_dist and dont_has_alife_info(reload_info) then use_difference_missed_time(section) for m,n in pairs(members_table) do for i=1,n.prob do create(n.section,tonumber(place[1])+math.random(-8,8),tonumber(place[2]),tonumber(place[3])+math.random(-8,8),tonumber(place[4]),tonumber(place[5])) end end sgm_functions.check_section_condlist(ini,section,"recoil_action") give_info(reload_info) end end end[/cut] [cut=respawn_base][zat_bandit_base] place = 360.605,10.844,-126.101,1565127,54 cond = {=zat_bandit_base_defeat} true, false base_members = zat_bandit_base_bodyguard_1,zat_bandit_base_bodyguard_2,zat_bandit_base_bodyguard_3,zat_bandit_base_bodyguard_4,zat_bandit_base_south_chief, zat_bandit_base_west_chief,zat_bandit_base_guard_1,zat_bandit_base_guard_2,zat_bandit_base_guard_3,zat_bandit_base_guard_4,zat_bandit_base_g uard_5,zat_bandit_base_guard_6,zat_bandit_base_guard_7,zat_bandit_base_guard_8,zat_bandit_base_guard_9,zat_bandit_base_guard_10,zat_bandit_b ase_guard_11,zat_bandit_base_guard_12,zat_bandit_base_sniper_1,zat_bandit_base_sniper_2 recoil_action = %=recoil_zat_bandit_base% recoil_time = 2,30 reload_info = zat_bandit_base_repack[/cut]
[cut=xr_conditions]function zat_bandit_base_defeat(actor,npc) return has_alife_info("zat_bandit_base_west_chief_death") and has_alife_info("zat_bandit_base_south_chief_death") end[/cut] [cut=xr_effects]function recoil_zat_bandit_base(actor,npc) disable_several_info("zat_bandit_base_bodyguard_","_death",1,4) disable_several_info("zat_bandit_base_guard_","_death",1,12) disable_several_info("zat_bandit_base_sniper_","_death",1,2) disable_info("zat_bandit_base_west_chief_death") disable_info("zat_bandit_base_south_chief_death") end[/cut] При удалении от базы на 150 метров и по истечению определённого времени база должна отреспиться. Бегал к Лесопилке, спал не Скадовске неделю, уходил на Юпитер. Результат нулевой. Что нужно, чтобы функция заработала?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 16.09.2013, 15:38 | Сообщение # 658 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата (sergej5500) Мне почему то кажется, что эта фишка не работает. Работает! Для респавна: должны быть мертвы охранники на воротах, все четыре телохранителя Чапая, сам Чапай жив и не начат квест по захвату базы бандитов. Респавн происходит в 2 часа 30 мин, но точка респавна находиться не на базе почему-то. Единственное, что не работает (или я не правильно проверял) респавн не происходит при промотке времени (например сном).
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
NIV | Дата: Пт, 20.09.2013, 11:15 | Сообщение # 659 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Здравствуйте! Подтвердите или опровергните мои наблюдения по поводу добавления объектов нового класса в all.spawn.
Описываем новый предмет 'quest_ring' в quest_items.ltx: [quest_ring]:device_pda, и т.д. Добавляем его секцию в all.spawn. Пробуем собрать командой Код universal_acdc.pl -compile unpack -out new_all.spawn -idx -scan configs/ , где configs - папка с файлами из мода. Естественно, компиллятор говорит, что не знает класса 'quest_ring'. Как писал denis2000, дописываем в файл scan.pm строку Код 'quest_ring' => 'S_PDA' После этого all.spawn собирается. Самое интересное: приводим scan.pm к первоначальному виду, а all.spawn всё равно разбирается и собирается. Смотрим, и видим, что в файл sections.ini дописано Код 'quest_ring' = cse_alife_item_pda Вопросы: 1) Возможно это следовало сразу дописать в sections.ini и не мучаться? 2) Может ли быть так, что при разборке all.spawn компиллятор может читать классы из configs\misc\quest_items.ltx, а при сборке - нет? Или действительно у меня он глючный?Добавлено (20.09.2013, 11:15) --------------------------------------------- Здравствуйте! Спрошу: Как отпустить НПС в симуляцию? Ведь на смарте прописана для него работа.
Писал в simulation_objects_props.ltx Код [сквад]:default_squad sim_avail = {+инфо} true, false И не понял - то ли НПС порывается уйти, натыкается на препятствие и стоит. То ли не уходит в симуляцию.
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 20.09.2013, 11:30 | Сообщение # 660 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| NIV, Чтобы отпустить НПС в симуляцию, нужно настраивать параметр target_smart в секции сквада. Пример: сквад Петрухи и Шила zat_b53_artefact_hunter_1_squad. Строка target_smart = {-zat_b53_go_nil} zat_b53, nil. До получения инфопорции сквад выполняет работу на смарте zat_b53. Потом отправляется гулять по локации.
В секции [сквад]:default_squad sim_avail = {+инфо} true, false прописывается разрешение спавнить сквад при наличии определённой инфопорции.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
|