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

Цитата (yakuti)
Как перевести сквад или одного нпс из сквада в офф(ЗП)?

Уже обсуждалось. Читаем форум.
Цитата (yakuti)
Как функцией телепортировать актора(ЗП)?

Код
=teleport_actor(<Имя точки пути где находиться>:<Имя точки пути куда смотрит>)

Цитата (yakuti)
Подскажите логику пленника в зов припяти

Код
[logic]
active = walker

[walker]
path_walk = ...
path_look = ...
def_state_standing = prisoner
gather_items_enabled = false
corpse_detection_enabled = false
combat_ignore_keep_when_attacked = true   
combat_ignore_cond = true
meet = no_meet


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

Как заспавнить сквад после выдачи инфопоршня и как перевести в офф(на форумах не нашел)
Через рестриктор не работает

КМБ Урок 4. denis2000
 
denis2000Дата: Сб, 27.04.2013, 19:45 | Сообщение # 363
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (yakuti)
как перевести в офф(на форумах не нашел)

Вы не находите ответ на этот вопрос, потому что это никому не нужно.


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

Через рестриктор я пробовал. Проблема в том, что сквад спавнится в начале игре (хотя в simulation и simulation_object_props) не прописывал
Логика рестриктора:
Код
[logic]
active = sr_idle@wait_for_actor

[sr_idle@wait_for_actor]
sr_idle@create_squad

[sr_idle@create_squad]
on_info = {-info_created_squad +newtaskmod} %=create_squad(esc_sidorovich:esc_sidor_smart) +info_created_squad% sr_idle@create_second

[sr_idle@create_second]
on_info = {-info_created_lager +newtaskmod} %=create_squad(esc_kolt:esc_zahvat_sidor) +info_created_lager%
 
FantomICWДата: Сб, 27.04.2013, 21:16 | Сообщение # 365
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

yakuti, можно через смарт-террейн прописать. Например, нам нужен сквад на Станции Переработки Отходов. Открываем логику смарта configs/scripts/zaton/smart/zat_b40_smart_terrain.ltx
Видим это
[cut=Файл]
Код
[smart_terrain];zat_b40_smart_terrain
squad_id = 38
max_population = 4

[exclusive]
zat_b40_guard_leader_01 = zaton\zat_b40_mercs.ltx
zat_b40_guard_leader_02 = zaton\zat_b40_mercs.ltx
;leave this for sim - killers only
zat_b40_guard_01 = zaton\zat_b40_mercs.ltx
zat_b40_guard_02 = zaton\zat_b40_mercs.ltx
zat_b40_guard_03 = zaton\zat_b40_mercs.ltx
zat_b40_guard_04 = zaton\zat_b40_mercs.ltx
zat_b40_guard_05 = zaton\zat_b40_mercs.ltx
zat_b40_guard_06 = zaton\zat_b40_mercs.ltx
zat_b40_guard_07 = zaton\zat_b40_mercs.ltx
zat_b40_guard_08 = zaton\zat_b40_mercs.ltx
[/cut]

Думаю, пояснять что есть что не надо. Добавляем под параметром max_population строку
Код
respawn_params = spawn@zat_b40_smart_terrain

Ниже прописываем
Код
[respawn@zat_b40_smart_terrain]
spawn_sidor

[spawn_sidor]
spawn_squads = твой сквад
spawn_num = {+инфопорция} 1, 0

Общий вид
[cut=Измененный файл]
Код
[smart_terrain];zat_b40_smart_terrain
squad_id = 38
max_population = 4
respawn_params = spawn@zat_b40_smart_terrain

[respawn@zat_b40_smart_terrain]
spawn_sidor

[spawn_sidor]
spawn_squads = твой сквад
spawn_num = {+инфопорция} 1, 0

[exclusive]
zat_b40_guard_leader_01 = zaton\zat_b40_mercs.ltx
zat_b40_guard_leader_02 = zaton\zat_b40_mercs.ltx
;leave this for sim - killers only
zat_b40_guard_01 = zaton\zat_b40_mercs.ltx
zat_b40_guard_02 = zaton\zat_b40_mercs.ltx
zat_b40_guard_03 = zaton\zat_b40_mercs.ltx
zat_b40_guard_04 = zaton\zat_b40_mercs.ltx
zat_b40_guard_05 = zaton\zat_b40_mercs.ltx
zat_b40_guard_06 = zaton\zat_b40_mercs.ltx
zat_b40_guard_07 = zaton\zat_b40_mercs.ltx
zat_b40_guard_08 = zaton\zat_b40_mercs.ltx
[/cut]

Только не забывайте что речь идет о спавне, а не о респавне. denis2000





Сообщение отредактировал FantomICW - Сб, 27.04.2013, 21:17
 
denis2000Дата: Сб, 27.04.2013, 22:14 | Сообщение # 366
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

yakuti, Секция [sr_idle@wait_for_actor] - чушь, а так логика рабочая.

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

Такая проблема. Заспавнил нпс с логикой волкера, телепортировал его. После телепорта он должен выполнять секцию из логики wounded, но он ее не выполняет (пробовал два варианта)
1ый
Код
[logic@esc_otryad3]
active = walker@esc_otryad3
suitable = {=check_npc_name(esc_otryad3)} true
prior = 200
threshold = threshold@mil_fbarier

[walker@esc_otryad3]:walker@def_guarder
path_walk = esc_team3_walk
path_look = esc_team3_look
on_info = {+respawn_npc} walker@team3

[walker@esc_attaker3]:walker@def_guarder
path_walk = esc_bandit3_walk
path_look = esc_bandit3_look
on_info = {+you_in_restr} walker@esc_atake3
meet = no_meet
combat_ignore_cond = {+first_talk_cap -you_in_restr}

[walker@esc_atake3]:walker@def_guarder
path_walk = esc_banda3_walk
path_look = esc_banda3_look

[walker@team3]
path_walk = esc_trety_walk
path_look = esc_banda1_look
def_state_moving = walk_noweap
meet = meet
wounded = wounded@commandy3

[wounded@commandy3]
hp_state = 101|wounded_heavy@help_heavy
hp_state_see = 101|wounded_heavy@help_heavy
hp_victim = 101|nil ;actor
hp_cover = 101|false
hp_fight = 101|false
autoheal = false
not_for_help = true
enable_talk = true


2ой через смарт ковер
Код
[logic@esc_otryad4]
active = walker@esc_otryad4
suitable = {=check_npc_name(esc_otryad4)} true
prior = 200
threshold = threshold@mil_fbarier

[walker@esc_otryad4]:walker@def_guarder
path_walk = esc_team4_walk
path_look = esc_team4_look
on_info = {+first_talk_cap} walker@esc_attaker1
on_info = {+respawn_npc} animpoint@team4

[walker@esc_attaker4]:walker@def_guarder
path_walk = esc_bandit4_walk
path_look = esc_bandit4_look
on_info = {+you_in_restr} walker@esc_atake4
meet = no_meet
combat_ignore_cond = {+first_talk_cap -you_in_restr}

[walker@esc_atake4]:walker@def_guarder
path_walk = esc_banda4_walk
path_look = esc_banda4_look

[animpoint@team4]
cover_name = esc_team4_cover
avail_animations = wounded
meet = meet
use_camp = false
reach_distance = 2
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
 
makdmДата: Вс, 28.04.2013, 18:41 | Сообщение # 368
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

yakuti, после телепортации логика персов иногда "подвисает". Иногда намертво, а иногда секунд через 10 вдруг НПС оживают, а не стоят, как "истуканы", и начинают выполнять работу.
А если после телепортации, например в такое место, куда НПС сами попасть не могут вы переведёте их в OFF - line ( удалитесь за пределы switch_distanсe ) , то при переходе в ON - line ( и как следствие перезагрузка их логики ) вы увидите, что в том месте, где вы их поставили, их не будет. Они просто не смогут туда попасть.
Поэтому аккуратнее с teleport_npc ().


Терпение......
И все получится!
 
yakutiДата: Вс, 28.04.2013, 18:44 | Сообщение # 369
Отмычка
Пользователи
Сообщений: 46
Награды: 0
Репутация: [ 7 ]

"удалитесь за пределы switch_distanсe ) , то при переходе в ON - line ( и как следствие перезагрузка их логики ) вы увидите, что в том месте, где вы их поставили, их не будет. Они просто не смогут туда попасть. "
Да, было такое.
 
SandwichДата: Пт, 03.05.2013, 22:30 | Сообщение # 370
Зам. Лидера «Свободы»
Свобода
Сообщений: 4340
Награды: 16
Репутация: [ 431 ]

Создавал нпс на новой локе через алл.спавн
[cut=Лог]FATAL ERROR

[error]Expression : no_assert
[error]Function : CXML_IdToIndex<class CCharacterInfo>::GetById
[error]File : d:\prog_repository\sources\trunk\xrserverentities\xml_str_id_loader.h
[error]Line : 112
[error]Description : item not found, id
[error]Arguments :


stack trace:[/cut]


А колбасу и батоны нынче хреновые стали делать! (Умнейший неизвестный сталкер)
 
sergej5500Дата: Пт, 03.05.2013, 22:44 | Сообщение # 371
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Sandwich,
Судя по логу, не находит секцию НПС в character_desc_. Проверь, подключён ли файл в system.ltx.
 
SandwichДата: Пт, 03.05.2013, 23:19 | Сообщение # 372
Зам. Лидера «Свободы»
Свобода
Сообщений: 4340
Награды: 16
Репутация: [ 431 ]

sergej5500, он прописан в system

А колбасу и батоны нынче хреновые стали делать! (Умнейший неизвестный сталкер)
 
sergej5500Дата: Пт, 03.05.2013, 23:50 | Сообщение # 373
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Sandwich,
Тогда, возможно, не прописана ссылка на профиль этого НПС. Пример, спавн-секция НПС:
[zat_stalker_employer]:stalker_employer
$spawn = "respawn\zat_stalker_employer"
character_profile = zat_stalker_employer
spec_rank = master
community = stalker
story_id = zat_stalker_employer
can_be_wounded = false
custom_data = scripts\SGM\zaton\zat_stalker_employer.ltx


