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

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

 

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

Спойлер

АМК - 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. 

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


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

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

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


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

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

Спойлер

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

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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

чего так?
 

 

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

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

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


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

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


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

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

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

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

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


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

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 костыли используют лишь настоящие модмейкеры с кабаньими яйцами и золотыми руками 😄  Так что костыли - сила, на них и стоит весь сталкерский моддинг)

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


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

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

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


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

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

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

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

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

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


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

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


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

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

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


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

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

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

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

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

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

Войти

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

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

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

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