Новое на сайте:
Новости:
Файлы:
Статьи:
Топ пользователей:
Обновления сайта:
Группа "Гости" не имеет право просмотра модуля
Форум S.T.A.L.K.E.R. - Моддинг Разбираем S.T.A.L.K.E.R. Уроки моддинга Полезные функции (ТЧ) |
Полезные функции |
Дата: Суббота, 20.04.2013, 18:00
Сообщение #21
Graff46,
Код function switch_online(actor, npc) local npc = alife():story_object(111) if npc then alife():set_switch_online (npc:id (), true) alife():set_switch_offline (npc:id (), false) end end Где 111 это sid объекта. |
Дата: Понедельник, 20.05.2013, 22:32
Сообщение #25
Graff46, Вот в "загашнике" нашел функцию:
Код -- Проверка нахождения актора в особой зоне function actor_in_zone(pos_psy_x,pos_psy_y,size_psy_x,size_psy_y,z1,z2) local pos = db.actor:position() local x1 = pos_psy_x local x2 = pos_psy_y local y1 = size_psy_x local y2 = size_psy_y if (pos.x >= x1 and pos.x <= x2) and (pos.z >= y1 and pos.z <= y2) and (pos.y >= z1) and (pos.y <= z2) then return 1 end return 0 end Правда я ее ни разу не пробовал, посмотри, может пригодиться? Цитата (Graff46) Спасибо, я за это уже думал, это надо аллСпаун ковырять, не хотелось бы. Существует скриптовый спавн спейсрестриктора, довольно простой, нужен только скрипт с нетпактом. |
Дата: Вторник, 21.05.2013, 00:07
Сообщение #26
Frankenshtayn, Но опять же таки. Функцию придется ставить на апдейт. В то время, как рестриктор можно спавнить в самый последний момент, да и после отработки которого (если прописан nil) - ресурсы на проверку тратится не будут.
Более упрощенный способ: Код function bla_bla() local pos = db.actor:position() if pos.x>65 and pos.y>30 and pos.z<40 then ........ end end Со знаками можно поэкспериментировать Цитата (Graff46) А вообще в игре сообщения приходят когда, от Сидоровича например, по условию выходу из рестрикторов? Выдать сообщения можно по разному. Рестриктор, таймер из диалога/рестриктора, наличие поршня/предмета и т.д |
Дата: Четверг, 23.05.2013, 17:13
Сообщение #27
Так маленький примерчик: Когда юзаем дверь у Сидора, дверь открывается и отзывается инфопоршн
Код esc_close_door, в коде это %-esc_close_door% Далее, когда ГГ выходит из бункера, то попадает в рестриктор, который выдаёт по новой этот инфопоршн и дверь, по условию этого инфопоршна, закрывается. Мы можем дверь закрыть обычным юзанием, а можем не закрывать. Выходим на поверхность, попадая в данный рестриктор, дверь закрылась. Код [1616] ; cse_abstract properties section_name = space_restrictor name = esc_close_door_restrictor position = -255.506713867188,-20.2865753173828,-127.440452575684 direction = 0,0,0 ; cse_alife_object properties game_vertex_id = 0 distance = 0 level_vertex_id = 594270 object_flags = 0xffffff3e custom_data = <<END [logic] active = sr_idle [sr_idle] on_actor_inside = %+esc_close_door% END ; cse_shape properties shapes = shape0 shape0:type = box shape0:axis_x = 2.64159965515137,0,0 shape0:axis_y = 0,2.22759985923767,0 shape0:axis_z = 0,0,2.64159965515137 shape0:offset = 0,0,0 ; cse_alife_space_restrictor properties restrictor_type = 3 nil, нет, значит рестриктор многоразового использования. Собственно, логика двери: Код [logic] active = ph_door@locked [ph_door@locked] locked = true snd_open_start = trader_door_unlock on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)% [ph_door@closed] closed = true locked = false on_use = ph_door@open %-esc_close_door% snd_open_start = trader_door_open_start snd_close_start = trader_door_close_start snd_close_stop = trader_door_close_stop [ph_door@open] closed = false locked = false on_use = ph_door@closed on_info = {+esc_close_door} ph_door@closed snd_open_start = trader_door_open_start snd_close_start = trader_door_close_start snd_close_stop = trader_door_close_stop Самое первое условие - это Код esc_trader_can_leave выдается, когда мы поговорили с Сидором, т.е. если не поговорим, то дверь бесполезно юзать, не откроется. Скриптовые рестрикторы - это считаю одним из лучших фишек в написании кода, благодаря которым можно писать любые сюжеты, не возвращаясь в начало игры, т.к. все мы знаем, что обычные рестрикторы пишутся в all.spawn, и любое изменение вступает в силу только с НИ. Если не ошибся, то автор создания спейсрестрикторов скриптовым методом - singapur22. Ещё, про удаление любого объекта не по секции и по сиду, а по использованию его имя в all.spawn В народной соли применялось часто и работает на ура. В ВШ, я удалил одной такой функцией двери у Сидора, самого Сидора, ноутбук, физ.об-кт броник найма, рацию. Код function del_esc_trader() local se_obj = alife():object("escape_trader") if se_obj then alife():release(se_obj, true) end local se_obj = alife():object("trader_door") if se_obj then alife():release(se_obj, true) end local se_obj = alife():object("trader_physic_object0014") if se_obj then alife():release(se_obj, true) end local se_obj = alife():object("trader_physic_object0013") if se_obj then alife():release(se_obj, true) end local se_obj = alife():object("physic_object0025") if se_obj then alife():release(se_obj, true) end end Также после взрыва 2 двери в бункере у Сахарова Код function del_yan_sahar_door() local se_obj = alife():object("door_trader_0000") if se_obj then alife():release(se_obj, true) end local se_obj = alife():object("door_trader") if se_obj then alife():release(se_obj, true) end end Как здорово быть тёртым сталкером! Не бояться каждого шороха, оружия не носить с собой много! Сообщение отредактировал dimak - Суббота, 25.05.2013, 01:58 |
Дата: Пятница, 30.08.2013, 18:56
Сообщение #29
Всем привет! Вот нашел на просторах инета функцию, которая отрабатывает удар по морде ГГ. Рабочая проверено. Вызывал из диалога, но есть и другие способы.
На счет - AI additions, не плохая вещь у меня стоит. Советую. Сообщение отредактировал butrikA - Пятница, 30.08.2013, 22:46 |
Дата: Пятница, 30.08.2013, 19:45
Сообщение #30
butrikA, А лог какой?
ЗЫ: Функция просто отыгрывает нужную анимку. Урона от нее не будет. Тот же самый удар в лицо при надоедании НПС юзает анимку punch из state_lib.script. Более подробно можно глянуть в xr_abuse.script. Если АМК, тогда rx_facer.script. Там уже расчитывается наносимый удар, кости, анимация, звуки и т.д |
Дата: Пятница, 30.08.2013, 21:53
Сообщение #31
Цитата Если АМК, тогда rx_facer.script. Там уже расчитывается наносимый удар, кости, анимация, звуки и т.д Поправлю малость. Это не АМК, а AI additions от автора Bak Как здорово быть тёртым сталкером! Не бояться каждого шороха, оружия не носить с собой много! |
Дата: Пятница, 30.08.2013, 22:15
Сообщение #32
butrikA, данный файл идет из оригинала игры. Он есть, просто в скрипте ошибка в указании пути. У тебя camera_effects\fusker.anm, а надо camera_effects\\fusker.anm. Т.е не хватает одного слеша.
dimak, Действительно, в файлах черт ногу сломит АМК стоит с этим АИ паком. |
Дата: Пятница, 30.08.2013, 23:49
Сообщение #33
Вот, может кому пригодится. Возможно возникнет необходимость проверить "народонаселение" какого-либо гулага:
Код function имя_функции() if (xr_gulag.getGulagPopulation("имя_гулага") <= 1) --здесь проверяем "больше", "меньше" или "равно"-- then --делаем что надо-- end end вызываем в нужный момент, или если "очень надо" - ставим на апдейт |
Дата: Суббота, 16.11.2013, 14:41
Сообщение #34
Такой вопрос если объявить переменную вне функции, то её могут использовать несколько ф-ций в скрипте?
пример: Код local t function babki1 () local wpn, b, hp, k, d, e, x wpn = db.actor:item_in_slot(1) --пулучаем оружие как объект b = wpn:cost() --получаем цену пушки hp = wpn.health --получаем состояние пушки k = b/100 --получаем коофициент (сколько стоит 1% здоровья пушки) e = 1 - hp -- получаем величину: количество здоровья пушки которого не хватает до полного здоровья x = k*e t = math.ceil (x) -- получаем стоимость ремонта if db.actor:money() >= t and hp < 0.9 then return true else return false end end function otd () local npc = level_object_by_sid(515) dialogs.relocate_money(npc, t, "out") end Сообщение отредактировал Graff46 - Суббота, 16.11.2013, 14:42 |
Дата: Вторник, 01.10.2019, 18:18
Сообщение #39
Всем привет. Я тут посмотрел последние два поста, и хотел спросить более развернуто. К примеру, я хочу отыскать на локации предмет (водку) и установить на ее метку, так по колхозному накидал скрипт, но при активации фунции метка отображается на ГГ, посмотрите сам скрипт:
|
Дата: Вторник, 01.10.2019, 21:15
Сообщение #40
Угу))) А в рюкзаке случаем водка не завалялась))) Вариант при непосредственном спавне обьекта Код local ObjId=0 function pda_killer_spawn() local obj= alife():create("vodka",vector():set(-223.700,-7.678,-129.688),17000,281) local text = "Водка" level.map_add_object_spot_ser(obj.id, "blue_location", text) --/blue_location - тип метки ObjId=obj.id end При взятии предмета метку удаляем: Код function delete_spot() for a=1,65534 do --Перебор айди local obj = alife():object(a) if obj and obj:section_name() == "vodka" then level.map_remove_object_spot(obj.id,"blue_location") break end end end |
| |||