В данной теме вы можете задавать любые вопросы касательно S.T.A.L.K.E.R. моддинга.
Не флудить
Предварительно просматривайте раздел. Ответ на ваш вопрос может быть там.
В своем вопросе указывайте платформу моддинга - Тень Чернобыля, Чистое небо или Зов Припяти.
1. Какая стоит игра, с каким патчем? 2. Какой мод, версия мода? 3. Что правили своими ручками? 4. Конфиг компа. 5. Лог вылета и последние 25 строк (помещать под спойлер).
Структура папок и файлов в корневом каталоге игры:
...\S.T.A.L.K.E.R\gamedata\anims – папка содержит исполнительные файлы эффектов (например от ПНВ).
...\S.T.A.L.K.E.R\gamedata\config – папка содержит основные конфигурационные файлы (т. е. большинство настроек игры)
...\S.T.A.L.K.E.R\gamedata\meshes – содержит модели игровых предметов и персонажей...
...\S.T.A.L.K.E.R\gamedata\scripts – папка со скриптами (рабочими файлами содержащими в себе наборы функций) – основная папка, отвечающая за ответные действия игры и действия производимых игроком в игре.
...\S.T.A.L.K.E.R\gamedata\shaders – папка содержит в себе конфигурационные файлы шейдеров.
...\S.T.A.L.K.E.R\gamedata\sounds – здесь находятся все звуки игры (разложены по своим каталогам и папкам)
...\S.T.A.L.K.E.R\gamedata\spawns – содержит файл спавна – очень важный файл – не трогать без нужды!!!
...\S.T.A.L.K.E.R\gamedata\textures – содержит разложенные по каталогам и папкам текстуры используемые в игре.
Теперь разберем папки в каталоге «config»
...\S.T.A.L.K.E.R\gamedata\config\creatures - содержит массу конфигурационных файлов, в основном отвечающих за взаимодействие Главного героя игры (в дальнейшем ГГ) и прочего окружения в игре и ТТХ самого ГГ.
...\S.T.A.L.K.E.R\gamedata\config\gameplay – содержит конфиг. файлы персонажей игры (НПС) отвечающие за внешний вид, статус, снаряжение. Файлы: character_desc_ххх (где ххх – название локации) и character_desc_general (отвечает за зомбированного персонажа). Также содержит файлы диалогов и профилей НПС.
…\S.T.A.L.K.E.R\gamedata\config\misc – конфиг.файлы торговцев (папки с именами торговцев), артефактов, брони, квестовых предметов, уникальных предметов, файл отвечающий за награды за автозадания, файл эффектов (алкоголизма, ранения, ПНВ и прочих)...
…\S.T.A.L.K.E.R\gamedata\config\mp – среди прочих содержит важный файл mp_ranks – отвечающий за выпадение оружия и патронов из рук ГГ и НПС – без прописывания добавляемого в игру оружия в этот файл при выпадении нового оружия из рук ГГ\НПС будут следовать вылеты.
…\S.T.A.L.K.E.R\gamedata\config\text\rus – содержит файлы описаний всего и вся находящегося в игре (брони, артефактов, оружия, предметов и прочего).
…\S.T.A.L.K.E.R\gamedata\config\weapons – содержит конфиг.файлы оружия и боеприпасов используемых в игре.
…\S.T.A.L.K.E.R\gamedata\config\weathers – содержит конфиг.файлы настройки погоды на локациях.
Теперь немного подробнее о файлах.
...\S.T.A.L.K.E.R\gamedata\config\misc:
Папка shop_ххх (ххх – имя торговца) – содержит конфиг.файлы ассортимента торговца.
outfits – содержит секции конфигов костюмов.
artefacts - содержит секции конфигов артефактов.
items - содержит секции конфигов предметов.
monster_items - содержит секции конфигов частей монстров
postprocess - содержит секции конфигов пост. процессов (например: ПНВ).
quest_items - содержит секции конфигов квестовых предметов.
task_manager - содержит секции наград за автоквесты.
unique_items - содержит секции конфигов уникального оружия и костюмов.
У кого есть желание, создать FAQ по основным вопросам моддинга - обращаемся в ЛС.
Подскажите , на что ругается жук Код: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ...ll of pripyat\gamedata\scripts\postproces_mod.script:593: bad argument #1 to 'random' (interval is empty)
стандартный файл постпроцесс мода , происходит во время эффекта камеры 593 строка
local upd_time,seldom_upd_time,often_upd_time = 0,0,0 local pret = game.get_game_time() local last_updt = -100 function update() if not db.actor:alive() then for n,e in pairs(effects) do remove_effect(n,true) end return end local tg = time_global() wounded_pp_update(tg) local deltag = tg-last_updt if deltag >= 63 then update_effects(deltag) check_krovosos_sos() last_updt = tg end if tg > upd_time then local time = game.get_game_time() local delta = time:diffSec(pret) mezaton_update(delta) hunger_update(delta) toxic_update(delta) thirst_update(delta) pret = time upd_time = tg+810 proce = true end if tg > seldom_upd_time then sleep_update() seldom_upd_time = tg+6100 end if tg > often_upd_time then often_upd_time = tg+544 end -- show_hud() -------------- end
function show_hud() local hud = get_hud() local h = hud:GetCustomStatic("hud_ppm_test") if not h then hud:AddCustomStatic("hud_ppm_test",true) else local function round(num) local str = "%c[default]" num = math.floor(num*100) if num > 90 then str = "%c[255,238,155,20]" end return str..num.."%c[default]" end h:wnd():TextControl():SetTextST(string.format("PPM STAT: sleep[%s],hunger[%s],thirst[%s],toxic1[%s],toxic2[%s],mezaton[%s]",round(xr_logic.pstor_retrieve(db.actor,"drowse",0)),round(1-xr_logic.pstor_retrieve(db.actor,"satiety",1)),round(xr_logic.pstor_retrieve(d b.actor,"thirst",0)),round(xr_logic.pstor_retrieve(db.actor,"toxic1",0)),round(xr_logic.pstor_retrieve(db.actor,"toxic2",0)),round(xr_logic. pstor_retrieve(db.actor,"mez",0)))) end end
function init_effects() for n,e in pairs(effects) do if e.pp or e.cam then base_id = base_id+1 e.id = base_id end if e.pp then if not tonumber(e.pp[#e.pp]) then --type(e.pp[#e.pp]) ~= "number" table.insert(e.pp,1) end -- e.pp[2] = 1 end if e.snd then e.snd[2] = 0 e.snd[3] = 1 end e.time = 0 if not e.tr_time then if e.cyclic then e.tr_time = 5000 else e.tr_time = 1 end end if not e.cyclic and not e.play_time then e.play_time = e.snd and e.snd[1]:length() or 5000 end if e.update_func then e.update_func = loadstring(e.update_func.."(...)") setfenv(e.update_func,this) end if e.callback_func then e.callback_func = loadstring(e.callback_func.."(...)") setfenv(e.callback_func,this) end end end
local inited function update_effects(delta) if not inited then init_effects() inited = true return end for n,e in pairs(effects) do if e.play or e.ending then -- завершение по таймеру if not e.cyclic and e.play and e.play_time then e.time = e.time+delta if e.time > e.play_time then -- rx_ai.printf("update_effects end callback %s",n) if e.callback_func then e.callback_func(e) end remove_effect(n) end end -- изменение фактора if e.factor ~= e.target_factor then local add = delta/e.tr_time if math.max(e.factor,e.target_factor)-math.min(e.factor,e.target_factor) < add then e.factor = e.target_factor else local fr = e.factor < e.target_factor and 1 or -1 e.factor = e.factor+add*fr end if e.ending and e.factor < 0.05 then remove_effect(n,true) else if e.pp then -- rx_ai.printf("set %s factor %s %s %s",n,e.factor,tostring(e.play),tostring(e.ending)) level.set_pp_effector_factor(e.id,e.factor*e.pp[#e.pp],20) end if e.snd then e.snd[1].volume = e.factor*e.snd[3] end end end -- кастом апдейт if e.play and e.update_func then e.update_func(n,e,delta) end end end end
function add_effect(name,ef) local eff = effects[name] if not eff.play then local loop = eff.cyclic if eff.ending and loop then -- rx_ai.printf("add_effect %s ending",name) eff.ending = nil eff.play = true eff.target_factor = 1 return end eff.target_factor = 1 eff.factor = 1 eff.play = true if loop then eff.factor = 0.01 end if eff.pp and (not ef or ef == "pp") then local pe = eff.pp[math.random(1,#eff.pp-1)] level.add_pp_effector(pe,eff.id,loop) level.set_pp_effector_factor(eff.id,eff.factor*eff.pp[#eff.pp]) end if eff.cam and (not ef or ef == "cam") then local ce = eff.cam[math.random(1,#eff.cam)] level.add_cam_effector("camera_effects\\"..ce,eff.id,loop) end local snd = eff.snd if snd and (not ef or ef == "snd") then snd[1]:play(db.actor,snd[2],loop and sound_object.s2d+sound_object.looped or sound_object.s2d) snd[1].volume = snd[3] end end end
function remove_effect(name,f) local eff = effects[name] if f then -- убираем нафиг if eff.pp then level.remove_pp_effector(eff.id) end if eff.cam then level.remove_cam_effector(eff.id) end if eff.snd then eff.snd[1]:stop() end eff.ending = nil -- rx_ai.printf("remove_effect %s f",name) elseif eff.play then -- or (eff.factor and not eff.cyclic) eff.ending = true eff.target_factor = 0.01 end eff.time = 0 eff.play = nil end
function effect_playing(name) return effects[name].play end
function set_ppe_factor(name,factor,f) if effects[name].play then if factor < 0.01 then factor = 0.01 elseif factor > 1 then factor = 1 end if f then level.set_pp_effector_factor(effects[name].id,factor,20) effects[name].factor = factor else effects[name].target_factor = factor end end end
local max_wake_time = 24*60*60 -- сколько может продержаться без сна. секунды local drst = pret local tsleept local sleepd = nil function sleep_update() local time = game.get_game_time() if sleepd ~= nil then if sleepd == false then sleepd = nil drst = time end return end local val = xr_logic.pstor_retrieve(db.actor,"drowse",0) local add = time:diffSec(drst)/max_wake_time drst = time val = val+add xr_logic.pstor_store(db.actor,"drowse",val) local power_in = (1-db.actor.power)/10 -- влияние силы на сонливость -- rx_ai.printf("drowse:add %s, val = %s,power_in = %s",add,val,power_in) --не спать вне укрытия во время выброса и за пол часа до него if val > 1-power_in and (surge_manager.actor_in_cover() or (not surge_manager.is_started() and surge_manager.get_surge_manager()._delta > time:diffSec(surge_manager.get_surge_manager().last_surge_time)+1200)) then -- отруб if not tsleept then tsleept = time_global()+math.random(5000,20000) elseif tsleept < time_global() then add_effect("sleep_snd") if val > 1.1 then ui_sleep_dialog.sleep_forced(math.floor(10*val)) --- нажрались водяры? Спим дольше else ui_sleep_dialog.sleep_forced() end sleepd = true end else tsleept = nil end if val > 0.75-power_in then -- блюр remove_effect("sleep_low") add_effect("sleep_high") set_ppe_factor("sleep_high",(val-0.7)*4) local m = math.random(100) if m > 91 then -- зевок add_effect("zevok") elseif m > 60 then add_effect("wink") set_ppe_factor("sleep_high",0.1,true) end elseif val > 0.5-power_in then -- двоение remove_effect("sleep_high") add_effect("sleep_low") local m = math.random(100) if m == 100 then -- зевок add_effect("zevok","snd") end if m > 95 then add_effect("zevok","pp") elseif m > 70 then add_effect("wink") end else remove_effect("sleep_high") remove_effect("sleep_low") end end
function mezaton_update(delta) -- mezaton local val = xr_logic.pstor_retrieve(db.actor,"mez",nil) if val then local add = delta/4800 val = val-add if val <= 0 then remove_effect("mezaton") db.storage[0].pstor.mez = nil else xr_logic.pstor_store(db.actor,"mez",val) add_effect("mezaton") end end end
local satiety_v = tonumber(rx_utils.read_from_ini(nil,"actor_condition","satiety_v",0,1)) function hunger_update(delta) --reverse --[[ if db.actor:dont_has_info("satiety_sync") then local bs = db.actor:object("bread_script") if bs then db.actor:eat(bs) db.actor:give_info_portion("satiety_sync") else alife():create("bread_script",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) return end end]] local val = xr_logic.pstor_retrieve(db.actor,"satiety",1) if val < 0 then val = 0 else val = val-delta*satiety_v end xr_logic.pstor_store(db.actor,"satiety",val) if val < 0.1 then remove_effect("hungry") add_effect("hunger") set_ppe_factor("hunger",1-val) if math.random(100) > 91 then add_effect("growling_snd") end elseif val < 0.3 then -- hungry remove_effect("hunger") add_effect("hungry") set_ppe_factor("hungry",1.2-val*2) else remove_effect("hungry") remove_effect("hunger") end end
local pre_power = 0 function thirst_update(delta) local val = xr_logic.pstor_retrieve(db.actor,"thirst",0) if val < 0 then val = 0 else local add = 0 if db.actor.power < pre_power then add = (pre_power-db.actor.power)/100 end val = val+delta/72000+add end pre_power = db.actor.power xr_logic.pstor_store(db.actor,"thirst",val) if val > 1 then if val > 2 then db.actor.health = -(val-2) end local max_power = 2-val if max_power < 0.2 then max_power = 0.2 end if db.actor.power > max_power then db.actor.power = max_power-db.actor.power end add_effect("thirst_low") add_effect("thirst_high") elseif val > 0.6 then remove_effect("thirst_high") add_effect("thirst_low") else remove_effect("thirst_low") remove_effect("thirst_high") end if effect_playing("thirst_low") then set_ppe_factor("thirst_low",val-0.5) end end
function toxic_update(delta) local val,val2 = xr_logic.pstor_retrieve(db.actor,"toxic1",0),xr_logic.pstor_retrieve(db.actor,"toxic2",0) if val == 0 and val2 == 0 then return end if val2 ~= 0 then local add = delta/36000 if math.abs(val2) <= add then val2 = 0 else val2 = val2+add*(val2 < 0 and 1 or -1) end end if val ~= val2 and math.abs(val2-val) > 0.001 then local add = (val2-val)*delta/1200 local mn,mx = math.abs(add) < 0.001,math.abs(add) > 0.5 if mn or mx then if add > 0 then if mn then add = 0.001 else add = 0.5 end else if mn then add = -0.001 else add = -0.5 end end end val = val+add else val = val2 end xr_logic.pstor_store(db.actor,"toxic1",val) xr_logic.pstor_store(db.actor,"toxic2",val2) if val > 1 then if math.random(100) > 91 then add_effect("groan_snd_"..math.random(3)) end add_effect("intoxication_low") add_effect("intoxication_high") add_effect("intoxication_du") elseif val > 0.75 then remove_effect("intoxication_high") add_effect("intoxication_low") add_effect("intoxication_du") elseif val > 0.45 then remove_effect("intoxication_du") remove_effect("intoxication_high") add_effect("intoxication_low") else remove_effect("intoxication_low") remove_effect("intoxication_du") remove_effect("intoxication_high") end end
local toxic_cf,toxic_wt = true,time_global()+math.random(12000) function toxic_effect1(n,eff,delta) local val = xr_logic.pstor_retrieve(db.actor,"toxic1",0) if toxic_wt < time_global() then if toxic_cf then local max = (val-0.4)*1.4 max = max < 1 and max or 1 set_ppe_factor(n,max) toxic_wt = time_global()+math.random(60,240)*100*val toxic_cf = nil else set_ppe_factor(n,0.1) toxic_wt = time_global()+math.random(40,160)*100*(2.1-val) toxic_cf = true end end -- отнимается сила if db.actor.power > 0.25 then db.actor.power = -delta*val/90000 end end
function toxic_effect2(n) local val = xr_logic.pstor_retrieve(db.actor,"toxic1",0) local min = val/2.2 local mid = val-min local power = math.abs(1.2-db.actor.power) set_ppe_factor(n,min+power*mid) end
function toxic_effect3(n,eff,delta) if not effect_playing("intoxication_stroke") then -- or effect_playing("intoxication_stroke_lethal")) local val = xr_logic.pstor_retrieve(db.actor,"toxic2",0) if val > 1 and db.actor.health < 0.1 then -- local rnd = math.random(val*10) -- if rnd < 8 then add_effect("intoxication_stroke") -- else -- add_effect("intoxication_stroke_lethal") -- end level.hide_indicators_safe() -- db.actor:hide_weapon() else db.actor.health = -delta*(val-1)/10000 if math.random() < 0.05 then local hit = hit() hit.type = hit.dummy hit.draftsman = db.actor hit.power = 0 db.actor:hit(hit) end end end end
function stroke_effect(eff) db.actor.health = 0.1-db.actor.health db.actor.power = 0.5-db.actor.power local hud = get_hud() hud:HideActorMenu() hud:HidePdaMenu() end
function stroke_callback(eff) local val = xr_logic.pstor_retrieve(db.actor,"toxic2",0) local rnd = math.random(val*100) if val > 1 then -- rx_ai.printf("stroke_callback: - pois %s",0.9-val) use_poisonousness(0.9-val) use_drinking(-0.2) end if rnd > 130 then db.actor:kill(db.actor) elseif rnd > 30 then ui_sleep_dialog.sleep_forced() level.show_indicators() db.actor.health = 0.15-db.actor.health end -- db.actor:restore_weapon() remove_effect("intoxication_high") end
function sleep_callback(hours,mins,forced) -- rx_ai.printf("sleep:%s:%s (-%s)",hours,mins,hours/16+mins/960) if xr_logic.pstor_retrieve(db.actor,"toxic2",0) > 1 then db.actor:kill(db.actor) return end sleepd = false add_effect("wakeup_snd") local val = xr_logic.pstor_retrieve(db.actor,"drowse",0) val = val-hours/10-mins/600 if val < 0 then val = 0 end xr_logic.pstor_store(db.actor,"drowse",val) val = xr_logic.pstor_retrieve(db.actor,"drowse_cut",0) val = val-hours/16-mins/960 if val < 0 then val = 0 end xr_logic.pstor_store(db.actor,"drowse_cut",val) -- spawn surprise if not forced or surge_manager.actor_in_cover() then -- rx_ai.printf("not forced or actor_in_cover") return end for i,v in ipairs(no_surprise_zones) do if xr_conditions.actor_in_zone(nil,nil,{[1] = v}) then -- rx_ai.printf("in ns zone: %s",v) return end end db.actor.radiation = math.random(hours)/8 local rnd = 0 local tmp = {} for k,v in pairs(surprise_list) do rnd = rnd+v[1] table.insert(tmp,{sec = k,rnd = rnd}) end rnd = math.random(rnd) local pre = 0 for k,v in ipairs(tmp) do if rnd >= pre and rnd < v.rnd then local sim = alife() local actor_pos,actor_lvid,actor_gvid = db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id() for i=1,math.random(surprise_list[v.sec][2],surprise_list[v.sec][3]) do local pos = vector():set(actor_pos):add(vector():set(math.random(4,9),0,math.random(4,9))) sim:create(v.sec,pos,actor_lvid,actor_gvid) -- rx_ai.printf("spawn: %s",v.sec) end break else pre = v.rnd end end end
--[[------ Здесь определяется сонливость в зависимоти от принятых на грудь литров водки или энергетиков. В принципе можете добавлять любой предмет который можно "съесть". я добавил некоторые медикаменты --]] ------ function use_sleepiness(add) -- rx_ai.printf("use_sleepiness: %s",add) local val = xr_logic.pstor_retrieve(db.actor,"drowse_cut",0) if val >= 1 and add < 0 then return -- если лимит использования энeргеников исчерпан end if add < 0 then xr_logic.pstor_store(db.actor,"drowse_cut",val-add) end val = xr_logic.pstor_retrieve(db.actor,"drowse",0)+add if val < 0 then val = 0 end xr_logic.pstor_store(db.actor,"drowse",val) end
function use_satiety(add) -- rx_ai.printf("use_satiety: %s",add) local val = xr_logic.pstor_retrieve(db.actor,"satiety",1) val = val+add if val < 0 then val = 0 elseif val > 1 then val = 1 end xr_logic.pstor_store(db.actor,"satiety",val) end
function use_drinking(add) -- rx_ai.printf("use_drinking: %s",add) local val = xr_logic.pstor_retrieve(db.actor,"thirst",0) val = val-add if val < 0 then val = 0 elseif val > 2 then val = 1.9 end xr_logic.pstor_store(db.actor,"thirst",val) end
function use_mezaton(s) if s == "drug_mezaton" then add_effect("mezaton") xr_logic.pstor_store(db.actor,"mez",1) mezt = game.get_game_time() end end
function use_poisonousness(add) -- rx_ai.printf("use_poisonousness: %s",add) local val = xr_logic.pstor_retrieve(db.actor,"toxic2",0) val = val+add if val < -1 then val = -1 elseif val > 1.5 then val = 1.5 end xr_logic.pstor_store(db.actor,"toxic2",val) end
local obj_table = {} function use_obj(obj) local s = obj:section() if not obj_table[s] then obj_table[s] = {} obj_table[s].sleepiness = rx_utils.read_from_ini(nil,s,"eat_sleepiness",0) obj_table[s].satiety = rx_utils.read_from_ini(nil,s,"eat_satiety",0) obj_table[s].poisonousness = rx_utils.read_from_ini(nil,s,"eat_poisonousness",0) obj_table[s].drinking = rx_utils.read_from_ini(nil,s,"eat_drinking",0) end if obj_table[s].sleepiness ~= 0 then use_sleepiness(obj_table[s].sleepiness) end if obj_table[s].satiety ~= 0 then use_satiety(obj_table[s].satiety) end if obj_table[s].poisonousness ~= 0 then use_poisonousness(obj_table[s].poisonousness) end if obj_table[s].drinking ~= 0 then use_drinking(obj_table[s].drinking) end use_mezaton(s) end
-- эффект ранения local lite_treshold = 0.05 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб экран окрасился в красный local crit_treshold_1 = 0.15 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб ГГ начало шатать local crit_treshold_2 = 0.20 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб ГГ начало шатать local crit_treshold_3 = 0.30 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб ГГ начало шатать local drop_item_on_crit_prob = 0.20 -- вероятность того что ГГ выронит оружие local prev_health = -1 local chk_h_t = 0 function wounded_pp_update(tg) -- if dinamic_hud and dinamic_hud.blood_enable ~= 0 then -- return -- end if chk_h_t < tg then chk_h_t = tg+100 local hl = prev_health-db.actor.health if hl > lite_treshold then local effector_power = hl*3 add_effect("fire_hit") set_ppe_factor("fire_hit",effector_power) if hl > crit_treshold_3 then add_effect("crit_hit_3") if math.random() < drop_item_on_crit_prob 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 elseif hl > crit_treshold_2 then add_effect("crit_hit_2") elseif hl > crit_treshold_1 then add_effect("crit_hit_1") end end prev_health = db.actor.health end end
-- отравление засосом local sos_time = 0 local sos_id local sos_name function check_krovosos_sos() if sos_name then if sos_name == db.actor:who_hit_name() then -- rx_ai.printf("sosich: sosanul!") use_drinking(-0.2) use_poisonousness(1) sos_id = nil sos_name = nil elseif sos_time+10000 < time_global() then sos_id = nil sos_name = nil end end if sos_id then local obj = level.object_by_id(sos_id) if obj:position():distance_to_sqr(db.actor:position()) < 3.2 then if sos_time+5000 < time_global() then --zasos -- rx_ai.printf("sosich: zasos!") sos_name = obj:name() return end -- rx_ai.printf("sosich: radom %s",sos_time) else sos_id = nil end return end for k,v in pairs(xr_combat_ignore.fighting_with_actor_npcs) do local obj = level.object_by_id(k) if obj and obj:clsid() == clsid.bloodsucker_s then if obj:position():distance_to(db.actor:position()) < 2 then sos_id = k sos_time = time_global() -- rx_ai.printf("sosich: podbezal!") return end end end end
Сообщение отредактировал SanyaSuicide - Вторник, 25.08.2015, 20:47
Скорее всего hours = 0, поскольку этот параметр передается в функцию извне, то ищи откуда его ноги растут. akmc47u, Можно конечно решить задачу в лоб: в скрипте xr_motivator.script есть колбек, вызываемый при нанесении урона НПС motivator_binder:hit_callback(obj, amount, local_direction, who, bone_index). Соответсвено obj - объект НПС получивший урон, amount - размер урона, local_direction - направления откуда получен хит, who - объект нанесший урон, bone_index - индекс кости в скелете НПС куда пришелся хит. Тоесть вся необходимая информация, чтобы выдать инфопорцию при нанесении смертельного ранения конкретному НПС. Или решать задачу косвенно в логике НПС: