Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Спавн и логика
denis2000Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Спавн и логика

Создание объектов на локации и логика поведения этих объектов

Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Вс, 08.09.2013, 23:34 | Сообщение # 646
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый Вечер. Интересует следующий вопрос. Через рестриктор нужно вызвать эффект опьянения ГГ. Какой функцией можно воспользоваться для этой цели?
 
makdmДата: Пн, 09.09.2013, 00:19 | Сообщение # 647
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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
 
Volk66Дата: Пн, 09.09.2013, 19:04 | Сообщение # 648
Отмычка
Пользователи
Сообщений: 34
Награды: 0
Репутация: [ -24 ]

а как заспавнить НПС на новых локациях?
 
FantomICWДата: Пн, 09.09.2013, 19:07 | Сообщение # 649
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Volk66, читаем уроки КМБ.


 
Volk66Дата: Пн, 09.09.2013, 19:12 | Сообщение # 650
Отмычка
Пользователи
Сообщений: 34
Награды: 0
Репутация: [ -24 ]

FantomICW, А как мутантов заспавнить? Да и как координаты вычеслить?
 
strelok200Дата: Пн, 09.09.2013, 19:20 | Сообщение # 651
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Цитата (Volk66)
FantomICW, А как мутантов заспавнить? Да и как координаты вычеслить?

Такое в сдк желательно проделывать, если по глобальному заселяешь.

Добавлено (09.09.2013, 19:20)
---------------------------------------------

Цитата (Volk66)
а как заспавнить НПС на новых локациях?

смотрим уроки по СДК
 
Volk66Дата: Пн, 09.09.2013, 19:21 | Сообщение # 652
Отмычка
Пользователи
Сообщений: 34
Награды: 0
Репутация: [ -24 ]

strelok200, я в нём не умею работать
 
strelok200Дата: Пн, 09.09.2013, 19:23 | Сообщение # 653
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Обязательно надо научиться. Тем более если ты работаешь
Цитата (Volk66)
на новых локациях

Посмотри уроки от Андрея Непряхина
 
Volk66Дата: Пн, 09.09.2013, 19:25 | Сообщение # 654
Отмычка
Пользователи
Сообщений: 34
Награды: 0
Репутация: [ -24 ]

strelok200, да у меня на это времени нету. Я занят. Времени хватает только на добавление от 1 до 3 новых локаций.
 
FantomICWДата: Пн, 09.09.2013, 19:46 | Сообщение # 655
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

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
 
makdmДата: Пн, 09.09.2013, 20:00 | Сообщение # 656
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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
 
sergej5500Дата: Вс, 15.09.2013, 19:03 | Сообщение # 657
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый День. Заинтересовал такой вопрос. В СГМ есть базы наёмников, бандитов, Рассвета и Монолита. Предусмотрена опция 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 метров и по истечению определённого времени база должна отреспиться. Бегал к Лесопилке, спал не Скадовске неделю, уходил на Юпитер. Результат нулевой. Что нужно, чтобы функция заработала?
 
denis2000Дата: Пн, 16.09.2013, 15:38 | Сообщение # 658
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (sergej5500)
Мне почему то кажется, что эта фишка не работает.

Работает! Для респавна: должны быть мертвы охранники на воротах, все четыре телохранителя Чапая, сам Чапай жив и не начат квест по захвату базы бандитов.
Респавн происходит в 2 часа 30 мин, но точка респавна находиться не на базе почему-то.
Единственное, что не работает (или я не правильно проверял) респавн не происходит при промотке времени (например сном).


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Пт, 20.09.2013, 11:15 | Сообщение # 659
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Здравствуйте! Подтвердите или опровергните мои наблюдения по поводу добавления объектов нового класса в 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"
 
sergej5500Дата: Пт, 20.09.2013, 11:30 | Сообщение # 660
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

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
прописывается разрешение спавнить сквад при наличии определённой инфопорции.
 
Поиск: