Gość Diegtiariow Opublikowano 2 Marca 2023 Zgłoś Udostępnij Opublikowano 2 Marca 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/ Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.