Строка character_profile = zat_stalker_employer отсылает к профилю НПС.
 
SandwichДата: Сб, 04.05.2013, 00:03 | Сообщение # 374
Зам. Лидера «Свободы»
Свобода
Сообщений: 4340
Награды: 16
Репутация: [ 431 ]

sergej5500, нечего не пойму,всё указано вроде верно,делал по кучи уроков а ошибка одна везде
[cut=character_desc]<specific_character id="voennyi_01" team_default="1">
<name>GENERATE_NAME_stalker</name>
<icon>ui_inGame2_Sich</icon>
<map_icon x="1" y="0"></map_icon>
<bio>Опытный сталкер. Детальная информация отсутствует.</bio>

<class>voennyi_01</class>
<community>army</community>
<terrain_sect>stalker_terrain</terrain_sect>
<snd_config>characters_voice\human_01\military\</snd_config>

<rank>900</rank>
<reputation>0</reputation>

<visual>actors\stalker_soldier\stalker_soldier_1</visual>
<supplies>
[spawn] \n
wpn_ak74 = 1 \n
ammo_5.45x39_fmj = 3 \n
</supplies>
#include "gameplay\character_criticals_4.xml"

<start_dialog>zat_b30_owl_stalker_trader_start_dialog</start_dialog>
<actor_dialog>zat_b30_owl_stalker_trader_choose_task</actor_dialog>
<actor_dialog>zat_b30_owl_stalker_trader_sell_items</actor_dialog>
<actor_dialog>zat_b30_owl_stalker_trader_buy_info</actor_dialog>
<!-- actor_dialog>zat_b30_owl_stalker_trader_b40_about_merc_camp</actor_dialog -->
<actor_dialog>zat_b30_owl_stalker_trader_stages</actor_dialog>
<actor_dialog>zat_b30_owl_stalker_trader_b30_actor_after_barmen</actor_dialog>
<actor_dialog>zat_b30_owl_stalker_trader_about_nimble</actor_dialog>
<actor_dialog>actor_break_dialog</actor_dialog>
</specific_character>
[/cut]
[cut=nps_profile]
<character id="voennyi_01">
<class>voennyi_01</class>
<specific_character>voennyi_01</specific_character>
</character>[/cut]
[cut=spawn_section_military(он указан в spawn_section) ][voennyi_01]:stalker
$spawn = "respawn\voennyi_01"
character_profile = voennyi_01
spec_rank = novice
community = stalker
story_id = voennyi_01
can_be_wounded = false
[/cut]
[cut=all.spawn][2354]

; cse_abstract properties
section_name = stalker
name = voennyi_01
position = 13.244469, -7.294157, 16.457243
direction = 0,0,0
; cse_alife_trader_abstract properties
money = 5000
character_profile = voennyi_01

; cse_alife_object properties
game_vertex_id = 1366
distance = 0
level_vertex_id = 320484
object_flags = 0xffffffbf
custom_data = <<END
[smart_terrains]
END

; cse_alife_creature_abstract properties
g_team = 0
g_squad = 1
g_group = 5
health = 1
dynamic_out_restrictions =
dynamic_in_restrictions =
upd:health = 1
upd:timestamp = 0x2009656c
upd:creature_flags = 0x3d
upd:position = 13.244469,-7.294157,16.457243
upd:o_model = 0
upd:o_torso = 0.00316426996141672,0.062321275472641,0
upd:g_team = 0
upd:g_squad = 1
upd:g_group = 5
; cse_alife_monster_abstract properties
upd:next_game_vertex_id = 65535
upd:prev_game_vertex_id = 65535
upd:distance_from_point = 0
upd:distance_to_point = 0

; cse_alife_human_abstract properties
predicate5 = 1,1,0,0,1
predicate4 = 2,2,0,2

; cse_ph_skeleton properties
upd:start_dialog =
; se_stalker properties[/cut]


А колбасу и батоны нынче хреновые стали делать! (Умнейший неизвестный сталкер)
 
sergej5500Дата: Сб, 04.05.2013, 00:17 | Сообщение # 375
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Sandwich,
Не уверен на 100%, но возможно, этот метод в Зове Припяти не работает. Попробуй заспавнить сталкера иначе.
В way_ локации в all.spawn пропиши место спавна.
[voennyi_01_look]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = -513.054443359375,4.84810924530029,102.342498779297
p0:game_vertex_id = 98
p0:level_vertex_id = 37892


Координаты сделай свои. Пропиши рестриктор спавна с логикой типа:
[logic]
active = sr_idle@voennyi_01_spawner

[sr_idle@voennyi_01_spawner]
on_info = {-voennyi_01_spawned} %=spawn_corpse(voennyi_01:voennyi_01_look) +voennyi_01_spawned%
on_info2 = {+voennyi_01_spawned} sr_idle@voennyi_01_spawner1

[sr_idle@voennyi_01_spawner1]
 
Поиск: