Перейти к содержанию

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

 

Всем привет, я, можно сказать, модмейкер-любитель, потихоньку делаю свою модификацию и иногда сталкиваюсь с проблемами. 
 

Спойлер

АМК - Labadal
Ап-про - Gowther (Амон Нихродский)

Совсем недавно я столкнулся с необходимостью отследить выстрел из оружия, решение я искал долго, но, всё же, нашёл - и спешу поделится с вами.  
Рассмотрим ситуацию, в которой мы хотим выдавать аптечку каждый раз, когда стреляем из LR300

Что понадобится? 
1. bind_stalker.script 

2. ваше_название.script -- этот файл вы должны создать сами.

Спойлер

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 -- выполняем функцию gun_yes() 
    elseif curr_ammo > ammo_old then
                old_ai_id = 0
    end
end
end

2. Функция gun_yes() - выполняется только в том случае, если предыдущая "дала добро"


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
start_timer()
end
end

3. Таймер (таймер необходим для того, чтобы вернуть функцию gun() в рабочее состояние, когда в магазине закончились патроны. Он срабатывает через секунду, так что этого времени хватит на перезарядку. (если переменной old_wpn_id присвоить 0 до того, как перезарядимся, то вместо одной аптечки - получим много)


  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

4. Функция preload() - решает проблему, которая возникала в случае самовольной разрядки оружия в инвентаре - функция gun() переставала работать.

 


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

 

Спойлер

Ищем функцию:


function actor_binder:update(delta)

И в самом конце, перед последним END вставляем:


function actor_binder:update(delta)
***
ваше_название.gun()
ваше_название.preload()
end

 

Нашёл эту функцию в частично рабочем варианте в файле мода "Золотой Шар: завершение" (функция, найденная мной в ЗШ, работала пока в оружии не кончатся патроны. При разрядке/перезарядке нужно было перемещать ружьё из инвентаря и обратно, я же доработал функцию до ума - теперь все работает как надо - стреляйте, перезаряжайте, разряжайте и так далее, но не отрицаю возможность наличия багов, так что если найдёте - пишите).
Авторами, помимо меня, доработавшего функцию, можно считать товарищей Jek@n и Charsi. 

  • Мастер! 2
  • Жму руку 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Вот я все понять не могу, вам религия не позволяет использовать модифицированные движки с уже готовыми на то каллбеками, вместо вот этого костыля голимого?

  • Лайк 2
  • Мастер! 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Использовал такую функцию, стащенную из АМК, без таймеров, проблем при разрядке с инвентаря не было

Спойлер

local prev_ammo = 0

function check_shot()
	local wpn = utils.wpn_info_get(db.actor)
		if wpn["ammo"] ~= nil and wpn["ammo"] ~= 0 then
			if prev_ammo > wpn["ammo"] then
				.........
			end
		end
		
		prev_ammo = wpn["ammo"] or 0

end

 

 

 

Изменено пользователем vader_33
  • Лайк 2
  • Мастер! 1

В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Ну или так хотя бы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

I am dead 
Не у всех есть возможность использовать модифицированные движки, в которых есть данный калбек. 

  • Лайк 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Gowther В чем проблема то? Зашёл на github и скачал релизную сборку. Или этой возможности нету?

  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

I am dead Проблема в несовместимости, или мне отказаться от всех моих движковых наработок и перейти на огср, лишь потому, что там есть нужный каллбек? И вообще я недолюбливаю огср. К тому же, движок на гитхубе нужно ещё уметь собирать, не каждый сможет его скомпилировать.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Gowther если у тебя есть движковые правки, то есть ты уже копаешь двиг, то почему бы не посмотреть, как сделали в ОГСР и сделать так же у себя?

  • Мастер! 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Gowther Я более чем уверен что есть у тебя в движке - на огср есть в 5 раз лучше, собирать не обязательно потому что есть собранные бины на гитхабе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
4 часа назад, Gowther сказал:

И вообще я недолюбливаю огср.

чего так?
 

 

4 часа назад, Gowther сказал:

К тому же, движок на гитхубе нужно ещё уметь собирать, не каждый сможет его скомпилировать.  

к тому же на гитхубе есть скомпилированные релизные версии и документация

  • Лайк 2

Слишком огромная подпись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, I am dead сказал:

Gowther Я более чем уверен что есть у тебя в движке - на огср есть в 5 раз лучше, собирать не обязательно потому что есть собранные бины на гитхабе.

я смотрел - нет.
upd: послушай, друг. Тебе нравится использовать ОГСР? Я тебе запрещаю? Используй на здоровье. Я использую то, что мне нравится. Огср мне не нравится.

Изменено пользователем Gowther
  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Gowther А я тебя ни в коем случае и не заставляю, просто дал лишь совет, к тому же огср не единственный модифицированный движок который существует. Я лишь хотел донести до тебя что это костыль в дичайшем виде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Надо калибр увеличить.


Берегите патроны, особенно если он последний.

IC i5-8400 CPU @ 2,80 GHz, 16 OGB RAM, GF GTX 1060 6GB.

%D1%82%D0%B5%D0%BD%D1%8C121.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

I am dead пусть так, меня устраивает

Изменено пользователем Gowther

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

I am dead костыли используют лишь настоящие модмейкеры с кабаньими яйцами и золотыми руками ?  Так что костыли - сила, на них и стоит весь сталкерский моддинг)

  • Лайк 1
  • Смех 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

I am dead чел дело говорит. На кой мне, например, юзать какой-нибудь СДК, для добавления условного НеПиСя, если можно и скриптом всё сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
50 минут назад, Одиночка сказал:

На кой мне, например, юзать какой-нибудь СДК, для добавления условного НеПиСя, если можно и скриптом всё сделать.

не очень подходит пример. Тут скрипт висит на апдейте, не одноразово откуда-то вызывается. Если брать пример с нпс, проверка на выполнение условий его спавна висела бы на апдейте, выполнялась бы десятки раз в секунду, и потом спавн этого нпс происходил бы половину игры с того же апдейта вместе с таймером и кучей функций вдобавок. Зачем в апдейт сувать, если можно спавн сделать из диалога/рестриктора/инфопоршня. Не очень хорошо для оптимизации, учитывая, что это сталкер. Ну, хозяин-барин, как говорится

Изменено пользователем vader_33
  • Лайк 1

В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Одиночка Ну ага, а потом жалуются где оптимизация...


Дополнено 1 минуту спустя

LoidRus Это очень плохо, скажу я вам ( сарказм выкупил если что )

  • Лайк 1
  • Жму руку 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

I am dead а какой калбек уже готовый есть в ОГСР сегодня? Такой вопрос


76561198152189716.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

ian98 Примерно так и называеться


Дополнено 0 минут спустя

on_actor_weapon_fire если быть точнее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

I am dead можешь помочь мне его в bind_stalker подключить?) А то я как-то пробовал и вылетала игра. Ничего не получалась. Последний огср у меня движок. Ещё вопрос, может знаешь, оригинальная Вики по движку давно не обновляется с формулировкой "Знающие и так все посмотрят в диздоках". В общем, где их смотреть-то эти диздоки можно? Скачал я дебаг версию движка, это оно, это диздоки? 


76561198152189716.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Смотреть на гите по коммитам, а подключить увы не помогу, времени нету совсем

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

разобрался сам случайным образом, на радостях аж поделюсь. Может столкнется кто. В общем, на ОГСР вырезали калбеки на выстрел, их нет, но есть калбеки на нажатие клавиши и если нужен выстрел, то там можно его отследить. Да, корректно отследить так можно лишь одиночный выстрел. В принципе мне этого достаточно, но все-таки решение не универсальное далеко.

function actor_binder:on_key(key, bind) -- нажатие клавиши
local weapon = db.actor:active_item()
	if weapon and isWeapon(weapon) then
	local ammo_in_magazine = weapon:get_ammo_in_magazine() -- обязательно проверять есть ли в пушке патроны
	local ready = weapon:get_weapon():ready_to_kill() -- нельзя давать срабатывать функции во время доставания оружия из кобуры
	local wnd = level.get_inventory_wnd() -- окно инвентаря
	local wnd2 = level.get_car_body_wnd() -- окно обыска трупов и ящиков. Нельзя давать функции работать с этими окнами.
		if bind == key_bindings.kWPN_FIRE and ready then
		if (ammo_in_magazine==0) or wnd:IsEnabled() or wnd2:IsEnabled() then return end
		...
		end
	end
end

 

Изменено пользователем ian98

76561198152189716.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу