Guest Diegtiariow Posted March 2, 2023 Report Share Posted March 2, 2023 Twórca tematu na ap-pro niedawno spotkał się z potrzebą śledzenia strzału z broni. W tym przykładzie będziemy chcieli dawać apteczkę za każdy strzał z LR300. Autorzy: Gowther/Labadal, Jek@n i Charsi Co się przyda?: bind_stalker.script wasza_nazwa.script - ten plik powinniście stworzyć sami. wasza_nazwa.script: Spoiler 1. funkcja gun() - podstawowa funkcja, która śledzi "wystrzał" (działa, jeśli zmniejszyła się ilość naboi w magazynku) 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 --z jaką bronią chcemy pracować, w naszym przypadku - to 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 -- wykonujemy funkcję gun_yes() elseif curr_ammo > ammo_old then old_ai_id = 0 end end end 2. Funkcja gun_yes() - jest wykonywana tylko wtedy, jeśli poprzednia "dała zielone światło" function gun_yes() local curr_ammo_yes = db.actor:active_item():get_ammo_in_magazine() - liczymy naboje, zawsze na początku funkcji --=============================================--własny kod pisać tylko poniżej tego paska -- tutaj wykonujemy to, co trzeba. Czyli spawn apteczki alife():create("medkit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) --=============================================--własny kod pisać tylko powyżej tego paska if curr_ammo_yes== 0 then start_timer() end end 3. Timer (timer potrzebny po to, aby przywrócić funkcję gun() do stanu roboczego, kiedy w magazynku skończyły się naboje. Działa tylko przez sekundę, tak więc tego czasu wystarczy na przeładowanie. (jeśli zmiennej old_wpn_id przypiszemy 0 zanim uzupełnimy amunicję, to zamiast jednej apteczki - otrzymamy wiele) 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. Funkcja preload() - rozwiązuje problem, który pojawiał się w przypadku samowolnego rozładowania broni w ekwipunku - funkcja gun() przestawała działać. 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 bind_stalker.script: Spoiler Szukamy funkcji: function actor_binder:update(delta) I na samym końcu, przed ostatnim END wstawiamy: function actor_binder:update(delta) *** wasza_nazwa.gun() wasza_nazwa.preload() end ŹRÓDŁO: https://ap-pro.ru/forums/topic/3051-shocskriptovyy-modul-otslezhivaniya-vystrela-iz-oruzhiya/ Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.