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

Quote (dmitry778)
как это может повлиять на основной сюжет?

Ты уже его убил спавном в Припяти, теперь переделывай весь сюжет.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
dmitry778Дата: Сб, 04.02.2012, 16:42 | Сообщение # 77
Советник «Свободы»
Свобода
Сообщений: 727
Награды: 15
Репутация: [ 159 ]

denis2000,
Quote (dmitry778)
И как сделать так что-бы основной сюжет не испортить?

Так я вот очем теперь беспакоюсь.


СОВСЕМ НЕ ВАЖНО ОТ ЧЕГО ПОМРЕШЬ - ГОРАЗДО ВАЖНЕЕ ДЛЯ ЧЕГО РОДИЛСЯ.
 
RomalДата: Вс, 12.02.2012, 20:47 | Сообщение # 78
Отмычка
Пользователи
Сообщений: 40
Награды: 0
Репутация: [ 0 ]

С этим я сам разобрался.
Я по вашим инструкциям создал НПС уникального.
Прописал ему:
[logic]
active = move@trad

[move@trad]
invulnerable = true
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true
meet = meet_sgm

[meet_sgm]
abuse = false
allow_break = false ;не разрешаем ему прерывать диалог
meet_on_talking = false ; не разрешаем ему начинать разговор
trade_enable = true ; разрешаем ему торговать с ГГ
close_distance = 5 ; на расстоянии 5 метров от ГГ
close_anim = guard_na ; должен встать в позу охранника
close_victim = actor
use = {=actor_has_weapon} false, true ; не откликнется, если у ГГ нет в руках ствола
snd_on_use = {=actor_has_weapon} meet_hide_weapon, nil ; если у ГГ ствол - попросит убрать

Но почему-то он не бессмертный. С первого выстрела убили из СВД.
Вроде же всё правильно, почему он ходит, а не стоит и смертным стал?

Возможно он просто не принял логику. XOBAH
 
STALKER_2010Дата: Ср, 22.02.2012, 15:13 | Сообщение # 79
Гражданский
Пользователи
Сообщений: 12
Награды: 0
Репутация: [ -10 ]

Всем мододелам привет, у меня вопрос насчет спавна. Функция SGM не работает.
[cut=Цитата ui_main_menu.script] elseif dik==DIK_keys.DIK_F3 then
self:deliver_mp3_and_bonus()
elseif dik==DIK_keys.DIK_N then
self:give_object_to_actor("nano_1")
self:give_object_to_actor("nano_2")
self:give_object_to_actor("nano_3")
elseif dik==DIK_keys.DIK_P then
self:set_rich_actor()[/cut]
А зачем ещё 2 параметра?
[cut noguest=Цитата FAQ]give_object_to_actor(section,count,news)[/cut]
nano_1, nano_2 и nano_3 прописаны везде. Повелитель зоны спавнит без проблем.

1. self: писать не нужно. Функция give_object_to_actor является глобальной
2. give_object_to_actor(section[,count,news])
count - кол-во предметов, news - выводить новость о получении предмета, али нет (по-умолчанию false, т.е нет)
XOBAH

Спасибо ХОВАН, выручил!

Добавлено (22.02.2012, 15:13)
---------------------------------------------
Ох, не работает.
[cut noguest=Приведу-ка я всю функцию...]function main_menu:OnKeyboard(dik, keyboard_action) --virtual function
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
local bind = dik_to_bind(dik)
local console = get_console()
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
if level.present() and (((db.actor~=nil)and(db.actor:alive())) or (false==IsGameTypeSingle())) then
self.OnButton_return_game()
end
end
if dik==DIK_keys.DIK_Q then
self:OnMessageQuitWin()
elseif dik==DIK_keys.DIK_SUBTRACT then
self:screenshot_mode_on()
elseif dik==DIK_keys.DIK_ADD then
self:screenshot_mode_off()
elseif db.actor~=nil and dik==DIK_keys.DIK_F5 then
self:mod_options()
elseif db.actor~=nil and dik==DIK_keys.DIK_T then
self.OnButton_return_game()
run_choose_box("yes_or_no","remove_bad_outfit","Удалить текущий бронекостюм?")
elseif db.actor~=nil and dik==DIK_keys.DIK_6 then
self.OnButton_return_game()
level.show_weapon(true)
end
if db.actor~=nil then
if dik==DIK_keys.DIK_0 then
self:set_0_factor()
elseif dik==DIK_keys.DIK_1 then
self:set_1_factor()
elseif dik==DIK_keys.DIK_2 then
self:set_2_factor()
elseif dik==DIK_keys.DIK_3 then
self:set_3_factor()
elseif dik==DIK_keys.DIK_4 then
self:set_4_factor()
elseif dik==DIK_keys.DIK_5 then
self:set_5_factor()
elseif dik==DIK_keys.DIK_F1 then
self:mod_modes()
elseif dik==DIK_keys.DIK_F2 then
if db.actor then
self:OnButton_load_spawn()
elseif dik==DIK_keys.DIK_F3 then
self:deliver_mp3_and_bonus()
elseif db.actor~=nil and dik==DIK_keys.DIK_F4 then
give_object_to_actor("nano_1",1,true)
give_object_to_actor("nano_2",1,true)
give_object_to_actor("nano_3",1,true)
elseif dik==DIK_keys.DIK_P then
self:set_rich_actor()
end
end
end
--'Повелитель Зоны 5.0'--
god.key_binder(dik, keyboard_action, self)
--'Повелитель Зоны 5.0'--
end
return true
end[/cut]
Не спавнится, нет новости... Может где-то недостающий end?

А что-же вы сюда то вставили!? Инструкцию читали? От балды скрипт пишете, а потом заявления:"Функция SGM не работает." denis2000
КМБ? Читал. А по какой причине закидали тапками? Не от балды, а для наработки. Ну не сработала. У меня появляется вопрос: "Почему?". Причину не вижу.


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

STALKER_2010, Почему закидали? Мои тапки на мне.
Если для наработки, а не от балды объясните каким образом этот код вообще может сработать (ну по вашему не сработал так не сработал, но на что вы рассчитывали). В этом и причина - такой код никогда не сработает.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
PolicaiДата: Чт, 23.02.2012, 08:25 | Сообщение # 81
Удаленные



Народ!!!!
Нужна помощь гуру!

Анимация - дверь сдвигающаяся всторону, 1 кость, сдвиг вправо на 1.5 метра, 3 секунды пауза и сдвиг обратно на место.(Самодельный обьект, ставлю через спавн, в сдк анимация работает) В кустом дата прописана ссылка на логику, с текстом:

[cut noguest=Дверь][collide]
ignore_static

[animated_object][/cut]

Пульт взят с лабы х-8 в припяти, с родной логикой, я просто изменил на своё название анимации, спейса и смарта:

[cut noguest=Пульт][logic]
active = ph_button@no_card

[ph_button@no_card]
anim = idle
tooltip = tip_no_access_card
on_info = {=actor_has_item(zat_a23_labx8_key)} ph_button@has_card

[ph_button@has_card]
anim = idle
tooltip = tip_need_access_card
on_press = ph_button@unlocked
on_info = {!actor_has_item(zat_a23_labx8_key)} ph_button@no_card

[ph_button@unlocked]
anim = idle
tooltip = st_lx8_button_press_true
on_game_timer = 20 | {-lx8_door_open} %+lx8_door_open =anim_obj_forward(lim_door_laba_hide)%
on_game_timer2 = 10 | {-lx8_green_on} %+lx8_green_on =turn_off(lx8_light_switch_1_red_id) =turn_on(lx8_light_switch_1_green_id)%
on_info = {=actor_in_zone(lim_sr_actor_in_lab) -lim_actor_in_lab} %+lim_actor_in_lab =create_squad(lx8_polter_squad:lim_smart_terrain)%[/cut]

Всё проходит до запуска анимации, то есть без карты требует карту доступа, с картой появляется сообщение доступ разрешён, потом завис на 3-4 секунды, (в этот момент должна отработать анимация), и вылет с жалобой:

[cut noguest=Лог]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 : ....r. - Зов Припяти\gamedata\scripts\xr_effects.script:1317: attempt to index field '?' (a nil value)
stack trace:[/cut]

Понимаю что это всё туфта, просто я в скриптах ноль, и пытаюсь разобраться методом тыка.

xr_effects родной нетронутый. Подскажите куда ткнуться, или хотя бы где почитать тутор .....
 
denis2000Дата: Чт, 23.02.2012, 11:29 | Сообщение # 82
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Policai, Движек не может найти объект к которому нужно применить функцию anim_forward() (Проверил эксперементально!)

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
PolicaiДата: Чт, 23.02.2012, 11:38 | Сообщение # 83
Удаленные



Quote
косяк в анимации двери, сверяй имя анимации и ее параметры.


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

Хотелось бы увидеть содержимое all.spawn. denis2000
 
denis2000Дата: Сб, 25.02.2012, 17:58 | Сообщение # 84
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Теган, В all.spawn посмотри [cut][107]
; cse_abstract properties
section_name = helicopter
name = esc_heli
position = -317.183898925781,16.3679752349854,83.289665222168
direction = 0,-1.47526597976685,0

; cse_alife_object properties
game_vertex_id = 0
distance = 0
level_vertex_id = 594270
object_flags = 0xfffffffa
custom_data = <<END
[logic]
active = heli_move@idle

[heli_move@idle]
path_move = heli_idle_move
engine_sound = false
on_info = {+esc_heli_go} heli_move@fly
combat_safe_altitude = -50

[heli_move@fly]
path_move = heli_fly
on_signal = heli_radio| %+esc_heli_direct%
on_signal2 = fly_end| heli_move@patrol
combat_safe_altitude = -50

[heli_move@patrol]
path_move = heli_sleep
on_signal = heli_sig| heli_move@sleep
combat_safe_altitude = -50
invulnerable = true
mute = true

[heli_move@sleep]
path_move = heli_sleep2
engine_sound = false
combat_safe_altitude = -50
END
story_id = 14

; cse_visual properties
visual_name = physics\vehicles\mi24\veh_mi24_u_01

; cse_motion properties
motion_name = helicopter\aaa.anm

; cse_ph_skeleton properties
skeleton_name = idle

; cse_alife_helicopter properties
cse_alife_helicopter__unk1_sz = idle
engine_sound = alexmx\helicopter

[/cut]


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

Quote (Теган)
не бьет никого и летит дальше

Цель для вертолета задается параметром combat_enemy
Quote (Теган)
как надо настроить чтоб он просто перелетел с одного места в другое и остался там

Путь должен быть не замкнутым.
Quote (Теган)
как сделать чтоб он все время был в универсальной боевой схеме и атаковал какого либо нпс

См. первый ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Wall-eДата: Чт, 01.03.2012, 22:31 | Сообщение # 86
Гражданский
Пользователи
Сообщений: 14
Награды: 0
Репутация: [ 0 ]

S.T.A.L.K.E.R. Call of Pripyat 1.6.02 + Sigerous Mod 2.1
Всем доброго времени суток. У нас проблема как сделать завербованного мутанта бессмертным, и его можно было уволить. А дикие оставались уязвимыми

Ничего не получается Помогите кто нибуть аааааааааа! bye


Сообщение отредактировал Wall-e - Вт, 06.03.2012, 23:13
 
denis2000Дата: Чт, 01.03.2012, 23:13 | Сообщение # 87
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Wall-e, У завербованных мутантов есть общая секция [captured_monster] в файле m_addition_monsters.ltx можно попробовать создать там секцию имцнитетов (соответственно с нулевыми воздействиями), но возможно после того как их отпустишь они останутся неуязвимы.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
ТамерланДата: Ср, 07.03.2012, 22:14 | Сообщение # 88
Удаленные



Здравствуйте. Подскажите пожалуйста по логике рестрикторов. Хочется сделать выполнение своей функции при выходе ГГ из рестриктора и желательно через некоторое время (сек 10, на пример). Заранее благодарен.
 
denis2000Дата: Ср, 07.03.2012, 22:50 | Сообщение # 89
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Тамерлан, Пробуй нечто такое в логике рестриктора:
Code

[logic]
active = sr_idle@start

[sr_idle@start]
on_actor_inside = sr_idle@wait_out ; ожидаем вход ГГ в рестриктор

[sr_idle@wait_out]
on_actor_outside = sr_idle@wait_function ; ожидаем выход ГГ из рестриктора

[sr_idle@wait_function]
on_game_timer = 100 | sr_idle@end %=run_function% ; запускаем через 100 игровых секунд функцию run_function

[sr_idle@end]
;рестриктор более не активен


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
ТамерланДата: Пт, 09.03.2012, 17:49 | Сообщение # 90
Удаленные



denis2000, Спасибо. Примерно понял что к чему, но остался вопрос: как правильно написать
Quote (denis2000)
%=run_function%

Если написать как %=имя_скрапта.имя_функции%, то вылет с ошибкой в xr_logic.script... Заранее благодарен.

run_function берется только из файла scripts\xr_effects.script XOBAH

Добавлено (09.03.2012, 17:49)
---------------------------------------------
XOBAH, понятно, вот Тут я спрашивал как раз о выполнении своей функции. Есть какой-нибудь способ это реализовать?
з.ы. Попутный вопрос, а можно "изменить время"? т.е. на пример, было 9-30 утра, а стало 9-40.
з.ы.ы. denis2000, Большое спасибо за логику рестриктора.
Заранее благодарен.

 
Поиск: