Рассмотрим ситуацию, в которой мы хотим после каждого выстрела из оружия "wpn_lr300" спавнить аптечку в инвентарь игрока.
Что понадобится?
- bind_stalker.script;
- action_gun.script - созданный нами файл скрипта.
Шаги действия:
1. создаём файл action_gun.script и в нем пишем:
1.1: основная функция gun (проверяет на выстрел)
local check_ammo = false
local old_wpn_id = 0
function gun()
local wpn = db.actor:active_item()
if wpn then
    if wpn:id()~=old_wpn_id then
    old_wpn_id = wpn:id()
    if wpn:section() == "wpn_lr300" then -- с каким оружием мы хотим работать, в нашем случае - это LR300
        check_ammo = true
        ammo_old = wpn:get_ammo_in_magazine()
    end
    end
else
    if old_wpn_id~=0 then old_wpn_id=0 check_ammo=false end
end
if check_ammo then
    local curr_ammo = wpn:get_ammo_in_magazine()
    if curr_ammo < ammo_old then
    ammo_old = curr_ammo
    if not level.main_input_receiver() then gun_yes() end
    elseif curr_ammo > ammo_old then
                old_ai_id = 0
    end
end
end
1.2: функция, срабатывающая только если из нужного оружия был произведён выстрел
function gun_yes()
local curr_ammo_yes = db.actor:active_item():get_ammo_in_magazine() - считаем патроны, всегда вначале функции
=============================================--свой код писать только ниже этой полоски
alife():create("medkit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) - любой код, который должен выполнятся при каждом выстреле из оружия, в нашем случае - это спавн аптечки;
=============================================--свой код писать только выше этой полоски
if curr_ammo_yes== 0 then - запуск таймера, должен ВСЕГДА и ВСЕГДА ПЕРЕД ПОСЛЕДНИМ END
start_timer() - запуск таймера, должен ВСЕГДА и ВСЕГДА ПЕРЕД ПОСЛЕДНИМ END
end - запуск таймера, должен ВСЕГДА и ВСЕГДА ПЕРЕД ПОСЛЕДНИМ END
end
1.3: таймер, возвращающий функцию gun() в рабочее состояние
   function action_timer()
      old_wpn_id = 0
   end

   function start_timer()
      local iTimer = time_global() + 1000

      local function check_timer()
         return time_global() > iTimer
      end

      level.add_call(check_timer, action_timer)
   end

1.4. данная функция необходима, чтобы не сломать основную, когда в стволе 0 патронов. (закончились, или произошла разрядка)
function preload()
local wpn = db.actor:active_item()
if wpn and wpn:section() == "wpn_lr300" then
local curr_ammo_preload = wpn:get_ammo_in_magazine()
    if curr_ammo_preload == 0 then
    check_ammo = false
    old_wpn_id = 0
    end
end
end

2. Переходим в bind_stalker.script
2.1. находим функцию function actor_binder:update(delta)
2.2. В самом конце этой функции, перед последним END - пишем:
action_gun.gun()
action_gun.preload()
3. Все, теперь, при каждом выстреле в инвентарь будет спавнится аптечка.
4. ВНИМАНИЕ - если вы хотите, чтобы функция работала для любого оружия, то:
4.1. В функции gun():
вместо: if wpn:section() == "wpn_lr300" then
пишем: if string.find(wpn:section(),"^wpn_") then
4.2. В функции preload():
вместо: if wpn and wpn:section() == "wpn_lr300" then
пишем: if wpn and string.find(wpn:section(),"^wpn_") then
(с) Labadal
мой профиль на АМК - https://www.amk-team.ru/forum/profile/45555-labadal/
моя страница в ВК - https://vk.com/id589657926
Будут вопросы - спрашивайте или тут, или в личке на АМК, или в вк.

Отредактировано labadal (2021-11-16 11:57:11)