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

Kosha, Да, такое возможно только учтите, что вертолет обычно спавниться в all.spawn размещается под локацией с выключенным звуком, а в нужный момент появляется, убрать его можно обычным путем: alife():release()

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
KoshaДата: Сб, 27.09.2014, 21:48 | Сообщение # 992
Отмычка
Пользователи
Сообщений: 32
Награды: 0
Репутация: [ 0 ]

А просто поставить спавн скриптом, проход маршрута и его деспавн не получится?
 
KaрибДата: Пн, 29.09.2014, 23:09 | Сообщение # 993
Отмычка
Пользователи
Сообщений: 41
Награды: 0
Репутация: [ 20 ]

Доброго времени суток. В Sgm 2.2 + все фиксы + AI Aditions заметил такую проблему: NPC стреляют в ГГ строго тогда, когда он находится на расстоянии меньше 30 метров. В других неписей стреляют с более дальнего расстояния, как и положено. Решил проверить в оригинальной игре - такая же ерунда. Сквады атакуют ГГ только если он ближе к ним чем на 30 метров. Я так понял тут дело в логике (Т.к правка Eye_Range и Eye_fov ничего не принесла, да и как я уже писал, друг в друга неписи стреляют с более дальнего расстояния). Какой файл отвечает за это расстояние ? Заранее спасибо!

Сообщение отредактировал Kaриб - Вт, 30.09.2014, 11:42
 
makdmДата: Вт, 30.09.2014, 13:00 | Сообщение # 994
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата Kaриб ()
Какой файл отвечает за это расстояние ?


Файл xr_combat_ignore.script

Причём это расстояние проверяется, только для членов сквада, работающего под симуляцией (sim_avail = true).


Терпение......
И все получится!
 
KaрибДата: Вт, 30.09.2014, 14:15 | Сообщение # 995
Отмычка
Пользователи
Сообщений: 41
Награды: 0
Репутация: [ 20 ]

makdm, Большое спасибо! У меня всё получилось. В общем в файле xr_combat_ignore.script находим строчку se_obj.position:distance_to_sqr(se_enemy.position) > 900 then
return false.

И вот это число 900 (30м * 30м) мне и нужно было изменить.
 
makdmДата: Вт, 30.09.2014, 14:30 | Сообщение # 996
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Kaриб, можно сделать и так. Но более правильно ( так как в вашем случае под "раздачу" попадут и уникальные сквады ) перед строчкой

local se_enemy = alife():object(enemy:id())

прописать

if enemy:id() == db.actor:id() then
return true
end


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

Kosha, Попробуй и отпишись. Но разработчики в ТЧ и ЗП поступали именно так, как я тебе написал.

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

Всем добрый день.

Имеются два сквада со стори ид: squad_1 и squad_2. С помощью какой функции в xr_conditions можно проверить, не являются ли эти сквады врагами друг другу? Если не являются, то их надо будет поссорить. Вызов функции из рестриктора. Один сквад после гибели должен будет отреспиться по новой. Можно бы обойтись без проверки враждебности. Но тогда функцию set_squads_enemies надо будет вызывать каждый раз после очередного спавна сквада.
 
makdmДата: Вс, 05.10.2014, 02:32 | Сообщение # 999
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
С помощью какой функции в xr_conditions можно проверить


Готовой функции нет, но можно добавить:

Код
function is_squads_enemies( actor, obj, p )
local squad_1 = get_story_squad(p[1])
local squad_2 = get_story_squad(p[2])
if squad_1 and squad_2 then
return game_relations.is_factions_enemies(squad_1:get_squad_community(), squad_2:get_squad_community())
end
return false
end


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


Сообщение отредактировал makdm - Вс, 05.10.2014, 02:35
 
alex_xp_77Дата: Вс, 12.10.2014, 17:43 | Сообщение # 1000
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

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

 
denis2000Дата: Вс, 12.10.2014, 20:08 | Сообщение # 1001
Полевой исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 1002
Полевой Исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 1003
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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

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

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

Терпение......
И все получится!
 
sergej5500Дата: Пн, 20.10.2014, 00:43 | Сообщение # 1005
Полевой Исследователь
Ученые сталкеры
Сообщений: 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 у него нет. Но автоматы он не "прикарманивает". Может быть, дело в Скадовске, как таковом. Какой параметр на Скадовске блокирует выбор неписем лучшего оружия?
 
Поиск: