Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Редактирование и создание скриптов
denis2000Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Редактирование и создание скриптов

Редактирование и создание скриптов на языке LUA

Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[ Если у вас не открывается файл CHM(Этот текст скрыт от гостей) ]


[ Где найти лог игры после вылета ]
[ Получение более подробной информации о вылете (ХОВАН) ]



Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы,
статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
denis2000Дата: Пт, 23.10.2015, 20:13 | Сообщение # 691
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

avn1975, Передавайте привет DirectX11 и GSC с их кривым четвертым рендером.

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

Добрый день.

Добавил в чистый Зов Припяти персональные рюкзаки и взрывающиеся заряды в стиле СГМ. Встала задача установки на эти объекты меток на карте.

С персональными рюкзаками справился быстро. Использовал функцию generic_physics_binder:net_spawn(data) из bind_physic_object.scripts. Добавил туда код.

[ Функция ]


В функцию generic_physics_binder:net_destroy() дописал код.

[ Функция ]


Дописал нужные секции в xml_файлы. Результат меня удовлетворил. Метки ставятся и удаляются.



Возникло два вопроса.

1. У меня есть 5 рюкзаков (дистанционных зарядов). remote_explosive_box_1, remote_explosive_box_2 и т.д.

Для установки меток можно применить функцию. Для трех объектов она выглядит так.

if (self.object:section() == "remote_explosive_box_1" or self.object:section() == "remote_explosive_box_2" or self.object:section() == "remote_explosive_box_3") then
level.map_add_object_spot(self.object:id(), "ui_pda2_actor_rukzak_location", "st_ui_pda_actor_rukzak")
end

Как её подкорректировать, чтобы она ставила метку по маске remote_explosive_box_..?

2. Планирую создать рюкзаки сталкеров с хабаром. Наподобие рюкзаков, появляющихся после активации флешек в СГМ. Например, рюкзак Чапая. Рюкзаки будут называться esc_b1_stalker_commander_deserve, esc_b6_bandit_commander_deserve и т.д. К имени непися, которому принадлежит рюкзак, припишу deserve. Рюкзак будет юзабелен после получения наводки. Квестовая записка esc_b1_stalker_commander_deserve_notes, esc_b6_bandit_commander_deserve_notes, и т.д.

Метка на рюкзак сталкера должна ставиться при наличии у ГГ соответствующей квестовой записки-наводки. Функция наподобие такой.

if self.object:section() == "esc_b1_stalker_commander_deserve" and db.actor:object("esc_b1_stalker_commander_deserve_notes") ~= nil then
level.map_add_object_spot(self.object:id(), "ui_pda2_actor_rukzak_location", "st_ui_pda_actor_rukzak")
end

Если таких рюкзаков будет двадцать, то потребуется двадцать функций. Можно ли эту функцию обобщить, а списки рюкзаков и записок вынести в таблицы. Как это правильно сделать?
 
denis2000Дата: Вс, 25.10.2015, 17:23 | Сообщение # 693
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
Как её подкорректировать, чтобы она ставила метку по маске remote_explosive_box_..?

Код
if string.find(self.object:section(), "remote_explosive_box_") ~= nil then


Цитата sergej5500 ()
Можно ли эту функцию обобщить, а списки рюкзаков и записок вынести в таблицы. Как это правильно сделать?

Да, делаете объекты с именами секции начинающимися одинаково и отличающимися лишь индексом в конце, затем проверяете содержит ли имя секции предмета определенную комбинацию символов (как например: remote_explosive_box_).
Функция string.find(S, T) возвращает позицию первого символа подстроки T в строке S. Если строка S не содержит подстроку T, то возвращает nil.
Можно конечно делать таблицу, но постоянно итерироваться по ее элементам в поиске нужного не самое рациональное решение.


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

denis2000,

Спасибо за помощь. Возник ещё один вопрос. Я сделал закладываемые заряды взрывчатки. Как в СГМ.

[ Функция установки зарядов ]


Как видно из функции, проверяется кол-во установленных зарядов. Функция if not xr_conditions.object_exist(nil,nil,{"remote_explosive_box_1"}) then. Функция работает. Но если заложенные заряды оказались далеко, в оффлайне, то функция считает что зарядов нет, дает сбой и позволяет поставить 6, 7 и т.д. заряд.

Используемые функции

function object_exist(actor , npc , p)
return get_story_object(p[1]) ~= nil
end

function get_story_object(story_obj_id)
local obj_id = story_objects.get_story_objects_registry():get(story_obj_id)
if obj_id == nil then return nil end
return (db.storage[obj_id] and db.storage[obj_id].object) or (level ~= nil and level.object_by_id(obj_id))
end

Видимо, функция object_exist правильно работает, только если объект в онлайне. Или она так действует только с объектами класса inventory_box. Это нежелательно.

Нужно, чтобы заложенные заряды проверялись и в оффлайне и даже на других локациях. Как поправить эту функцию или написать новую? Чтобы сбоев с объектами не было.

[ Заряды ]


И еще один вопрос. Функция xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_1"}) сработает, если объект в оффлайне или на другой локации?


Сообщение отредактировал sergej5500 - Вс, 25.10.2015, 18:58
 
denis2000Дата: Вс, 25.10.2015, 19:06 | Сообщение # 695
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Ваши заряды в офлайне не взорвутся. Тут придется всю систему пересмотреть или подрывать заряды автоматически при удалении от них на 120 метров например.

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

Цитата denis2000 ()
Ваши заряды в офлайне не взорвутся. Тут придется всю систему пересмотреть или подрывать заряды автоматически при удалении от них на 120 метров например.


С этим я согласен. Заряды взрываются при повторном попадании в онлайн. Если игрок подорвал заряды, то возможна установка следующих зарядов. При установке первого заряда из новой группы я добавил проверку на наличие и сброс инфопорции подрыва и удаление всех невзорвавшихся ранее объектов.

[ Код ]


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

Цитата sergej5500 ()
Защита от непредвиденных последствий.

Есть проблема: будут удалены только заряды в онлайне.


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

Цитата denis2000 ()
Есть проблема: будут удалены только заряды в онлайне.


Печально. Тогда придется добавить счетчик. Для контроля установки зарядов использовать функции ins_counter и counter_equal. А несработавшие заряды удалять проверкой всех объектов в игре.

За помощь спасибо.

Добавлено (25.10.2015, 23:58)
---------------------------------------------
Добрый вечер. Попробовал сделать мину.

[ Логика ]


[ Функция подрыва ]


По замыслу, если ближе 25 метров от заряда окажется монстр (сталкер), то заряд должен взорваться. Логика сработала. Заряд исчез. Вылета не было. Взрыва тоже не было. В каком месте функции допущена ошибка?


Сообщение отредактировал sergej5500 - Вс, 25.10.2015, 23:59
 
denis2000Дата: Пн, 26.10.2015, 18:23 | Сообщение # 699
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Я вам уже писал по поводу мин. В движке есть объект - скриптовая зона (script_zone), у которой есть биндер xr_zones.script. Так вот у этого объекта есть колбеки на попадание в зону объекта (arena_zone_binder:on_enter) и выход из этой зоны объекта (arena_zone_binder:on_exit). Нет необходимости периодически шерстить все объекты проверяя расстояние от "мины"! Попал НПС, ГГ, Мутант или что либо другое в эту зону, вызвался колбек - в его отработке спавните взрывчатку и взрывайте - все просто!

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

denis2000,

Посмотрел xr_zones.script и возникло несколько вопросов.

arena_zone_binder - это относится к конкретной скриптовой зоне arena_zone или ко всем script_zone? Каждую скриптовую зону нужно биндить индивидуально?

Каким образом спавнятся script_zone? Они делаются в СДК? Или их можно сделать из логики через xr_effects?
 
denis2000Дата: Вт, 27.10.2015, 18:22 | Сообщение # 701
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
Каждую скриптовую зону нужно биндить индивидуально?

Конечно же все экземпляры класса обрабатываются одним скриптом!
Цитата sergej5500 ()
Каким образом спавнятся script_zone?

SDK, all.spawn или скриптом.


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

denis2000,

В Зове Припяти нет ни одной script_zone. Поэтому не очень понятно, как с ними работать. Несколько вопросов.

1. Спавн script_zone. Есть inventory_box с логикой.

[ Логика ]


Как будет выглядеть функция create_script_zones? Функция должна заспавнить скриптовую зону радиусом 10 метров в точке, где располагался inventory_box.

Назовем скрипт-зону mine_script_zones.

2. Скрипт-зона должна при попадании в неё сталкера или мутанта заспавнить в своих координатах заряд взрывчатки функцией примерно такого вида. После этого скрипт - зона должна удалиться.

[ Функция ]


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

Цитата sergej5500 ()
В Зове Припяти нет ни одной script_zone

Есть одна единственная на все игры в оригинальном ТЧ.
Цитата sergej5500 ()
Как будет выглядеть функция create_script_zones?

Код
function create_script_zones(actor,obj)
local script_zone = alife():create("script_zones",vector():set(obj:position()),obj:level_vertex_id(),obj:game_vertex_id())
--;;;;;;;;;;;;;;;;;;;;;;;
--Здесь радактированием нетпакета объекта script_zone нужно прикрутить шейп нужной формы и размера
--;;;;;;;;;;;;;;;;;;;;;;;
end

Цитата sergej5500 ()
Как нужно править xr_zones?

Простите у меня нет готовых решений.


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

Добрый вечер. Попробовал сделать в чистом ЗП персональные флешки в стиле СГМ.

В бинд-сталкер дописал код вида.

if (s_obj) and (s_obj:section_name()=="dv_test_case") then
alife():create("dv_test_case_box",vector():set(-152.94622802734,-29.912256240845,-403.56521606445),99393,93)
give_item_to_sid("medkit,bandage","dv_test_case_box")
end

Конфиги

[dv_test_case]:booster
$spawn = "devices\dv_test_case"
visual = dynamics\devices\dev_pda\dev_pda.ogf

[dv_test_case_box]:inventory_box
$spawn = "devices\dv_test_case_box"
custom_data = scripts\addon_test_rukzak_1.ltx
visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf
story_id = dv_test_case_box

Рюкзак заспавнился после активации бустера. С хабаром. С помощью какой функции на этот рюкзак можно поставить метку тайника? Метка должна ставиться после активации бустера. С помощью какой функции метку убрать с рюкзака после его юзания? Как это правильно сделать?
 
denis2000Дата: Вт, 15.12.2015, 12:55 | Сообщение # 705
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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

level.map_add_object_spot(<ID объекта на который ставить метку>, <Имя метки>, <Имя описания>)
Цитата sergej5500 ()
С помощью какой функции метку убрать с рюкзака после его юзания?

level.map_remove_object_spot(<ID объекта с которого снять метку>, <Имя метки>)


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