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

Цитата sergej5500 ()
В порядке гипотезы. Возможно, сквады респятся, но куда-то исчезают

А мне кажется вообще не спавняться несмотря на вызов соответствующей функции. В любом случае стоит поставить метки на отряды и включить подробное логирование используемых функций (вполне возможно что там не выполняется какое-то условие и спавн не проходит).

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


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

makdm, denis2000,

Попробовал поставить метки. Получилось следующее.

[cut=Скрины]1. Спавн еще не произошел.


2. Сквады отреспились. Все хорошо.


3. Прошел мимо ВНЗ. Маркеры чуть поменяли положение. Видимо, из-за расстановки неписей по работам. Все хорошо.


4. Отхожу от ВНЗ. Удаления сквадов пока не было.


5. Сквады удалились.


6. Возвращаюсь к ВНЗ, Респятся только два сквада.


[/cut]

Добавлено (14.06.2014, 11:00)
---------------------------------------------
Пока вижу 2 направления решения проблемы.

1. Спавнить неписей одним сквадом в 30 НПС или двумя по 15 НПС.

2. Попробовать сделать для каждого сквада отдельный рестриктор в точке спавн-пойнта этого сквада.
Каждый сквад спавнить и убирать индивидуально из своего рестриктора.

P.S. Просто интересно, в чем "затык". Почему движок прекрасно спавнит сквады в первый раз и "капризничает" во второй раз.

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

Цитата sergej5500 ()
Почему движок прекрасно спавнит сквады в первый раз и "капризничает" во второй раз

Возможно потому, что считает, что количество НПС в смарте уже достигло максимально разрешённого количества.
Т.е. удаление сквадов из смарта происходит некорректно.
Попробуйте заменить функцию удаления сквадов на такую

function zat_b38_alfa_base_clean()
xr_effects.clear_smart_terrain(db.actor, nil, {"zat_b38"})
end

Если не поможет, то попробуйте сделать количество НПС меньше 30, например по 5 НПС в скваде.


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

makdm,

Функцию clear_smart_terrain(db.actor, nil, {"zat_b38"}) попробовал. Результат нулевой. Все 5 сквадов удаляются. При повторном приближении к смарту респятся два сквада.

Уменьшение чмсла НПС в скваде так же не дает результата. Уменьшил число ботов в скваде до 3. При первом проходе. как и ожидалось, были 15 НПС. При втором приближении 6 НПС (два сквада). То есть ограничение действует по числу сквадов. (Не больше 2). Это ограничение не действует, если дистанция до точки спавна менее 150 метров (примерно). Но это уже на глазах игрока.

Спавн всех неписей одним сквадом дает заметное подвисание игры при входе смарта в онлайн. При пяти сквадах тормозов заметно меньше.
 
denis2000Дата: Сб, 14.06.2014, 19:02 | Сообщение # 935
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
Это ограничение не действует, если дистанция до точки спавна менее 150 метров (примерно). Но это уже на глазах игрока.

Да все выпрыгивает из офлайна на расстоянии 150 метров, респавн на смартах обычно происходит на этой дистанции, многие скрипты заточены именно под эту дистанцию.

Выход один: подробно логировать процесс спавна сквадов и анализировать, где происходит затык.


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

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

Сделал НПС с логикой.

[cut=Логика][logic@zat_b38_alfa_plennic3]
active = remark@zat_b38_alfa_plennic3
suitable = {=check_npc_name(zat_b38_alfa_plennic4)} true
prior = 300
post_combat_time = 0,0

[remark@zat_b38_alfa_plennic3]:remark@zat_b38_alfa_plennic
on_info2 = {!is_squad_friend_to_actor(zat_b38_alfa_plennic4_squad)} %=set_squad_goodwill(zat_b38_alfa_plennic4_squad:friend)%
on_info3 = {+petrusha_money_quests_reward =dist_to_actor_ge(225)} %=remove_squad(zat_b38_alfa_plennic4_squad) =create_squad(zat_b38_alfa_plennic5_squad:zat_b38)%

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

Схема remark для НПС использована потому, что там, где стоит непись, нет сетки. Чтобы НПС смотрел на игрока, в логике есть строка target = story | actor.

Непись неплохо поворачивается.
[cut=Скрины]
[/cut]

Собственно, вопрос. На какой дистанции действует этот эффект? Если игрок дальше 10 метров, то поворачивать непися смысла нет. Пусть смотрит куда хочет. Можно ли в строку добавить поддержку дистанции и как это правильно сделать?
 
makdmДата: Вс, 15.06.2014, 22:06 | Сообщение # 937
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, для этого нужно править файл xr_remark.script
Попробуйте сделать так:

[cut noguest]В методе UPDATE в файле прописано

local target = self:get_target()

Вот ниже этого пропишите
if target then
if self.st.target_id == db.actor:id() then
if self.object:position():distance_to( db.actor:position() ) > 10 then
target = nil
end
end
end

Если всё получится, то в схему можно ввести параметр, например look_actor_distance
Тогда в файл xr_remark.script нужно после строчки
st.snd_anim_sync = utils.cfg_get_bool(ini, section, "snd_anim_sync", npc, false)
написать
st.distance_actor = utils.cfg_get_number( ini, section, "look_actor_distance", npc, false, 10 )

А проверку сделать так

if target then
if self.st.target_id == db.actor:id() then
if self.object:position():distance_to( db.actor:position() ) > self.st.distance_actor then
target = nil
end
end
end

А в логику remark ввести параметр
look_actor_distance = 10
Ну или другая цифра.[/cut]


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


Сообщение отредактировал makdm - Вс, 15.06.2014, 22:26
 
sergej5500Дата: Ср, 18.06.2014, 21:05 | Сообщение # 938
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

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

Функции в xr_conditions.

[cut=Код]function distance_to_obj_ge(actor, npc, p)
local npc_id = get_story_object_id(p[1])
local npc1 = npc_id and alife():object(npc_id)
if npc1 then
return db.actor:position():distance_to_sqr(npc1.position) >= p[2]*p[2]
end
return false
end

function distance_to_obj_le(actor, npc, p)
local npc_id = get_story_object_id(p[1])
local npc1 = npc_id and alife():object(npc_id)
if npc1 then
return db.actor:position():distance_to_sqr(npc1.position) < p[2]*p[2]
end
return false
end[/cut]

Можно ли применить эти функции для измерения дистанции до объекта (не НПС)? Объект имеет стори-ид.
[cut=Объект]
[zat_b38_firepos_spot]:default_spot
story_id = zat_b38_firepos_spot[/cut]

Если эти ф-ии пригодны только для НПС, то какие функции подойдут для данной задачи?
 
FantomICWДата: Ср, 18.06.2014, 21:21 | Сообщение # 939
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, эти проверки подходят и для объектов (не НПС). И оно и так и так проверяет конкретный story_id:
Цитата sergej5500 ()
local npc_id = get_story_object_id(p[1])

Вот, к примеру, в оригинале ЗП используется эта функция в файле configs\scripts\jupiter\jup_a6_help_counter.ltx:
Код
=distance_to_obj_ge(jup_b202_actor_treasure:100)



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

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

Заинтересовал один вопрос. Имеется эксклюзивный сквад. Для сквада есть персональные работы на смарте.
Одному из НПС требуется заспавнить в рюкзак квестовый предмет. Можно ли это сделать в секции логики работы на смарте? Какой функцией можно воспользоваться? Профиль НПС значения не имеет. Нужно только взять у него предмет.

Или для данной задачи обязательно нужен эксклюзивный НПС? С прописыванием предмета в character_descr_...
 
makdmДата: Вс, 22.06.2014, 01:12 | Сообщение # 941
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, в одной из активных секций логики прописать

on_info = {-поршень} %+поршень =give_item( Секция предмета )%


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

Добрый вечер. Интересует такой вопрос.

Имеется сквад из 30 НПС.
[cut=Сквад]
[zat_b38_alfa_squad]:online_offline_group
faction = alfa_force
npc = respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force
story_id = zat_b38_alfa_squad
spawn_point = zat_b38_respawn_point
target_smart = zat_b38
always_arrived = true[/cut]

Допустим, что один из неписей погиб. Затоптали кабаны, например. В скваде осталось 29 ботов.

Возможно ли в логике рестриктора проверить число живых неписей в скваде? Какой функцией можно воспользоваться?

Так же интересует вопрос. Можно ли сравнить кол-во живых НПС с каким-то определенным числом. Если неписей меньше 15, то сквад убрать и отреспить по новой.


Сообщение отредактировал sergej5500 - Сб, 28.06.2014, 22:59
 
denis2000Дата: Вс, 29.06.2014, 11:24 | Сообщение # 943
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Добавить НПС в сквад можно функцией function create_squad_member(actor, obj, p)
р[1] - Имя секции НПС
p[2] - Имя секции сквада
p[3] - Точка спавна (может не задаваться)
Пример:
Код
%=create_squad_member(pri_a17_military_captain_tarasov_strong:pri_a16_military_squad)%


Проверка на число НПС в скваде function squad_npc_count_ge(actor, npc, p)
р[1] - Имя секции сквада
p[2] - число НПС
Если число НПС больше проверяемого функция выдаст true
Пример:
Код
{=squad_npc_count_ge(pri_a16_military_squad:4)}


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



Помогите переношу спавн перенесённой локации кордон из чн в зп. И когда добавляю эти секцию [cut noguest=секция][14140]
; cse_abstract properties
section_name = physic_destroyable_object
name = shkaf_work_01_door_0004
position = -122.860298156738,-29.9799995422363,-371.085906982422
direction = 0,-4.71236276626587,0

; cse_alife_object properties
game_vertex_id = 1179
distance = 0
level_vertex_id = 2383
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static

[logic]
cfg = scripts\door_metal_small_unlocked.ltx
END

; cse_visual properties
visual_name = dynamics\door\shkaf_work_01_door
visual_flags = 0x1

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link

upd:num_items = 0xc7

upd:position = 0,7,0
upd:cse_alife_object_physic__unk1 = 46015152,0,7
upd:cse_alife_object_physic__unk2 = 0,46015536,0
upd:cse_alife_object_physic__unk3 = 0,7,0,46016304

[14233]
; cse_abstract properties
section_name = komp_monitor
name = esc_komp_monitor
position = -244.919998168945,-23.9468040466309,-132.896026611328
direction = 0,0.6875,0

; cse_alife_object properties
game_vertex_id = 1179
distance = 0
level_vertex_id = 2383
object_flags = 0xffffff3a

; cse_visual properties
visual_name = dynamics\el_tehnika\komp_monitor_screen_1

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link

upd:num_items = 0xc7

upd:position = 0,7,0
upd:cse_alife_object_physic__unk1 = 46238288,0,7
upd:cse_alife_object_physic__unk2 = 0,46237008,0
upd:cse_alife_object_physic__unk3 = 0,7,0,46239760

[14234]
; cse_abstract properties
section_name = komp_klava
name = esc_komp_klava
position = -244.745483398438,-23.9441795349121,-133.606979370117
direction = 0,1.04124999046326,0

; cse_alife_object properties
game_vertex_id = 1179
distance = 0
level_vertex_id = 2383
object_flags = 0xffffff3a

; cse_visual properties
visual_name = dynamics\el_tehnika\komp_klava

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link

upd:num_items = 0xc7

upd:position = 0,7,0
upd:cse_alife_object_physic__unk1 = 46378240,0,7
upd:cse_alife_object_physic__unk2 = 0,46378624,0
upd:cse_alife_object_physic__unk3 = 0,7,0,46379392

[14235]
; cse_abstract properties
section_name = bottle_3l
name = esc_bottle_3l_0000
position = 12.071647644043,1.75919198989868,259.709533691406
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 1179
distance = 0
level_vertex_id = 2383
object_flags = 0xffffff3a

; cse_visual properties
visual_name = dynamics\kitchen_room\bottle_3l

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10

upd:num_items = 0xc7

upd:position = 0,7,0
upd:cse_alife_object_physic__unk1 = 46407744,0,7
upd:cse_alife_object_physic__unk2 = 0,46410560,0
upd:cse_alife_object_physic__unk3 = 0,7,0,46409920

[/cut]

аль спавн не запаковывается


Сообщение отредактировал Shram22 - Вс, 29.06.2014, 19:17
 
denis2000Дата: Вс, 29.06.2014, 23:57 | Сообщение # 945
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Shram22, Или формат секций не соответствует вашему компилятору для ЗП или одно из двух.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Поиск: