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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
alex_xp_77Дата: Вс, 12.10.2014, 17:43 | Сообщение # 1006
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Доброго всем дня!!Вот решил навестить старый добрый форум, не возникало вопросов, но теперь нужна помощь знатоков, у меня вопрос по respawn, это который в spawn element в sdk 04, но вот не понятно, я заспавнил полный дом на террейне монстров, и нпс, теперь после их зачистки, то есть если их убить они больше не появятся, кто ни будь знает для чего эта строка?? http://SSMaker.ru/bdf08c98/ тут есть клавиша респаун тайм, можно ли назначить время респавна в sdk, этим решив проблему респавна?? Если я не прав просьба откоректировать мое предположение , и если это по другому, то если можно дайте по подробнее ответ на эту проблему, заранее большое спасибо за любой ответ!!

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

alex_xp_77, В ТЧ респавн делался при помощи специального рестриктора:
Код
section_name = respawn
restrictor_type = 0

В его кастом дате было например такое:
Код
[respawn]
respawn_section = flesh_weak,19, flesh_normal,14
max_spawn = 3
idle_spawn = medium

Обрабатывал это скрипт: se_respawn.script


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

Всем привет. Написал фрагмент кода для рестриктора.

[cut=Фрагмент][sr_idle@esc_b2_bandit_enemy_task_timer]
on_game_timer = 10800 | sr_idle@esc_b2_bandit_enemy_save
on_info = {=is_squad_enemy_to_actor(esc_b2_stalker_squad)} sr_idle@end

[sr_idle@esc_b2_bandit_enemy_save]
on_info = {-esc_b2_bandit_enemy_task_start_save} %+esc_b2_bandit_enemy_task_start_save =scenario_autosave(st_save_esc_b2_bandit_enemy_task_start)%
on_info2 = {+esc_b2_bandit_enemy_task_start_save} sr_idle@esc_b2_bandit_enemy_task_start
on_info3 = {=is_squad_enemy_to_actor(esc_b2_stalker_squad)} sr_idle@end[/cut]

После отработки таймера произойдет автосейв, затем стартует квест. Код работает. Но если игрок спит, то автосейв происходит немедленно после пробуждения. Нет времени среагировать. Какой функцией можно проверить, спит ли игрок в момент остановки таймера. Если спит, то включить мини-таймер на 30 секунд. Чтобы квест стартовал не сразу после пробуждения.
 
denis2000Дата: Чт, 16.10.2014, 12:48 | Сообщение # 1009
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Проверяй инфопорцию actor_is_sleeping.

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

Добрый вечер. В СГМ есть торговцы, продающие вещи на заказ.

Решил сделать из Сидоровича нового СГМ-торговца. По аналогии прописал функции в sgm_dialogs. Написал диалог заказа. Настроил файл торговли.

[cut=Файл торговли]#include "default_sections.ltx"

[trader]
buy_condition = {+sgm_achievements_client =check_night_interval(22:5)} order_trader_buy_upgraded_hidden, {+sgm_achievements_client} order_trader_buy_upgraded, order_trader_buy
sell_condition = {+sgm_achievements_client +esc_b2_trader_order} order_trader_sell_upgraded, {+sgm_achievements_client} default_order_trader_sell_upgraded, {+esc_b2_trader_order} order_trader_sell, default_order_trader_sell
buy_supplies = {+esc_b2_trader_mosina =check_trader_order_item(wpn_mosina)} supplies_mosina, {+esc_b2_trader_kar98k =check_trader_order_item(wpn_kar98k)} supplies_kar98k, {+esc_b2_trader_svoboda_light_outfit =check_trader_order_item(svoboda_light_outfit)} supplies_svoboda_light_outfit, {+esc_b2_trader_dolg_outfit =check_trader_order_item(dolg_outfit)} supplies_dolg_outfit, order_trader_supplies
discounts = {+esc_smart_terrain_6_bandit_clean +esc_smart_terrain_7_bandit_clean} discount
buy_item_condition_factor = {+sgm_achievements_client} 0.4, 0.65

[discount]
buy = 1.4
sell = 0.7

[order_trader_supplies]:default_ammo_supplies
minetrap_detector = 1,0.9
remote_explosive_charge = 1,0.5
demolution_ballon = 1,0.8
demolution_kanistra = 1,0.8
demolution_barrel = 1,0.8
detector_battery_1 = 1,0.8
detector_battery_2 = 1,0.5
detector_battery_3 = 1,0.2
conventer_grenade_box = 1,0.8
repair_outfit_box = 1,0.8
repair_arms_box = 1,0.8
mp3_player = 1,0.3
personal_rukzak = 1,0.9

[supplies_mosina]:order_trader_supplies
wpn_mosina = 2,1.0
[supplies_kar98k]:order_trader_supplies
wpn_kar98k = 1,1.0
[supplies_svoboda_light_outfit]:order_trader_supplies
svoboda_light_outfit = 1,1.0
[supplies_dolg_outfit]:order_trader_supplies
dolg_outfit = 1,1.0

[order_trader_buy]:default_order_trader_buy
[order_trader_buy_upgraded]:default_order_trader_buy_upgraded
[order_trader_buy_upgraded_hidden]:default_order_trader_buy_upgraded_hidden

[order_trader_sell]:default_order_trader_sell
wpn_mosina = 1,1.7
wpn_kar98k = 1,1.7
svoboda_light_outfit = 1,1.7
dolg_outfit = 1,1.7

[order_trader_sell_upgraded]:default_order_trader_sell_upgraded
wpn_mosina = 1,1.2
wpn_kar98k = 1,1.2
svoboda_light_outfit = 1,1.2
dolg_outfit = 1,1.2[/cut]

Долго не мог понять, почему Сидор не продает заказанное оружие. Костюмы продает. Обнаружил, что Сидор нагло "присваивает" заказанные стволы. Берет их в личное пользование. Для проверки гипотезы прописал в торговлю две мосинки.

На скринах видно, что одна винтовка у Сидора есть в продаже. Вторую он "зажал". На скрине винтовка у Сидоровича за спиной.




[cut=Логика Сидора][meet]
close_snd_hello = nil
close_snd_bye = nil
use = {!actor_enemy !actor_has_weapon !has_enemy} true, false
allow_break = false
trade_enable = true

;

[meet_2]
close_snd_hello = nil
close_snd_bye = nil
use = {!actor_enemy !actor_has_weapon !has_enemy} true, false
allow_break = false
trade_enable = false

;

[logic@esc_b2_trader]
active = remark@esc_b2_trader_offline
suitable = {=target_squad_name(esc_b2_trader_squad)} true
prior = 300
level_spot = trader
trade = misc\trade\order_traders\esc_b2_trader.ltx

;

[remark@esc_b2_trader]
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true
anim = ward_noweap
meet = meet
invulnerable = {!is_squad_enemy_to_actor(esc_b2_stalker_squad)} true, false
target = story | actor
on_info = %=control_npc_position(esc_b2_trader_control_spawn_point:1)%
on_info3 = {=is_squad_enemy_to_actor(esc_b2_stalker_squad) !is_squad_enemy_to_actor(esc_b2_trader_squad)} %=set_squad_goodwill(esc_b2_trader_squad:enemy)%

;

[remark@esc_b2_trader_offline]:remark@esc_b2_trader
on_info2 = {=dist_to_actor_le(3)} remark@esc_b2_trader_online %=esc_trader_sidor_sound_start%

[remark@esc_b2_trader_online]:remark@esc_b2_trader
on_info2 = {=dist_to_actor_ge(5)} remark@esc_b2_trader_offline %=esc_trader_sidor_sound_final%[/cut]

Логику Сидоровичу написал на основе логики СГМ-торговца на Скадовске. Тот заказанное оружие не "зажимает".

Что надо поправить, чтобы Сидорович не "обманывал" покупателей.


Сообщение отредактировал sergej5500 - Вс, 19.10.2014, 23:30
 
makdmДата: Пн, 20.10.2014, 00:02 | Сообщение # 1011
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, попробуй в секцию логики [logic@esc_b2_trader] дописать can_select_weapon = false

Терпение......
И все получится!
 
sergej5500Дата: Пн, 20.10.2014, 00:43 | Сообщение # 1012
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,
Совет отчасти помог. Сидор больше не забирает винтовки. Но в продаже стволы появляются не сразу.

Если сделать заказ, затем лечь спать и потом вернуться к Сидору, то ствола нет. Чтобы ствол появился, надо или сделать сейв и загрузиться с него или убежать от Сидора, чтобы тот ушёл в оффлайн. Затем вернуться.

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

У торговца на Скадовске аналогичная схема торговли. У торговца на Янове тоже. У тех стволы появляются без задержек.

[cut=Торговец на Скадовске][meet]
abuse = true
use = {!actor_enemy} true, false
trade_enable = true
meet_on_talking = false

;

[remark@zat_stalker_trader]
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true
anim = ward_noweap
meet = meet
invulnerable = true
target = story | actor
on_info = %=control_npc_position(zat_stalker_trader_spawn_point:0.3)%

;

[logic@zat_stalker_trader]
active = remark@zat_stalker_trader
suitable = {=check_npc_name(zat_stalker_trader)} true
prior = 300
post_combat_time = 0,0
trade = misc\trade\order_traders\zat_stalker_trader.ltx[/cut]

Строки can_select_weapon = false у него нет. Но автоматы он не "прикарманивает". Может быть, дело в Скадовске, как таковом. Какой параметр на Скадовске блокирует выбор неписем лучшего оружия?
 
makdmДата: Пн, 20.10.2014, 09:33 | Сообщение # 1013
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, надеюсь после правок НИ начинал?

Давай сделаем так, для начала, пропиши Сидору в specific_character, какой - нибудь слабенький автомат, например АКСУ или МП-5.
Сделай rank = 50. (<rank>50</rank>)
В логику пропиши can_select_weapon = false. Начни НИ.
Теперь посмотри, что получится.

Если не получится, то попробуй наоборот. Максимальный ранг и РПГ в specific_character. В логику can_select_weapon = false

Твоя задача - Сидор должен прекратить перевыбирать оружие.


Терпение......
И все получится!
 
alex_xp_77Дата: Вт, 21.10.2014, 16:44 | Сообщение # 1014
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Доброго дня !! можно ли посадить торговца, например сидоровича, только например поменять ему фамилию , например на петровича?? что нужно изменять в настройках, конфигах, подскажите пожалуста !!



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

alex_xp_77, В дескрипшене персонажа есть тег: <name>st_jup_a12_stalker_assaulter</name>
Имя можно написать прямо туда или в виде ссылки на строку из файла st_characters.xml


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

Всем добрый день. В СГМ есть особые инвентарные ящики - утилизаторы. Кладете в него оружие. Взамен получаете деньги.

Логика утилизатора.

[logic]
active = ph_idle@enable

[ph_idle@enable]
nonscript_usable = true
tips = st_utilizator_box_check_descr


Попробовал повесить на утилизатор метку - level_spot.

level_spot = actor_box

Результат нулевой. Метка не появляется. Утилизатор работает нормально. Строку level_spot = actor_box для пробы вставлял в обе секции логики утилизатора.

В чем может быть причина сбря?
 
makdmДата: Сб, 25.10.2014, 12:43 | Сообщение # 1017
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
В чем может быть причина сбря?

sergej5500, причина в том, что ни схема ph_idle, ни биндер bind_physic_object не обрабатывают параметр level_spot

Для обработки параметра необходимо в скрипт ph_idle.script прописать следующее:

1. В функцию set_scheme пишем

Код
st.level_spot  = utils.cfg_get_string(ini, section, "level_spot", npc, false, "", "nil")


2. В метод reset_scheme() пишем

Код
if self.st.level_spot == "actor_box"  then
level.map_add_object_spot(self.object:id(), "ui_pda2_actor_box_location", "st_ui_pda_actor_box")
end


Терпение......
И все получится!
 
alex_xp_77Дата: Пт, 31.10.2014, 14:22 | Сообщение # 1018
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Добрый день подскажите пожалуста, какова логика для нпс, для того что бы он сидел, если не сложно поподробнее, как его посадить например на ящик? вот тут http://SSMaker.ru/decacc22/ мне уже отвечали но по луа получил вылет, просто в логике еще новичек , видать что то не так , и по точкам что в них надо прописывать, по моему на скадовске азот сидел на стуле, да и сталкер в спальне, но карт у меня нету , делаю для тч, списать не от куда , помогите пожалуста понять!!Заранее большое спасибо!!

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

alex_xp_77, Логика НПС walker:
Код
[logic]
active = walker

[walker]
path_walk = bar_dolg_bunker_rest_1_walk    
path_look = bar_dolg_bunker_rest_1_look    


В SDK создается две связанные точки пути bar_dolg_bunker_rest_1_walk - та где сидит, bar_dolg_bunker_rest_1_look - та куда смотрит, в имени точки куда смотрит приписывается анимация |a=sit.
В all.spawn это выглядит так:
Код
[bar_dolg_bunker_rest_1_look]
points = p0
p0:name = wp00|a=sit
p0:flags = 0x1
p0:position = 219.80143737793,-5.44817924499512,125.315498352051
p0:game_vertex_id = 1198
p0:level_vertex_id = 54653

[bar_dolg_bunker_rest_1_walk]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = 217.560607910156,-5.21441125869751,123.737777709961
p0:game_vertex_id = 1198
p0:level_vertex_id = 53915


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
alex_xp_77Дата: Пт, 31.10.2014, 20:55 | Сообщение # 1020
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Но как я понял именно, bar_dolg_bunker, это расположение обьекта (нпс) то есть вписывать не обязательно Denis?? Так как нпс стоять будет на (например тестовой локации) Хотя ответ ваш исчерпывающий))Благодарен!!
Сделал как вы писали выше Денис, но при том что я прописал получается в игре вот это http://SSMaker.ru/6dba51d2/ , нпс просто стоит но не садится, вроде все сделал верно вот тут
точка look http://SSMaker.ru/a8270323/
точка walk http://SSMaker.ru/b1db4c94/
логика нпс http://SSMaker.ru/c1539d48/
помгите понять уважаемый Денис где ошибка ??
может смарт нужно прямо на ящике делать?7
Добрый вечер всем !! Было моей ошибкой просить вас сделать невозможное, нпс сидят в присяди, но скинуть ноги с ящика не дает им анимация которой для тч просто нету, хотя Денису 2000 отдельный поклон!!Очень благодарен за помошь!!




Сообщение отредактировал alex_xp_77 - Пн, 03.11.2014, 17:17
 
Поиск: