Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Скрипты
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2, 3, 4, 5, 6
RayTwitty
Цитата(Pavel_Blend @ 07.09.2020, 16:02) *
При изучении нужно знать две вещи: сам луа и собственно функции движка (в блендере это называется API, наверное в X-Ray это тоже API в виде lua функций).

Луа в сталкере это по сути интерфейс, осуществляющий доступ к внутридвижковым объектам. Этакая надстройка на логикой внутри движка.

Цитата(Pavel_Blend @ 07.09.2020, 16:02) *
как вообще можно встроить свои собственные скрипты в сталкер? Я пока знаю, что можно в диалогах прописать вызов скрипта и функции. А какие ещё способы есть?

Можно просто вызвать любую функцию в скрипте, тогда он инициализируется. Поскольку, почти все начинают работать с конкретными объектами и чаще всего с актором, свои скрипты инициализируют из bind_stalker.script.

Цитата(Pavel_Blend @ 07.09.2020, 16:02) *
И как сделать редактор погоды в игре?

В ТЧ без правок движка никак. Исходя из первой моей цитаты, тебе потребуется написать экспорт движковых функций в Lua, после чего написать на основе оконной системы сталкера весь интерфейс. Задача весьма нетривиальная и не на пару часов.
Pavel_Blend
Цитата(RayTwitty @ 07.09.2020, 21:20) *
Можно просто вызвать любую функцию в скрипте, тогда он инициализируется. Поскольку, почти все начинают работать с конкретными объектами и чаще всего с актором, свои скрипты инициализируют из bind_stalker.script.

а вообще, какой принцип работы скриптов в сталкере? Вот в blender game engine есть такое понятие, как такт, который длится 1/60 секунд. Во время этого такта выполняются действия. А в сталкере как всё работает? Например, как работает bind_stalker? В этом скрипте каждый кадр выполняется определённая функция? Или данный скрипт выполняется один раз за весь сеанс игры? И вообще где выполняется основная работа скриптовой системы? Вот к примеру скрипт из диалога выполнится только один раз. А какие скрипты непрерывно работают в игре и обрабатывают события?
Diesel
Pavel_Blend, движок заранее заготовленные внедряет свои щупальца в скрипты. И ждёт их изменений, согласно обновлений в движке.
В движке создаются скрипты, как основа, для луа. Каждая функция луа, заранее прописана в движок. Если и не прописана, то предок этой функции всё равно в движке есть.

В поиск визуалки забей .def и увидишь сколько их там.
RayTwitty
Цитата(Pavel_Blend @ 08.09.2020, 17:44) *
В этом скрипте каждый кадр выполняется определённая функция?

Нет, в движке есть глобальный шедулер (апдейтер), из которого уже апдейтятся все онлайновые объекты (он в свою очередь вроде бы как раз из рендера должен вызываться, но я уже не помню). Покадрового апдейта в скриптах нет, у актора вроде бы интервал каждые 20-40 мс, он динамичен, для этого есть переменная delta в аргументе. У других объектов интервал в целях оптимизации может быть больше.

Цитата(Pavel_Blend @ 08.09.2020, 17:44) *
Или данный скрипт выполняется один раз за весь сеанс игры?

Код который ничем не обернут (не в функции, не в таблице и т.д.), вызывается при инициализации скрипта. Сам скрипт может инициализироваться только при его вызове, и это не гарантированно при старте игры. бинд_сталкер например инитится при появлении онлайнового актора, если конечно до этого момента еще кто-нибудь в этот скрипт не полезет за чем нибудь. Проще говоря, скрипты инициализируются по мере надобности.

Плюс те же функции в биндерах, вызываются при определенных события. Например net_spawn при появлении актора на уровне, update - периодический апдейт (см. выше) и т.д.

Цитата(Pavel_Blend @ 08.09.2020, 17:44) *
А какие скрипты непрерывно работают в игре и обрабатывают события?

Ну кроме апдейта объектов и некоторых апдейтов в UI-интерфейсах таких нет.
Pavel_Blend
А с помощью скриптов возможно сделать такую вещь:

добавить отметки в пда на все динамические объекты. На сталкеров, на мутантов, тайники, физические объекты, лампочки, бочки, аномалии, еду, патроны, оружие. В общем на всё. И сделать так, чтобы при убийстве сталкера, в пда была метка его трупа. Только метка меняла цвет на серый. Была метка бандита, к примеру, красной, а при убийстве стала серой. И чтобы можно было скрывать метки по типу: аномалии, тайники, трупы, физ. объекты и т. д.

И как можно полностью отключить респавн? Чтобы новые мутанты и сталкеры не появлялись?
Yara
Цитата(Pavel_Blend @ 10.09.2020, 15:23) *
И как можно полностью отключить респавн? Чтобы новые мутанты и сталкеры не появлялись?

Попробуй в se_respawn.script заремить строку self:spawn(), а для отметок всего использую такое:
...

CODE

По клавише в главном меню: ui_main_menu.script,
-----------------------------
function main_menu:OnKeyboard(dik, keyboard_action) --virtual function
...
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
...
if dik == DIK_keys.DIK_NUMPAD0 then
if (level.present() and db.actor ~= nil and db.actor:alive()) then
this.mark_all_objects()
end
end



В самый конец файла добавить:

function mark_all_objects()
for i=1,65535,1 do
local obj = alife():object(i)
if (obj and obj.parent_id and obj.parent_id == 65535) then
local obj_name = obj:name()

-- from _g.script

if (IsStalker(obj)) then
level.map_add_object_spot(obj.id, "obj_location", tostring(obj_name))
end
if (IsMonster(obj)) then
--if (IsMonster(obj) and obj:alive()) then -- только живых
level.map_add_object_spot(obj.id, "obj_location", tostring(obj_name))
end

if (
isWeapon(obj) or -- оружие

-- from lua_help.script

get_clsid(obj)==clsid.wpn_ammo or -- патроны
get_clsid(obj)==clsid.wpn_ammo_og7b or -- выстрелы рг/пг
get_clsid(obj)==clsid.wpn_ammo_vog25 or
get_clsid(obj)==clsid.wpn_ammo_m209 or

get_clsid(obj)==clsid.obj_explosive or -- взрывные бочки и прочее

get_clsid(obj)==clsid.obj_food or -- еда и медицина
get_clsid(obj)==clsid.obj_antirad or
get_clsid(obj)==clsid.obj_bandage or
get_clsid(obj)==clsid.obj_bottle or
get_clsid(obj)==clsid.obj_medkit or

get_clsid(obj)==clsid.equ_stalker_s or -- костюмы

get_clsid(obj)==clsid.artefact_s or -- арты
get_clsid(obj)==clsid.artefact or

get_clsid(obj)==clsid.inventory_box or -- тайники
get_clsid(obj)==clsid.obj_phskeleton or -- физ.объекты
get_clsid(obj)==clsid.obj_phys_destroyable or
get_clsid(obj)==clsid.obj_physic or
get_clsid(obj)==clsid.obj_breakable or
get_clsid(obj)==clsid.script_phys or
get_clsid(obj)==clsid.obj_climable or -- лестницы
get_clsid(obj)==clsid.projector or -- прожектор
get_clsid(obj)==clsid.hanging_lamp or -- лампочки

get_clsid(obj)==clsid.ameba_zone or -- аномалии
get_clsid(obj)==clsid.torrid_zone or
get_clsid(obj)==clsid.zone or
get_clsid(obj)==clsid.zone_acid_fog or
get_clsid(obj)==clsid.zone_bfuzz_s or
get_clsid(obj)==clsid.zone_dead or
get_clsid(obj)==clsid.zone_galant_s or
get_clsid(obj)==clsid.zone_galantine or
get_clsid(obj)==clsid.zone_mbald_s or
get_clsid(obj)==clsid.zone_mincer_s or
get_clsid(obj)==clsid.zone_mosquito_bald or
get_clsid(obj)==clsid.zone_radioactive or
get_clsid(obj)==clsid.zone_rusty_hair or
get_clsid(obj)==clsid.nogravity_zone or

get_clsid(obj)==clsid.level_changer or -- переходы
get_clsid(obj)==clsid.respawn or -- респавнеры
get_clsid(obj)==clsid.smart_terrain or -- смарты
get_clsid(obj)==clsid.script_restr or -- рестрикторы
get_clsid(obj)==clsid.script_zone or
get_clsid(obj)==clsid.car_s or -- машины
get_clsid(obj)==clsid.script_heli or -- вертолёты
get_clsid(obj)==clsid.helicopter
)
then
level.map_add_object_spot(obj.id, "obj_location", tostring(obj_name))
end

end
end
end



Добавить в map_spots.xml,
-----------------------------
<!-- debug icon -->
<obj_location>
<level_map spot="obj_location_spot"/>
<mini_map spot="obj_location_spot"/>
</obj_location>
<obj_location_spot x="0" y="0" width="4" height="4" alignment="c" stretch="1">
<texture r="0" g="255" b="255">ui_minimap_point</texture>
</obj_location_spot>

RayTwitty
Цитата(Pavel_Blend @ 10.09.2020, 12:23) *
А с помощью скриптов возможно сделать такую вещь:

добавить отметки в пда на все динамические объекты. На сталкеров, на мутантов, тайники, физические объекты, лампочки, бочки, аномалии, еду, патроны, оружие. В общем на всё.

Можно. Перебираешь все айдишники (1..65536, 0 - актор, его пропускаем) объектов в игре через alife():object(id), или если нужно только онлайновых то level.object_by_id(id). Добавляем метку через level.map_add_object_spot.

Цитата(Pavel_Blend @ 10.09.2020, 12:23) *
И сделать так, чтобы при убийстве сталкера, в пда была метка его трупа. Только метка меняла цвет на серый. Была метка бандита, к примеру, красной, а при убийстве стала серой.

Так это штатный механизм ПДА. Надо только тег level_spot/mini_spot в xml конфиге проверить/сделать.

Цитата(Pavel_Blend @ 10.09.2020, 12:23) *
И чтобы можно было скрывать метки по типу: аномалии, тайники, трупы, физ. объекты и т. д.

Для этого нужно написать UI, в котором добавлять/удалять метки по типу объекта. Скрывать нельзя, только если экспортировать из движка получение CUIStatic метки.

Цитата(RayTwitty @ 07.09.2020, 21:20) *
В ТЧ без правок движка никак. Исходя из первой моей цитаты, тебе потребуется написать экспорт движковых функций в Lua, после чего написать на основе оконной системы сталкера весь интерфейс. Задача весьма нетривиальная и не на пару часов.

Вот кстати чувак сделал консольные команды, к которым можно привязаться в интерфейсе biggrin.gif
https://www.gameru.net/forum/index.php?s=&a...t&p=1680713
Правда команд мало, и вообще это нужно было бы сделать через экспорт методов, но уж как есть.
Pavel_Blend
RayTwitty, попробовал редактор погоды. Трудновато редактировать. Хотелось бы иметь ползунки, чтобы плавно менять цвета. Ну или чтобы были горячие клавиши. Например, стрелки (вниз-вверх - листать параметры, влево-вправо - менять значения параметров). И ещё трудно угадать цвет солнца. Всё таки без игрового редактора удобнее тем, что можно загрузить в фотошоп текстуру неба и пипеткой скопировать цвет солнца. А потом пропорционально его увеличить или уменьшить.

А что ещё интересного можно сделать с помощью скриптов, кроме проставления меток?

И вопрос: я проставил метки на всех сталкеров и удалил респавн. Зачистил локации от врагов, но не от всех. Остались монолитовцы, к примеру. Они видны на карте, но их там нет. И монстры. Монолитовцы в припяти возле гаражей у костра. Они не спавнятся. Не выполнено определённое условие для их спавна. В userdata у них прописано это:

CODE
[smart_terrains]
none = true

[logic]
active = kamp1
combat_ignore = combat_ignore

;on_signal = arrived | camper2 %+pri_wave1_side_start%

[kamp1]
center_point = pri_sideway_left_kamp

[combat_ignore]


Как заспавнить с помощью скриптов объекты, которые уже есть, но не заспавнены (как монолитовцы).

AndreySol
Цитата
А что ещё интересного можно сделать с помощью скриптов, кроме проставления меток?

Ну так весь сюжет в общем-то скриптами строится. Вся логика объектов в конечном счете разворачивается в скрипты(xr_logic.script и все схемы поведения), все гулаги и их работы(xr_gulag.script). Спавн объектов, всякие UI-окна с различным функционалом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.