qwqwqw 117 Опубликовано 28 Ноября 2011 Поделиться Опубликовано 28 Ноября 2011 Люди может кто помочь - возможно ли каким нибудь способом регулировать длину очередей НПС через логику? Необходимо сделать пулемётчика. Ссылка на комментарий
panzyuza 41 Опубликовано 28 Ноября 2011 Поделиться Опубликовано 28 Ноября 2011 А как правильно скриптово выполнить проверку на то, что монстр в данный момент атакует игрока и то что актор находиться в режиме прицеливания? AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 28 Ноября 2011 Поделиться Опубликовано 28 Ноября 2011 qwqwqw, логика никоим образом не расчитана на "регалировку очередей у НПС". Есть некая возможность влиять на анимацию через object.fire1 в стайт-менеджере, но это уже совершенно иная история. panzyuza, поделись с нами хотя бы 'не правильными' вариантами того, о чем спрашиваешь - может тогда и найдется более 'правильный' вариант ... ;-) "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Zander_driver 10 334 Опубликовано 28 Ноября 2011 Поделиться Опубликовано 28 Ноября 2011 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. Ссылка на комментарий
panzyuza 41 Опубликовано 28 Ноября 2011 Поделиться Опубликовано 28 Ноября 2011 (изменено) Вот на основании данного кода хочу сделать, что бы эффект выбрасывания оружия срабатывал только в случае,если собака атакует игрока 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 Изменено 28 Ноября 2011 пользователем panzyuza AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 28 Ноября 2011 Поделиться Опубликовано 28 Ноября 2011 (изменено) panzyuza, в том же АМК-моде имеется прародитель тобою приведенного скрипта и именно по атаке собак. Несложно варьируя классом монстра подстраивать подобное под свои нужды. Помимо АМК аналогичные коды имеются во многих модах ... (см. в bind_monster.script) Ну а задавая вопрос, не группируй его союзом 'И', тем более, если это совершенно не взаимосвязанные вопросы. Изменено 28 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
panzyuza 41 Опубликовано 28 Ноября 2011 Поделиться Опубликовано 28 Ноября 2011 Хорошо.А как подправить правильно скрипт, выше, что бы когда ГГ начинает целиться, данный эффект стрельбы отключалься? AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 28 Ноября 2011 Поделиться Опубликовано 28 Ноября 2011 (изменено) panzyuza, у меня довольно плохой характер ... Я не даю (в большинстве случаев) готовых ответов/кодов/... Считаю, что по подсказке направления поиска/действия, модмейкер и не получит шор и что-то сделает именно сам ... Этот вариант хотя порой и более долог, но в конечной цели - более продуктивен (ИМХО). И опять же, мне непонятьно то, что в твоем случае для 'dinamic_hud by Rulix aka Baк' требуется все то, что было сделано уже 4 года назад той же командой АМК в их кодах по интерактивному худу. Т.е. определять изменение 'fov' и отключать свой худ в моменты, когда он отличен от 'обычного' значения. (не изобретай велосипеды! и почаще смотри уже наработанное годами ...) Изменено 28 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
qwqwqw 117 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 Artos а каким образом можно влиять на анимацию через object.fire1 чтобы заставить НПС стрелять без перерыва? Ссылка на комментарий
*Shoker* 322 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 panzyuza Тебя какой именно эффект интересует? Эффект покраснения экрана, или эффект противогаза? qwqwqw Пулемётчика советую посмотреть в ЧН, в госпитале. Папка configs\scripts\katacomb_hospital\kat_hosp_z1_minigun.ltx и kat_hosp_z1_minigunner.ltx Это правда станционарный пулемёт, зато его очередь можно регулировать как тебе нужно. Для ЗП тоже должен работать, но наверно придётся переносить его скриптовую схему (ph_minigun.script) Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
qwqwqw 117 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 *Shoker* забыл уточнить мне для ТЧ надо. Хотя спасибо за наводку-там ведь тоже есть турели. Ссылка на комментарий
Полтергейст 37 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 (изменено) Недавно в "ковырялке" кто-то писал про срабатывание коллбеков на выкладывание/взятие предмета при переходах между локациями. Нашёл решение (теоретически, на практике пока не проверялось) этой проблемы. В некоторых местах разрабы ставили проверку на "чёрный экран", т.е. видит ли игрок что-нибудь, или же ещё идёт загрузка. Чтобы коллбеки вызывались только ПОСЛЕ появления первого кадра игры, надо сделать в 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) Изменено 29 Ноября 2011 пользователем Полтергейст Ссылка на комментарий
Artos 99 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 (изменено) qwqwqw, у НПС имеется метод 'set_item', позволяющий отыгрывать различные варианты анимаций с предметами. Например строка: oNPC:set_item(object.fire1, oWeapon, 3, 5000) определяет для НПС стрельбу из оружия (oWeapon), размер очереди = 3, пауза между очередями = 5сек Заставить стрелять непрерывно невозможно, т.к. патроны в магазинах оружия небесконечны и потребны перерывы на перезарадку. Изменено 29 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Полтергейст 37 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 (изменено) Да, небольшое дополнение: после установки коллбеков (которые в update) надо присвоить self.callbackset = true. Изменено 29 Ноября 2011 пользователем Полтергейст Ссылка на комментарий
Artos 99 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 (изменено) Полтергейст, твое решение и имеет ошибки и ... очень частное, т.е. во многих случаях не пременимо. 1. У тебя пропущена установка self.callbackset = true, без которой коллбэеки будут 'взводиться' непрерывно. 2. Излишняя проверка device().precache_frame >1 в каждом апдейте - далеко не оптимальна. Если делать, то после self.callbackset == false. 3. Коллбэк дает только информацию о событии и (ИМХО) стОит не 'завязывать себе глаза', а не допускать ненужных действий при наступлении соотв. коллбэка в неподходящее время, т.е. блокировать отработку коллбэков в зависимости от контекста, а не их самих. Изменено 29 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
qwqwqw 117 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 Artos к сожалению мои познания в скриптах пока несильно велики. Как присвоить НПС set_item? Ссылка на комментарий
Artos 99 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 (изменено) qwqwqw, если задаешь подобные вопросы - вначале стОит подучить азы по скриптам (см. шапку). Метод не присваивается, а ... вызывается. В мною упомянутой строке: oNPC:set_item(...) - это и есть вызов для клиентского объекта (oNPC) данного метода с аргументами (...), которые и определяют что с чем и как требуется делать 'твоему НПС'. Изменено 29 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
AutoGnom 0 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 Всем привет! Начал ковыряться в логике, получается не всё( вот не знаю как из файла логики обратиться к скрипту, как? Всё перерыл, ничего не нашел Вот допустим функция в файле test.script: function conf_door() ... return true end А вот логика: [ph_door@locked] locked = true closed = true on_info = {тут обращение к функции должно быть как я понимаю} ph_door@open ; как тут обратиться к своей функции в моём скрипте? Заранее спасибо Ссылка на комментарий
Старлей 88 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 AutoGnom, нет не правильно on_info = {условие(это инфопоршень)} ph_door@open, т.е on_info = {+actor_talked_with_wolf} ph_door@open это означает, что после того как нам выдадут инфу(actor_talked_with_wolf) дверь откроется а + это если есть инфа а - это если инфы еще нет Ray Of Hope - кооператив сталкера OldStory Ссылка на комментарий
ColR_iT 171 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 (изменено) 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<< Изменено 29 Ноября 2011 пользователем ColR_iT Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти