|
Модостроение. Спавн и логика
|
|
| denis2000 | Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Спавн и логика Создание объектов на локации и логика поведения этих объектов Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| denis2000 | Дата: Сб, 14.06.2014, 19:02 | Сообщение # 931 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 (  ) Это ограничение не действует, если дистанция до точки спавна менее 150 метров (примерно). Но это уже на глазах игрока. Да все выпрыгивает из офлайна на расстоянии 150 метров, респавн на смартах обычно происходит на этой дистанции, многие скрипты заточены именно под эту дистанцию.
Выход один: подробно логировать процесс спавна сквадов и анализировать, где происходит затык.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вс, 15.06.2014, 21:34 | Сообщение # 932 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Сделал НПС с логикой.
[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 метров, то поворачивать непися смысла нет. Пусть смотрит куда хочет. Можно ли в строку добавить поддержку дистанции и как это правильно сделать?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| makdm | Дата: Вс, 15.06.2014, 22:06 | Сообщение # 933 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| 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 |
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| sergej5500 | Дата: Ср, 18.06.2014, 21:05 | Сообщение # 934 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Функции в 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]
Если эти ф-ии пригодны только для НПС, то какие функции подойдут для данной задачи?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| FantomICW | Дата: Ср, 18.06.2014, 21:21 | Сообщение # 935 |
 Лидер «Свободы»
Свобода
Сообщений: 4438
| 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)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
| sergej5500 | Дата: Сб, 21.06.2014, 23:10 | Сообщение # 936 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Заинтересовал один вопрос. Имеется эксклюзивный сквад. Для сквада есть персональные работы на смарте. Одному из НПС требуется заспавнить в рюкзак квестовый предмет. Можно ли это сделать в секции логики работы на смарте? Какой функцией можно воспользоваться? Профиль НПС значения не имеет. Нужно только взять у него предмет.
Или для данной задачи обязательно нужен эксклюзивный НПС? С прописыванием предмета в character_descr_...
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| makdm | Дата: Вс, 22.06.2014, 01:12 | Сообщение # 937 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, в одной из активных секций логики прописать
on_info = {-поршень} %+поршень =give_item( Секция предмета )%
Терпение...... И все получится!
|
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| denis2000 | Дата: Вс, 29.06.2014, 11:24 | Сообщение # 938 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| 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)}
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| Shram22 | Дата: Вс, 29.06.2014, 17:20 | Сообщение # 939 |
|
Удаленные
| Помогите переношу спавн перенесённой локации кордон из чн в зп. И когда добавляю эти секцию [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 |
| |
|
| Эти 0 пользователя(ей) поблагодарили Shram22 за это полезное сообщение: |
|
|
| denis2000 | Дата: Вс, 29.06.2014, 23:57 | Сообщение # 940 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Shram22, Или формат секций не соответствует вашему компилятору для ЗП или одно из двух.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| Shram22 | Дата: Пн, 30.06.2014, 09:59 | Сообщение # 941 |
|
Удаленные
| denis2000, а в чём именно проблемма?
В том, что вы используете разные компиляторы all.spawn и они делают разные секции объектов. Выход использовать один компилятор или подгонять секции одного под секции другого (не рекомендую, поскольку так можно надолго завязнуть). denis2000
Сообщение отредактировал Shram22 - Пн, 30.06.2014, 10:05 |
| |
|
| Эти 0 пользователя(ей) поблагодарили Shram22 за это полезное сообщение: |
|
|
| STALKER_2010 | Дата: Пн, 30.06.2014, 17:28 | Сообщение # 942 |
 Гражданский
Пользователи
Сообщений: 12
| Здравствуйте! Пишу мод на ALife, но есть некоторые неприятности - требуется реализовать моментальную(или с задержкой не более 5 реальных секунд) остановку всех боёв на локации. Отключение схем combat и mob_combat в action приводит к различным несостыковкам, к тому же бой не всегда останавливается. К тому же необходимо отключать только бои, которые не затрагивают никакие квесты(нет story_id). В скриптах GSC такого не нашёл, Google выдаёт фигню по запросу, поиск по этой теме ответа не дал. Подскажите пожалуйста, в какую сторону копать, или, что лучше, приведите пример кода. Уровень знаний LUA - не новичок и не профи - можно использовать терминологию.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили STALKER_2010 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вт, 01.07.2014, 12:28 | Сообщение # 943 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день.
Каким образом можно измерить расстояние от НПС со стори ИД под индивидуальной логикой до точки, заданной в way_zaton? Функция для проверки вызывается в логике этого НПС и переключает его на другую секцию логики. До точки примерно 15-20 метров. Если это сделать нельзя, то можно ли выполнить измерение дистанции он НПС до объекта класса spot (имеет стори-ид)? Какими ф-иями можно воспользоваться?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Вт, 01.07.2014, 13:23 | Сообщение # 944 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Готовой нет, можно пробовать такую (вызывается из логики НПС и возвращает true если расстояние меньше заданного): Код function distance_to_point_le(actor, npc, p) local patrol_way = patrol(p[2]) local point_id = 0 if p[3] then point_id = tonumber(p[3]) end if npc then return npc:position():distance_to_sqr(patrol_way:point(point_id)) < p[1]*p[1] end return false end где p[1] - расстояние, p[2] - имя пути, p[3] - индекс точки пути (если не задано то 0) Пример: Код {=distance_to_point_le(10:zat_wa_way_9:1)}
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| STALKER_2010 | Дата: Вт, 01.07.2014, 19:06 | Сообщение # 945 |
 Гражданский
Пользователи
Сообщений: 12
| STALKER_2010, или просто, как остановить бой если есть клиентский или серверный объект(неважно)? Применить его в схеме логики не проблема для всех персонажей. Ответьте пожалуйста! Этот модуль очень важен для моего мода в целом.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили STALKER_2010 за это полезное сообщение: |
|
|
|