Модостроение. Редактирование и создание скриптов
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Редактирование и создание скриптов Редактирование и создание скриптов на языке LUA Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (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 | Дата: Пт, 23.10.2015, 20:13 | Сообщение # 691 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| avn1975, Передавайте привет DirectX11 и GSC с их кривым четвертым рендером.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 25.10.2015, 14:09 | Сообщение # 692 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день.
Добавил в чистый Зов Припяти персональные рюкзаки и взрывающиеся заряды в стиле СГМ. Встала задача установки на эти объекты меток на карте.
С персональными рюкзаками справился быстро. Использовал функцию generic_physics_binder:net_spawn(data) из bind_physic_object.scripts. Добавил туда код.
[cut=Функция]function generic_physics_binder:net_spawn(data) if not object_binder.net_spawn(self, data) then return false end
if self.object:section() == "physic_door" then db.level_doors[self.object:id()] = self.object:position() end
if self.object:section() == "personal_rukzak_box" then level.map_add_object_spot(self.object:id(), "ui_pda2_actor_rukzak_location", "st_ui_pda_actor_rukzak") end
if(self.object:spawn_ini()) then if(self.object:spawn_ini():section_exist("drop_box")) then self.box_items = xr_box.ph_item_box(self.object) end
if(self.object:spawn_ini():section_exist("level_spot")) then if(self.object:spawn_ini():line_exist("level_spot", "actor_box")) then level.map_add_object_spot(self.object:id(), "ui_pda2_actor_box_location", "st_ui_pda_actor_box") end end end db.add_obj(self.object) return true end[/cut]
В функцию generic_physics_binder:net_destroy() дописал код.
[cut=Функция]function generic_physics_binder:net_destroy() if level.map_has_object_spot(self.object:id(), "ui_pda2_actor_box_location") ~= 0 then level.map_remove_object_spot(self.object:id(), "ui_pda2_actor_box_location") end if level.map_has_object_spot(self.object:id(), "ui_pda2_actor_rukzak_location") ~= 0 then level.map_remove_object_spot(self.object:id(), "ui_pda2_actor_rukzak_location") end xr_sound.stop_sounds_by_id(self.object:id()) local st = db.storage[self.object:id()] if st.active_scheme then xr_logic.issue_event(self.object, st[st.active_scheme], "net_destroy") end local on_offline_condlist = db.storage[self.object:id()] and db.storage[self.object:id()].overrides and db.storage[self.object:id()].overrides.on_offline_condlist if on_offline_condlist ~= nil then xr_logic.pick_section_from_condlist(db.actor, self.object, on_offline_condlist) end if self.particle ~= nil then self.particle:stop() end db.del_obj(self.object)
db.storage[self.object:id()] = nil
object_binder.net_destroy(self) end[/cut]
Дописал нужные секции в xml_файлы. Результат меня удовлетворил. Метки ставятся и удаляются.
[cut=Скрины] [/cut]
Возникло два вопроса.
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
Если таких рюкзаков будет двадцать, то потребуется двадцать функций. Можно ли эту функцию обобщить, а списки рюкзаков и записок вынести в таблицы. Как это правильно сделать?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 25.10.2015, 17:23 | Сообщение # 693 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата 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. Можно конечно делать таблицу, но постоянно итерироваться по ее элементам в поиске нужного не самое рациональное решение.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 25.10.2015, 18:56 | Сообщение # 694 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| denis2000,
Спасибо за помощь. Возник ещё один вопрос. Я сделал закладываемые заряды взрывчатки. Как в СГМ.
[cut=Функция установки зарядов]function remote_explosive_charge_init() if has_alife_info("remote_explosive_pda_init") then if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_1"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_1"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_2"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_2"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_3"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_3"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_4"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_4"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_5"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_5"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_1"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_1"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_2"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_2"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_3"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_3"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_4"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_4"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_5"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_5"}) end disable_info("remote_explosive_pda_init") end if db.actor:object("remote_explosive_pda") == nil then give_object_to_actor("remote_explosive_pda") end if not xr_conditions.object_exist(nil,nil,{"remote_explosive_box_1"}) then alife():create("remote_explosive_box_1",vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z),db.actor:level_vertex_id(),db.actor:game_vertex_id()) elseif not xr_conditions.object_exist(nil,nil,{"remote_explosive_box_2"}) then alife():create("remote_explosive_box_2",vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z),db.actor:level_vertex_id(),db.actor:game_vertex_id()) elseif not xr_conditions.object_exist(nil,nil,{"remote_explosive_box_3"}) then alife():create("remote_explosive_box_3",vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z),db.actor:level_vertex_id(),db.actor:game_vertex_id()) elseif not xr_conditions.object_exist(nil,nil,{"remote_explosive_box_4"}) then alife():create("remote_explosive_box_4",vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z),db.actor:level_vertex_id(),db.actor:game_vertex_id()) elseif not xr_conditions.object_exist(nil,nil,{"remote_explosive_box_5"}) then alife():create("remote_explosive_box_5",vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z),db.actor:level_vertex_id(),db.actor:game_vertex_id()) else game.start_tutorial("remote_explosive_no_use") give_object_to_actor("remote_explosive_charge") end end [/cut]
Как видно из функции, проверяется кол-во установленных зарядов. Функция 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. Это нежелательно.
Нужно, чтобы заложенные заряды проверялись и в оффлайне и даже на других локациях. Как поправить эту функцию или написать новую? Чтобы сбоев с объектами не было.
[cut=Заряды] [remote_explosive_box_1]:inventory_box $spawn = "devices\remote_explosive_box_1" visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf custom_data = scripts\remote_explosive_box_1.ltx story_id = remote_explosive_box_1
[remote_explosive_box_2]:remote_explosive_box_1 $spawn = "devices\remote_explosive_box_2" custom_data = scripts\remote_explosive_box_2.ltx story_id = remote_explosive_box_2[/cut]
И еще один вопрос. Функция xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_1"}) сработает, если объект в оффлайне или на другой локации?
Сообщение отредактировал sergej5500 - Вс, 25.10.2015, 18:58 |
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 25.10.2015, 19:06 | Сообщение # 695 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Ваши заряды в офлайне не взорвутся. Тут придется всю систему пересмотреть или подрывать заряды автоматически при удалении от них на 120 метров например.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 25.10.2015, 19:33 | Сообщение # 696 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Цитата denis2000 ( ) Ваши заряды в офлайне не взорвутся. Тут придется всю систему пересмотреть или подрывать заряды автоматически при удалении от них на 120 метров например.
С этим я согласен. Заряды взрываются при повторном попадании в онлайн. Если игрок подорвал заряды, то возможна установка следующих зарядов. При установке первого заряда из новой группы я добавил проверку на наличие и сброс инфопорции подрыва и удаление всех невзорвавшихся ранее объектов.
[cut=Код]if has_alife_info("remote_explosive_pda_init") then if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_1"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_1"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_2"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_2"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_3"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_3"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_4"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_4"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_box_5"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_box_5"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_1"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_1"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_2"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_2"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_3"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_3"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_4"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_4"}) end if xr_conditions.object_exist(nil,nil,{"remote_explosive_5"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_5"}) end disable_info("remote_explosive_pda_init") end[/cut]
Эта проверка должна удалить все несработавшие объекты. Независимо от их положения. Защита от непредвиденных последствий.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 25.10.2015, 19:38 | Сообщение # 697 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 ( ) Защита от непредвиденных последствий. Есть проблема: будут удалены только заряды в онлайне.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 25.10.2015, 23:58 | Сообщение # 698 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Цитата denis2000 ( ) Есть проблема: будут удалены только заряды в онлайне.
Печально. Тогда придется добавить счетчик. Для контроля установки зарядов использовать функции ins_counter и counter_equal. А несработавшие заряды удалять проверкой всех объектов в игре.
За помощь спасибо.
Добавлено (25.10.2015, 23:58) --------------------------------------------- Добрый вечер. Попробовал сделать мину.
[cut=Логика][logic] active = ph_idle
[ph_idle] on_info = {=dist_to_actor_ge(35)} ph_idle@expl
[ph_idle@expl] on_game_timer = 15 | ph_idle@expl %=mine_activate%[/cut]
[cut=Функция подрыва]function mine_activate(actor,obj) for a=1,65534 do local object = alife():object(a) if (object==IsStalker or object==IsMonster) then if distance_between(object,obj)<=25 then
alife():create("rukzak_explosive",vector():set(obj:position()),obj:level_vertex_id(),obj:game_vertex_id()) level.add_call( function() if get_story_object("rukzak_explosive") ~= nil then return true end end, function() expl_obj = get_story_object("rukzak_explosive") expl_obj:explode(0) end ) end end end local sobj = alife():object(obj:id()) if sobj then alife():release( sobj, true ) end
end[/cut]
По замыслу, если ближе 25 метров от заряда окажется монстр (сталкер), то заряд должен взорваться. Логика сработала. Заряд исчез. Вылета не было. Взрыва тоже не было. В каком месте функции допущена ошибка?
Сообщение отредактировал sergej5500 - Вс, 25.10.2015, 23:59 |
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 26.10.2015, 18:23 | Сообщение # 699 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Я вам уже писал по поводу мин. В движке есть объект - скриптовая зона (script_zone), у которой есть биндер xr_zones.script. Так вот у этого объекта есть колбеки на попадание в зону объекта (arena_zone_binder:on_enter) и выход из этой зоны объекта (arena_zone_binder:on_exit). Нет необходимости периодически шерстить все объекты проверяя расстояние от "мины"! Попал НПС, ГГ, Мутант или что либо другое в эту зону, вызвался колбек - в его отработке спавните взрывчатку и взрывайте - все просто!
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вт, 27.10.2015, 17:16 | Сообщение # 700 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| denis2000,
Посмотрел xr_zones.script и возникло несколько вопросов.
arena_zone_binder - это относится к конкретной скриптовой зоне arena_zone или ко всем script_zone? Каждую скриптовую зону нужно биндить индивидуально?
Каким образом спавнятся script_zone? Они делаются в СДК? Или их можно сделать из логики через xr_effects?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 27.10.2015, 18:22 | Сообщение # 701 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 ( ) Каждую скриптовую зону нужно биндить индивидуально? Конечно же все экземпляры класса обрабатываются одним скриптом!
Цитата sergej5500 ( ) Каким образом спавнятся script_zone? SDK, all.spawn или скриптом.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вт, 27.10.2015, 20:24 | Сообщение # 702 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| denis2000,
В Зове Припяти нет ни одной script_zone. Поэтому не очень понятно, как с ними работать. Несколько вопросов.
1. Спавн script_zone. Есть inventory_box с логикой.
[cut=Логика][logic] active = ph_idle
[ph_idle] nonscript_usable = false on_info = {=dist_to_actor_ge(15)} nil %=destroy_object =create_script_zones%[/cut]
Как будет выглядеть функция create_script_zones? Функция должна заспавнить скриптовую зону радиусом 10 метров в точке, где располагался inventory_box.
Назовем скрипт-зону mine_script_zones.
2. Скрипт-зона должна при попадании в неё сталкера или мутанта заспавнить в своих координатах заряд взрывчатки функцией примерно такого вида. После этого скрипт - зона должна удалиться.
[cut=Функция] function remote_explosive_box_1_activate(actor,obj) alife():create("remote_explosive_bomb_1",vector():set(obj:position()),obj:level_vertex_id(),obj:game_vertex_id()) level.add_call( function() if get_story_object("remote_explosive_bomb_1") ~= nil then return true end end, function() expl_obj = get_story_object("remote_explosive_bomb_1") expl_obj:explode(0) end )
local sobj = alife():object(obj:id()) if sobj then alife():release( sobj, true ) end
if xr_conditions.object_exist(nil,nil,{"remote_explosive_bomb_1"}) then xr_effects.destroy_object(actor,npc,{"story","remote_explosive_bomb_1"}) end end[/cut]
Как нужно править xr_zones?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 28.10.2015, 15:14 | Сообщение # 703 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата 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? Простите у меня нет готовых решений.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вт, 15.12.2015, 01:01 | Сообщение # 704 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Попробовал сделать в чистом ЗП персональные флешки в стиле СГМ.
В бинд-сталкер дописал код вида.
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
Рюкзак заспавнился после активации бустера. С хабаром. С помощью какой функции на этот рюкзак можно поставить метку тайника? Метка должна ставиться после активации бустера. С помощью какой функции метку убрать с рюкзака после его юзания? Как это правильно сделать?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 15.12.2015, 12:55 | Сообщение # 705 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 ( ) С помощью какой функции на этот рюкзак можно поставить метку тайника? level.map_add_object_spot(<ID объекта на который ставить метку>, <Имя метки>, <Имя описания>)
Цитата sergej5500 ( ) С помощью какой функции метку убрать с рюкзака после его юзания? level.map_remove_object_spot(<ID объекта с которого снять метку>, <Имя метки>)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
|