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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Вт, 26.11.2013, 15:55 | Сообщение # 706
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Один или 2 остаются на огневом рубеже, оружие на изготовку и кричат "Быть наготове"

sergej5500, используйте оверрайд post_combat_time

Пропишите, если это работа на смарте, то в логику работы, а если это логика НПС, то в активную схему.

post_combat_time = 0,0

После этого, action_post_combat_wait не будет работать и НПС сразу после боя начнут выполнять работу, прописанную в логике.


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


Сообщение отредактировал makdm - Вт, 26.11.2013, 16:03
 
АзазельДата: Вт, 26.11.2013, 23:43 | Сообщение # 707
Новичок
Пользователи
Сообщений: 77
Награды: 0
Репутация: [ 0 ]

Всем здрасте. Снова я и снова с тупым вопросом biggrin А что поделать. Другие сами решаются.
В косяк в чн. Сменил логику Каланче. Вместо смарт ковера. Поставил обычный валкер. (не знаю почему но отчаянно гробится meet логика. Именно та часть что отвечает за поворот на актора) И нпс спавнится. Все отлично. Вот только стоит этот чудак в углу рядом с той точкой что должен стоять. (оригинал, координаты не менял как и спавн) При этом к актору он не поворачивается. Но! Если с разбегу в него втемяшиться. Или попрыгать по предметам забрашись тем самым в этот угол. Одним словом попробовать сдвинуть нпс. Он просыпается и встает в точку пребывания. И реагирует на актора и все дела. Данный баг был и в зп. Не всегда. Но подезреваю что связан он с тем что НПС. Не может нормально повернутся в аи сетке.. Бред конечно. Но баг действительно возникает в таких проблематичных местах.
Вопрос по сей лекции: а исправить то как ?
 
makdmДата: Ср, 27.11.2013, 13:37 | Сообщение # 708
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата Азазель ()
оригинал, координаты не менял как и спавн


Азазель, это и есть ответ на Ваш вопрос.

В Вашем случае для поворота НПС относительно оси Y, необходимо установить path_look.
Но и этого мало. Точки path_walk и path_look, должны быть связаны флагом.
Так что, разбирайте all.spawn и приводите всё в соответствие.
Также немного нужно переделать секцию [meet], чтобы НПС поворачивался в сторону ГГ, при диалоге с ним.

Если нет желания ковырять all.spawn, тогда используйте переход с walker на схему remark при приближении ГГ к НПС.


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


Сообщение отредактировал makdm - Ср, 27.11.2013, 14:03
 
FantomICWДата: Ср, 27.11.2013, 17:13 | Сообщение # 709
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Азазель, как сказал makdm, или через ремарк, или через meet. Дополнлишь, что для meet можно использовать следующее:
Код
victim = расстояние_в_цифрах | actor
close_victim  = actor  ;В зависимости от параметра close_distance
far_victim   = actor  ;В зависимости от far_distance

По умолчанию close_distance - 3, far_distance - 5.
Для remark:
Код
target = story | actor





Сообщение отредактировал FantomICW - Ср, 27.11.2013, 17:13
 
АзазельДата: Ср, 27.11.2013, 20:02 | Сообщение # 710
Новичок
Пользователи
Сообщений: 77
Награды: 0
Репутация: [ 0 ]

FantomICW, Ну я конечно слаб в логике но не настолько. Логика meet данная еще у пыс есть. Не то что у меня. А суть проблемы именно в застревании нпса. Данный баг часто встречал если нпсу надо встать рядом со стеной. Он останавливался лицом к стене и не реагировал пока в него со всей дури не втемяшишься.
 
NIVДата: Сб, 30.11.2013, 20:25 | Сообщение # 711
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Подскажите, пожалуйста, как заспанить оружие с установленными апгрейтами?

В файле w_toz34.ltx дописал новый ствол:

Код
[wpn_toz34_kardan]:wpn_toz34
$spawn                      = "weapons\wpn_toz34_kardan"
description             = st_wpn_sig550_strelok_descr
inv_name                = st_wpn_sig550_strelok

upgrades                = up_gr_firstab_toz34, up_gr_firstcd_toz34, up_gr_firstef_toz34, up_gr_seconab_toz34, up_gr_seconcd_toz34, up_gr_thirdab_toz34, up_gr_thirdcd_toz34, up_gr_thirdef_toz34
installed_upgrades      = up_firsta_toz34, up_firstc_toz34, up_seconc_toz34, up_thirda_toz34, up_thirdc_toz34
upgrade_scheme          = upgrade_scheme_toz34


Оружие спанится через all.spawn в ящике. Текстовое описание оружия соответствует st_wpn_sig550_strelok_descr, но само оружие апгрейтов не имеет, и дерево апгрейтов для него не открывается. Что нужно исправить?


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Сб, 30.11.2013, 20:39
 
denis2000Дата: Сб, 30.11.2013, 21:46 | Сообщение # 712
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

NIV, В файл inventory_upgrades.ltx добавляли ствол?

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

Доброй ночи. Такой вопрос. Каким образом на тайники Стрелка вешаются метки тайников?

Пытался сделать метку на "персональный" рюкзак в чистом ЗП. Мои правки.

[cut=Рестриктор спавна рюкзака.][logic]
active = sr_idle@start

[sr_idle@start]
on_info = {=zat_1001_test_dist -zat_1001_test_spawn} sr_idle@spot %+zat_1001_test_spawn =zat_1001_test_spawn%

[sr_idle@spot]
on_info = {-zat_1001_test_spot} sr_idle@nil %+zat_1001_test_spot =give_treasure(personal_inventory_box_1_mapspot)%

[sr_idle@nil]
[/cut]

[cut=секрет Затон][list_zaton]
personal_inventory_box_1_mapspot

zat_hiding_place_1
zat_hiding_place_2
zat_hiding_place_3
zat_hiding_place_4
zat_hiding_place_5
zat_hiding_place_6
zat_hiding_place_7
zat_hiding_place_8
zat_hiding_place_9
zat_hiding_place_10
zat_hiding_place_11
zat_hiding_place_12
zat_hiding_place_13
zat_hiding_place_14
zat_hiding_place_15
zat_hiding_place_16
zat_hiding_place_17
zat_hiding_place_18
zat_hiding_place_19
zat_hiding_place_20
zat_hiding_place_21
zat_hiding_place_22
zat_hiding_place_23
zat_hiding_place_24
zat_hiding_place_25
zat_hiding_place_26
zat_hiding_place_27
zat_hiding_place_28
zat_hiding_place_29
zat_hiding_place_30
zat_hiding_place_31
zat_hiding_place_32
zat_hiding_place_33
zat_hiding_place_34
zat_hiding_place_35
zat_hiding_place_36
zat_hiding_place_37
zat_hiding_place_38
zat_hiding_place_39
zat_hiding_place_40
zat_hiding_place_41
zat_hiding_place_42
zat_hiding_place_43
zat_hiding_place_44
zat_hiding_place_45
zat_hiding_place_46
zat_hiding_place_47
zat_hiding_place_48
zat_hiding_place_49
zat_hiding_place_50
zat_hiding_place_51
zat_hiding_place_52
zat_hiding_place_53
zat_hiding_place_54
zat_hiding_place_55

[personal_inventory_box_1_mapspot]
empty = true

[zat_hiding_place_1]
wpn_pm = 1, 1
ammo_9x18_fmj = 2, 1

[zat_hiding_place_2]
medkit = 1, 1
drug_radioprotector = 2, 1

[zat_hiding_place_3]
ammo_9x18_fmj = 3, 1
ammo_9x19_fmj = 2, 1

[zat_hiding_place_4]
wpn_ak74 = 1, 1
ammo_5.45x39_fmj = 3, 1

[zat_hiding_place_5]
conserva = 3, 1

[zat_hiding_place_6]
ammo_gauss = 1, 1
medkit_army = 3, 1

[zat_hiding_place_7]
wpn_spas12 = 1, 1
ammo_12x70_buck = 2, 1

[zat_hiding_place_8]
antirad = 2, 1
bandage = 3, 1

[zat_hiding_place_9]
antirad = 1, 1
medkit_scientic = 1, 1

[zat_hiding_place_10]
medkit = 1, 1
bandage = 2, 1

[zat_hiding_place_11]
medkit = 1, 1
bandage = 1, 1
ammo_5.45x39_fmj = 2, 1

[zat_hiding_place_12]
medkit = 2, 1

[zat_hiding_place_13]
ammo_9x19_fmj = 2, 1
ammo_5.56x45_ss190 = 3, 1

[zat_hiding_place_14]
bandage = 3, 1
medkit_army = 2, 1
drug_coagulant = 1, 1
drug_booster = 1, 1

[zat_hiding_place_15]
stalker_outfit = 1, 1
vodka = 1, 1

[zat_hiding_place_16]
wpn_mp5 = 1, 1
ammo_9x19_fmj = 3, 1
grenade_rgd5 = 2, 1

[zat_hiding_place_17]
grenade_rgd5 = 2, 1
medkit = 1, 1
bandage = 1, 1

[zat_hiding_place_18]
wpn_svd = 1, 1
ammo_7.62x54_7h1 = 1, 1

[zat_hiding_place_19]
grenade_f1 = 3, 1
medkit = 2, 1

[zat_hiding_place_20]
ammo_5.45x39_fmj = 2, 1
wpn_ak74 = 1, 1
ammo_vog-25 = 2, 1
wpn_addon_grenade_launcher = 1, 1

[zat_hiding_place_21]
ammo_5.56x45_ss190 = 2, 1
ammo_9x39_pab9 = 3, 1

[zat_hiding_place_22]
wpn_l85 = 1, 1
ammo_5.56x45_ss190 = 2, 15

[zat_hiding_place_23]
bread = 1, 1
kolbasa = 1, 1
conserva = 1, 1
vodka = 2, 1
energy_drink = 2, 1

[zat_hiding_place_24]
energy_drink = 2, 1
ammo_5.56x45_ss190 = 3, 1
ammo_5.45x39_fmj = 3, 1
medkit = 2, 1

[zat_hiding_place_25]
wpn_addon_scope = 1, 1
wpn_addon_grenade_launcher = 1, 1
ammo_vog-25 = 3, 1

[zat_hiding_place_26]
ammo_11.43x23_fmj = 2, 1
wpn_colt1911 = 1, 1

[zat_hiding_place_27]
wpn_toz34 = 1, 1
ammo_12x70_buck = 2, 1

[zat_hiding_place_28]
vodka = 1, 1
wpn_pm = 1, 1

[zat_hiding_place_29]
wpn_lr300 = 1, 1
ammo_5.56x45_ss190 = 2, 1
bandage = 1, 1

[zat_hiding_place_30]
wpn_desert_eagle = 1, 1
ammo_11.43x23_fmj = 2, 1
ammo_11.43x23_fmj = 1, 1

[zat_hiding_place_31]
drug_antidot = 2, 1
drug_radioprotector = 1, 1
drug_coagulant = 1, 1
bandage = 2, 1

[zat_hiding_place_32]
ammo_pkm_100 = 1, 1
ammo_pkm_100 = 1, 1

[zat_hiding_place_33]
bandage = 3, 1
medkit = 2, 1

[zat_hiding_place_34]
wpn_beretta = 1, 1
ammo_9x19_fmj = 3, 1

[zat_hiding_place_35]
grenade_f1 = 3, 1

[zat_hiding_place_36]
ammo_m209 = 3, 1
wpn_addon_grenade_launcher_m203 = 1, 1

[zat_hiding_place_37]
ammo_5.45x39_fmj = 3, 1

[zat_hiding_place_38]
ammo_7.62x54_7h1 = 2, 1

[zat_hiding_place_39]
medkit = 2, 1
drug_anabiotic = 2, 1
drug_antidot = 1, 1
bandage = 2, 1

[zat_hiding_place_40]
ammo_vog-25 = 3, 1
medkit_scientic = 1, 1
energy_drink = 1, 1
energy_drink = 1, 1

[zat_hiding_place_41]
wpn_wincheaster1300 = 1, 1
ammo_12x70_buck = 2, 1

[zat_hiding_place_42]
ammo_5.45x39_fmj = 2, 1
medkit = 1, 1

[zat_hiding_place_43]
ammo_9x39_pab9 = 4, 1
ammo_11.43x23_fmj = 2, 1

[zat_hiding_place_44]
bandage = 3, 1
vodka = 1, 1
energy_drink = 2, 1

[zat_hiding_place_45]
wpn_lr300 = 1, 1
ammo_5.56x45_ss190 = 2, 1
ammo_m209 = 4, 1

[zat_hiding_place_46]
ammo_gauss = 1, 1
medkit_army = 3, 1

[zat_hiding_place_47]
grenade_rgd5 = 3, 1

[zat_hiding_place_48]
conserva = 1, 1
vodka = 1, 1

[zat_hiding_place_49]
wpn_vintorez = 1, 1

[zat_hiding_place_50]
drug_coagulant = 2, 1
medkit = 2, 1
energy_drink = 3, 1
ammo_5.45x39_fmj = 2, 1

[zat_hiding_place_51]
ammo_gauss = 1, 1
medkit_army = 3, 1

[zat_hiding_place_52]
bandage = 2, 1
medkit= 1, 1

[zat_hiding_place_53]
vodka = 3, 1

[zat_hiding_place_54]
;helm_respirator = 1, 1
ammo_11.43x23_fmj = 3, 1
wpn_sig220 = 1, 1
bandage = 3
medkit = 3
antirad = 2
conserva = 2
energy_drink = 3, 1

[zat_hiding_place_55]
wpn_ak74 = 1, 1
[/cut]

[cut=Функция спавна рюкзака через скрипт]function mod_distanse(actor, npc)
if dont_has_alife_info("zat_test_quest_spawn_items") then
local actor_pos=db.actor:position()
local zat_test1=actor_pos:distance_to(vector():set(-318.35098266602,14.892880439758,516.04516601563),312637,124)<12.0
if zat_test1 then give_info("zat_test_quest_spawn_items") end
end
if has_alife_info("zat_test_quest_spawn_items") and dont_has_alife_info("zat_test_quest_spawn_items_spawn") then
alife():create("personal_inventory_box_1",vector():set(-318.35098266602,14.892880439758,516.04516601563),312637,124)
give_info("zat_test_quest_spawn_items_spawn") end
if has_alife_info("zat_test_quest_spawn_items_spawn") and dont_has_alife_info("zat_test_quest_spawn_items_spawn1") then
xr_effects.spawn_object_in(actor, npc, {"wpn_ak74","personal_inventory_box_1"})
give_info("zat_test_quest_spawn_items_spawn1") end
end[/cut]

[cut=Секция в алл.спавн][1867]

; cse_abstract properties
section_name = space_restrictor
name = personal_inventory_box_1_mapspot
position = -318.350982666016, 14.8928804397583, 516.045166015625
direction = 0, 0, 0
version = 128
script_version = 12

; cse_alife_object properties
game_vertex_id = 124
distance = 0
level_vertex_id = 312637
object_flags = 0xffffff3e
custom_data = [secret]

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 0.863488972187042

; cse_alife_space_restrictor properties
restrictor_type = 3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;[/cut]

Рюкзак спавнится. Автомат в нем тоже. Метка на карте не появляется. Что еще нужно прописать и где?
 
FantomICWДата: Вс, 01.12.2013, 02:15 | Сообщение # 714
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, попробуй подправить секцию тайника:
Код
[personal_inventory_box_1_mapspot]   
empty = {-zat_test_quest_spawn_items} true, false

Добавлено (01.12.2013, 02:15)
---------------------------------------------
Кстати, спавн предметов в тайник также можно проделать через рестриктор.





Сообщение отредактировал FantomICW - Вс, 01.12.2013, 02:14
 
sergej5500Дата: Вс, 01.12.2013, 11:06 | Сообщение # 715
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Цитата FantomICW ()
sergej5500, попробуй подправить секцию тайника:


Спасибо, но не помогает. Спавн предметов - это уже частность. Нужна метка на тайнике.
 
NIVДата: Вс, 01.12.2013, 17:14 | Сообщение # 716
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Цитата denis2000 ()
В файл inventory_upgrades.ltx добавляли ствол?

Спасибо, получилось заспанить оружие с апргрейдами! Только дерево апгрейдов пока недоступно, разбираюсь с этим.


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Вс, 01.12.2013, 17:18
 
denis2000Дата: Вс, 01.12.2013, 17:34 | Сообщение # 717
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, А разве на пустой тайник метка становиться?

Цитата NIV ()
Только дерево апгрейдов пока недоступно, разбираюсь с этим.

Дерево не доступно потому, что ствол не прописан данному механику в апгрейды.


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

denis2000,
Возникла мысль прописать в конфиг тайника level_spot. Можно ли отследить, когда ящик станет пуст (игрок все забрал), затем метку убрать?
 
denis2000Дата: Вс, 01.12.2013, 18:04 | Сообщение # 719
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Это давно реализовано в treasure_manager.script

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

sergej5500, я выдавал сообщение о тайнике так:
Код
function red_kardan_give_secret ()
  local yantar_kardan_treasure_id_id = get_story_object_id("yantar_kardan_treasure_id")

  level.map_add_object_spot_ser(yantar_kardan_treasure_id_id, "treasure", "")
  news_manager.send_treasure(0)
   
end

где yantar_kardan_treasure_id, это story_id соответствующего ящика в all.spawn
Код
[story_object]
story_id = yantar_kardan_treasure_id


Вопрос про автоматическое снятие меток меня тоже интересует. Пытался смотреть, как сделан treasure_manager в Чн - там большие отличия от ЗП.


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
Поиск: