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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Пн, 17.11.2014, 20:01 | Сообщение # 1036
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Цитата Дизель ()
можно в логике хоть sr_kupe написать

Разумеется, будет вылет.

Цитата Дизель ()
sr_universal

Это разработанная Николаем универсальная убер-схема для рестрикторов, переходов и другого.



 
makdmДата: Пн, 17.11.2014, 20:09 | Сообщение # 1037
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Можно ли схемы sr_idle и sr_universal применять в одном рестрикторе?

Можно. Только параметры у схем разные.
Например параметр scheme_type в схеме sr_idle обрабатываться не будет.

Схема sr_universal крайне не рациональна. С одной стороны кажется, что всё очень удобно и можно с помощью одной схемы отследить все события. НО если у вас рестриктор, который только отслеживает условия и производит переключения, в соответствие с работой скрипта xr_logic, то это просто "распыление" ресурсов компа и как следствие Большие тормоза в игре.

Достаточно посмотреть в метод UPDATE этой схемы и в в этот же метод в схеме sr_idle и сравнить их.
Теперь сразу станет понятно почему в SGM моде такие "тормоза" в игре.


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


Сообщение отредактировал makdm - Пн, 17.11.2014, 20:16
 
СахарДата: Вт, 18.11.2014, 12:07 | Сообщение # 1038
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Всем доброго времени суток. Столкнулся с такой проблемой я прописал сталкеру в эксклюзиве что бы он во время выброса шёл в укрытие. Вот собственно переход на нужную секцию.
Код
on_info2 = {=surge_started} walker@surge

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


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

Сахар,
Покажите всю логику сталкера.
 
СахарДата: Вт, 18.11.2014, 12:41 | Сообщение # 1040
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

sergej5500, Пожалуйста.

[cut=Логика]
Код
[logic@d3_czech]
active = walker
; suitable = {=check_npc_name(czech_name)} true
suitable = {=check_npc_name(d3_stalker_czech)} true
level_spot = quest_npc
on_death = death

[walker]
path_walk = walker_czech_walk
path_look = walker_czech_look
use_camp = false
on_info1 = {!is_day} sleeper
on_info2 = {=surge_started} walker@surge
show_spot = {+info_d3_czech_hello_talk} true, false

[sleeper]
path_main = d3_sleeper_czech_walk
wakeable = false
use_camp = false
meet = no_meet
on_info = {=is_day} walker
show_spot = {+info_d3_czech_hello_talk} true, false

[walker@surge]
path_walk = surge_czech_walk
path_look = surge_czech_look
use_camp = false
on_info1 = {=surge_complete} walker
on_info2 = {=is_dark_night} sleeper
show_spot = {+info_d3_czech_hello_talk} true, false

[death]
on_info = %+info_d3_stalker_czech_death%
[/cut]


 
makdmДата: Вт, 18.11.2014, 13:02 | Сообщение # 1041
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата Сахар ()
Но проблема заключается в том, что этот сталкер во время выброса идёт в случайное укрытие.

А вы точно уверены, что он идёт в укрытие?
Скорее всего туда, куда вы его в логике хотите отправить, нет AI - сетки. И соответственно схема walker не работает.
Если с SDK не работаете и не можете посмотреть сетку, то попробуйте его отправить в другое укрытие. Возможно там есть сетка.


Терпение......
И все получится!
 
СахарДата: Вт, 18.11.2014, 13:12 | Сообщение # 1042
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Цитата makdm ()
нет AI - сетки

Сетка есть, на это указывает две вещи
1)Эту работу занимает случайный сталкер, который находится в лагере.
2)Я работаю в СДК.




Сообщение отредактировал Сахар - Вт, 18.11.2014, 14:49
 
sergej5500Дата: Вт, 18.11.2014, 14:42 | Сообщение # 1043
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Сахар,

Попробуй работы

path_walk = surge_czech_walk
path_look = surge_czech_look

и секцию walker@surge

переименовать. Убери surge из названий. Тогда дефолтные неписи перестанут её занимать.
 
ДизельДата: Вт, 18.11.2014, 15:27 | Сообщение # 1044
Сталкер
Разработчики
Сообщений: 260
Награды: 1
Репутация: [ 136 ]

Цитата sergej5500 ()
path_walk = surge_czech_walk
path_look = surge_czech_look


Это всего лишь вей поинты, они могут быть различны в названиях, зависит от сборки локации, либо от внесения в аллспавн их. В логике они являются вектором.

Хотя я молчу, что там вы нагородили я не знаю, может вы и правы.

Если работаете в Зов Припяти, то на выброс, это легко сделать при помощи создания анипоинта в смарт кавере. Так будет работать точно - проверено, хотя если нет там аи сетки, то тоже не фига не получится.


andreyholkin
 
sergej5500Дата: Вт, 18.11.2014, 19:26 | Сообщение # 1045
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый день.

Сделал рестриктор радиоточки.

[cut=Логика][logic]
active = sr_idle@start

[sr_idle@start]
on_info = {=dist_to_actor_le(10)} sr_idle@stop %=play_sound(radio_music)%

[sr_idle@stop]
on_info = {=dist_to_actor_ge(25)} sr_idle@start %=stop_sound%[/cut]

[cut=script_sound][radio_music]
type = 3d
path = radio_music\radio_music_
shuffle = rnd
idle = 0,0,100[/cut]

В папке sounds\radio_music имеется 30 файлов radio_music_1, radio_music_2, radio_music_3 и т.д.

При подходе к приемнику (рестриктору) рандомно запускается одна из композиций. Если просто стоять и слушать, то после окончания трека музыка прекращается. Чтобы запустить музыку по новой, надо отойти на 25 метров. Потом вернуться к рестриктору.

Вопрос такой. Можно ли сделать так, чтобы после окончания ролика немедленно запускался следующий? Музыка должна звучать непрерывно. Что надо поправить?
 
makdmДата: Вт, 18.11.2014, 19:48 | Сообщение # 1046
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
чтобы после окончания ролика немедленно запускался следующий?


[sr_idle@stop]
on_info = {=dist_to_actor_ge(25)} sr_idle@start %=stop_sound%
on_info2 = {!is_playing_sound()} sr_idle@start


Терпение......
И все получится!
 
ДизельДата: Ср, 19.11.2014, 03:11 | Сообщение # 1047
Сталкер
Разработчики
Сообщений: 260
Награды: 1
Репутация: [ 136 ]

Цитата makdm ()
Вопрос такой. Можно ли сделать так, чтобы после окончания ролика немедленно запускался следующий? Музыка должна звучать непрерывно. Что надо поправить?


Музыка должна играть, сменяясь сама. Значит неправильно создали логику.

Я свой пример приведу, а там разгребите попробуйте. Может работает, не ругайтесь если не пашет при выбросе, я давно её не включал.

[cut noguest]#include "dizel_sound_autostation.ltx" добавить в Z:\S.T.A.L.K.E.R. - Зов Припяти\gamedata\configs\misc\script_sound.ltx

Дописать в лист:
    : list_music_and_stories, list_script_sound_zaton, list_script_sound_jupiter, list_script_sound_pripyat, list_script_sound_underpass, list_dizel_sound_autostation

    Далее:

    Создать Z:\S.T.A.L.K.E.R. - Зов Припяти\gamedata\configs\misc\dizel_sound_autostation.ltx

    Написать в нём:

    [list_dizel_sound_autostation]
    avto_bar_ph_music
    avto_bar_ph_music_surge

    [avto_bar_ph_music]
    type = 3d
    path = avto_bar_ph_music\avto_bar_ph_music_
    shuffle = rnd
    idle = 1,2,10
    play_always = true
    npc_prefix = false

    [avto_bar_ph_music_surge]
    type = 3d
    path = avto_bar_ph_music\avto_bar_ph_music_surge_
    shuffle = rnd
    idle = 1,2,10
    play_always = true
    npc_prefix = false

    Создать файл avto_bar_ph_music.ltx в Z:\S.T.A.L.K.E.R. - Зов Припяти\gamedata\configs\scripts\avto_bar_ph_music\

    Написать в нём:

    [logic]
    active = ph_idle@wait

    [ph_idle@wait]
    on_info = {-avto_sr_light_off} ph_idle@ph_sound3000
    on_info2 = {+avto_sr_light_off} ph_idle@ph_sound
    on_info3 = { =surge_complete =actor_in_zone(avto_surge_hide_centr_krysha)} ph_idle@ph_sound3000_rupor

    [ph_idle@ph_sound3000]
    on_info = %=play_sound(avto_bar_ph_music)%
    on_game_timer = 10 | {=surge_complete =actor_in_zone(avto_surge_hide_centr_krysha)}ph_idle@ph_sound

    [ph_idle@ph_sound]
    on_game_timer = 10 | ph_idle@ph_sound3000_surge %=stop_sound(avto_bar_ph_music)%

    [ph_idle@ph_sound3000_surge]
    on_info = %=play_sound(avto_bar_ph_music_surge) %
    on_game_timer = 30 | ph_idle@ph_sound3000_wait

    [ph_idle@ph_sound3000_wait]
    on_info = {-avto_sr_light_off} ph_idle@ph_sound3000 %=stop_sound(avto_bar_ph_music_surge) %

    [ph_idle@ph_sound3000_rupor]
    on_info = {=actor_in_zone(avto_surge_hide_centr_krysha)} ph_idle@wait %=play_sound(avto_bar_ph_music)%

    Далее надо создать в аллспавне простой рестриктор у радиоточки и прописать в нём путь к файлу в конфигах avto_bar_ph_music.ltx

    Закинуть в звуки sounds\avto_bar_ph_music\avto_bar_ph_music_surge_1,2,3....ogg и avto_bar_ph_music_1,2,3...ogg

    Это возможно рабочая схема, к сожалению я давно её не проверял. Это всего лишь направление к вашему действию![/cut]

    andreyholkin

    Сообщение отредактировал Дизель - Вс, 23.11.2014, 14:28
 
СахарДата: Вс, 23.11.2014, 05:56 | Сообщение # 1048
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Доброго здравия сегодня ковырялся в xr_effects.script и наткнулся на функцию send_tip она служит для отправки сообщений и имеет такую структуру =send_tip(news_id:sender:sender_id) с news_id всё понятно это индфикатор текстовой строки, но вот как использовать sender и sender_id я так и не понял, пробовал так может, кто знает как этими двумя параметрами пользоваться с меня +

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

Сахар, Итак функция xr_effects.send_tip(actor, npc, p), это лишь обертка для функции news_manager.(actor, news_id, timeout, sender, showtime, sender_id), которой передаются еще и не все параметры, а только p[1]=news_id, p[2]=sender, p[3]=sender_id. Достаточно взгянуть на функцию news_manager.(actor, news_id, timeout, sender, showtime, sender_id), чтобы понять для чего нужны эти параметры:
news_id - идентификатор строки текста новости
sender - иконка новости из таблицы tips_icons (строго говоря может быть или строкой - имя иконки или объектом - указателем на НПС отправившего сообщение тогда иконка сообщения есть иконка этого НПС через xr_effects.send_tip естественно не применимо)
sender_id - story_id НПС отправителя используется только для того, чтобы определить не умер ли НПС или не тяжело ранен, если он мертв или ранен то сообщение не отправиться.


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

Добрый вечер.

[cut=Логика непися][logic]
prior = 100
known_info = known_info

[known_info]
zat_b100_military_1_serchd[/cut]

Это логика одного из мертвых солдат у вертолета в Железном Лесу.

Согласно справочнику по логике:

Секция known_info

По обыску тела NPC выдает прописанные в секции инфопорции.

[known_info]
info1
info2


Есть два вопроса.

1. Трупы солдат в Железном Лесу "вечные". Они валяются и после осмотра вертолета. После визита в Припять. Уборщик их не берет. По крайней мере у меня. Данная особенность есть только у неписей с known_info. Связано ли это с known_info, или есть другая причина устойчивости трупов?

2. Можно ли из секции known_info запускать функции в xr_effects? Или можно выдать только инфопорцию?
 
Поиск: