Перейти к контенту

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

Люди может кто помочь - возможно ли каким нибудь способом регулировать длину очередей НПС через логику? Необходимо сделать пулемётчика.

Ссылка на комментарий

А как правильно скриптово выполнить проверку на то, что монстр в данный момент атакует игрока и то что актор находиться в режиме прицеливания?

Ссылка на комментарий

qwqwqw, логика никоим образом не расчитана на "регалировку очередей у НПС".

Есть некая возможность влиять на анимацию через object.fire1 в стайт-менеджере, но это уже совершенно иная история.

 

panzyuza, поделись с нами хотя бы 'не правильными' вариантами того, о чем спрашиваешь - может тогда и найдется более 'правильный' вариант ... ;-)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

panzyuza

Про режим прицеливания на форуме писали совсем-совсем недавно. Буквально на прошлой неделе, вроде как...

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Вот на основании данного кода хочу сделать, что бы эффект выбрасывания оружия срабатывал только в случае,если собака атакует игрока

if self.object:section()=="pseudo_sucker_strong" and self.object:alive() and self.object.health>0.05 then
            local npc=self.object:get_enemy()
            if npc then
                if npc:id()==db.actor:id() and db.actor:see(self.object) and self.object:see(db.actor) and math.random()<0.2 then
                    level.add_pp_effector("snd_shock.ppe", 2012, false)                    
                    local h = hit()
                    h.type = hit.telepatic
                    h.power = 0.02
                    h.impulse = 0.0
                    h:bone("bip01_spine") -- чтобы учитывалась броня
                    h.draftsman = self.object
                    h.direction = self.object:direction()
                    db.actor:hit(h)

                    if math.random()<0.02 then
                    local active_item = db.actor:active_item()
                        if active_item and active_item:section()~= "bolt" and active_item:section()~= "wpn_knife" then
                            db.actor:drop_item(active_item)
                        end
                    end
                end
            end
        end

А состояние прицеливания нужно для скрипта dinamic_hud by Rulix aka Baк.Просто хочеться в апдейт эффекта стрельбы вставить код,который бы отключал эффект при режиме прицеливания.Прошу помочь с советом или как это сделать?

local dh_ini = ini_file("misc\\dinamic_hud.ltx")
local suithud_enable = rx_utils.read_from_ini(dh_ini,"main","suithud_enable",true,0) -- худ шлема
local zoom_enable = rx_utils.read_from_ini(dh_ini,"main","zoom_enable",true,0) -- смещение худа
local blurs_enable = rx_utils.read_from_ini(dh_ini,"main","blurs_enable",true,0) -- эффект запотевания
local blood_enable = rx_utils.read_from_ini(dh_ini,"main","blood_enable",true,0) -- эффект ранения
local bleed_enable = rx_utils.read_from_ini(dh_ini,"main","bleed_enable",true,0) -- эффект плохого самочувствия
local hit_enable = rx_utils.read_from_ini(dh_ini,"main","hit_enable",true,0) -- эффект попадания по игроку
local brnv_enable = rx_utils.read_from_ini(dh_ini,"main","brnv_enable",true,0) -- сломанный ПНВ
local shoot_enable = rx_utils.read_from_ini(dh_ini,"main","shoot_enable",true,0) -- эффект стрельбы
ui_disabled = nil
--------------------------------------------------------------------------------
local helmets = {stalker_outfit_gas            = {hud = "hud_gas",breakable = true,blurs = 4},
                novice_outfit_gas            = {hud = "hud_dark",breakable = true,blurs = 3.5},
                dolg_gaz_outfit                = {hud = "hud_gas",breakable = true,blurs = 3.6},
                svoboda_gaz_outfit            = {hud = "hud_gas",breakable = true,blurs = 3.2},
                ecolog_outfit                = {hud = "hud_sci",breakable = true,blurs = 1.8},
                protection_outfit            = {hud = "hud_sci",breakable = true,blurs = 2.8},
                scientific_outfit            = {hud = "hud_sci",breakable = true,blurs = 2.8},
                bandit_gaz_outfit    = {hud = "hud_dark",breakable = true,blurs = 2.8},
                ecolog_outfit            = {hud = "hud_sci",breakable = true,blurs = 2.6},
                soldier_outfit_shlem        = {hud = "hud_shlem",breakable = true,blurs = 2.4},
                military_outfit            = {hud = "hud_mil",breakable = true,blurs = 3},
                killer_gaz_outfit        = {hud = "hud_kill",breakable = true,blurs = 2.4},
                exo_dolg_outfit        = {hud = "hud_exo",breakable = true,blurs = 3},
                exo_outfit            = {hud = "hud_exo",breakable = true,blurs = 3.3},
                exo_clear_sky_outfit        = {hud = "hud_exo",breakable = true,blurs = 3.7},
                outfit_exo_m1            = {hud = "hud_exo",breakable = true,blurs = 3.1},
                exo_svoboda_outfit        = {hud = "hud_exo",breakable = true,blurs = 2.8},
                exo_bandit_outfit        = {hud = "hud_exo",breakable = true,blurs = 3.3},
                exo_killer_outfit        = {hud = "hud_exo",breakable = true,blurs = 3.3},   
                exo_military_outfit        = {hud = "hud_exo",breakable = true,blurs = 3.3},   
                exo_monolit_outfit        = {hud = "hud_exo",breakable = true,blurs = 3.3},  
                dark_stalker_outfit        = {hud = "hud_dark",breakable = true,blurs = 3.3},    
                                nano_scientific_outfit          = {hud = "hud_nano",breakable = true,blurs = 3.1}}
helmets.ecolog_outfit                    = helmets.scientific
helmets.protection_outfit                = helmets.scientific
--helmets.outfit_killer_m1                = helmets.killer_outfit

local no_drop_items = {bolt = true,wpn_knife = true}
--------------------------------------------------------------------------------
local seldom_upd_time,often_upd_time
function update()
    if db.actor then
        local tg = time_global()
        if tg > (seldom_upd_time or 100) then
            seldom_upd_time = tg+400
            bleedcondition()
        end
        init_blurs()
        if tg > (often_upd_time or 50) then
            often_upd_time = tg+120
                        helmet_hud()
            blood()
        end
        hit_effect()
        broken_nv()
        zoom_hud()
        shoot_effect()
    end
end
--------------------------------------------------------------------------------

local wpn_tbl = {}
local ammon = 0
local shotc = 1
local curwpn
local shott
local function parse_anims(sec)
    local hud = rx_utils.read_from_ini(nil,sec,"hud","o_O",1)
    local anim = rx_utils.read_from_ini(nil,hud,"shoot_effect",nil,1) or rx_utils.read_from_ini(dh_ini,hud,"shoot_effect",nil,1)
    if not anim then
        rx_utils.read_from_ini(dh_ini,rx_utils.read_from_ini(nil,sec,"class","O_o",1),"shoot_effect",nil,1)
    end
    if anim and dh_ini:section_exist(anim) then
--        rx_ai.printf("parse %s for %s",anim,sec)
        local tbl = {}
        tbl.s = rx_utils.parse_list(dh_ini,anim,"strength")
        tbl.r = rx_utils.read_from_ini(dh_ini,anim,"strength_rnd",1)
        tbl.e = {}
        for i=0,5 do
            tbl.e[i] = rx_utils.parse_list(dh_ini,anim,tostring(i))
            for k,v in pairs(tbl.e[i]) do
                tbl.e[i][k] = v and tonumber(v)
            end
        end
        tbl.p = {}
        tbl.c = {}
        local n = dh_ini:line_count(anim)
        if n > 8 then
            for i=6,n-1 do
                local r,id,val = dh_ini:r_line(anim,i,"","")
                val = rx_utils.str_explode(",",val,true)
                local shr = "ppe"
                if val[2] then
                    shr = val[2]
                end
                local ex
                if getFS():exist("$game_anims$",string.format("shoot\\%s.%s",id,shr)) then
                    ex = false
                elseif getFS():exist("$game_anims$",string.format("shoot\\%s_s1.%s",id,shr)) then
                    ex = true
                end
                val[1] = tonumber(val[1])
                if ex ~= nil and val[1] and val[1] ~= 0 then
                    if shr == "ppe" then
--                        rx_ai.printf("ppe %s = %s",id,val[1])
                        tbl.p[id] = {f = val[1],s = ex}
                    else
--                        rx_ai.printf("anm %s = %s",id,val[1])
                        tbl.c[id] = {f = val[1],s = ex}
                    end
                end
            end
        end
        wpn_tbl[sec] = tbl
    else
        wpn_tbl[sec] = true
    end
end

function shoot_effect()
    if not shoot_enable then
        return
    end
    if shott and shott < time_global() then
        shotc = 1
        shott = nil
    end
    local wpn = db.actor:active_item()
--    rx_ai.printf("%s %s",tostring(db.actor:dont_has_info("ui_inventory")),tostring(db.actor:dont_has_info("ui_car_body")))
    if rx_utils.item_is_fa(wpn) then
        local sect = wpn:section()
        if not wpn_tbl[sect] then
            parse_anims(sect)
        end
        if wpn_tbl[sect] ~= true then
            if wpn:name() == curwpn then
                local aminmag = wpn:get_ammo_in_magazine()
                if (aminmag == 0 and aminmag == ammon-1) or (aminmag ~= 0 and aminmag < ammon) then
                    shoot_anim(sect)
                end
                ammon = aminmag
            else
                curwpn = wpn:name()
                ammon = wpn:get_ammo_in_magazine()
            end
        else
            curwpn = nil
        end
    else
        curwpn = nil
    end
end

function shoot_anim(sect)
    local anims = {}
    local s = wpn_tbl[sect].s
    if #s > 1 then
        if wpn_tbl[sect].r == 1 then
            s = s[math.random(#s)]
        elseif wpn_tbl[sect].r == 2 then
            if shotc == 1 then
                s = shotc
            else
                s = s[math.random(2,#s)]
            end
        else
            local sc = #s
            sc = shotc <= sc and shotc or (sc > 2 and math.random(sc-1,sc)) or sc
            s = s[sc]
        end
    else
        s = s[1]
    end
    for i,v in pairs(wpn_tbl[sect].e) do
        local cnt,r = math.modf(v[1])
        if r ~= 0 and cnt > 4 then --fmb
            cnt = cnt-cnt*math.random(0,r*100)/100 --fmb
            cnt,r = math.modf(cnt)
        end
        if r ~= 0 and math.random() < r then
            cnt = cnt+1
        end
        if cnt > 0 then
            local dir = v[2]
            if not dir then
                dir = math.random(0,1)
            end
            table.insert(anims,{e = i,d = dir,c = cnt})
        end
    end
    for i,a in ipairs(anims) do
        local n = string.format([[shoot\s%s_e%s_%s.anm]],s,a.e,a.d)
        for ii=1,a.c do
            level.add_cam_effector(n,math.random(5000,8000),false,"")
        end
    end
    for k,v in pairs(wpn_tbl[sect].c) do
        local cnt,r = math.modf(v.f)
        if r ~= 0 and cnt > 4 then
            cnt = cnt-cnt*math.random(0,r*100)/100
            cnt,r = math.modf(cnt)
        end
        if r ~= 0 and math.random() < r then
            cnt = cnt+1
        end
        local n = v.s and string.format([[shoot\%s_s%s.anm]],k,s) or string.format([[shoot\%s.anm]],k)
        for i=1,cnt do
            level.add_cam_effector(n,math.random(8000,9000),false,"")
        end
    end
    for k,v in pairs(wpn_tbl[sect].p) do
        local n = v.s and string.format([[shoot\%s_s%s.ppe]],k,s) or string.format([[shoot\%s.ppe]],k)
        local cnt,f = math.modf(v.f)
        if f > 0 then
            cnt = cnt+1
        end
        for i=1,cnt do
            local eid = math.random(5000,8000)
            level.add_pp_effector(n,eid,false)
            if i == 1 then
                level.set_pp_effector_factor(eid,f)
            end
        end
    end
    shotc = shotc+1
    shott = time_global()+300
end

local suithud
local pre_suithud
local pre_cond
local pre_helmet
local hud_blurs = 0
local helmet_d
local hct = {[1] = "blue",[2] = "green",[3] = "yellow",[4] = "red",[5] = "red2",[6] = "red3"}
local function get_condition_sf(c)
    if c > 0.86 then return 1
    elseif c > 0.67 then return 2
    elseif c > 0.54 then return 3
    elseif c > 0.43 then return 4
    elseif c > 0.25 then return 5
    else return 6 end
end
function helmet_hud()
    if not suithud_enable then
        return
    end
    local helmet = db.actor:alive() and db.actor:get_current_outfit()
    local helmet_id = helmet and helmet:id()
    if not helmet then
        helmet_d = nil
        pre_helmet = nil
    elseif helmet_id ~= pre_helmet then
        local sect = helmet:section()
        for k,v in pairs(helmets) do
            if string.find(sect,k) then
                helmet_d = v
            end
        end
        if helmet_d then
            pre_cond = 1
            if helmet_d.breakable == true then
                pre_cond = get_condition_sf(helmet:condition())
            end
            hud_blurs = helmet_d.blurs
            suithud = helmet_d.hud.."_"..hct[pre_cond]
        end
        pre_helmet = helmet_id
    elseif helmet and helmet_d and helmet_d.breakable == true then
        local cond = get_condition_sf(helmet:condition())
        if cond ~= pre_cond then
            if cond > pre_cond and cond > 2 then
                local snd_obj = sound_object("material\\glass\\glass_fall03hl")
                snd_obj:play(db.actor,0,sound_object.s2d)
            end
            pre_cond = cond
            suithud = helmet_d.hud.."_"..hct[pre_cond]
        end
    end
    setmysuithud()
end

function setmysuithud()
    local hud = get_hud()
    local actor_pos = db.actor:bone_position("bip01_head")
    if not helmet_d or ui_disabled or actor_pos:distance_to_sqr(device().cam_pos) > 4 then
        local wchud = pre_suithud and hud:GetCustomStatic(pre_suithud)
        if wchud then
            hud:RemoveCustomStatic(pre_suithud)
        end
        pre_suithud = nil
    elseif pre_suithud ~= suithud then
--        rx_ai.printf("change suithud from %s to %s",tostring(pre_suithud),suithud)
        if pre_suithud then
            hud:RemoveCustomStatic(pre_suithud)
        end
        hud:AddCustomStatic(suithud)
        pre_suithud = suithud
    end
end

local pre_fov = 0
local precf = 0
local ztime = time_global()
local zbias = Frect():set(0,0,1024,768)
local zenc
function zoom_hud()
    if not zoom_enable then
        return
    end
    if helmet_d then
        local hud = get_hud():GetCustomStatic(suithud)
        if hud then
            local cf = precf
            local fov = math.floor((device().fov+0.02)*10)
            local delta = time_global()-ztime
            ztime = time_global()
            if not zenc or fov > 38*10 and pre_fov < fov then
                zenc = nil
                if cf > 0 then
                    cf = cf-(delta/400)
                    if cf < 0 then
                        cf = 0
                    end
                end
            end
            if zenc or fov < 58*10 and pre_fov > fov then
                zenc = true
                if cf < 1 then
                    cf = cf+(delta/400)
                    if cf > 1 then
                        cf = 1
                    end
                end
            end
            if cf ~= precf then
                local wpn = db.actor:active_item()
                if wpn then
                    if wpn:clsid() == clsid.wpn_binocular_s then
                        zbias:set(-100*cf,-100*cf,1024+100*cf,768+100*cf)
                    elseif rx_utils.addon_attached(wpn,"sc") then
                        zbias:set(-350*cf,-175*cf,1024,768+175*cf)
                    else
                        zbias:set(-200*cf,-100*cf,1024,768+100*cf)
                    end
                    hud:wnd():SetWndRect(zbias)
                elseif precf ~= 0 then
                    zbias:set(0,0,1024,768)
                    hud:wnd():SetWndRect(zbias)
                end
                precf = cf
            end
            pre_fov = fov
        end
    end
end

function broken_nv()
    if not brnv_enable then
        return
    end
    if helmet_d then
        local rnd = math.random(1000)
        if pre_cond == 4 then
            if rnd < 30 then
                enable_nv(false)
            end
        elseif  pre_cond == 5 then
            if rnd < 60 then
                enable_nv(false)
            end
        elseif  pre_cond == 6 then
            enable_nv(false)
        end
    end
end

function enable_nv(enable)
    if enable == false then
        level.remove_pp_effector(55)
    end
end

function init_blurs()
    if not blurs_enable then
        return
    end
    if helmet_d and helmet_d.blurs >= 1 and pre_cond ~= 6 then
        set_blurs(true)
    else
        set_blurs(false)
    end
end

local blurs
local blurval = 0 -- уровень запотевания от 0 до 1
local blurlt = 0 -- время последнего обновления
local blurcyctime = 0 -- время начала последнего цикла дыхания (выдох)
local blurlastphase = 0
function set_blurs(enabled)
    local hud = get_hud()
    if not (blurs and hud:GetCustomStatic("hud_blur1")) then
        blurs = {}
        for i=1,4 do
            hud:AddCustomStatic("hud_blur"..i)
            blurs[i] = hud:GetCustomStatic("hud_blur"..i):wnd()
            blurs[i]:SetWidth(0)
            blurs[i]:SetColor(GetARGB(0,255,255,255))
        end
    end
    if not enabled then
        for i=1,4 do
            blurs[i]:SetWidth(0)
        end
        return
    end
-- Циклы в зависимости от силы дыхания: 0->1->0 0->1->2->4->5->0 0->1->2->3->4->5->0 5->4->3->4->5 4->3->4
    local power = db.actor.power
    local period = 1.0+power*power*1.0 -- текущая частота дыхания от 30 до 120 циклов в минуту
    local expirt = 0.3
    local breathpower = hud_blurs
    local delta = (time_global()-blurlt)/1000 -- дельта в секундах
    local phase = (time_global()-blurcyctime)/1000 -- фаза дыхательного цикла в сек.
    blurlt = time_global()
    if phase > period then
        phase = phase%period
        blurcyctime = blurlt-phase*1000
    end
    if blurlastphase > phase then
        blurlastphase = 0
    end
    local blurdelta = delta*-0.7 -- работа вентилляции
    if blurlastphase < expirt and phase < expirt then
        blurdelta = blurdelta+(phase-blurlastphase)*breathpower
    elseif blurlastphase < expirt then
        blurdelta = blurdelta+(expirt-blurlastphase)*breathpower
    end
    blurlastphase = phase
    blurval = blurval+blurdelta
    if blurval > 0.999 then
        blurval = 0.999
    elseif blurval < 0 then
        blurval = 0
    end
    local tm = math.floor(blurval*3)
    local tmn = (tm+1)
    local v = blurval*3-math.floor(blurval*3)
    v = 1-v
    local v1 = 1-v
    if tm ~= 0 then
        blurs[tm]:SetColor(GetARGB(v*255,255,255,255))
    end
    if tmn ~= 0 then
        blurs[tmn]:SetColor(GetARGB(v1*255,255,255,255))
    end
    for i=1,4 do
        if i == tm or i == tmn then
            blurs[i]:SetWndRect(Frect():set(zbias.x1,zbias.y1,zbias.x2,zbias.y2+56))
        else
            blurs[i]:SetWndRect(Frect():set(zbias.x1,zbias.y1,zbias.x2,zbias.y2+56))
        end
    end
end

local prev_health = 0
function hit_effect()
    if not hit_enable then
        return
    end
    if prev_health > db.actor.health+0.05 then
        level.add_pp_effector("amk_shoot.ppe",2011,false)
        level.set_pp_effector_factor(2011,(prev_health-db.actor.health)*100)
        if prev_health > db.actor.health+0.2 then
            local cameffs,sounds
            if prev_health > db.actor.health+0.5 then
                level.add_pp_effector("total_recall.ppe",2016,false)
                level.set_pp_effector_factor(2016,(prev_health-db.actor.health)*100)
                cameffs = {"head_shot","fusker"}
                sounds = {"pain_4","pain_1","hit_5","hit_6"}
            else
                cameffs = {"shell_shock","hit_front","hit_right","hit_back","hit_left","hit_front_left","hit_back_left","hit_front_right","hit_back_right"}
                sounds = {"pain_2","pain_3","pain_5","pain_6","pain_7","pain_8"}
            end
            if not shott then
                level.add_cam_effector("camera_effects\\"..cameffs[math.random(#cameffs)]..".anm",999,false,"")
            end
            local snd_obj = sound_object("actor\\"..sounds[math.random(#sounds)])
            snd_obj:play(db.actor,0,sound_object.s2d)
            if math.random() < (prev_health-db.actor.health)/2.5 then
                local active_item = db.actor:active_item()
                if active_item and not no_drop_items[active_item:section()] then
                    db.actor:drop_item(active_item)
                end
            end
        end
    end
    prev_health = db.actor.health
end

local actor_last_health = 0
local bloodtime = 0
local bloodtimeb = 0
local isbleeding = "no"
local countblood = 0
function blood()
    if not blood_enable then
        return
    end
    local hud = get_hud()
    if db.actor:alive() and not ui_disabled then
        local current_health = math.floor(db.actor.health*100)
        local tg = time_global()
        if tg > bloodtime then
            if isbleeding == "stopit" then
                if hud:GetCustomStatic("hud_blood"..countblood) then
                    hud:RemoveCustomStatic("hud_blood"..countblood)
                end
                countblood = countblood-1
                if countblood == 0 then
                    isbleeding = "no"
                end
                bloodtime = time_global()+110
            else
                if actor_last_health ~= 0 and actor_last_health > current_health and db.actor.radiation < 0.12 then
                    if current_health < math.random(100) then
                        isbleeding = "yes"
                    end
                    level.add_pp_effector("bloody.ppe",2010,false)
                end
                if isbleeding == "yes" then
                    bloodtime = time_global()+math.random(500,2000)
                else
                    bloodtime = time_global()+math.random(2000,5000)
                end
                actor_last_health = current_health
            end
        end
        if tg > bloodtimeb and isbleeding == "yes" then
            bloodtimeb = time_global()+130
            countblood = countblood+1
            hud:AddCustomStatic("hud_blood"..countblood)
            if countblood == 4 then
                isbleeding = "stopit"
            end
        end
    else
        for i=1,4 do
            if hud:GetCustomStatic("hud_blood"..i) then
                hud:RemoveCustomStatic("hud_blood"..i)
            end
        end
    end
end

local isactcondset = false
local radeffect = false
local ble1 = 0
local ble2 = false
function bleedcondition()
    if not bleed_enable then
        return
    end
    if db.actor.health < 0.31 and isactcondset ~= true then
        level.add_pp_effector("alcohol.ppe",2012,true)
        isactcondset = true
    end
    if db.actor.health > 0.30 and isactcondset ~= false then
        level.remove_pp_effector(2012)
        isactcondset = false
    end
    if db.actor.radiation > 0.3 and radeffect ~= true then
        level.add_pp_effector("alcohol.ppe",2013,true)
        radeffect = true
    end
    if db.actor.radiation == 0 and radeffect ~= false then
        level.remove_pp_effector(2013)
        radeffect = false
    end
    if db.actor:get_bleeding() > 0.5 and db.actor.health < 0.4 and ble1 < time_global() then
        level.add_pp_effector("deimos1.ppe",2014,false)
        ble1 = time_global()+math.random(4000,10000)
    end
    if db.actor:get_bleeding() > 0.4 and db.actor.power < 0.35 and ble2 ~= true then
        level.add_cam_effector("camera_effects\\pripyat_horror.anm",1001,false,"")
        level.add_pp_effector("snd_shock.ppe",2015,true)
        ble2 = true
    end
    if db.actor:get_bleeding() < 0.2 or db.actor.power > 0.7 and ble2 ~= false then
        level.remove_pp_effector(2015)
        ble2 = false
    end
end

Изменено пользователем panzyuza
Ссылка на комментарий

panzyuza, в том же АМК-моде имеется прародитель тобою приведенного скрипта и именно по атаке собак.

Несложно варьируя классом монстра подстраивать подобное под свои нужды. Помимо АМК аналогичные коды имеются во многих модах ... (см. в bind_monster.script)

 

Ну а задавая вопрос, не группируй его союзом 'И', тем более, если это совершенно не взаимосвязанные вопросы.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Хорошо.А как подправить правильно скрипт, выше, что бы когда ГГ начинает целиться, данный эффект стрельбы отключалься?

Ссылка на комментарий

panzyuza, у меня довольно плохой характер ... Я не даю (в большинстве случаев) готовых ответов/кодов/... Считаю, что по подсказке направления поиска/действия, модмейкер и не получит шор и что-то сделает именно сам ... Этот вариант хотя порой и более долог, но в конечной цели - более продуктивен (ИМХО).

И опять же, мне непонятьно то, что в твоем случае для 'dinamic_hud by Rulix aka Baк' требуется все то, что было сделано уже 4 года назад той же командой АМК в их кодах по интерактивному худу. Т.е. определять изменение 'fov' и отключать свой худ в моменты, когда он отличен от 'обычного' значения. (не изобретай велосипеды! и почаще смотри уже наработанное годами ...)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

panzyuza

Тебя какой именно эффект интересует? Эффект покраснения экрана, или эффект противогаза?

 

qwqwqw

Пулемётчика советую посмотреть в ЧН, в госпитале. Папка configs\scripts\katacomb_hospital\kat_hosp_z1_minigun.ltx и kat_hosp_z1_minigunner.ltx

 

Это правда станционарный пулемёт, зато его очередь можно регулировать как тебе нужно.

Для ЗП тоже должен работать, но наверно придётся переносить его скриптовую схему (ph_minigun.script)

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Недавно в "ковырялке" кто-то писал про срабатывание коллбеков на выкладывание/взятие предмета при переходах между локациями. Нашёл решение (теоретически, на практике пока не проверялось) этой проблемы.

В некоторых местах разрабы ставили проверку на "чёрный экран", т.е. видит ли игрок что-нибудь, или же ещё идёт загрузка. Чтобы коллбеки вызывались только ПОСЛЕ появления первого кадра игры, надо сделать в bind_stalker.script такие изменения:

 

1. Добавляем переменную, которая показывает, установлены ли коллбеки

function actor_binder:__init (obj) super(obj)
              ...
              self.callbackset = false
              ...
end

2. Переносим в функцию update() все коллбеки, которые не должны вызываться до окончания загрузки.

function actor_binder:update(delta)
              object_binder.update(self, delta)
              ...
              if device().precache_frame >1 then
                            return
              end
              if self.callbackset == false then
                            self.object:set_callback(callback.on_item_take, self.on_item_take, self)
                            self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
                            self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self)
                            self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
                            self.object:set_callback(callback.article_info, self.article_callback, self)
              end
              ...

3. В функции reinit должны остаться все остальные коллбеки:

self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.task_state, self.task_callback, self)
self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)

Изменено пользователем Полтергейст
Ссылка на комментарий

qwqwqw, у НПС имеется метод 'set_item', позволяющий отыгрывать различные варианты анимаций с предметами.

Например строка: oNPC:set_item(object.fire1, oWeapon, 3, 5000)

определяет для НПС стрельбу из оружия (oWeapon), размер очереди = 3, пауза между очередями = 5сек

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Да, небольшое дополнение: после установки коллбеков (которые в update) надо присвоить self.callbackset = true.

Изменено пользователем Полтергейст
Ссылка на комментарий

Полтергейст, твое решение и имеет ошибки и ... очень частное, т.е. во многих случаях не пременимо.

1. У тебя пропущена установка self.callbackset = true, без которой коллбэеки будут 'взводиться' непрерывно.

2. Излишняя проверка device().precache_frame >1 в каждом апдейте - далеко не оптимальна. Если делать, то после self.callbackset == false.

3. Коллбэк дает только информацию о событии и (ИМХО) стОит не 'завязывать себе глаза', а не допускать ненужных действий при наступлении соотв. коллбэка в неподходящее время, т.е. блокировать отработку коллбэков в зависимости от контекста, а не их самих.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

qwqwqw, если задаешь подобные вопросы - вначале стОит подучить азы по скриптам (см. шапку).

Метод не присваивается, а ... вызывается.

В мною упомянутой строке: oNPC:set_item(...) - это и есть вызов для клиентского объекта (oNPC) данного метода с аргументами (...), которые и определяют что с чем и как требуется делать 'твоему НПС'.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Всем привет! Начал ковыряться в логике, получается не всё( вот не знаю как из файла логики обратиться к скрипту, как? Всё перерыл, ничего не нашел

 

Вот допустим функция в файле test.script:

function conf_door()

...

return true

end

 

А вот логика:

[ph_door@locked]

locked = true

closed = true

on_info = {тут обращение к функции должно быть как я понимаю} ph_door@open ; как тут обратиться к своей функции в моём скрипте?

 

Заранее спасибо

Ссылка на комментарий

AutoGnom, нет не правильно

on_info = {условие(это инфопоршень)} ph_door@open, т.е

on_info = {+actor_talked_with_wolf} ph_door@open это означает, что после того как нам выдадут инфу(actor_talked_with_wolf) дверь откроется

а + это если есть инфа

а - это если инфы еще нет

Ссылка на комментарий

AutoGnom

Для того, чтобы использовать функцию, её нужно разместить или сделать её вызов в файлах: либо xr_conditions.script, либо xr_effects.script, выбор зависит от того - используешь ли ты функцию, как условие или как эффект (надеюсь понятно в каком случае, куда писать функцию).

То есть:

on_info = {conditions}
;либо
on_ifo = %effects%

в случае использования функции в качестве условия и эффекта, нужно помнить:

для conditions (function - имя функции):

=function - требуется, чтобы function вернула true;

!function - требуется, чтобы function вернулся false.

для effects:

=function - в случае включения секции стартует функция function.

 

А вообще об использовании скриптов в логике можешь почитать здесь: >>Click Me<<

Изменено пользователем ColR_iT
Ссылка на комментарий

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

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...