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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
denis2000Дата: Ср, 08.05.2013, 21:25 | Сообщение # 391
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

yakuti, А как-же насчет того что вы сделали респавн сквада?

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Ср, 08.05.2013, 21:27 | Сообщение # 392
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

yakuti, значит, у тебя есть сквад dar_comanda. По какой инфопорции он должен спавнится? В твоих кодах я инфопорции не вижу. Более того, давай внимательно глянем на этот код:
Код
[smart_terrain]   
squad_id = 1   
max_population = 1   
respawn_params = respawn@dar_smart_terrain_1   

[respawn@dar_smart_terrain_1]   
spawn_army@novice   

[spawn_army@novice]   
spawn_squads = dar_comanda   
spawn_num = 1   

[exclusive]   
dar_comanda1 = dar\dar_comanda.ltx   
dar_comanda2 = dar\dar_comanda.ltx   
dar_comanda3 = dar\dar_comanda.ltx   
dar_comanda4 = dar\dar_comanda.ltx   
dar_comanda5 = dar\dar_comanda.ltx   
dar_com_cap = dar\dar_comanda.ltx

А точнее на
Код
[spawn_army@novice]   
spawn_squads = dar_comanda   
spawn_num = 1

Если в spawn_num просто стоит число 1, это означает, что сквад будет респавнится в единичном количестве без любых инфопорций. Если ты хочешь, чтоб сквад респавнился после определенной инфы, надо прописать так:
Код
spawn_num = {+твоя_инфопорция} 1, 0





Сообщение отредактировал FantomICW - Ср, 08.05.2013, 21:28
 
yakutiДата: Ср, 08.05.2013, 21:36 | Сообщение # 393
Отмычка
Пользователи
Сообщений: 46
Награды: 0
Репутация: [ 7 ]

нет. Я по другому сделал. Через отдельный рестриктор
[logic]
active = sr_idle@start

[sr_idle@start]
on_info1 = {+polkovnik_info1 -squadist13} %=create_squad(dar_comanda:dar_comanda_terrain) +squadist13%

Добавлено (08.05.2013, 21:36)
---------------------------------------------

Цитата (FantomICW)
spawn_num = {+твоя_инфопорция} 1, 0

Не работает. Сквад просто не респавнится
 
FantomICWДата: Ср, 08.05.2013, 21:51 | Сообщение # 394
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

yakuti,
1) проверь, что выдается правильно сама инфопорция, проверь правильность написания инфопорции во всех файлах, где она используется
2) временно закомментируй все эксклюзивы

Добавлено (08.05.2013, 21:51)
---------------------------------------------
kvant, зайди на Stalker Inside Wiki в раздел "Руководства к программам". Там статья





Сообщение отредактировал FantomICW - Ср, 08.05.2013, 21:55
 
yakutiДата: Вс, 12.05.2013, 23:00 | Сообщение # 395
Отмычка
Пользователи
Сообщений: 46
Награды: 0
Репутация: [ 7 ]

Заработало когда я сразу два условия поставил (через рестриктор и через логику самого сквада)

Добавлено (12.05.2013, 23:00)
---------------------------------------------
Можно вопрос: как заспавнить level changer после выдачи инфопоршня (ЗП)

 
denis2000Дата: Вс, 12.05.2013, 23:44 | Сообщение # 396
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

yakuti, Вообще для спавна level changer используют такую функцию:
[cut=Для ТЧ]
Код
function create_level_changer(
       p_story_id,    -- STORY_ID нового level_changer (понадобится нам позже)
       p_position,    -- вектор, координаты точки, в которой будет располагаться центр нового level_changer
       p_lvertex_id,    -- level_vertext_id  - идентифицируют уровень, на котором будет создан level_changer
       p_gvertex_id,    -- game_vertext_id          

       p_dest_lv,    -- level_vertex_id   - идентифицируют уровень, на который level_changer будет перебрасывать игрока    
       p_dest_gv,    -- game_vertex_id
       p_dest_pos,    -- координаты точки, в которой на новом уровне окажется игрок
       p_dest_dir,    -- направрение взгляда игрока
       p_dest_level,    -- название уровня, например "L11_Pripyat"
       p_silent    -- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход)
)
       local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)

       level.map_add_object_spot(obj.id, "level_changer", "")

       local packet = net_packet()
       obj:STATE_Write(packet)

       -- свойства cse_alife_object
       local game_vertex_id             = packet:r_u16()
       local cse_alife_object__unk1_f32     = packet:r_float()
       local cse_alife_object__unk2_u32     = packet:r_u32()
       local level_vertex_id             = packet:r_u32()
       local object_flags             = packet:r_u32()
       local custom_data             = packet:r_stringZ()
       local story_id                 = packet:r_u32()
       local spawn_story_id            = packet:r_u32()

       -- свойства cse_shape
       local shape_count             = packet:r_u8()
       for i=1,shape_count do
           local shape_type         = packet:r_u8()
           if shape_type == 0 then
               -- sphere
               local center         = packet:r_vec3()
               local radius         = packet:r_float()
           else
               -- box
               local axis_x_x = packet:r_float()
               local axis_x_y = packet:r_float()
               local axis_x_z = packet:r_float()
               local axis_y_x = packet:r_float()
               local axis_y_y = packet:r_float()
               local axis_y_z = packet:r_float()
               local axis_z_x = packet:r_float()
               local axis_z_y = packet:r_float()
               local axis_z_z = packet:r_float()
               local offset_x = packet:r_float()
               local offset_y = packet:r_float()
               local offset_z = packet:r_float()
           end
       end

       -- свойства cse_alife_space_restrictor
       local restrictor_type             = packet:r_u8()

       -- свойства cse_level_changer
       local dest_game_vertex_id        = packet:r_u16()     
       local dest_level_vertex_id         = packet:r_u32()     
       local dest_position             = packet:r_vec3()
       local dest_direction             = packet:r_vec3()
       local dest_level_name             = packet:r_stringZ()
       local dest_graph_point             = packet:r_stringZ()
       local silent_mode             = packet:r_u8()

       packet:w_begin(game_vertex_id)            -- game_vertex_id
       packet:w_float(cse_alife_object__unk1_f32)
       packet:w_u32(cse_alife_object__unk2_u32)    
       packet:w_u32(level_vertex_id)            -- level_vertex_id
       packet:w_u32( bit_not(193) )            -- object_flags = -193 = 0xFFFFFF3E
       packet:w_stringZ(custom_data)
       packet:w_u32(p_story_id)            -- story_id
       packet:w_u32(spawn_story_id)

       packet:w_u8(1)            -- количество фигур
--        packet:w_u8(0)            -- тип фигуры: сфера
--        packet:w_vec3(vector():set(0, 0, 0))  -- sphere_center
--        packet:w_float(3.0)
       packet:w_u8(1)            -- тип фигуры: box
       packet:w_float(2)       -- axis_x_x
       packet:w_float(0)       -- axis_x_y
       packet:w_float(0)       -- axis_x_z
       packet:w_float(0)       -- axis_y_x
       packet:w_float(4)       -- axis_y_y
       packet:w_float(0)       -- axis_y_z
       packet:w_float(0)       -- axis_z_x
       packet:w_float(0)       -- axis_z_y
       packet:w_float(4)       -- axis_z_z
       packet:w_float(0)       -- offset_x
       packet:w_float(0)       -- offset_y
       packet:w_float(0)          -- offset_z

       packet:w_u8(3)            -- restrictor_type

       packet:w_u16(p_dest_gv)            -- destination game_vertex_id
       packet:w_s32(p_dest_lv)            -- destination level_vertex_id
       packet:w_vec3(p_dest_pos)        -- destination position
       packet:w_vec3(p_dest_dir)        -- destination direction (направление взгляда)
       packet:w_stringZ(p_dest_level)        -- destination level name
       packet:w_stringZ("start_actor_02")    -- some string, always const
       packet:w_u8(p_silent)            -- 1 for silent level changing

       packet:r_seek(0)
       obj:STATE_Read(packet, packet:w_tell())
level.add_pp_effector ("teleport.ppe", 2006, false)

end
[/cut]

Но я бы поступал иначе:
1. Создал в all.spawn необходимый level changer на участке локации не доступном для ГГ
2. Создал рестриктор с логикой телепорта ГГ прямиком в созданный в первом пункте level changer
3. Логика рестриктора может быть достаточно сложной в том числе и реакция на определенную инфопорцию.
К стати так поступил и создатель SGM, а до него команда разработчиков оригинальной игры

Вон тебе ниже конкретный пример рестриктора, только он специфический СГМ-овский.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Вс, 12.05.2013, 23:46 | Сообщение # 397
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

yakuti, не знаю. Но в СГМ есть фишка с переходом Кордон-Болота. Вот его логика
Код
[logic]
active = sr_universal

[sr_universal]
scheme_type = level_change_zone
level_change_cond         = {+esc_key_from_gate_founded} true, false
level_change_on_use       = %+level_change_to_marsh_from_escape%
level_change_travel_coord = 15.017832756042,19.779502868652,712.16851806641
level_change_throw_coord  = 18.188539505005,16.269477844238,676.32806396484,3.187,esc_key_from_gate_needed
level_change_travel_time  = 2,30
level_change_spot         = level_change_up_location,st_level_change_to_marsh,false
level_change_autosave     = st_save_travel_escape_to_marsh
level_change_silent_travel = false
level_change_hidden_mode  = {+esc_uncoupling_halt_searched} false, true
level_change_message_impossible = st_level_change_zone_ok_need_key_text

Строка
Код
level_change_cond         = {+esc_key_from_gate_founded} true, false

означает, что level_changer не будет работать без инфы о взятом ключе.
Может, как-то так реализовать...





Сообщение отредактировал FantomICW - Вс, 12.05.2013, 23:47
 
divisorДата: Пн, 13.05.2013, 02:40 | Сообщение # 398
Удаленные



Привет всем! Можете подсказать где можно отредактировать звания которые получаешь в сталкере зов припяти, точнее в каком файле находятся эти звания например я хочу отредактировать звание Друг Долга где можно это найти? это случайно не файл xr_statistic надо править?

Сообщение отредактировал divisor - Пн, 13.05.2013, 03:24
 
denis2000Дата: Пн, 13.05.2013, 18:54 | Сообщение # 399
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

divisor, Названия в st_achievement.xml

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
yakutiДата: Чт, 16.05.2013, 17:53 | Сообщение # 400
Отмычка
Пользователи
Сообщений: 46
Награды: 0
Репутация: [ 7 ]

Как выдать инфопоршень после уничтожения вертушки (ЗП)?

Добавлено (16.05.2013, 17:53)
---------------------------------------------
Как выдать инфо при обыске трупа

 
makdmДата: Чт, 16.05.2013, 18:45 | Сообщение # 401
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

yakuti, например так. В логике рестриктора пишите:

on_info = { =is_dead(STORY_ID_вертушки) -ПОРШЕНЬ } %+ПОРШЕНЬ%


Терпение......
И все получится!


Сообщение отредактировал makdm - Чт, 16.05.2013, 18:45
 
yakutiДата: Чт, 16.05.2013, 19:54 | Сообщение # 402
Отмычка
Пользователи
Сообщений: 46
Награды: 0
Репутация: [ 7 ]

Все работает, спасибо.
Другой вопрос: почему мой вертолет не до конца подчиняется логике
[cut]
[logic]
active = sr_idle

[sr_idle]
heli_move@patr_start_again

[heli_move@start_hunts]
engine_sound = true
path_move = dar_heli_hunter
max_velocity = 100
show_health = false
enemy = actor
rocket_delay = 3000
path_look = der_heli_look

[heli_move@patr_start_again]
path_look = zat_heli_end
engine_sound = false
max_velocity = 100
path_move = dar_heli_end
show_health = false
mute = false
on_info = {+dar_borov_talking -death_dar_heli} heli_move@start_hunts

[death]
show_health = false

[dar_heli_end]
points = p0
p0:name = wp00
p0:position = -233.73666381836,42.415229797363,-92.915390014648
p0:game_vertex_id = 712
p0:level_vertex_id = 37

[dar_heli_hunter]
points = p0,p1,p2
p0:name = wp00
p0:position = -233.73666381836,42.415229797363,-92.915390014648
p0:game_vertex_id = 712
p0:level_vertex_id = 37
p0:links = p1(1)

p1:name = wp01
p1:position = 61.859592437744,40.612442016602,-45.607154846191
p1:game_vertex_id = 760
p1:level_vertex_id = 247940
p1:links = p2(1)

p2:name = wp02
p2:position = 61.859592437744,40.612442016602,-45.607154846191
p2:game_vertex_id = 760
p2:level_vertex_id = 247940
p2:links = p0(1)

[der_heli_look]
points = p0
p0:name = wp00
p0:position = 51.8384017944336,0.0627550035715103,-93.7323455810547
p0:game_vertex_id = 780
p0:level_vertex_id = 237349[/cut]

После выдачи dar_borov_talking актору, верт должен переходить к секции логики start_hunts, но почему-то он летит в заданную точку
 
coomer330Дата: Чт, 16.05.2013, 20:01 | Сообщение # 403
Гражданский
Пользователи
Сообщений: 15
Награды: 0
Репутация: [ 0 ]

Всем привет, простите, ежели не в тему, в другой ветке не ответили.
Подскажите, как изменить набор вещей для тайников монолита на Затоне, хочу сделать их пожирнее? Я так понимаю, что проверка состояния оружия в тайниках только через скрипт ??

Так...
Файлы нашел, разбираюсь. А как прописать, скажем, несколько одинаковых предметов, а не по-одному ?


Без свадьбы только мухи женятся

Сообщение отредактировал coomer330 - Чт, 16.05.2013, 22:14
 
sergej5500Дата: Чт, 16.05.2013, 20:23 | Сообщение # 404
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

coomer330,
За наполнение тайников Монолита отвечает файл sgm_callbacks в gamedata\scripts. Секции типа if find_in_string(box:section(),"pri_monolith_taynik_1"). В коде
get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x")))
прописан набор предметов для закрытия тайника. Текстовое описание квеста в файле gamedata\configs\text\rus\SGM_tasks.
 
denis2000Дата: Чт, 16.05.2013, 21:58 | Сообщение # 405
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (yakuti)
почему мой вертолет не до конца подчиняется логике

Потому, что у вас логика начинается секциями для спейсрестриктора, а заканчивается секциями для вертолета. А как вы понимаете, надеюсь, рестриктор не может неожиданно стать вертолетом!


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Поиск: