Перейти к контенту

Рекомендуемые сообщения

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

Нашёл такой код:

Скрытый текст

local explosive_weapons = {
    ["wpn_rg-6"] = true,
    ["wpn_rpg7"] = true,
    ["grenade"] = true
    }
function npcondeath(victim, who)
    if IsStalker(who) then
  local active_item = who:active_item()
  local active_slot = who:active_slot()
  if (active_item and (active_slot == 1 or active_slot == 2)) or active_slot == 3 then
   local section = active_slot ~= 3 and active_item:section() or "grenade"
   if explosive_weapons[section] then
    particles_object("anomaly2\\body_tear_00"):play_at_pos(victim:bone_position("bip01_head"))
   end
  end
    end
end

 

Но, почему-то, партикл body_tear_00 отыгрывается даже при убийстве из любого дробовика, хотя их нет в списке. Прошу людей разбирающихся помочь. Сказали, что код из Simbion мода, но там такого не нашёл. И ещё, хотелось бы, чтобы труп после смерти исчезал. Хотя я понимаю, что тут нужна проверка на квестовость непися... Но может у кого нибудь уже есть готовое решение ?

Ссылка на комментарий
В 19.03.2018 в 10:39, Space.Marine сказал:

Нашёл такой код:

попробуйте этот:

Скрытый текст

local explosive_weapons = {
    ["wpn_rg-6"] = true,
    ["wpn_rpg7"] = true,
    ["grenade"] = true
    }
function npcondeath(victim, who)
    if IsStalker(who) then
  local active_item = who:active_item()
  local active_slot = who:active_slot()
  if (active_item ) then
   local section = active_item:section()
   if explosive_weapons[section] or active_slot == 3 then
    particles_object("anomaly2\\body_tear_00"):play_at_pos(victim:bone_position("bip01_head"))
   end
  end
    end
end

 

 

  • Спасибо 1
Ссылка на комментарий

Столкнулся тут с такой проблемой. Хм...Решил что лучше здесь спросить, а не в ковырялке.

Имеем такую логику персонажа. Сразу оговорюсь - val - это Темная Долина, а не мания величия.

[logic]
active = {-val_barman_1_sleep}walker@val_bar_sleep,sleeper@val_barmen

[walker@val_bar_sleep]
path_walk = val_barman_go_sleep_walk
path_look = val_barman_go_sleep_look
on_signal = val_sleep_bar | sleeper@val_barmen %+val_barman_1_sleep%

[sleeper@val_barmen]
path_main = val_bar_1_sleep_walk

Согласно логике НПС должен подойти к диванчику, по сигналу из точки пути перейти в следующую схему(выдав поршень) и завалиться спать на этот диванчик.

В действительности происходит следующее. По логу:

on_signal___(c.v1___=___val_sleep_bar)___signalled___[val_barman_1] ----сигнал есть.
 npc = 'single_player' give_info_portion id = 'val_barman_1_sleep'             ----выдан поршень

Далее.

object___'val_barman_1':___activate_by_section:___looking___for___section___'sleeper@val_barmen'
reset_generic_schemes_on_scheme_switch:___npc:name()='val_barman_1'
calling___module('xr_sleeper')

Ну - судя по всему - в следующую схему он перешел. И тут начинается самое интересное.

Scheduler tried to update object val_barman_1

Перец раскорячивается в точке пути и не идет на диванчик. При этом с ним можно разговаривать да и видно, что он находится под логикой sleeper@

а не в nil допустим.

Путь для секции sleeper@ абсолютно рабочий. Проверено удалением предыдущей секции.

Пробовал переводить перца из волкера в ремарк и далее по таймеру в слипер с выдачей поршня. Тогда еще интересней - виснет в ремарке, не выдавая поршень.

Взрыв мозга уже. Подумываю обойтись без Бармена))

Ссылка на комментарий
16 часов назад, Graff46 сказал:

попробуйте этот:

Ничего не поменялось. Партикл проигрывается, как и раньше при убийстве из любого мощного ствола (дробовик, СВД и пр.) Если что - платформа ЗП.

Изменено пользователем Space.Marine
Ссылка на комментарий

@Space.Marine 

Мне кажется слот проверять совершенно не нужно. Попробуй в варианте от @Graff46 оставить в условии только наличие итема в таблице:

if explosive_weapons[section] ~= nil then

 

  • Спасибо 1

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

Ссылка на комментарий
14 часов назад, _Val_ сказал:

Scheduler tried to update object

как правило - перемещение или анимации.

В ремарке без перехода куда-либо еще как себя ведет ?

 

Ссылка на комментарий

@Dennis_Chikin 

А без перехода я не пробовал.

Вообще - проблема уже решена путём обходного маневра. Конечно хотелось бы понять, что в конце концов случилось с этим неписем...особенно с учетом того, что таких логик уже прилично написано и все они работают....

Ссылка на комментарий
4 часа назад, WinCap сказал:

Попробуй

Завтра проверю, но... Если в условии есть конкретно переменная explosive_weapons и для неё заданны конкретные параметры wpn_такое-то, то какого не работает ? 

Уточню, я в скриптах - максимум читатель без образования.

Возможно ли такое поведения скрипта из-за того, что у меня значения k_ap и k_hit в конфигах некоторых боеприпасов больше единицы ? 

Изменено пользователем Space.Marine
Ссылка на комментарий
or "grenade"
   if explosive_weapons[section] then

А что, вообще, хотели этим сказать ?

 

Ссылка на комментарий
31 минуту назад, Dennis_Chikin сказал:

А что, вообще

Как я уже упоминал, я не специалист и, даже, не любитель. Я так понимаю, что условия такие, если некоторые заданные в explosive_weapons стволы а также гранаты, то - бабах ! Код из Simbion, как говорят. И, да, там есть фишка на эффект разрыва трупов для дум-дум боеприпаса (из описания мода). Как я припоминаю, это всё, тянется ещё из АМК мода для ТЧ. Я просто не понимаю, неужели это настолько проблематично (скорее просто на не нужно) решить спецам ? 

Изменено пользователем Space.Marine
Ссылка на комментарий
8 часов назад, Dennis_Chikin сказал:

А что, вообще, хотели этим сказать ?

При активных 1 и 2 слотах проверяется секция оружия, 3-ий слот считается гранатным ив нем проверка не делается.

Мне кажется номера слотов, что в ТЧ, что в ЗП несколько другие, из-за того и глюки.

  • Согласен 1
Ссылка на комментарий
10 часов назад, Dennis_Chikin сказал:

А что, вообще, хотели этим сказать ?

Если ты имел в виду синтаксическую ошибку, то её там нет. Условие является независимым, а предыдущую строку надо читать целиком, как самостоятельное присвоение:

local section = active_slot ~= 3 and active_item:section() or "grenade"

 

Ссылка на комментарий

if who:active_slot() == 3 then ...

else

  local item = who:active_item()

  if item and t[item:section()] then ...

  end

end

 

Может, все-таки так ?

 

Или сразу:

if who and who.active_slot and ( ( who:active_slot() == 3 ) or ( who:active_item() and t[who:active_item():section()] ) ) then ... end

 

Ссылка на комментарий

А вот кстати еще один животрепещущий вопрос. Что за гадская схема kamp

Какой раз уже сталкиваюсь - если непись идет с пути патрулирования к костру...уже находится под схемой kamp...то если его в момент передвижения(до того - как он уселся) - дернуть в другую схему, то сразу срабатывает Scheduler

Я конечно это дело обошел, методом дописывания неписю еще одного пути прямо к костерку по схеме walker, но что-то меня это начало утомлять.

Ссылка на комментарий

Изрядно гадская, да. Пришлось шаманствовать с removeNpc():

    local kamp_end = xr_evaluators_id.stohe_kamp_base + 1
    local on_pos = xr_evaluators_id.stohe_kamp_base + 2

    local mgr = npc:motivation_action_manager()

-- todo: слишком сложно. ПРОСТО оторвать лишние эвалюаторы СОВСЕМ. Оставить все в одном.
    local a = mgr and mgr:action( xr_actions_id.alife )
    if a then a:remove_precondition( kamp_end )
    else log( "warning", "(%s):removeNpc, no action (alife) (%s)", self.center_point, npc:name() )
    end

    a = mgr:action( xr_actions_id.stohe_kamp_base + 3 )
    if a then
        xr_logic.unsubscribe_action_from_events( npc, st, a )
        mgr:remove_action( xr_actions_id.stohe_kamp_base + 3 )
        -- log( "info", "(%s):removeNpc, %s, 2", self.center_point, npc:name() )
    else log( "warning", "(%s):removeNpc, no action (action_kamp_wait) (%s)", self.center_point, npc:name() )
    end

    mgr:remove_action( xr_actions_id.stohe_kamp_base + 1 )
    -- log( "info", "(%s):removeNpc, %s, 3", self.center_point, npc:name() )

    mgr:remove_evaluator( kamp_end )
    -- mgr:add_evaluator( kamp_end, property_evaluator_const( true ) )
    mgr:remove_evaluator( on_pos )
    -- mgr:add_evaluator( on_pos, property_evaluator_const( true ) )

    -- if npc:name() == "bar_dolg_ivancov" then
    --    log( "info", "(%s):removeNpc, %s, remove_evaluators, ok", self.center_point, npc:name() )
    -- end

    st.on_position = false    -- поскольку строжейж грохнуть не дают, сделаем вид, что он новый.
    st.count = 0
    st.pos_lvid = nil
    st.dest_lvid = nil

  • Спасибо 1
Ссылка на комментарий

Я тут поэкспериментировал и вроде как получается, что в спавне (скриптом) можно не указывать точно гейм-вертекс, главное что бы он был с данной локации (на которой спавним)...

Изменено пользователем Graff46
Ссылка на комментарий

Доброго времени!

Каким способом можно реализовать удаление предмета из инвентаря с течением времени с момента взятия этого предмета.

Пример: экзоскелет работает только с аккумулятором (это я сделал), но через некоторое время аккумулятор разряжается и удаляется из рюкзака.

Подайте идею.

Важнейшая задача цивилизации - научить человека мыслить.

Ссылка на комментарий
Только что, Fenrir02 сказал:

Подайте идею.

Запоминай в пстор время (game.time()) когда батарея начала работать и проверяй сколько она работает, где проверять смотри сам, можно конечно биндером постоянно, можно еще на какое событие повесить, например дроп ГГ, ведь в игре достаточно часто патроны перезаряжаем, что то выкидываем, продаём\покупаем и тд...

Не забываем про level.add_call

Изменено пользователем Graff46
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...