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


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


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

Пробую заспавнить монстров другим способ,не получатса ,подскажите кте косяк

[cut noguest=all.spawn][20000]
; cse_abstract properties
section_name = smart_terrain
name = zat_b216_mon
position = 247.16491699219,18.105577468872,527.29174804688
direction = -0.61985343694687,0,-0.7847176194191

; cse_alife_object properties
game_vertex_id = 292
distance = 0.699999988079071
level_vertex_id = 1388877
object_flags = 0xffffff3e
custom_data = <<END
[smart_terrain]
cfg = scripts\zaton\smart\zat_b216_mon.ltx

END

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

; cse_alife_space_restrictor properties
restrictor_type = 3

; se_smart_terrain properties

[/cut]

[cut noguest=zat_b216_mon][smart_terrain];zat_b216_mon
squad_id = 16
max_population = 16
respawn_params = respawn@zat_b216_mon

[respawn@zat_b216_mon]
spawn_tushkano

[spawn_tushkano]
spawn_squads = zat_m1_squad
spawn_num = 16 [/cut]

[cut noguest=squad_descr_zaton]
[zat_m1_squad]:online_offline_group
faction = monster
npc = rat_normal, rat_normal, rat_normal, rat_normal, rat_normal, rat_normal, rat_normal, karlik_normal, karlik_normal, karlik_normal, karlik_normal, karlik_normal, tushkano_normal, tushkano_normal, tushkano_normal, tushkano_normal
target_smart = zat_b216_mon
spawn_point = zat_b216_mon_1_spawn
story_id = zat_m1_squad[/cut]

[cut noguest=simulation_objects_props][zat_m1_squad]:default_squad
sim_avail = true[/cut]

[cut noguest=simulation]
zat_m1_squad = zat_b216_mon[/cut]
 
makdmДата: Чт, 01.08.2013, 00:25 | Сообщение # 557
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

gamer,
spawn_num = 16
Это не количество НПС, а количество сквадов.
Зачем Вам 16 сквадов по 16 НПС в каждом?
Это же относится и к max_population = 16


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


Сообщение отредактировал makdm - Чт, 01.08.2013, 00:27
 
sergej5500Дата: Чт, 01.08.2013, 18:07 | Сообщение # 558
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый День. Делаю квест для СГМ 2.1 на зачистку ВНЗ Круг от Альфы.
[cut=Типовая логика альфовца.][logic]
active = move@walking
on_death = death

[death]
on_info = %+zat_b38_alfa1_death%

[move@walking]
move_dest_number = 206665
move_state_when_center = guard
move_state_when_move = walk
move_look_vertex = 246485
meet = meet

[meet]
abuse = true
use = {!actor_enemy} true, false
allow_break = true
meet_on_talking = false[/cut]
Всего там этих альфовцев 30. Их ID: zat_b38_alfa1, zat_b38_alfa2 и т.д. Хочу сделать квест на зачистку ВНЗ при помощи группы сталкеров по типу квестов на зачистку баз Чапая и Киборга. ID сталкеров штурмовой группы zat_b38_stalker1, zat_b38_stalker2 и т.д. Всего 12. В СГМ 2.1 сталкеры и альфа изначально нейтральны друг другу. Автор мода для этих квестов использовал специальные группировки сталкеров: army_alies и stalker_alies, которые враждебны бойцам Чапая и Киборга. Вопрос: можно ли в логике или через скрипт прописать взаимную враждебность носителей определённого ID (zat_b38_alfa** и zat_b38_stalker**) после прихода определенной инфопорции. Про настройку отношений группировок через скрипт я знаю. Этот метод полностью ссорит группировки, что нежелательно. Здесь нужна именно враждебность двух групп при общей нейтральности отношений между группировками. Новую группировку добавлять пока не хочется. Можно ли решить эту задачу? Заранее благодарен за советы.
 
FantomICWДата: Чт, 01.08.2013, 18:53 | Сообщение # 559
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, я бы пробовал использовать функции из game_relations.script. В частности, set_npcs_relation, set_squad_goodwill_to_npc, set_squad_community_goodwill




Сообщение отредактировал FantomICW - Чт, 01.08.2013, 18:53
 
sergej5500Дата: Чт, 01.08.2013, 20:11 | Сообщение # 560
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

FantomICW,
Спасибо за подсказку. Нашел для данной цели более-менее подходящую функцию: set_relation_between(obj1,obj2,type).
Сделал для тестов двух сталкеров.
[cut=Спавн-секция.][zat_test_stalker1]:stalker
$spawn = "respawn\zat_test_stalker1"
character_profile = respawn_easy_stalker
spec_rank = master
community = stalker
story_id = zat_test_stalker1
can_be_wounded = false
custom_data = scripts\zat_test_stalker1.ltx
[zat_test_stalker2]:stalker
$spawn = "respawn\zat_test_stalker2"
character_profile = respawn_easy_stalker
spec_rank = master
community = stalker
story_id = zat_test_stalker2
can_be_wounded = false
custom_data = scripts\zat_test_stalker2.ltx[/cut]
[cut=Логика]
1 сталкер.
[logic]
active = move@walking
on_death = death

[move@walking]
move_dest_number = 370626
move_state_when_center = guard
move_state_when_move = walk
move_look_vertex = 336453
meet = meet

[meet]
abuse = true
use = {!actor_enemy} true, false
allow_break = true
meet_on_talking = false

2 сталкер.
[logic]
active = move@walking
on_death = death

[move@walking]
move_dest_number = 336453
move_state_when_center = guard
move_state_when_move = walk
move_look_vertex = 370626
meet = meet

[meet]
abuse = true
use = {!actor_enemy} true, false
allow_break = true
meet_on_talking = false[/cut]

[cut=ui_main_menu.scripts]elseif db.actor~=nil and dik==DIK_keys.DIK_V then
create("zat_test_stalker1",-287.97134399414,13.446946144104,622.3046875,370626,33)
create("zat_test_stalker2",-306.00772094727,17.248880386353,621.38940429688,336453,33)
elseif db.actor~=nil and dik==DIK_keys.DIK_B then
set_relation_between("zat_test_stalker1","zat_test_stalker2","e")[/cut]
При нажатии на клавишу V сталкеры спавнятся и смотрят друг на друга. После нажатия на B следует
[cut=FATAL ERROR]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 : ...ogram files 1\Зов Припяти\gamedata\scripts\_g.script:2890: attempt to call method 'set_relation' (a nil value)[/cut]
[cut=Функция из g_scripts]
-- 'Установка отношений одного обьекта к другому.
function set_relation_between(obj1,obj2,type)
if type==nil or type=="enemy" or type=="e" then
obj1:set_relation(game_object.enemy,obj2)
elseif type=="friend" or type=="f" then
obj1:set_relation(game_object.friend,obj2)
elseif type=="neutral" or type=="n" then
obj1:set_relation(game_object.neutral,obj2)
end
end[/cut]
Как надо прописывать функцию, чтобы не вылетало? Как прописать одной функцией изменение отношений группы сталкеров с однотипными ID: конкретно zat_b38_alfa** и zat_b38_stalker**. Заранее благодарен за советы.
 
makdmДата: Чт, 01.08.2013, 20:28 | Сообщение # 561
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, поссорьте их между собой.
Попробуйте сделать так:

в логике

zat_b38_alfa_1 сталкера пропишите

on_info = %=make_enemy(zat_b38_stalker_1)%

а в логике zat_b38_stalker_1 сталкера пропишите

on_info = %=make_enemy(zat_b38_alfa_1)%

Аналогично можно перессорить всех НПС в сквадах.

Можно использовать также функцию hit_obj из файле xr_effects.script


Терпение......
И все получится!
 
strelok200Дата: Чт, 01.08.2013, 22:09 | Сообщение # 562
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Народ, у меня сквад без причины удалился, первый раз такое, ничего не редактировал
 
sergej5500Дата: Чт, 01.08.2013, 23:31 | Сообщение # 563
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,
Попробовал Ваше предложение на тестовых сталкерах. Вписал им в логику соответственно:
1-му on_info = %=make_enemy(zat_test_stalker2)%
2-му on_info = %=make_enemy(zat_test_stalker1)%

Результат нулевой. Стоят, смотрят друг на друга, драться не хотят. Со второй функцией та же история. Для пробы заспавнил рядом с ними бандита. Общими усилиями сталкеры его завалили.

strelok200,
О каком скваде идёт речь?
 
makdmДата: Пт, 02.08.2013, 00:45 | Сообщение # 564
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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

Функция для смены отношений есть в файле game_relations.script
Сама функция set_factions_community


Терпение......
И все получится!
 
denis2000Дата: Пт, 02.08.2013, 09:24 | Сообщение # 565
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Сделать сквады врагами set_squads_enemies из xr_effects, в качестве аргумента стори_ид двух сквадов.

strelok200, С чего вы взяли, что без причины?


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

denis2000,
Спасибо за подсказку. Команда set_squads_enemies работает неплохо. Но её можно применять только к сквадам. Вопрос, есть ли эквивалентная функция для несквадовых НПС. Пробовал использовать функцию:
-- 'Установка отношений одного обьекта к другому.
function set_relation_between(obj1,obj2,type)
.
Если написать код типа:
elseif db.actor~=nil and dik==DIK_keys.DIK_B then
set_relation_between("zat_test_stalker1","zat_test_stalker2","e")

то следует вылет. Функция есть в СГМ и упоминается в сборнике Хована. Вопрос, как её правильно применять к конкретным НПС в файле логики или скрипте? Можно ли показать пример кода с этой функцией?
 
denis2000Дата: Пт, 02.08.2013, 18:54 | Сообщение # 567
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Там-же make_enemy, применение из рестриктора:
Код
%=make_enemy(NPC_1:NPC_2)%

NPC_1 становиться врагом NPC_2
Или при вызове из логики НПС:
Код
%=make_enemy(NPC)%

NPC становиться врагом, тому НПС из логики которого вызвана функция

Естественно NPC_1, NPC_2, NPC - это стори-ид персонажей.

[off]PS: Изучайте xr_effects.script и xr_conditions.script, там очень много полезных функций в том числе закоментированных![/off]


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

denis2000,
Есть ли возможность обобщить функцию? Для конкретного квеста придётся в логику каждому сталкеру писать код типа:
on_info = %=make_enemy(zat_b38_stalker1:zat_b38_alfa1) =make_enemy(zat_b38_stalker1:zat_b38_alfa2) =make_enemy(zat_b38_stalker1:zat_b38_alfa3) ... %
Можно ли написать обобщение кода для 12-сталкеров и 30 альфовцев?
 
denis2000Дата: Пт, 02.08.2013, 19:12 | Сообщение # 569
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Проще сделать их конечно сквадами и поссорить, но можно и свою функцию написать, какую угодно.

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

Цитата (sergej5500)
Есть ли возможность обобщить функцию?

Можно обобщить, как я и советовал, через вражду группировок.
Например начинаем воевать, когда сталкеры сблизились на расстояние 50 метров.
В логике одного из альфовцев пишем
on_info = {-поршень =dist_between_npc_and_obj_le(zat_b38_stalker_1:50)} %+поршень =set_faction_enemy_to_faction(army_alies:stalker_alies)%

После того, как война закончится и сталкеры победят с помощью ГГ нужно восстановить нейтралитет.
Для этого найдите активную секцию любого рестриктора и в ней напишите

on_info = {-поршень =all_zat_b38_alfa_dead} %+поршень =set_faction_neutral_to_faction(army_alies:stalker_alies)%

Теперь сами функции

[cut noguest=Функции]В xr_effects пишем

function set_faction_neutral_to_faction(actor, npc, p)
local faction = p[1]
local faction_to = p[2]
local neutral = 0
if faction_to and faction then
relation_registry.set_community_relation( faction, faction_to, neutral )
else
abort("Wrong parameters in function 'set_faction_neutral_to_faction'")
end
end
function set_faction_enemy_to_faction(actor, npc, p)
local faction = p[1]
local faction_to = p[2]
local enemy = -5000
if faction_to and faction then
relation_registry.set_community_relation( faction, faction_to, enemy )
else
abort("Wrong parameters in function 'set_faction_enemy_to_faction'")
end
end

В xr_conditions пишем
Надеюсь, что при гибели альфовцев выдаются однотипные инфопоршни zat_b38_alfa1_death, zat_b38_alfa2_death и т.д.

function all_zat_b38_alfa_dead(actor, obj)
for i = 1,30 do
local infopor = "zat_b38_alfa"..i.."_death"
if not has_alife_info(infopor) then
return false
end
end
return true
end

function dist_between_npc_and_obj_le(actor, npc, p)
local npc1 = get_story_object( p[1] )
local d = p[2]
if npc1 then
return d and npc:position():distance_to_sqr(npc1:position()) <= d * d
end
end
[/cut]


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