Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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Дата: Вт, 25.06.2013, 20:52 | Сообщение # 466
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (NIV)
Визуалы из этой папки почему-то не видно (получается невидимый ящик)

Поздравляю вы открыли невероятную загадку Зоны biggrin
На самом деле все верно, ящики визуально нарисованы в SDK статическими объектами, а спавняться невидимые объекты с физическими свойствами. Поэтому визуально нычка может быть чем угодно и располагаться в любом удобном разработчику месте.


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

NIV,
Дело в ogf-модели inventory_box. Несколько моделей сделано невидимыми. Разработчики, видимо, совмещали невидимую модель с различными объектами на локации. Например, металлический сундук рядом с вертолетом возле ВНЗ Круг. Невидимую модель inventory_box наложили на него. Надпись "Обыскать ящик" появляется при наведении именно на невидимую модель. Тут есть один нюанс. Невидимая модель должна хотя бы с одной стороны "вылезать" из объекта, в котором "спрятана", иначе инвентарный ящик не сработает. Это можно использовать в разных целях. Например, в СГМ ящики механиков "бесплотные". ГГ через них проходит насквозь. Чтобы исправить этот глюк, можно сделать так. В all.spawn делаем привязанный к локации объект с визуалом сейфа.
[cut=секция][10000008]

; cse_abstract properties
section_name = physic_object
name = zat_mechanic_box_object
position = 104.25, -3.92499995231628, 183.649993896484
direction = 0, 1.57079601287842, 0
version = 128
script_version = 12

; cse_alife_object properties
game_vertex_id = 316
distance = 0
level_vertex_id = 1146041
object_flags = 0xffffff3a

; cse_visual properties
visual_name = dynamics\devices\dev_secret_boxs\secret_seif

; cse_ph_skeleton properties
skeleton_flags = 1

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = bone01

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;[/cut]
Объект получается твёрдым и непроницаемым. Секции бокса Кардана редактируем так.
[cut=Бокс Кардана]Строка спавна
create("zat_mechanic_box",104.25,-3.925,183.49,1146041,316)
Секция бокса
[zat_mechanic_box]:default_seif
custom_data = scripts\SGM\zaton\inventory_boxs\zat_mechanic_box.ltx
visual = dynamics\equipment_cache\equipment_box_02_case[/cut]
Бокс Кардана на 15 см смещён относительно твёрдого объекта, прописанного в all.spawn. Невидимая модель выходит за пределы непроницаемого объекта и бокс нормально работает. Таким образом инвентарные ящики можно размещать где угодно и совмещать с любыми предметами.
 
FantomICWДата: Ср, 26.06.2013, 10:45 | Сообщение # 468
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Здравствуйте!
Не подскажете, как проверить нахождение НПС в точке рестриктора?



 
yakutiДата: Ср, 26.06.2013, 11:25 | Сообщение # 469
Отмычка
Пользователи
Сообщений: 46
Награды: 0
Репутация: [ 7 ]

Работает ли схема heli_hunter в ЗП?

Добавлено (26.06.2013, 11:25)
---------------------------------------------

Цитата (FantomICW)
Здравствуйте!
Не подскажете, как проверить нахождение НПС в точке рестриктора?

В тч работало, насчет ЗП сказать не могу
[logic]
active = sr_idle

[sr_idle]
on_npc_in_zone = 19223123 |gerda_restr|nil %+trup_in_restr%

19223123 - сид нпс
 
sergej5500Дата: Ср, 26.06.2013, 11:27 | Сообщение # 470
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

FantomICW,
В оригинале ЗП это сделано так:
on_actor_in_zone = zat_b42_warning_space_restrictor | {-zat_b42_controller_warning_1_sound -zat_b42_controller_dead} %+zat_b42_controller_warning_1_sound =play_sound(zat_b42_controller_warning_1)%
При попадании ГГ в зону рестриктора выдаётся инфопорция и контролер говорит свою фразу.
Секция рестриктора включает в себя границы зоны действия.
[cut=zat_b42_warning_space_restrictor][208]

; cse_abstract properties
section_name = space_restrictor
name = zat_b42_warning_space_restrictor
position = 34.4459342956543, 4.17600011825562, 367.441070556641
direction = 0.00979799963533878, -0.584761023521423, -0.0352459996938705
version = 128
script_version = 12

; cse_alife_object properties
game_vertex_id = 0
distance = 0
level_vertex_id = 293223
object_flags = 0xffffff3e
custom_data = <<END
[logic]
cfg = scripts\zaton\zat_b42_logic.ltx
END

; cse_shape properties
shapes = shape0
shape0:type = box
shape0:axis_x = 44.6448020935059,0,0
shape0:axis_y = 0,9.31059646606445,0
shape0:axis_z = 0,0,32.1383895874023
shape0:offset = 0,0,0

; cse_alife_space_restrictor properties
restrictor_type = 0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;[/cut]
 
denis2000Дата: Ср, 26.06.2013, 12:12 | Сообщение # 471
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (yakuti)
В тч работало, насчет ЗП сказать не могу

И в ЗП эта схема так-же работает:
on_npc_in_zone = <Стори-ид НПС> |<Имя рестриктора>|<Имя секции для перехода> %действия%

Цитата (yakuti)
Работает ли схема heli_hunter в ЗП?

Да скрипт присутствует и зарегистрирован. Не факт что работает также как и в ТЧ, поэтому изучайте скрипт.


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

Не подскажите с чем могут быть связаны подобные стабильные вылеты? Происходят при убийстве зомби
FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : e:\strelok200\gamedata\scripts\db.script:38: table index is nil
 
makdmДата: Пт, 28.06.2013, 12:12 | Сообщение # 473
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

yakuti, смотрите фвйл xr_motivator.script

В методе net_spawn идёт помещение объекта в таблицу.

А в методе net_destroy идёт удаление объекта из таблицы.

Условия помещения в таблицу и условия удаления из таблицы должны быть идентичны.

У вас получается, что помещаете в таблицу один объект, а удалить пытаетесь другой, которого нет в таблице. Отсюда вылет.


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


Сообщение отредактировал makdm - Пт, 28.06.2013, 12:15
 
yakutiДата: Ср, 03.07.2013, 17:28 | Сообщение # 474
Отмычка
Пользователи
Сообщений: 46
Награды: 0
Репутация: [ 7 ]

Приветствую, такой вопрос: создал личный ящик ГГ. Как прописать отметку на карте как в оригинале?
 
sergej5500Дата: Ср, 03.07.2013, 18:02 | Сообщение # 475
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

yakuti,
У оригинальных личных ящиков в секции в all.spawn прописан код:
[level_spot]
actor_box

Вероятно, он отвечает за метку.
 
yakutiДата: Ср, 10.07.2013, 16:17 | Сообщение # 476
Отмычка
Пользователи
Сообщений: 46
Награды: 0
Репутация: [ 7 ]

Что может означать этот вылет?
FATAL ERROR

[error]Expression : error handler is invoked!
[error]Function : handler_base
[error]File : D:\prog_repository\sources\trunk\xrCore\xrDebugNew.cpp
[error]Line : 764
[error]Description : pure virtual function call


stack trace:

Создавал level_changer, телепортировал на него ГГ и получил этот странный вылет

Добавлено (10.07.2013, 16:17)
---------------------------------------------
Вылет не стабильный

 
sniper777Дата: Чт, 11.07.2013, 15:32 | Сообщение # 477
Мастер
Пользователи
Сообщений: 598
Награды: 3
Репутация: [ 49 ]

Как сделать так, чтобы в прачечной(Припять) спавнились сталкеры с начала игры, а не после фриплея?


[cut=тл][/cut]
 
makdmДата: Чт, 11.07.2013, 18:30 | Сообщение # 478
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sniper777, отредактировать файл gamedata\configs\scripts\pripyat\smart\pri_a15.ltx
Сталкеры спавнятся по условию выдачи инфопоршион pri_a28_actor_in_zone_stay, т.е. если ГГ остался в Зоне.

Уберите условие и Сталкеры будут спавниться сразу.

Вместо

spawn_num = {+pri_a28_actor_in_zone_stay} 2, 0

пропишите

spawn_num = 2


Терпение......
И все получится!
 
sniper777Дата: Чт, 11.07.2013, 19:57 | Сообщение # 479
Мастер
Пользователи
Сообщений: 598
Награды: 3
Репутация: [ 49 ]

Все сделал, но военные остались на месте, а из сталкеров там появился только бродяга.
Дело вот в чем, я создал телепорт из янова в припять, все работает отлично, только гг переносится не на заданные координаты, а в прачечную и начинается диалог с Ковальским, я хотел таким образом устраннить данную проблему, что можно сделать?



[cut=тл][/cut]
 
sergej5500Дата: Чт, 11.07.2013, 21:00 | Сообщение # 480
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

sniper777,
Полагаю, что действует ограничение на кол-во сквадов. Прачечную занимают военные, и "вакансии" для сквадов заняты. Попробуй увеличить параметр max_population в файле gamedata\configs\scripts\pripyat\smart\pri_a16. По умолчанию он равен 3. Сделай его равным 6 или 7, например.
 
Поиск: