Divergent/mods/Body Health System Realisti.../gamedata/scripts/zzz_player_injuries.script

2656 lines
91 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Eddie's Edit September 6, 2021
local disable_hud_fps_fix_tmr = 0.2 -- sec
------------------------ SETTINGS ------------------------
local damagescale=zzz_player_injuries_mcm.get_config("DAMAGE_MULT") or 3.5
-- Damage scale to body parts from recieved damage; 0.5 means half of normal limbs do have 50 hp, torso has 100 hp and head has 50 hp
local damagescale_floor = math.floor(damagescale)
local damage_threshold=0.0293/damagescale_floor -- 0.0293 is default
local hud_vertical_spacing=25--27 -- How low hitbox hud will be drown. The higher the number, the lower the HUD. 0 is default ~in the middle of screen.
local hide_default_hud= (zzz_player_injuries_mcm.get_config("TEXT_BASED_PATCH")) and false or true
local show_player_name=true
local hide_if_healthy=false
local natural_regeneration = zzz_player_injuries_mcm.get_config("NATURAL_REGENERATION")
local natural_regeneration_speed_mod = zzz_player_injuries_mcm.get_config("regeneration_speed")
local painkiller_grain_shader = zzz_player_injuries_mcm.get_config("PAINKILLER_GRAIN_SHADER")
local tourniquet_is_splint = zzz_player_injuries_mcm.get_config("TOURNIQUET_IS_SPLINT")
local bandage_is_splint = zzz_player_injuries_mcm.get_config("BANDAGE_IS_SPLINT")
local splinting = zzz_player_injuries_mcm.get_config("SPLINTING")
local medkit_is_splint = zzz_player_injuries_mcm.get_config("MEDKIT_IS_SPLINT")
local medkits_heal_logic = zzz_player_injuries_mcm.get_config("MEDKITS_HEAL_LOGIC") or 2
local rebirth_heal_logic = zzz_player_injuries_mcm.get_config("REBIRTH_HEAL_LOGIC") or 2
local sleep_heal = zzz_player_injuries_mcm.get_config("SLEEP_HEALS")
local sleep_heal_logic = zzz_player_injuries_mcm.get_config("SLEEP_HEALS_LOGICAL")
local sleep_heal_power = zzz_player_injuries_mcm.get_config("SLEEP_HEALS_POWER")
local using_surgery = zzz_player_injuries_mcm.get_config("USE_SURGERY")
local surgery_heals = zzz_player_injuries_mcm.get_config("SURGERY_HEALS")
local surgery_all_limbs = zzz_player_injuries_mcm.get_config("SURGERY_ALL_LIMBS")
local cms_restores_hp_too = zzz_player_injuries_mcm.get_config("CMS_RESTORES_HP_TOO")
bhs_exp_mode = zzz_player_injuries_mcm.get_config("BHS_EXPERIMENTAL_MODE")
local bhs_bleed = zzz_player_injuries_mcm.get_config("BHS_BLEEDTHROUGH")
local fall_mult = zzz_player_injuries_mcm.get_config("FALL_MULT")
local regen=0 -- Don't change that. Use mcm instead. Automatic blue health regeneration on each limb. Setting it to 90000 would mean each 90 seconds 1 health point restores
if natural_regeneration then
regen = 300000/natural_regeneration_speed_mod
end
-- It's very important to keep the correct ratio between "effects_mult" and "maxhp" as shown in example
effects_mult = 0.5 -- Divide this by maxhp and damagescale multipliers. Example "effects_mult = 1/10" if (default maxhp)*10, damagescale*10, medicines*10 etc (more immersive and harmful effects don't reduce the whole chunks)
local prev_time = nil
local head_tbl = {}
local tinnitus_play = false
function save_state(m_data)
m_data.head_tbl = head_tbl
end
function load_state(m_data)
head_tbl = m_data.head_tbl or {}
end
local aim_anm = {"earthquake_1","earthquake_2"}
local rightleg_anm = {"med1","med4"}
local leftleg_anm = {"med2","med3"}
local bothlegs_anm = {"strong1","strong2","strong4"}
function on_option_change()
if r(head_tbl.volume) ~= r(ui_options.get("sound/general/master_volume")) then
head_tbl.volume = (ui_options.get("sound/general/master_volume"))
end
end
-- shameful steal from arti
local speeds = {}
function actor_on_first_update()
options_vol = ui_options.get("sound/general/master_volume")
if not (head_tbl.volume) then head_tbl.volume = options_vol end
exec_console_cmd("snd_volume_eff " .. options_vol)
volume_sound_x = get_console_cmd(2,"snd_volume_eff")
speeds[0] = db.actor:get_actor_run_coef()
speeds[1] = db.actor:get_actor_runback_coef()
speeds[2] = db.actor:get_actor_sprint_koef()
end
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
hit={} -- struct to store all the hit data i might need
hit.type = nil
hit.power = nil
hit.bone_id = nil
hit.bone_id_adj = nil
hit.draftsman = nil
hit.fall = false
hit.death = false
hit.apply = false
hit.damage = false
showtexthud=(zzz_player_injuries_mcm.get_config("TEXT_BASED_PATCH")) and 2 or 0 --1 large left down, 2 default center 0 texture
show_hud_type=2
show_hud_change_time=0
local myhealth=0
healthstatus=true
local init=false
local healtimer=time_global()
local display_width=2560
local display_height=1440
local display_ratio=169
local display={}
display.types={}
display.types[43]=1.3333
display.types[169]=1.7777
display.types[1610]=1.56
maxhp={}
maxhp.head=22
maxhp.torso=22
maxhp.leftarm=10
maxhp.rightarm=10
maxhp.leftleg=10
maxhp.rightleg=10
health={}
health.head=maxhp.head
health.torso=maxhp.torso
health.leftarm=maxhp.leftarm
health.rightarm=maxhp.rightarm
health.leftleg=maxhp.leftleg
health.rightleg=maxhp.rightleg
preview={}
preview.health={}
preview.health.head=nil
preview.health.torso=nil
preview.health.leftarm=nil
preview.health.rightarm=nil
preview.health.leftleg=nil
preview.health.rightleg=nil
preview.bonus={}
preview.bonus.head=nil
preview.bonus.torso=nil
preview.bonus.leftarm=nil
preview.bonus.rightarm=nil
preview.bonus.leftleg=nil
preview.bonus.rightleg=nil
preview.surgeryhp={}
preview.surgeryhp.head=nil
preview.surgeryhp.torso=nil
preview.surgeryhp.leftarm=nil
preview.surgeryhp.rightarm=nil
preview.surgeryhp.leftleg=nil
preview.surgeryhp.rightleg=nil
timedhp={}
timedhp.head=0
timedhp.torso=0
timedhp.leftarm=0
timedhp.rightarm=0
timedhp.leftleg=0
timedhp.rightleg=0
surgeryhp={}
surgeryhp.head=0
surgeryhp.torso=0
surgeryhp.leftarm=0
surgeryhp.rightarm=0
surgeryhp.leftleg=0
surgeryhp.rightleg=0
local timedheal={}
timedheal.head=0
timedheal.torso=0
timedheal.leftarm=0
timedheal.rightarm=0
timedheal.leftleg=0
timedheal.rightleg=0
hud_blink_timer={}
hud_blink_timer.head=0
hud_blink_timer.torso=0
hud_blink_timer.leftarm=0
hud_blink_timer.rightarm=0
hud_blink_timer.leftleg=0
hud_blink_timer.rightleg=0
hud_blink_timer.blinktime=1000
-- These items heal bodyparts over time, healing all listed body parts at the same time. Won't heal if body part is at 0 hp (=broken).
-- * the numbers for each body part is the total amount of hp healed for each body part
-- * healtimer: after this amount of time, 1 hp is added to each listed body part.
healhelplist={}
healhelplist.lastregen=time_global()
healhelplist.healtimer=30000
healhelplist.healpower=0
if medkits_heal_logic == 1 then
healhelplist.medkit={head=11,torso=11,rightleg=5,leftleg=5,rightarm=5,leftarm=5,healpower=1,healtimer=6000}
healhelplist.medkit_army={head=16,torso=16,rightleg=7,leftleg=7,rightarm=7,leftarm=7,healpower=1,healtimer=4175}
healhelplist.medkit_scientic={head=16,torso=16,rightleg=7,leftleg=7,rightarm=7,leftarm=7,healpower=1,healtimer=4175}
healhelplist.stimpack={head=11,torso=11,rightleg=5,leftleg=5,rightarm=5,leftarm=5,healpower=1,healtimer=1000}
healhelplist.stimpack_army={head=16,torso=16,rightleg=7,leftleg=7,rightarm=7,leftarm=7,healpower=1,healtimer=900}
healhelplist.stimpack_scientic={head=16,torso=16,rightleg=7,leftleg=7,rightarm=7,leftarm=7,healpower=1,healtimer=900}
end
if rebirth_heal_logic == 1 then
healhelplist.rebirth={head=22,torso=22,rightleg=10,leftleg=10,rightarm=10,leftarm=10,healpower=0,healtimer=772}
end
-- Items that add 1 hp at a time to the most injured body part. Won't heal if body part is at 0 hp (=broken).
-- For broken limbs you first need to use a bandage (=splint).
-- * healamount: how many hp to add in total.
-- * healtimer: time it takes to heal 1 hp.
-- * healactive: leave at 0, this is used to track it during runtime.
-- * lasttimestamp: leave at 0, this is used to track it during runtime.
healonelist={}
healonelist.lastregen=time_global()
healonelist.healtimer=30000
healonelist.healamount=0
healonelist.healpower=0
if medkits_heal_logic == 2 then
healonelist.medkit={healamount=21,healtimer=3180,healpower=1}
healonelist.medkit_army={healamount=32,healtimer=2084,healpower=1}
healonelist.medkit_scientic={healamount=32,healtimer=2084,healpower=1}
healonelist.stimpack={healamount=21,healtimer=571,healpower=1}
healonelist.stimpack_army={healamount=32,healtimer=468,healpower=1}
healonelist.stimpack_scientic={healamount=32,healtimer=468,healpower=1}
healonelist.survival_kit={healamount=60,healtimer=1428,healpower=1}
end
if rebirth_heal_logic == 2 then
healonelist.rebirth={healamount=60,healtimer=283,healpower=0}
end
healonelist.drug_coagulant={healamount=11,healtimer=39818,healpower=0}
healonelist.propital={healamount=21,healtimer=6000,healpower=0}
-- First aid items:
-- * instant effect
-- * splintamount: how much hp is healed in total. Hp is added to body part with lowest health first.
-- * maxarmleg and maxheadtorso = can only heal body part up to this hp level.
splintlist={}
if splinting then
if tourniquet_is_splint then
splintlist.jgut={splintamount=1}
end
if bandage_is_splint then
splintlist.bandage={splintamount=1}
splintlist.bandage_army={splintamount=1}
end
splintlist.splint={splintamount=1}
splintlist.alu_splint={splintamount=1}
end
surgerylist={}
if using_surgery then
surgerylist.surginst={surgeryamount=1}
if cms_restores_hp_too then
surgerylist.cms={surgeryamount=4}
else
surgerylist.cms={surgeryamount=1}
end
end
-- Painkillers add painkillerpower as timedhp to limbs and double that to torso + head.
-- timedhp are added to health when considering effects such as shaking hands and limping. Won't prevent death when torso or head hp = 0.
painkillerlist={}
painkillerlist.lasttimestamp=time_global()
painkillerlist.painkillerduration=0
painkillerlist.painkillerpower=0
painkillerlist.countdown_increments=0 -- divides the total duration into x parts. Used to make sure painkillers actual duration stays closer to its set duration + up to length of one increment.
painkillerlist.morphine={painkillerpower=7,painkillerduration=1518000,countdown_increments=92}
painkillerlist.rebirth={painkillerpower=7,painkillerduration=305000,countdown_increments=30}
painkillerlist.salicidic_acid={painkillerpower=6,painkillerduration=1152000,countdown_increments=80}
painkillerlist.tetanus={painkillerpower=4,painkillerduration=202000,countdown_increments=20}
painkillerlist.analgetic={painkillerpower=5,painkillerduration=1042000,countdown_increments=80}
painkillerlist.sj1={painkillerpower=6,painkillerduration=1500000,countdown_increments=75}
painkillerlist.sj6={painkillerpower=9,painkillerduration=1500000,countdown_increments=75}
painkillerlist.analgin={painkillerpower=2,painkillerduration=180000,countdown_increments=36}
painkillerlist.akvatab={painkillerpower=4,painkillerduration=290000,countdown_increments=29}
painkillerlist.yadylin={painkillerpower=5,painkillerduration=505000,countdown_increments=50}
painkillerlist.adrenalin={painkillerpower=2,painkillerduration=2184000,countdown_increments=105}
painkillerlist.etg={painkillerpower=4,painkillerduration=1800000,countdown_increments=90}
painkillerlist.medkit_army={painkillerpower=4,painkillerduration=128000,countdown_increments=25}
painkillerlist.medkit_scientic={painkillerpower=3,painkillerduration=128000,countdown_increments=25}
painkillerlist.stimpack={painkillerpower=2,painkillerduration=128000,countdown_increments=25}
painkillerlist.stimpack_army={painkillerpower=4,painkillerduration=128000,countdown_increments=25}
painkillerlist.stimpack_scientic={painkillerpower=3,painkillerduration=128000,countdown_increments=25}
painkillerlist.cocaine={painkillerpower=2,painkillerduration=1644000,countdown_increments=80}
painkillerlist.joint={painkillerpower=1,painkillerduration=420000,countdown_increments=42}
painkillerlist.marijuana={painkillerpower=1,painkillerduration=652000,countdown_increments=40}
painkillerlist.vodka={painkillerpower=1,painkillerduration=300000,countdown_increments=30}
painkillerlist.vodka2={painkillerpower=1,painkillerduration=300000,countdown_increments=30}
painkillerlist.vodka_quality={painkillerpower=2,painkillerduration=300000,countdown_increments=30}
painkillerlist.bottle_metal={painkillerpower=2,painkillerduration=300000,countdown_increments=30}
exp_druglist = {}
exp_druglist.lasttimestamp=time_global()
exp_druglist.restoreduration=0
exp_druglist.restorepower=0
exp_druglist.countdown_increments=0
exp_druglist.drug_coagulant={restorepower=0.0005,countdown_increments=438,restoretime=438}
--exp_druglist.yadylin={restorepower=0.0005,countdown_increments=438,restoretime=438}
local modifiedregen = regen
local playername
function trace_this(to_trace1)
local log_file = io.open("log_memory_npc", "a")
log_file:write(to_trace1)
log_file:close(log_file)
end
local function GetConditionFromFloat(float,bodypart)
if bodypart then
if hud_blink_timer[bodypart] then
if time_global()-hud_blink_timer[bodypart]<hud_blink_timer.blinktime then
return "critical"
end
end
end
-- if float>=0.99 then
-- --return "good"
-- return "blue"
-- elseif float>=0.79 then
-- --return "ok"
-- return "blue"
-- elseif float>=0.33 then
-- return "blue"
-- elseif float>=0.19 then
-- return "critical"
-- else
-- return "critical"
-- end
return "blue"
end
local colors={}
--colors.blue="%c[0,50,200,200]"
-- colors.good="%c[0,0,255,0]"
-- colors.ok="%c[0,150,255,0]"
-- colors.medium="%c[0,255,255,0]"
-- colors.danger="%c[0,255,100,0]"
-- colors.critical="%c[0,255,0,0]"
colors.blue="%c[0,56,115,255]"
colors.good="%c[0,15,143,20]"
colors.ok="%c[0,138,204,51]"
colors.medium="%c[0,255,208,0]"
colors.danger="%c[0,255,79,0]"
colors.critical="%c[0,230,10,10]"
colors.grey="%c[0,161,161,161]"
colors.preview_health="%c[0,140,0,255]"
colors.preview_bonus="%c[0,0,212,24]"
colors.blank="%c[0,156,156,156]"
colors.white="%c[0,255,255,255]"
--colors.grey="%c[0,185,185,185]"
colors.black="%c[0,0,0,0]"
local function SaveHealthStatus()
utils_obj.save_var(db.actor,"health.head",health.head)
utils_obj.save_var(db.actor,"health.torso",health.torso)
utils_obj.save_var(db.actor,"health.rightarm",health.rightarm)
utils_obj.save_var(db.actor,"health.leftarm",health.leftarm)
utils_obj.save_var(db.actor,"health.rightleg",health.rightleg)
utils_obj.save_var(db.actor,"health.leftleg",health.leftleg)
utils_obj.save_var(db.actor,"timedheal.head",timedheal.head)
utils_obj.save_var(db.actor,"timedheal.torso",timedheal.torso)
utils_obj.save_var(db.actor,"timedheal.rightarm",timedheal.rightarm)
utils_obj.save_var(db.actor,"timedheal.leftarm",timedheal.leftarm)
utils_obj.save_var(db.actor,"timedheal.rightleg",timedheal.rightleg)
utils_obj.save_var(db.actor,"timedheal.leftleg",timedheal.leftleg)
utils_obj.save_var(db.actor,"timedhp.head",timedhp.head)
utils_obj.save_var(db.actor,"timedhp.torso",timedhp.torso)
utils_obj.save_var(db.actor,"timedhp.rightarm",timedhp.rightarm)
utils_obj.save_var(db.actor,"timedhp.leftarm",timedhp.leftarm)
utils_obj.save_var(db.actor,"timedhp.rightleg",timedhp.rightleg)
utils_obj.save_var(db.actor,"timedhp.leftleg",timedhp.leftleg)
utils_obj.save_var(db.actor,"surgeryhp.head",surgeryhp.head)
utils_obj.save_var(db.actor,"surgeryhp.torso",surgeryhp.torso)
utils_obj.save_var(db.actor,"surgeryhp.rightarm",surgeryhp.rightarm)
utils_obj.save_var(db.actor,"surgeryhp.leftarm",surgeryhp.leftarm)
utils_obj.save_var(db.actor,"surgeryhp.rightleg",surgeryhp.rightleg)
utils_obj.save_var(db.actor,"surgeryhp.leftleg",surgeryhp.leftleg)
utils_obj.save_var(db.actor,"healhelplist.healtimer",healhelplist.healtimer)
utils_obj.save_var(db.actor,"healhelplist.healpower",healhelplist.healpower)
utils_obj.save_var(db.actor,"healonelist.healtimer",healonelist.healtimer)
utils_obj.save_var(db.actor,"healonelist.healpower",healonelist.healpower)
utils_obj.save_var(db.actor,"healonelist.healamount",healonelist.healamount)
utils_obj.save_var(db.actor,"painkillerlist.painkillerduration",painkillerlist.painkillerduration)
utils_obj.save_var(db.actor,"painkillerlist.painkillerpower",painkillerlist.painkillerpower)
utils_obj.save_var(db.actor,"painkillerlist.countdown_increments",painkillerlist.countdown_increments)
utils_obj.save_var(db.actor,"exp_druglist.restoreduration",exp_druglist.restoreduration)
utils_obj.save_var(db.actor,"exp_druglist.restorepower",exp_druglist.restorepower)
utils_obj.save_var(db.actor,"exp_druglist.countdown_increments",exp_druglist.countdown_increments)
end
local function LoadHealthStatus()
health.head=utils_obj.load_var(db.actor,"health.head") or maxhp.head
health.torso=utils_obj.load_var(db.actor,"health.torso") or maxhp.torso
health.rightarm=utils_obj.load_var(db.actor,"health.rightarm") or maxhp.rightarm
health.leftarm=utils_obj.load_var(db.actor,"health.leftarm") or maxhp.leftarm
health.rightleg=utils_obj.load_var(db.actor,"health.rightleg") or maxhp.rightleg
health.leftleg=utils_obj.load_var(db.actor,"health.leftleg") or maxhp.leftleg
timedheal.head=utils_obj.load_var(db.actor,"timedheal.head") or 0
timedheal.torso=utils_obj.load_var(db.actor,"timedheal.torso") or 0
timedheal.rightarm=utils_obj.load_var(db.actor,"timedheal.rightarm") or 0
timedheal.leftarm=utils_obj.load_var(db.actor,"timedheal.leftarm") or 0
timedheal.rightleg=utils_obj.load_var(db.actor,"timedheal.rightleg") or 0
timedheal.leftleg=utils_obj.load_var(db.actor,"timedheal.leftleg") or 0
timedhp.head=utils_obj.load_var(db.actor,"timedhp.head") or 0
timedhp.torso=utils_obj.load_var(db.actor,"timedhp.torso") or 0
timedhp.rightarm=utils_obj.load_var(db.actor,"timedhp.rightarm") or 0
timedhp.leftarm=utils_obj.load_var(db.actor,"timedhp.leftarm") or 0
timedhp.rightleg=utils_obj.load_var(db.actor,"timedhp.rightleg") or 0
timedhp.leftleg=utils_obj.load_var(db.actor,"timedhp.leftleg") or 0
surgeryhp.head=utils_obj.load_var(db.actor,"surgeryhp.head",surgeryhp.head) or 0
surgeryhp.torso=utils_obj.load_var(db.actor,"surgeryhp.torso",surgeryhp.torso) or 0
surgeryhp.rightarm=utils_obj.load_var(db.actor,"surgeryhp.rightarm",surgeryhp.rightarm) or 0
surgeryhp.leftarm=utils_obj.load_var(db.actor,"surgeryhp.leftarm",surgeryhp.leftarm) or 0
surgeryhp.rightleg=utils_obj.load_var(db.actor,"surgeryhp.rightleg",surgeryhp.rightleg) or 0
surgeryhp.leftleg=utils_obj.load_var(db.actor,"surgeryhp.leftleg",surgeryhp.leftleg) or 0
healhelplist.healtimer=utils_obj.load_var(db.actor,"healhelplist.healtimer",healhelplist.healtimer) or 0
healhelplist.healpower=utils_obj.load_var(db.actor,"healhelplist.healpower",healhelplist.healpower) or 0
healonelist.healtimer=utils_obj.load_var(db.actor,"healonelist.healtimer",healonelist.healtimer) or 0
healonelist.healpower=utils_obj.load_var(db.actor,"healonelist.healpower",healonelist.healpower) or 0
healonelist.healamount=utils_obj.load_var(db.actor,"healonelist.healamount",healonelist.healamount) or 0
painkillerlist.painkillerduration=utils_obj.load_var(db.actor,"painkillerlist.painkillerduration",painkillerlist.painkillerduration) or 0
painkillerlist.painkillerpower=utils_obj.load_var(db.actor,"painkillerlist.painkillerpower",painkillerlist.painkillerpower) or 0
painkillerlist.countdown_increments=utils_obj.load_var(db.actor,"painkillerlist.countdown_increments",painkillerlist.countdown_increments) or 0
exp_druglist.restoreduration=utils_obj.load_var(db.actor,"exp_druglist.restoreduration",exp_druglist.restoreduration) or 0
exp_druglist.restorepower=utils_obj.load_var(db.actor,"exp_druglist.restorepower",exp_druglist.restorepower) or 0
exp_druglist.countdown_increments=utils_obj.load_var(db.actor,"exp_druglist.countdown_increments",exp_druglist.countdown_increments) or 0
if painkillerlist.painkillerpower > 0 and painkiller_grain_shader then
--printf("Adding the effector. Painkillerpower: %s , Painkillerduration: %s",painkillerlist.painkillerpower,painkillerlist.painkillerduration)
level.add_pp_effector("radiation.ppe", 5020, true)
else
--printf("Removing the effector. Painkillerpower: %s , Painkillerduration: %s",painkillerlist.painkillerpower,painkillerlist.painkillerduration)
level.remove_pp_effector(5020)
end
end
function r(val)
local shet = round_idp(val, 3)
return shet
end
function get_body_state()
local crouch = IsMoveState('mcCrouch')
local accel = IsMoveState('mcAccel')
local body_st = "stand"
if crouch then
if accel then body_st = "low_crouch"
else body_st = "crouch"
end
end
return body_st
end
function shaking_hands()
local activeslot = db.actor:active_slot()
if not (activeslot == 2 or activeslot == 3 or activeslot == 1) then return end
local item_in_slot = db.actor:item_in_slot(activeslot)
if not (item_in_slot) then return end
local section_name = item_in_slot:section()
local weight
if not (ini_sys:section_exist(section_name, "inv_weight")) then return end
weight = ini_sys:r_float_ex(section_name, "inv_weight")
local body_state = get_body_state()
local cam_power = 0
local left_arm = (health.rightarm + timedhp.rightarm) * effects_mult
left_arm = left_arm >=1 and left_arm or 0.75
local right_arm = (health.leftarm + timedhp.leftarm) * effects_mult
right_arm = right_arm >=1 and right_arm or 0.75
local arms_sum = left_arm + right_arm
local max_arms_sum = (maxhp.rightarm + maxhp.leftarm) * effects_mult
if arms_sum < (max_arms_sum * (zzz_player_injuries_mcm.get_config("arm_penalty_minimum_hp") * 0.05)) then
cam_power = 0.65 * weight / arms_sum
cam_power = (body_state == "crouch") and (0.60 * weight / arms_sum) or cam_power
cam_power = (body_state == "low_crouch") and (0.55 * weight / arms_sum) or cam_power
cam_power = clamp(cam_power, 0, 3)
cam_power = cam_power * (zzz_player_injuries_mcm.get_config("arm_animation_power"))
local cam_power_scope = cam_power * 0.33
if item_in_slot:weapon_is_scope() then
cam_power = cam_power_scope
end
-- play anm
level.add_cam_effector("camera_effects\\" .. aim_anm[math.random(#aim_anm)] .. ".anm", 9921, true, "", 0, true, cam_power)
else
cam_power = 0.19 * weight / max_arms_sum
cam_power = (body_state == "crouch") and (0.18 * weight / max_arms_sum) or cam_power
cam_power = (body_state == "low_crouch") and (0.17 * weight / max_arms_sum) or cam_power
cam_power = clamp(cam_power, 0, 3)
cam_power = cam_power * (zzz_player_injuries_mcm.get_config("arm_animation_power"))
local cam_power_scope = cam_power * 0.33
if item_in_slot:weapon_is_scope() then
cam_power = cam_power_scope
end
level.add_cam_effector("camera_effects\\" .. aim_anm[math.random(#aim_anm)] .. ".anm", 9921, true, "", 0, true, cam_power)
end
-- news_manager.send_tip(db.actor, r(cam_power), 0, nil, 1500)
end
function shaking_hands_remove()
level.remove_cam_effector(9921)
end
function limp_speed_slow()
local legs_summ = (health.leftleg + health.rightleg + timedhp.leftleg + timedhp.rightleg) * effects_mult
local run_coef = 1
local sprint_coef = 1
local run_coef = 0.0625 * legs_summ + 0.375
local sprint_coef = 0.0625 * legs_summ + 0.375
local real_sprint_coef = 0.025 * legs_summ + 0.75
if (health.leftleg==0 and timedhp.leftleg<=2) or (health.rightleg==0 and timedhp.rightleg<=2) then
real_sprint_coef = 0.75
elseif (health.leftleg + timedhp.leftleg) > (health.rightleg + timedhp.rightleg) then
real_sprint_coef = 0.025 * ((health.leftleg + timedhp.leftleg) * effects_mult) + 0.75
elseif (health.leftleg + timedhp.leftleg) < (health.rightleg + timedhp.rightleg) then
real_sprint_coef = 0.025 * ((health.rightleg + timedhp.rightleg) * effects_mult) + 0.75
end
if (health.leftleg==0 and timedhp.leftleg<=2) or (health.rightleg==0 and timedhp.rightleg<=2) then
run_coef = 0.22 --0.375
end
speed.add_speed("bhs_speed_run", run_coef, false, true)
-- speed.add_speed("bhs_speed_runback", run_coef, false, true)
speed.add_speed("bhs_speed_sprint", real_sprint_coef, true, true)
-- local vec = db.actor:get_movement_speed()
-- local ms = (vec.x)^2 + (vec.y)^2 + (vec.z)^2
-- news_manager.send_tip(db.actor, r(ms), 0, nil, 1500)
end
local leftleg_flag = false
local rightleg_flag = false
local bothlegs_flag = false
function legs_limp()
local right_l = (health.leftleg + timedhp.leftleg) * effects_mult -- right is left
local left_l = (health.rightleg + timedhp.rightleg) * effects_mult
local legs_sum = left_l + right_l
local max_right_l = maxhp.leftleg * effects_mult * (zzz_player_injuries_mcm.get_config("leg_penalty_minimum_hp") * 0.2)
local max_left_l = maxhp.rightleg * effects_mult * (zzz_player_injuries_mcm.get_config("leg_penalty_minimum_hp") * 0.2)
local max_legs_sum = max_left_l + max_right_l
if (right_l == left_l) and (legs_sum < max_legs_sum) then
bothlegs_flag = true
leftleg_flag, rightleg_flag = false
-- printf("bothlegs_flag = true")
elseif (left_l < max_left_l) and (left_l < right_l) then
leftleg_flag = true
rightleg_flag, bothlegs_flag = false
-- printf("leftleg_flag = true")
elseif (right_l < max_right_l) and (right_l < left_l) then
rightleg_flag = true
leftleg_flag, bothlegs_flag = false
-- printf("rightleg_flag = true")
elseif (legs_sum >= max_legs_sum) then
leftleg_flag, rightleg_flag, bothlegs_flag = false
-- printf("ALL = false")
end
end
function torso_penalty()
local torso_health = (health.torso + timedhp.torso) * effects_mult
local torso_max_hp = maxhp.torso * effects_mult
torso_health = torso_health > torso_max_hp and torso_max_hp or ((health.torso + timedhp.torso) * effects_mult)
local t_diff = (torso_max_hp - torso_health) / effects_mult
local t_cap = 1 - t_diff * 0.035
if (t_diff > 0) and (db.actor.health > t_cap) then
-- db.actor.health = t_cap
t_cap = t_cap
end
end
local tg_effects_regen = 0
local tg_effects_regen_delay = 500
local tg_stage_2_effects = 0
local tg_stage_2_effects_delay = 15000 -- just in case, duration of ppe is 7250
function bhs_concussion()
local tg = time_global()
local rnd = math.random(1, 100)
local current = health.head * effects_mult -- reason not to add timedhp.head here: will block effect on first hit to head and then do nothing.
if not (head_tbl.previous) then head_tbl.previous = current end
local previous = head_tbl.previous
local volume_sound_x = get_console_cmd(2,"snd_volume_eff")
local volume_sound_x_fade = 0.01
local anm_damage_threshold = 2
local damage_taken = (previous - current) * math.pow(0.75, painkillerlist.painkillerpower)
-- local damage_taken = previous - current
damage_taken = damage_taken > 0 and damage_taken or 0
local max_head = maxhp.head * effects_mult
local effector_k = damage_taken / max_head
local effector_power = effector_k * (zzz_player_injuries_mcm.get_config("head_animation_power"))
-- actor_menu.set_msg(1, strformat("head.tbl.volume: %s, console_volume: %s, stage: %s", r(head_tbl.volume), r(get_console_cmd(2,"snd_volume_eff")), r(head_tbl.stage)))
-- removing effects if hp between previous and current yellow or blue (or dead)
if head_tbl.stage ~= 0 and ((previous == current) or (current <= 0)) then
exec_console_cmd("snd_volume_eff " .. head_tbl.volume)
level.remove_pp_effector(99133)
head_tbl.stage = 0
end
-- stage 1
if (head_tbl.stage == 1) then
level.add_pp_effector("concussion_bhs.ppe", 99123, false)
exec_console_cmd("snd_volume_eff " .. volume_sound_x_fade)
CreateTimeEvent(0, "set_stage_two", 1, set_stage_two)
end
-- stage 2 xd
if (head_tbl.stage == 2) and (tg > tg_stage_2_effects) then
if (tinnitus_play) then
local snd = sound_object("bhs\\tinnitusx")
snd:play_no_feedback(db.actor, sound_object.s2d, 0, VEC_ZERO, 1.0, 1.0)
snd.volume = effector_k * 3
tinnitus_play = false
end
-- random chance for head shake
if (damage_taken > anm_damage_threshold) and (rnd <= effector_k * 10) then
level.add_cam_effector("camera_effects\\wake_up.anm", 96872, false, "", 0, true, effector_power * 0.2)
end
level.add_pp_effector("concussion_post_bhs.ppe", 99133, false)
tg_stage_2_effects = tg + tg_stage_2_effects_delay
end
level.set_pp_effector_factor(99123, effector_power)
level.set_pp_effector_factor(99133, effector_power)
-- regen
painkiller_regen_bonus = 0
if painkillerlist.painkillerpower > 0 then
painkiller_regen_bonus = (painkillerlist.painkillerpower + 1) * 0.05
end
if tg > tg_effects_regen then
head_tbl.previous = clamp(head_tbl.previous - 0.01 - painkiller_regen_bonus, current, head_tbl.previous) -- effector's power decrease: 50 sec for each lost HP
tg_effects_regen = tg + tg_effects_regen_delay
end
-- news_manager.send_tip(db.actor, string.format("previous: %s . current: %s", r(head_tbl.previous), r(current)), 0, nil, 1500)
end
function set_stage_two()
exec_console_cmd("snd_volume_eff " .. head_tbl.volume)
head_tbl.stage = 2
tinnitus_play = true
return true
end
------------------------------------------------------------------------
------------------------------------------------------------------------
local function bonebreak()
local helmet = (db.actor:item_in_slot(12) or db.actor:get_current_outfit())
if helmet then
muffle = ""
else
muffle = ""
end
local sound_play = math.random(1,13)
local file = "bhs\\" .. muffle .. "pain_" .. sound_play
file_to_say = sound_object( file )
file_to_say:play(db.actor,0,sound_object.s2d)
local file2 = "bhs\\" .. "bone_crack"
file_to_say = sound_object( file2 )
file_to_say:play(db.actor,0,sound_object.s2d)
level.add_pp_effector("blur_bhs.ppe", math.random(655808, 655820), false)
end
local function received_damage(amount)
if grok_progressive_rad_damages then
if grok_progressive_rad_damages.grok_rads == 1 then return end
end
local damage
damage=math.ceil((amount*100)/11*damagescale)
local damage_head=math.ceil((amount*2*100)/11*damagescale)
local choosen_hitbox={}
if hit.bone_id_adj then
choosen_hitbox=hit.bone_id_adj
printf("! Applying %s damage to %s. Damagescale: %s",damage , choosen_hitbox, damagescale)
else
local index=0
for k,v in pairs(health) do
index=index+1
end
local random_number=math.random(1,index)
-- trace_this("random"..random_number.."\n")
if random_number==1 then
choosen_hitbox="head"
elseif random_number==2 then
choosen_hitbox="torso"
elseif random_number==3 then
choosen_hitbox="leftarm"
elseif random_number==4 then
choosen_hitbox="rightarm"
elseif random_number==5 then
choosen_hitbox="leftleg"
elseif random_number==6 then
choosen_hitbox="rightleg"
end
printf("! Applying damage to random bone, %s. Damagescale: %s", choosen_hitbox, damagescale)
end
if hit.type=="Explosive" then -- explosives = bad for health
hud_blink_timer.head=time_global()
hud_blink_timer.torso=time_global()
hud_blink_timer.leftarm=time_global()
hud_blink_timer.rightarm=time_global()
hud_blink_timer.leftleg=time_global()
hud_blink_timer.rightleg=time_global()
health.head=math.floor(health.head-damage*0.75)
health.torso=math.floor(health.torso-damage*0.75)
health.leftarm=math.floor(health.leftarm-damage*0.75)
health.rightarm=math.floor(health.rightarm-damage*0.75)
health.leftleg=math.floor(health.leftleg-damage*0.75)
health.rightleg=math.floor(health.rightleg-damage*0.75)
surgeryhp.head=0
surgeryhp.torso=0
surgeryhp.leftarm=0
surgeryhp.rightarm=0
surgeryhp.leftleg=0
surgeryhp.rightleg=0
damage=0
elseif choosen_hitbox=="head" then
if damage >= 18 then
damage = 17
end
if damage >= health.head and health.head > 0 then
damage = damage - health.head
health.head=0
bonebreak()
hit.death=true
db.actor.health=-1
elseif damage < health.head then
health.head=health.head-damage
damage=0
end
hud_blink_timer.head=time_global()
utils_obj.save_var(db.actor,"health.head",health.head)
if damage_head > (zzz_player_injuries_mcm.get_config("head_penalty_minimum_hp") - 1) then
head_tbl.stage = 1
end
surgeryhp.head=0
elseif choosen_hitbox=="torso" then
if damage >= 16 then
damage = 14
end
if damage >= health.torso and health.torso > 0 then
damage = damage - health.torso
health.torso=0
bonebreak()
elseif damage < health.torso then
health.torso=health.torso-damage
damage=0
end
hud_blink_timer.torso=time_global()
utils_obj.save_var(db.actor,"health.torso",health.torso)
surgeryhp.torso=0
elseif choosen_hitbox=="leftarm" then
if damage >= 8 then
damage = 7
end
if damage >= health.leftarm and health.leftarm > 0 then
damage = damage - health.leftarm
health.leftarm=0
bonebreak()
elseif damage < health.leftarm then
health.leftarm=health.leftarm-damage
damage=0
end
hud_blink_timer.leftarm=time_global()
utils_obj.save_var(db.actor,"health.leftarm",health.leftarm)
surgeryhp.leftarm=0
elseif choosen_hitbox=="rightarm" then
if damage >= 8 then
damage = 7
end
if damage >= health.rightarm and health.rightarm > 0 then
damage = damage - health.rightarm
health.rightarm=0
bonebreak()
elseif damage < health.rightarm then
health.rightarm=health.rightarm-damage
damage=0
end
hud_blink_timer.rightarm=time_global()
utils_obj.save_var(db.actor,"health.rightarm",health.rightarm)
surgeryhp.rightarm=0
elseif choosen_hitbox=="leftleg" then
if not hit.fall then
if damage >= 8 then
damage = 7
end
if damage >= health.leftleg and health.leftleg > 0 then
damage = damage - health.leftleg
health.leftleg=0
bonebreak()
elseif damage < health.leftleg then
health.leftleg=health.leftleg-damage
damage=0
end
hud_blink_timer.leftleg=time_global()
surgeryhp.leftleg=0
else
local damage_rl = damage
local damage_ll = damage
if damage_ll >= health.leftleg then
damage_ll = damage_ll - health.leftleg
health.leftleg=0
bonebreak()
elseif damage < health.leftleg then
health.leftleg=health.leftleg-damage
damage_ll=0
end
if damage_rl >= health.rightleg then
damage_rl = damage_rl - health.rightleg
health.rightleg=0
bonebreak()
elseif damage < health.rightleg then
health.rightleg=health.rightleg-damage
damage_rl=0
end
utils_obj.save_var(db.actor,"health.rightleg",health.rightleg)
damage=damage_ll+damage_rl
surgeryhp.leftleg=0
surgeryhp.rightleg=0
end
utils_obj.save_var(db.actor,"health.leftleg",health.leftleg)
elseif choosen_hitbox=="rightleg" then
if not hit.fall then
if damage >= 8 then
damage = 7
end
if damage >= health.rightleg and health.rightleg > 0 then
damage = damage - health.rightleg
health.rightleg=0
bonebreak()
elseif damage < health.rightleg then
health.rightleg=health.rightleg-damage
damage=0
end
hud_blink_timer.rightleg=time_global()
surgeryhp.rightleg=0
else
local damage_rl = damage
local damage_ll = damage
if damage_rl >= health.rightleg then
damage_rl = damage_rl - health.rightleg
health.rightleg=0
bonebreak()
elseif damage < health.rightleg then
health.rightleg=health.rightleg-damage
damage_rl=0
end
if damage_ll >= health.leftleg then
damage_ll = damage_ll - health.leftleg
health.leftleg=0
bonebreak()
elseif damage < health.leftleg then
health.leftleg=health.leftleg-damage
damage_ll=0
end
utils_obj.save_var(db.actor,"health.leftleg",health.leftleg)
damage=damage_ll+damage_rl
surgeryhp.leftleg=0
surgeryhp.rightleg=0
end
utils_obj.save_var(db.actor,"health.rightleg",health.rightleg)
end
if damage>0 and (bhs_exp_mode or bhs_bleed) then
printf("! Damage spilling over! Spillover: %s", damage)
while damage > 0 do
local damage_parts = 1
local damage_rest = 0
local count = 0
for k,v in pairs(health) do
if v > 0 then
if string.match(k, "torso") then
count = count + 1
end
count = count + 1
end
end
if count == 0 then
break
end
if damage >= count then
printf("! Enough damage(%s) to hit all healthy limbs(%s) %s times", damage, count, damage/count)
printf("! Torso counts as 2")
damage_parts=math.floor(damage/count)
for k in pairs(health) do
if health[k] > 0 then
if string.match(k, "torso") then
damage_torso = damage_parts*2
if damage_torso >= health.torso then
damage_torso = damage_torso - health.torso
health.torso=0
bonebreak()
else
health.torso=health.torso-damage_torso
end
damage = damage - damage_torso
else
if damage_parts >= health[k] then
damage_parts = damage_parts - health[k]
health[k]=0
bonebreak()
else
health[k]=health[k]-damage_parts
end
damage = damage - damage_parts
end
surgeryhp[k]=0
end
end
printf("! Damage left: %s", damage)
printf("! Spillover pass finished, damage left: %s", damage)
else
printf("! NOT enough damage(%s) to hit all healthy limbs(%s) at least once.", damage, count)
printf("! Hitting randomly")
damage_rest=damage%count
local index=0
for k,v in pairs(health) do
index=index+1
end
while damage_rest > 0 do
local random_number=math.random(1,index)
if random_number==1 then
choosen_hitbox="head"
elseif random_number==2 then
choosen_hitbox="torso"
elseif random_number==3 then
choosen_hitbox="leftarm"
elseif random_number==4 then
choosen_hitbox="rightarm"
elseif random_number==5 then
choosen_hitbox="leftleg"
elseif random_number==6 then
choosen_hitbox="rightleg"
end
if health[choosen_hitbox] > 0 then
health[choosen_hitbox]=health[choosen_hitbox]-1
surgeryhp[choosen_hitbox]=0
damage_rest=damage_rest-1
printf("! Hitting %s once", choosen_hitbox)
else
printf("! Hitting %s but it is damaged, trying again", choosen_hitbox)
end
end
printf("! Finished hitting, no damage left. Breaking")
break
end
end
else
damage = 0
end
for k,v in pairs(health) do
local missinghealth = 0
if v < maxhp[k] then
missinghealth = maxhp[k] - v
if missinghealth < 0 then missinghealth = 0 end
end
local bonus = painkillerlist.painkillerpower
if string.match(k, "head") or string.match(k, "torso") then
bonus = painkillerlist.painkillerpower * 2
end
if bonus > missinghealth then
bonus = missinghealth
end
timedhp[k] = bonus
end
healtimer=time_global()
end
--19 head
--15 - head
--16 - head
--17 - head
--13 - upper torso
--12 - middle torso
--11 - lower torso
--2 pelvis
--20 left shoulder
--21 left upper arm
--22 left forearm
--23 left hand
--33 right shoulder
--34 right upepr arm
--35 right forearm
--36 right hand
--3 left upper leg
--4 left lower leg
--7 right upeprleg
--8 right lower leg
local hitboxes={}
hitboxes[19]="head"
hitboxes[17]="head"
hitboxes[16]="head"
hitboxes[15]="head"
hitboxes[14]="head"
hitboxes[13]="torso"
hitboxes[12]="torso"
hitboxes[11]="torso"
hitboxes[2]="torso"
hitboxes[20]="leftarm"
hitboxes[21]="leftarm"
hitboxes[22]="leftarm"
hitboxes[23]="leftarm"
hitboxes[33]="rightarm"
hitboxes[34]="rightarm"
hitboxes[35]="rightarm"
hitboxes[36]="rightarm"
hitboxes[3]="leftleg"
hitboxes[4]="leftleg"
hitboxes[5]="fall damage"
hitboxes[6]="fall damage"
hitboxes[9]="fall damage"
hitboxes[10]="fall damage"
hitboxes[7]="rightleg"
hitboxes[8]="rightleg"
local function actor_on_hit_callback(obj, amount, local_direction, who, bone_id)
local random = false
local redirect = false
local last_boneid = bone_id
if bone_id == 65535 then -- toxic anomalies and radiation. It was hitting head or torso be redirected to arms or torso instead
rand = math.random(1,5)
redirect = true
if rand == 1 or rand == 2 or rand == 3 then
bone_id = 12
elseif rand == 4 then
bone_id = 20
elseif rand == 5 then
bone_id = 33
end
end
hit.fall = false
if (bone_id == 0 or bone_id == 5 or bone_id == 6 or bone_id == 9 or bone_id == 10) and hit.type == "Strike" and hit.draftsman:id()==0 then -- attributes fall damage to left or right leg. 8 = explosive,7 = strike
hit.fall=true
if rand == 1 then
bone_id = 3
else
bone_id = 7
end
end
if bone_id == 0 and hit.type == "Chemical" then -- attributes chemical damage to left or right leg.
if rand == 1 then
bone_id = 3
else
bone_id = 7
end
redirect=true
end
if hitboxes[bone_id] then
hit.bone_id_adj=hitboxes[bone_id]
text=hitboxes[bone_id]
else -- if an unknown bone is hit, arms or torso are hit
random = true
bone_id = math.random(1,3)
if bone_id == 1 then
bone_id = 35
elseif bone_id == 2 then
bone_id = 23
elseif bone_id == 3 then
bone_id = 11
end
hit.bone_id_adj=hitboxes[bone_id]
text=hitboxes[bone_id]
end
local damage=amount
hit.damage = damage
if hit.fall then
text = "both legs"
end
printf("! Actor got hit in %s, random? %s, redirected? %s, damagescale: %s, damage threshold: %s. Original bone: %s, damage type: %s",text, random, redirect, damagescale, damage_threshold, hit.bone_id, hit.type)
printf("! Damage: %s",damage)
--printf("! Whodunit: %s",who:id())
if not hit.bone_id then
printf("! NOT A PROPER HIT! BONEID: %s, WHODUNIT: %s", last_boneid, who:id())
end
if damage>damage_threshold then
if hit.fall then
damage=damage*fall_mult
printf("! Fall damage increased to %s, fall multiplier: %s", damage, fall_mult)
end
received_damage(damage)
else
--printf("! Not enough damage taken")
hit.power = nil
hit.fall = nil
hit.bone_id = nil
hit.bone_id_adj = nil
hit.draftsman = nil
end
SaveHealthStatus()
end
function actor_on_before_hit(shit, bone_id)
if shit.type == 7 then hit.type = "Strike"
elseif shit.type == 6 then hit.type = "Gunshot"
elseif shit.type == 8 then hit.type = "Explosive"
elseif shit.type == 2 then hit.type = "Chemical"
elseif shit.type == 1 then hit.type = "Electric"
elseif shit.type == 10 then hit.type = "Fire"
elseif shit.type == 0 then hit.type = "Burn"
else hit.type=shit.type end
hit.power=shit.power
hit.bone_id=bone_id
hit.draftsman=shit.draftsman
if (hit.type == "Chemical" or hit.type == "Burn" or hit.type == "Flame") and shit.power <0.01 then
hit.apply=true
end
end
local progress_stamina=nil
local progress_health=nil
local progress_health_head=nil
local progress_health_torso=nil
local progress_health_rightarm=nil
local progress_health_leftarm=nil
local progress_health_rightleg=nil
local progress_health_leftleg=nil
local progress_health_head_time=nil
local progress_health_torso_time=nil
local progress_health_rightarm_time=nil
local progress_health_leftarm_time=nil
local progress_health_rightleg_time=nil
local progress_health_leftleg_time=nil
local progress_health_torso_surgery=nil
local progress_health_rightarm_surgery=nil
local progress_health_leftarm_surgery=nil
local progress_health_rightleg_surgery=nil
local progress_health_leftleg_surgery=nil
local scuffed_fix = false
local function HUDUpdate()
if showtexthud>=1 then --text
local staticname="body_health_system_text"
if showtexthud==1 then
staticname="body_health_system_text"
elseif showtexthud==2 then
staticname="cop_debug"
end
local hud = get_hud()
local hud_d = hud:GetCustomStatic(staticname)
local wnd
if not healthstatus or show_hud_type~=2 then --not show
if (hud_d ~= nil) then
hud:RemoveCustomStatic(staticname)
hud_d = nil
end
return
end
if (hud_d == nil) then
hud:AddCustomStatic(staticname,true)
hud_d = hud:GetCustomStatic(staticname)
wnd = hud_d:wnd()
if (wnd ~= nil) then
wnd:SetAutoDelete(true)
end
end
if (hud_d ~= nil) then
wnd = hud_d:wnd()
local str=""
if hud_vertical_spacing or hud_vertical_spacing>0 then
for i=1,hud_vertical_spacing do
str=str.." \\n"
end
end
local showparts=true
if hide_if_healthy then
showparts=false
for k,v in pairs(health) do
if (v<maxhp[k]) or (timedhp[k]>0) then
showparts=true
break
end
end
end
if not showparts then
str=str.." \\n".." \\n".." \\n".." \\n"
end
if show_player_name then
str=str..colors.grey..db.actor:character_name().."\\n"
else
str=str.." \\n"
end
local function AddToHUDCircles(array,text,class,array2)
if class=="main" and showparts then
str = str..colors[GetConditionFromFloat(health[array]/maxhp[array],array)]
for i=1,(preview.health[array] or health[array]) do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.critical
for i=1,(preview.surgeryhp[array] or surgeryhp[array]) do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.good
for i=1,(preview.bonus[array] or timedhp[array]) do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.blank
for i=1,maxhp[array]-(preview.health[array] or health[array])-(preview.bonus[array] or timedhp[array]) do
str=str.."•"
-- str=str.."<22>"
end
local whatcolor="grey"
if health[array]<=4 then whatcolor="critical" end
if health[array]==0 then whatcolor="blank" end
-- local hp_addition=preview.health[array]
-- if hp_addition>0 then
-- text=text..colors.blue.." +"..hp_addition
-- end
-- local green_addition=preview.bonus[array]
-- if green_addition>0 then
-- text=text..colors.good.." +"..green_addition
-- end
str=str..colors[whatcolor].." // "..text.."\\n"--.." H:"..health[array].." T:"..timedhp[array].." S:"..surgeryhp[array].." PH:"..preview.health[array].." PB:"..preview.bonus[array].." S:"..preview.surgeryhp[array].."\\n"
end
if not (zzz_player_injuries_mcm.get_config("TEXT_BASED_PATCH")) then
if class=="condition" then
local hp_in_ints=math.floor(db.actor.health*11)
str = str..colors.blue
if db.actor.health>=1.0 then hp_in_ints=11 end
if db.actor.health<=0.0 then hp_in_ints=0 end
for i=1,hp_in_ints do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.blank
for i=1,11-hp_in_ints do
str=str.."•"
-- str=str.."<22>"
end
local whatcolor="grey"
if db.actor.health<=0.4 then whatcolor="critical" end
if db.actor.health<=0 then whatcolor="blank" end
str=str..colors[whatcolor].." // "..text.."\\n"
elseif class=="stamina" then
local hp_in_ints=math.floor(db.actor.power*11)
str = str..colors.blue
if db.actor.power>=1.0 then hp_in_ints=11 end
if db.actor.power>0.98 then hp_in_ints=11 end
if db.actor.power<=0.0 then hp_in_ints=0 end
for i=1,hp_in_ints do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.blank
for i=1,11-hp_in_ints do
str=str.."•"
-- str=str.."<22>"
end
local whatcolor="grey"
-- if db.actor.power<=0.4 then whatcolor="critical" end
-- if db.actor.power<=0 then whatcolor="blank" end
str=str..colors[whatcolor].." // "..text.."\\n"
end
end
if class=="limbs" and showparts then
str = str..colors[GetConditionFromFloat(health[array]/maxhp[array],array)]
for i=1,(preview.health[array] or health[array]) do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.critical
for i=1,(preview.surgeryhp[array] or surgeryhp[array]) do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.good
for i=1,(preview.bonus[array] or timedhp[array]) do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.blank
for i=1,maxhp[array]-(preview.health[array] or health[array])-(preview.bonus[array] or timedhp[array]) do
str=str.."•"
-- str=str.."<22>"
end
str=str.." "
if (preview.health[array2] or health[array2])<maxhp[array2] then
str=str..colors.blank
for i=1,maxhp[array2]-(preview.health[array2] or health[array2])-(preview.bonus[array2] or timedhp[array2]) do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.critical
for i=1,(preview.surgeryhp[array2] or surgeryhp[array2]) do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.good
for i=1,(preview.bonus[array2] or timedhp[array2]) do
str=str.."•"
-- str=str.."<22>"
end
str = str..colors[GetConditionFromFloat(health[array2]/maxhp[array2],array2)]
for i=1,(preview.health[array2] or health[array2]) do
str=str.."•"
-- str=str.."<22>"
end
else
str=str..colors.good
for i=1,(preview.bonus[array2] or timedhp[array2]) do
str=str.."•"
-- str=str.."<22>"
end
str=str..colors.critical
for i=1,(preview.surgeryhp[array2] or surgeryhp[array2]) do
str=str.."•"
-- str=str.."<22>"
end
for i=1,(preview.health[array2] or health[array2]) do
str = str..colors[GetConditionFromFloat(health[array2]/maxhp[array2],array2)]
str=str.."•"
-- str=str.."<22>"
end
end
local whatcolor="grey"
if (health[array]==0 or health[array2]==0) then whatcolor="critical" end
if (health[array]==0 and health[array2]==0) then whatcolor="blank" end
-- local hp_addition=preview.health[array]
-- if hp_addition>0 then
-- text=text..colors.blue.." +"..hp_addition
-- end
-- local green_addition=preview.bonus[array]
-- if green_addition>0 then
-- text=text..colors.good.." +"..green_addition
-- end
str=str..colors[whatcolor].." // "..text.."\\n"--.." H[1]:"..health[array].." T[1]:"..timedhp[array].." S[1]:"..surgeryhp[array].." PH[1]:"..preview.health[array].." PB[1]:"..preview.bonus[array].." PS[1]:"..surgeryhp[array].." H[2]:"..health[array2].." T[2]:"..timedhp[array2].." S[2]:"..surgeryhp[array].." PH[2]:"..preview.health[array2].." PB[2]:"..preview.bonus[array2].." S[2]:"..surgeryhp[array].."\\n"
end
end
local preview_show=false
for k,v in pairs(preview.health) do
if preview.health[k] then
preview_show=true
break
end
end
for k,v in pairs(preview.bonus) do
if preview.bonus[k] then
preview_show=true
break
end
end
AddToHUDCircles("head","Head","main")
AddToHUDCircles("torso","Torso","main")
AddToHUDCircles("leftarm","Arms","limbs","rightarm")
AddToHUDCircles("leftleg","Legs","limbs","rightleg")
if not (zzz_player_injuries_mcm.get_config("TEXT_BASED_PATCH")) then
AddToHUDCircles(nil,"Condition","condition")
AddToHUDCircles(nil,"Stamina","stamina")
end
local green = math.floor(255 * ((100 - 100)/100))
local red = math.floor(255 * (100/100))
wnd:TextControl():SetTextST(str)
wnd:TextControl():SetTextColor(GetARGB(255, 255, 255, 255))
local hud = get_hud()
if not (hud) then
return
end
end
else --pics
local staticname="body_health_system"
if display.types[display_ratio] then
if display_ratio~=169 then
staticname=staticname.."_"..tostring(display_ratio)
end
end
local hud = get_hud()
local hud_d = hud:GetCustomStatic(staticname)
local wnd
if not healthstatus or show_hud_type~=2 then --not show
if (hud_d ~= nil) then
hud:RemoveCustomStatic(staticname)
hud_d = nil
end
goto otherhudparts
end
if (hud_d == nil) then
hud:AddCustomStatic(staticname,true)
hud_d = hud:GetCustomStatic(staticname)
wnd = hud_d:wnd()
if (wnd ~= nil) then
wnd:SetAutoDelete(true)
end
end
if (hud_d ~= nil) then
wnd = hud_d:wnd()
local hud = get_hud()
if not (hud) then
return
end
end
::otherhudparts::
local xml = CScriptXmlInit()
xml:ParseFile("ui_body_health.xml")
local function ParamBar(barhandler,customstatic,barname,param,param_max,showbg)
---- minimal bgs ----
local staticname
if showbg then
staticname=customstatic.."_bg"
else
staticname="bhs_garbage"
end
if display.types[display_ratio] then
if display_ratio~=169 then
staticname=staticname.."_"..tostring(display_ratio)
end
end
local hud = get_hud()
local hud_d = hud:GetCustomStatic(staticname)
local wnd
if not healthstatus or show_hud_type~=1 or (not showbg) then --not show
if (hud_d ~= nil) then
hud:RemoveCustomStatic(staticname)
hud_d = nil
end
else
if (hud_d == nil) then
hud:AddCustomStatic(staticname,true)
hud_d = hud:GetCustomStatic(staticname)
wnd = hud_d:wnd()
if (wnd ~= nil) then
wnd:SetAutoDelete(true)
end
end
if (hud_d ~= nil) then
wnd = hud_d:wnd()
local hud = get_hud()
if not (hud) then
goto progressbars
end
end
end
-------------------
::progressbars::
if display.types[display_ratio] then
if display_ratio~=169 then
customstatic=customstatic.."_"..tostring(display_ratio)
barname=barname.."_"..tostring(display_ratio)
end
end
local cs_name = hud:GetCustomStatic(customstatic)
if (cs_name == nil) then
if not (scuffed_fix) then
hud:AddCustomStatic(customstatic, true)
cs_name = hud:GetCustomStatic(customstatic)
local w = cs_name:wnd()
barhandler = xml:InitProgressBar(barname, w)
barhandler:Show(true)
barhandler:SetProgressPos(55)
scuffed_fix = true
CreateTimeEvent("bvcx", "bvcx", disable_hud_fps_fix_tmr, worst_possible_fix)
end
else
if not param_max then --default 0 to 100
param=param*100
if not param then param=0 end
barhandler:SetProgressPos(param)
else
param=param*100/param_max
if not param then param=0 end
barhandler:SetProgressPos(param)
end
end
if show_hud_type<1 or (time_global()-show_hud_change_time<50) then --not show
if (cs_name ~= nil) then
hud:RemoveCustomStatic(customstatic)
cs_name = nil
end
-- barhandler:Show(false)
-- else
-- barhandler:Show(true)
end
return barhandler
end
--- yellow bkg lines equials health+timedhp -----
local function nil_math(array)
local arg=health[array]+timedhp[array]
if preview.health[array] or preview.bonus[array] then
arg=(preview.health[array] or 0)+(preview.bonus[array] or 0)
end
return arg
end
progress_health_head_time=ParamBar(progress_health_head_time,"bhs_health_head_bar_green","bhs_health_bodypart_green", nil_math("head"),maxhp.head,false)
progress_health_torso_time=ParamBar(progress_health_torso_time,"bhs_health_torso_bar_green","bhs_health_bodypart_green", nil_math("torso"),maxhp.torso,false)
progress_health_rightarm_time=ParamBar(progress_health_rightarm_time,"bhs_health_rightarm_bar_green","bhs_health_bodypart_green", nil_math("rightarm"),maxhp.rightarm,false)
progress_health_leftarm_time=ParamBar(progress_health_leftarm_time,"bhs_health_leftarm_bar_green","bhs_health_bodypart_green", nil_math("leftarm"),maxhp.leftarm,false)
progress_health_rightleg_time=ParamBar(progress_health_rightleg_time,"bhs_health_rightleg_bar_green","bhs_health_bodypart_green", nil_math("rightleg"),maxhp.rightleg,false)
progress_health_leftleg_time=ParamBar(progress_health_leftleg_time,"bhs_health_leftleg_bar_green","bhs_health_bodypart_green", nil_math("leftleg"),maxhp.leftleg,false)
-----------------------------
--- blue bkg health equals heals -----
if not (zzz_player_injuries_mcm.get_config("TEXT_BASED_PATCH")) then
progress_stamina=ParamBar(progress_stamina,"bhs_stamina_bar","bhs_stamina",db.actor.power,nil,true)
end
progress_health=ParamBar(progress_health,"bhs_health_bar","bhs_health",db.actor.health,nil,true)
progress_health_head=ParamBar(progress_health_head,"bhs_health_head_bar","bhs_health_bodypart", preview.health.head or health.head,maxhp.head,true)
progress_health_torso=ParamBar(progress_health_torso,"bhs_health_torso_bar","bhs_health_bodypart", preview.health.torso or health.torso,maxhp.torso,true)
progress_health_rightarm=ParamBar(progress_health_rightarm,"bhs_health_rightarm_bar","bhs_health_bodypart", preview.health.rightarm or health.rightarm,maxhp.rightarm,true)
progress_health_leftarm=ParamBar(progress_health_leftarm,"bhs_health_leftarm_bar","bhs_health_bodypart", preview.health.leftarm or health.leftarm,maxhp.leftarm,true)
progress_health_rightleg=ParamBar(progress_health_rightleg,"bhs_health_rightleg_bar","bhs_health_bodypart", preview.health.rightleg or health.rightleg,maxhp.rightleg,true)
progress_health_leftleg=ParamBar(progress_health_leftleg,"bhs_health_leftleg_bar","bhs_health_bodypart", preview.health.leftleg or health.leftleg,maxhp.leftleg,true)
-------------------------------------
--- red bkg health equals surgery -----
progress_health_torso_surgery=ParamBar(progress_health_torso_surgery,"bhs_health_torso_bar_blue","bhs_health_bodypart_blue", preview.surgeryhp.torso or surgeryhp.torso,maxhp.torso,false)
progress_health_rightarm_surgery=ParamBar(progress_health_rightarm_surgery,"bhs_health_rightarm_bar_blue","bhs_health_bodypart_blue", preview.surgeryhp.rightarm or surgeryhp.rightarm,maxhp.rightarm,false)
progress_health_leftarm_surgery=ParamBar(progress_health_leftarm_surgery,"bhs_health_leftarm_bar_blue","bhs_health_bodypart_blue", preview.surgeryhp.leftarm or surgeryhp.leftarm,maxhp.leftarm,false)
progress_health_rightleg_surgery=ParamBar(progress_health_rightleg_surgery,"bhs_health_rightleg_bar_blue","bhs_health_bodypart_blue", preview.surgeryhp.rightleg or surgeryhp.rightleg,maxhp.rightleg,false)
progress_health_leftleg_surgery=ParamBar(progress_health_leftleg_surgery,"bhs_health_leftleg_bar_blue","bhs_health_bodypart_blue", preview.surgeryhp.leftleg or surgeryhp.leftleg,maxhp.leftleg,false)
-------------------------------------
end
end
function worst_possible_fix()
scuffed_fix = false
return true
end
function on_key_press(dik)
if dik == DIK_keys.DIK_H then
-- if healthstatus then
-- healthstatus=false
-- xr_sound.set_sound_play(db.actor:id(), "pda_tips")
-- else
-- healthstatus=true
-- staticplacement=lazyworkaroundplacement
-- xr_sound.set_sound_play(db.actor:id(), "pda_alarm")
-- end
if showtexthud>0 then
healthstatus=not healthstatus
else
if show_hud_type==0 then show_hud_type=1 show_hud_change_time=time_global()
elseif show_hud_type==1 then show_hud_type=2 show_hud_change_time=time_global()
elseif show_hud_type==2 then show_hud_type=0 show_hud_change_time=time_global()
end
end
xr_sound.set_sound_play(db.actor:id(), "pda_tips")
HUDUpdate()
-- elseif dik==DIK_keys.DIK_J then
-- health.rightarm=health.rightarm-1
-- elseif dik==DIK_keys.DIK_K then
-- health.leftarm=health.leftarm-1
-- db.actor:give_game_news("resolution", tostring(options) or "nil", db.actor:character_icon(), 0, 10000)
-- xr_sound.set_sound_play(db.actor:id(), "pda_tips")
end
end
local function actor_on_weapon_zoom_in(wpn) --maybe needed for sway idk
shaking_hands()
end
local function actor_on_weapon_zoom_out(wpn)
shaking_hands_remove()
end
local tg_anm = 0
local delay_anm_play = 500
cooldown = 1000
state_cooldown = 0
local function actor_on_footstep(material,power,hud_view,flags)
local tg = time_global()
local right_l = (health.leftleg + timedhp.leftleg) * effects_mult -- right is left
local left_l = (health.rightleg + timedhp.rightleg) * effects_mult
if right_l < 1 then right_l = 0.8 end -- exp will still make big difference between 1 and 0.8
if left_l < 1 then left_l = 0.8 end
local legs_sum = (right_l + left_l) * effects_mult
local left_limp = math.exp(1.5/left_l) --
local right_limp = math.exp(1.5/right_l)
local both_limp = (right_limp + left_limp) / 2
local mst = IsMoveState('mcSprint') -- sprint is tearing animations apart, the only way is to increase delay for it
if tg > tg_anm then
if leftleg_flag then
if not mst then
level.add_cam_effector("camera_effects\\switch\\" .. leftleg_anm[math.random(#leftleg_anm)] .. ".anm", 99251, false, "", 0, false, ((left_limp - 1) * (zzz_player_injuries_mcm.get_config("leg_animation_power"))) )
tg_anm = tg + delay_anm_play end
-- actor_menu.set_msg(1, strformat("Left leg HP: %s | Left leg Power: %s", left_l, left_limp))
elseif rightleg_flag then
if not mst then
level.add_cam_effector("camera_effects\\switch\\" .. rightleg_anm[math.random(#rightleg_anm)] .. ".anm", 99261, false, "", 0, false, ((right_limp - 1) * (zzz_player_injuries_mcm.get_config("leg_animation_power"))) )
tg_anm = tg + delay_anm_play end
-- actor_menu.set_msg(1, strformat("Right leg HP: %s | Right leg Power: %s", right_l, right_limp))
elseif bothlegs_flag then
level.add_cam_effector("camera_effects\\switch\\" .. bothlegs_anm[math.random(#bothlegs_anm)] .. ".anm", 99271, false, "", 0, false, ((both_limp - 1) * (zzz_player_injuries_mcm.get_config("leg_animation_power"))) )
if not mst then tg_anm = tg + delay_anm_play
else tg_anm = tg + delay_anm_play * 1.6 end
-- actor_menu.set_msg(1, strformat("Both legs HP: %s | Both legs Power: %s", legs_sum, both_limp))
end
end
local l_leg_power = 0
local r_leg_power = 0
local hit_power = 0
local cr = IsMoveState('mcCrouch')
local low_cr = cr and IsMoveState('mcAccel')
if mst then -- comment this and uncomment next one for super memes !!
-- if (not (cr or low_cr) ) and (left_l < 1 or right_l < 1) then
local right_l_mst = health.leftleg * effects_mult -- right is left
local left_l_mst = health.rightleg * effects_mult
if right_l_mst < 1 then right_l = 0.8 end -- exp will still make big difference between 1 and 0.8
if left_l_mst < 1 then left_l = 0.8 end
if left_l_mst <= (zzz_player_injuries_mcm.get_config("leg_limping_damage_minimum_hp")) then
l_leg_power = 0.0290
end
if right_l_mst <= (zzz_player_injuries_mcm.get_config("leg_limping_damage_minimum_hp")) then
r_leg_power = 0.0290
end
hit_power = (l_leg_power + r_leg_power) / 2
-- printf("hit_power: " .. (hit_power))
local file
local chance = math.random(1,100)
if (hit_power > 0) and (state_cooldown < time_global()) and (chance<=35) then
if zzz_player_injuries_mcm.get_config("new_voice_sounds") then
local helmet = (db.actor:item_in_slot(12) or db.actor:get_current_outfit())
local sound_play = math.random(1,13)
if helmet then
muffle = ""
else
muffle = ""
end
file = "bhs\\" .. muffle .. "pain_" .. sound_play
else
file = "actor\\pain_" .. sound_play
end
file_to_say = sound_object( file )
file_to_say:play(db.actor,0,sound_object.s2d)
level.add_pp_effector("blur_bhs.ppe", math.random(655808, 655820), false)
state_cooldown = time_global() + cooldown
actor_health = db.actor.health
if bhs_exp_mode then
hit_power = hit_power *0.25
end
actor_health_reduced = actor_health - hit_power
db.actor:set_health_ex(actor_health_reduced)
--hit.type="Fracture"
end
end
end
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
local is_body_parts_damaged = false
local function check_body_parts()
local head_difference = maxhp.head - health.head
local torso_difference = maxhp.torso - health.torso
local rightarm_difference = maxhp.rightarm - health.rightarm
local leftarm_difference = maxhp.leftarm - health.leftarm
local rightleg_difference = maxhp.rightleg - health.rightleg
local leftleg_difference = maxhp.leftleg - health.leftleg
is_body_parts_damaged = false
if (head_difference > 0 or torso_difference > 0 or rightarm_difference > 0 or leftarm_difference > 0 or rightleg_difference > 0 or leftleg_difference > 0) then
is_body_parts_damaged = true
end
end
old_is_actor_not_healthy = dialogs.is_actor_not_healthy
function dialogs.is_actor_not_healthy(first_speaker, second_speaker)
check_body_parts()
if (is_body_parts_damaged == true) then
return true
end
return old_is_actor_not_healthy(first_speaker, second_speaker)
end
old_is_actor_injured = dialogs.is_actor_injured
function dialogs.is_actor_injured(first_speaker, second_speaker)
check_body_parts()
if (is_body_parts_damaged == true) and (db.actor:money() >= 1850) then
return true
end
return old_is_actor_injured(first_speaker, second_speaker)
end
old_is_actor_injured_irradiated = dialogs.is_actor_injured_irradiated
function dialogs.is_actor_injured_irradiated(first_speaker, second_speaker)
check_body_parts()
if (is_body_parts_damaged == true) and (db.actor.radiation > 0) and (db.actor:money() >= 3350) then
return true
end
return old_is_actor_injured_irradiated(first_speaker, second_speaker)
end
local function heal_body_parts()
timedhp.head = 0
health.head = maxhp.head
timedhp.torso = 0
health.torso = maxhp.torso
timedhp.rightarm = 0
health.rightarm = maxhp.rightarm
timedhp.leftarm = 0
health.leftarm = maxhp.leftarm
timedhp.rightleg = 0
health.rightleg=maxhp.rightleg
timedhp.leftleg = 0
health.leftleg=maxhp.leftleg
SaveHealthStatus()
end
old_heal_actor_injury_radiation = dialogs.heal_actor_injury_radiation
function dialogs.heal_actor_injury_radiation(first_speaker, second_speaker)
old_heal_actor_injury_radiation(first_speaker, second_speaker)
check_body_parts()
if (is_body_parts_damaged == true) then
heal_body_parts()
end
end
old_heal_actor_injury = dialogs.heal_actor_injury
function dialogs.heal_actor_injury(first_speaker, second_speaker)
old_heal_actor_injury(first_speaker, second_speaker)
check_body_parts()
if (is_body_parts_damaged == true) then
heal_body_parts()
end
end
--new code Eddie--------------------------------------------------------
function rank_part(name)
if string.find(name, "leg") then
return 5
elseif string.find(name, "arm") then
return 4
elseif string.match(name, "torso") then
return 3
elseif string.match(name, "head") then
return 2
else
return 1
end
end
local functor = function(t,a,b)
local rank_a = a and rank_part(a) or 0
local rank_b = b and rank_part(b) or 0
if rank_a ~= rank_b then return rank_a > rank_b
else
return a > b
end
end
local function HealOne(healpower,health,surgeryhp)
local healupto = healpower
if healupto == 0 then healupto=db.actor.health --Heal up to this percentage value. Medicine should have 1, regeneration uses actor health.
elseif healupto > 1 then healupto = 1 end
local healamount = 1
local loopcounter = 1 --Only heal limbs that are not broken (broken = at 0 hp).
if using_surgery then
if splinting and (healpower>0 and medkit_is_splint) then loopcounter = 0 end
while healamount > 0 do
for k,v in pairs(health, functor) do
adjustedhealth = v --Double health for arm&leg for deciding what to heal, since limbs have half hp of head/torso
if string.find(k, "leg") or string.find(k, "arm") then
adjustedhealth = adjustedhealth * 2
end
if adjustedhealth == loopcounter then
if ((loopcounter==0 and surgeryhp[k]>0) and health[k] < maxhp[k] * healupto) or (loopcounter>0 and health[k] < maxhp[k] * healupto) then
health[k] = health[k] + 1
if health[k]>maxhp[k] then health[k]=maxhp[k] end
if surgeryhp[k]>0 then surgeryhp[k] = surgeryhp[k] - 1 end
healamount = 0
--printf("Healed once")
break
end
end
end
if loopcounter >= maxhp.head * healupto and loopcounter >= maxhp.torso * healupto
and loopcounter >= maxhp.rightarm * 2 * healupto and loopcounter >= maxhp.rightleg * 2 * healupto then break end
loopcounter = loopcounter + 1
end
else
if (medkit_is_splint and healpower > 0) or not splinting then loopcounter=0 end
while healamount > 0 do
printf("Trying to limb with %s, healpower: %s",loopcounter,healpower)
for k,v in pairs(health, functor) do
adjustedhealth = v --Double health for arm&leg for deciding what to heal, since limbs have half hp of head/torso
if string.find(k, "leg") or string.find(k, "arm") then
adjustedhealth = adjustedhealth * 2
end
if adjustedhealth == loopcounter then
if health[k] < maxhp[k] * healupto then
health[k] = health[k] + 1
if health[k]>maxhp[k] then health[k]=maxhp[k] end
if surgeryhp[k]>0 then surgeryhp[k] = surgeryhp[k] - 1 end
healamount = 0
--printf("Healed once")
break
end
end
end
if loopcounter >= maxhp.head * healupto and loopcounter >= maxhp.torso * healupto
and loopcounter >= maxhp.rightarm * 2 * healupto and loopcounter >= maxhp.rightleg * 2 * healupto then break end
loopcounter = loopcounter + 1
end
end
SaveHealthStatus()
end
function ArtiHeal(healpower)
printf("Artihealed or campfire once")
HealOne(healpower,health,surgeryhp)
end
local function SurgeryUsed(name,health,surgeryhp)
local surgeryamount = surgerylist[name].surgeryamount
if surgeryamount <= 0 then return end
--printf("Using surgery")
if using_surgery and not surgery_all_limbs then
if not surgery_heals and not (cms_restores_hp_too and string.match(name, "cms")) then
for k,v in pairs(health, functor) do
if v == 0 and surgeryhp[k] == 0 then
if string.match(k, "torso") or string.match(k, "head") then
surgeryhp[k] = surgeryamount*2
else
surgeryhp[k] = surgeryamount
end
--printf("Surgery used on %s",k)
surgeryamount = 0
if surgeryhp[k]>maxhp[k] then surgeryhp[k]=maxhp[k] end
break
end
end
else
for k,v in pairs(health, functor) do
if v == 0 then
if string.match(k, "torso") or string.match(k, "head") then
health[k] = surgeryamount*2
else
health[k] = surgeryamount
end
--printf("Surgery used on %s",k)
surgeryamount = 0
surgeryhp[k] = 0
if health[k]>maxhp[k] then health[k]=maxhp[k] end
break
end
end
end
elseif using_surgery and surgery_all_limbs then
if not surgery_heals and not (cms_restores_hp_too and string.match(name, "cms")) then
for k,v in pairs(health, functor) do
if v == 0 and surgeryhp[k] == 0 then
if string.match(k, "torso") or string.match(k, "head") then
surgeryhp[k] = surgeryamount*2
else
surgeryhp[k] = surgeryamount
end
--printf("Surgery used on %s",k)
if surgeryhp[k]>maxhp[k] then surgeryhp[k]=maxhp[k] end
end
end
else
for k,v in pairs(health, functor) do
if v == 0 then
if string.match(k, "torso") or string.match(k, "head") then
health[k] = surgeryamount*2
else
health[k] = surgeryamount
end
--printf("Surgery used on %s",k)
if health[k]>maxhp[k] then health[k]=maxhp[k] end
if surgeryhp[k]>0 then surgeryhp[k] = 0 end
end
end
end
end
SaveHealthStatus()
end
local function SplintUsed(name,health,surgeryhp)
local splintamount = splintlist[name].splintamount
if splintamount <= 0 then return end
local loopcounter = 0
if using_surgery then
--printf("Using surgery")
--printf("Splinting")
for k,v in pairs(surgeryhp, functor) do
if v >= 1 then
health[k] = health[k] + surgeryhp[k]
--printf("Splint used on %s",k)
splintamount = 0
surgeryhp[k] = 0
if health[k]>maxhp[k] then health[k]=maxhp[k] end
if splintamount <= 0 then break end
end
end
else
for k,v in pairs(health, functor) do
if v == 0 then
health[k] = health[k] + splintamount
--printf("Splint used on %s",k)
splintamount = 0
surgeryhp[k] = 0
if health[k]>maxhp[k] then health[k]=maxhp[k] end
if splintamount <= 0 then break end
end
end
end
SaveHealthStatus()
end
----------------------------------------------------------------
local currentBoosters = {}
local boosterCounters = {}
function manage_boosters()
local c_obj = db.actor:cast_Actor()
local function restoreState()
if currentBoosters[BoosterID["HpRestore"]] then
currentBoosters[BoosterID["HpRestore"]] = nil
c_obj:conditions():BoostHpRestore(-(boosterCounters[BoosterID["HpRestore"]] or 0))
boosterCounters[BoosterID["HpRestore"]] = nil
end
end
local foundRadiationBooster = false
c_obj:conditions():BoosterForEach(function(booster_type, booster_time, booster_value)
if booster_type == BoosterID["HpRestore"] and booster_value > 0 then
if boosterCounters[booster_type] then
c_obj:conditions():BoostHpRestore(-boosterCounters[booster_type])
else
boosterCounters[booster_type] = 0
end
currentBoosters[booster_type] = booster_value
boosterCounters[booster_type] = -booster_value
c_obj:conditions():BoostHpRestore(boosterCounters[booster_type])
foundRadiationBooster = true
--printf("booster_type %s, booster_time %s, booster_value %s", booster_type, booster_time, booster_value+boosterCounters[booster_type])
end
end)
if not foundRadiationBooster and currentBoosters[BoosterID["HpRestore"]] then
restoreState()
end
end
local status_check_timer = 0
local status_check_interval = 250
function actor_on_update()
local statuschanged = false
if bhs_exp_mode then
manage_boosters()
--if time_global() >= status_check_timer then
-- status_check_timer = time_global() + status_check_interval
--end
if exp_druglist.restorepower > 0 then
if time_global() - exp_druglist.lasttimestamp > exp_druglist.restoreduration then
if exp_druglist.countdown_increments == 1 or exp_druglist.countdown_increments < 0 then
db.actor:change_health(exp_druglist.restorepower)
exp_druglist.countdown_increments = 0
printf("(EXP) Restore effect ran out")
exp_druglist.restoreduration = 0
exp_druglist.restorepower = 0
exp_druglist.lasttimestamp = time_global()
elseif exp_druglist.countdown_increments > 1 then
db.actor:change_health(exp_druglist.restorepower)
exp_druglist.countdown_increments = exp_druglist.countdown_increments - 1
exp_druglist.lasttimestamp = time_global()
--printf("Restore countdowns left: %s",exp_druglist.countdown_increments)
end
statuschanged = true
end
end
end
--actor_menu.set_msg("width:"..device().width.." height:"..device().height)
local newhealth=db.actor.health
local amount=myhealth-newhealth
if amount>0 and hit.type and bhs_exp_mode then
if hit.apply then
hit.apply=false
else
db.actor:change_health(amount)
end
printf("Damage received: %s, Type: %s",amount,hit.type)
hit.type = nil
elseif amount>0.001 and bhs_exp_mode then
printf("Typeless damage received: %s",amount)
end
if db.actor.health <= 0 and bhs_exp_mode then
printf("Allowing death")
hit.death=true
db.actor.health=1
db.actor.health=-1
end
myhealth=db.actor.health
if time_global() >= status_check_timer then
status_check_timer = time_global() + status_check_interval
for k,v in pairs(health) do
if v>maxhp[k] then
health[k]=maxhp[k]
end
if v<=0 then health[k]=0 end
end
for k,v in pairs(preview.health) do
if v>maxhp[k] then
preview.health[k]=maxhp[k]
preview.bonus[k]=0
end
if v<=0 then preview.health[k]=0 end
if (preview.health[k]+preview.bonus[k])>maxhp[k] then preview.bonus[k]=(health[k]-maxhp[k]) end -- needs a check
end
local allheal_ceiling=1
if timedheal.torso>0 and time_global()-healhelplist.lastregen>healhelplist.healtimer then
healhelplist.lastregen=time_global()
if healhelplist.healpower == 0 then allheal_ceiling=db.actor.health
else allheal_ceiling=healhelplist.healpower end
for k,v in pairs(timedheal) do
if v>0 then
if health[k]~=0 or (not splinting) or (medkit_is_splint and medkits_all_heal) then -- broken
if health[k]<maxhp[k]*allheal_ceiling then
health[k]=health[k] + 1
if health[k]>maxhp[k] then health[k]=maxhp[k] end
end
--printf("Healed all")
else --printf("Wasted healing on %s",k)
end
timedheal[k]=timedheal[k]-1
if timedheal[k]<0 then timedheal[k]=0 end
end
end
statuschanged = true
end
if time_global() - healonelist.lastregen > healonelist.healtimer then
if healonelist.healamount > 0 then
HealOne(healonelist.healpower,health,surgeryhp) -- healing not capped to actor.health %
healonelist.healamount = healonelist.healamount - 1
if healonelist.healamount < 0 then
healonelist.healamount = 0
end
if healonelist.healamount == 0 then
healonelist.lastregen = 0
healonelist.healpower = 0
else
healonelist.lastregen = time_global()
end
statuschanged = true
end
end
if painkillerlist.painkillerpower > 0 then
if time_global() - painkillerlist.lasttimestamp > painkillerlist.painkillerduration then
if painkillerlist.countdown_increments == 1 or painkillerlist.countdown_increments < 0 then
painkillerlist.countdown_increments = 0
printf("Painkillers ran out")
painkillerlist.painkillerpower = 0
painkillerlist.painkillerduration = 0
painkillerlist.lasttimestamp = time_global()
if painkiller_grain_shader then level.remove_pp_effector(5020) end
for k,v in pairs(health) do
timedhp[k] = 0
end
elseif painkillerlist.countdown_increments > 1 then
painkillerlist.countdown_increments = painkillerlist.countdown_increments - 1
painkillerlist.lasttimestamp = time_global()
--printf("Countdowns left: %s",painkillerlist.countdown_increments)
end
statuschanged = true
end
end
if modifiedregen>0 and init then
if time_global() - healtimer > modifiedregen then
HealOne(newhealth,health,surgeryhp)
healtimer = time_global()
statuschanged = true
end
end
if not init then
display_width=device().width
display_height=device().height
local currentratio=display_width/display_height
local closest=999
local closestkey=999
for k,v in pairs(display.types) do
local d=math.abs(currentratio-v)
if d<closest then closest=d closestkey=k end
end
display_ratio=closestkey
--actor_menu.set_msg(display_ratio,1)
LoadHealthStatus()
init=true
elseif statuschanged then
for k,v in pairs(health) do
local missinghealth = 0
if v < maxhp[k] then
missinghealth = maxhp[k] - v
if missinghealth < 0 then missinghealth = 0 end
end
local bonus = painkillerlist.painkillerpower
if string.match(k, "head") or string.match(k, "torso") then
bonus = painkillerlist.painkillerpower * 2
end
if bonus > missinghealth then
bonus = missinghealth
end
timedhp[k] = bonus
end
SaveHealthStatus()
end
if not (zzz_player_injuries_mcm.get_config("TEXT_BASED_PATCH")) then
local hidehudonce=false
if hide_default_hud and not hidehudonce then
local maingameui = ActorMenu.get_maingame()
maingameui.m_ui_hud_states.m_ui_health_bar_show = false
maingameui.m_ui_hud_states.m_ui_stamina_bar_show = false
-- maingameui.m_ui_hud_states.m_ui_psy_bar_show = false
hidehudonce=true
end
end
local speedvector=db.actor:get_movement_speed()
local movementspeed=(speedvector.x*speedvector.x)+(speedvector.y*speedvector.y)+(speedvector.z*speedvector.z)
-- xcvb ---
limp_speed_slow()
torso_penalty()
bhs_concussion()
local curr_time = game.get_game_time()
if (prev_time == nil) then prev_time = curr_time end
if (curr_time:diffSec(prev_time) > 3) then
prev_time = curr_time
legs_limp()
end
----------------------------
end
HUDUpdate()
--if health.torso==0 then
-- hit.death = true
-- db.actor.health=-1
--end
if health.head== 0 then
hit.death = true
db.actor.health=-1
printf("Allowing death from head reaching 0")
end
if hit.death then
printf("Allowing death")
db.actor.health=-1
end
end
local function actor_on_before_death(whoID,flags)
if bhs_exp_mode and not hit.death and arszi_psy.get_psy_health() > 0 then
printf("!Preventing death")
--if myhealth <=0 then
-- printf("Healing to full from: %s, actual health: %s",myhealth, db.actor.health)
-- db.actor.health=1
--else
-- printf("Resetting health to: %s, actual health: %s",myhealth, db.actor.health)
-- db.actor.health=myhealth
--end
if hit.type then
if hit.apply then
hit.apply=false
else
db.actor.health=myhealth
printf("!Revesing death damage")
end
end
if db.actor.health <= 0 then
printf("!Allowing death")
hit.death=true
end
flags.ret_value = false
return
else
HUDUpdate()
health.head=maxhp.head
health.torso=maxhp.torso
health.rightarm=maxhp.rightarm
health.leftarm=maxhp.leftarm
health.rightleg=maxhp.rightleg
health.leftleg=maxhp.leftleg
timedhp.head=0
timedhp.torso=0
timedhp.rightarm=0
timedhp.leftarm=0
timedhp.rightleg=0
timedhp.leftleg=0
SaveHealthStatus()
if volume_sound_x then
exec_console_cmd("snd_volume_eff " .. volume_sound_x)
end
end
end
local function MedicineUsed(name,health,timedheal,surgeryhp,ispreview)
--printf("Medicine used for %s",ispreview)
if splintlist[name] then
SplintUsed(name,health,surgeryhp)
--printf("Splint used for %s",ispreview) -- see console output
end
if surgerylist[name] then
SurgeryUsed(name,health,surgeryhp)
--printf("Surgery used for %s",ispreview) -- see console output
end
if ispreview == 0 then
if healhelplist[name] then
healhelplist.lastregen=time_global()
healhelplist.healtimer=healhelplist[name].healtimer
healhelplist.healpower=healhelplist[name].healpower
for k,v in pairs(timedheal) do
local bonus=healhelplist[name][k]
if bonus and (health[k]>0 or (health[k]==0 and (not splinting or (medkit_is_splint and healhelplist.healpower>0)))) then
timedheal[k]=bonus
end
end
--printf("Heal all used for %s",ispreview)
end
if healonelist[name] then
healonelist.healamount = healonelist[name].healamount
healonelist.healtimer = healonelist[name].healtimer
healonelist.healpower = healonelist[name].healpower
healonelist.lastregen = time_global()
--printf("Heal one used for %s",ispreview)
end
if painkillerlist[name] then
if painkillerlist.painkillerpower < painkillerlist[name].painkillerpower then
painkillerlist.painkillerpower = painkillerlist[name].painkillerpower
painkillerlist.countdown_increments=painkillerlist[name].countdown_increments
--printf("Original duration: %s",painkillerlist[name].painkillerduration)
painkillerlist.painkillerduration = painkillerlist[name].painkillerduration/painkillerlist.countdown_increments
--printf("Countdowns set. New duration: %s",painkillerlist.painkillerduration)
painkillerlist.lasttimestamp = time_global()
elseif painkillerlist.painkillerpower == painkillerlist[name].painkillerpower then
painkillerlist.countdown_increments=painkillerlist[name].countdown_increments
--printf("Original duration: %s",painkillerlist[name].painkillerduration)
painkillerlist.painkillerduration = painkillerlist[name].painkillerduration/painkillerlist.countdown_increments
--printf("Countdowns set. New duration: %s",painkillerlist.painkillerduration)
painkillerlist.lasttimestamp = time_global()
end
if painkiller_grain_shader then level.add_pp_effector("radiation.ppe", 5020, true) end
--printf("Painkiller used for %s",ispreview)
end
for k,v in pairs(health) do
local missinghealth = 0
if v < maxhp[k] then
missinghealth = maxhp[k] - v
if missinghealth < 0 then missinghealth = 0 end
end
local bonus = painkillerlist.painkillerpower
if string.match(k, "head") or string.match(k, "torso") then
bonus = painkillerlist.painkillerpower * 2
end
if bonus > missinghealth then
bonus = missinghealth
end
timedhp[k] = bonus
end
else
if healonelist[name] then
for i=1,healonelist[name].healamount do
HealOne(healonelist[name].healpower,health,surgeryhp)
--printf("HealOne used for %s",ispreview)
end
end
if healhelplist[name] then
local allheal_ceiling=1
if healhelplist[name].healpower <= 0 then allheal_ceiling=db.actor.health
else allheal_ceiling=healhelplist[name].healpower end
for k,v in pairs(health) do
local bonus = healhelplist[name][k]
if bonus and (health[k]>0 or (health[k]==0 and (not splinting or (medkit_is_splint and healhelplist[name].healpower>0)))) then
if health[k]+bonus>maxhp[k]*allheal_ceiling then
health[k]=maxhp[k]*allheal_ceiling
else
health[k]=health[k]+bonus
end
end
end
--printf("Heal all used for %s",ispreview)
end
painkillerpreview = painkillerlist.painkillerpower
if painkillerlist[name] then
if painkillerpreview < painkillerlist[name].painkillerpower then
painkillerpreview = painkillerlist[name].painkillerpower
end
--printf("Painkiller used for %s",ispreview)
end
if painkillerpreview > 0 then
for k,v in pairs(health) do
missinghealth = 0
if v < maxhp[k] then
missinghealth = maxhp[k] - v
if missinghealth < 0 then missinghealth = 0 end
end
bonus = painkillerpreview
if string.match(k, "head") or string.match(k, "torso") then
bonus = painkillerpreview * 2
end
if bonus > missinghealth then
bonus = missinghealth
end
preview.bonus[k] = bonus
end
end
end
end
local function actor_on_sleep(hours)
local hoursleft=hours
printf("Sleepie time for : %s", hoursleft)
for k,v in pairs(timedhp) do
timedhp[k]=0
painkillerlist.painkillerpower = 0
painkillerlist.painkillerduration = 0
painkillerlist.countdown_increments=0
if painkiller_grain_shader then
level.remove_pp_effector(5020)
end
end
hoursleft = hoursleft*sleep_heal_power
printf("Adjusted hours: %s", hoursleft)
if sleep_heal then
if sleep_heal_logic then
printf("Sleep logic is on")
for i=1,hoursleft do
HealOne(0,health,surgeryhp)
end
else
printf("Sleep logic is off")
local head_difference=maxhp.head-health.head
if head_difference>0 then
if hoursleft>head_difference then
health.head=maxhp.head
hoursleft=hoursleft-head_difference
utils_obj.save_var(db.actor,"health.head",health.head)
else
health.head=health.head+hoursleft
utils_obj.save_var(db.actor,"health.head",health.head)
return
end
end
local torso_difference=maxhp.torso-health.torso
if torso_difference>0 then
if hoursleft>torso_difference then
health.torso=maxhp.torso
hoursleft=hoursleft-torso_difference
utils_obj.save_var(db.actor,"health.torso",health.torso)
else
health.torso=health.torso+hoursleft
utils_obj.save_var(db.actor,"health.torso",health.torso)
return
end
end
local rightarm_difference=maxhp.rightarm-health.rightarm
if rightarm_difference>0 then
if hoursleft>rightarm_difference then
health.rightarm=maxhp.rightarm
hoursleft=hoursleft-rightarm_difference
utils_obj.save_var(db.actor,"health.rightarm",health.rightarm)
else
health.rightarm=health.rightarm+hoursleft
utils_obj.save_var(db.actor,"health.rightarm",health.rightarm)
return
end
end
local leftarm_difference=maxhp.leftarm-health.leftarm
if leftarm_difference>0 then
if hoursleft>leftarm_difference then
health.leftarm=maxhp.leftarm
hoursleft=hoursleft-leftarm_difference
utils_obj.save_var(db.actor,"health.leftarm",health.leftarm)
else
health.leftarm=health.leftarm+hoursleft
utils_obj.save_var(db.actor,"health.leftarm",health.leftarm)
return
end
end
local rightleg_difference=maxhp.rightleg-health.rightleg
if rightleg_difference>0 then
if hoursleft>rightleg_difference then
health.rightleg=maxhp.rightleg
hoursleft=hoursleft-rightleg_difference
utils_obj.save_var(db.actor,"health.rightleg",health.rightleg)
else
health.rightleg=health.rightleg+hoursleft
utils_obj.save_var(db.actor,"health.rightleg",health.rightleg)
return
end
end
local leftleg_difference=maxhp.leftleg-health.leftleg
if leftleg_difference>0 then
if hoursleft>leftleg_difference then
health.leftleg=maxhp.leftleg
hoursleft=hoursleft-leftleg_difference
utils_obj.save_var(db.actor,"health.leftleg",health.leftleg)
else
health.leftleg=health.leftleg+hoursleft
utils_obj.save_var(db.actor,"health.leftleg",health.leftleg)
return
end
end
end
end
SaveHealthStatus()
end
local function actor_on_item_use(obj,objname)
--printf("Used %s",objname)
if bhs_exp_mode and objname then
if exp_druglist[objname] then
--printf("Used a restore item: %s",objname)
--printf("Will restore %s HP",exp_druglist[objname].restorepower*ini_sys:r_float_ex(objname, "boost_time"))
exp_druglist.restoreduration = ini_sys:r_float_ex(objname, "boost_time")*1000/exp_druglist[objname].countdown_increments
exp_druglist.restorepower = exp_druglist[objname].restorepower
exp_druglist.lasttimestamp = time_global()
exp_druglist.countdown_increments = exp_druglist[objname].countdown_increments
--printf("Set countdown_increments to: %s",exp_druglist.restoreduration)
end
end
--printf("%s used for %s",objname,obj)
--printf("It deals %s damage",eat_damage)
if bhs_exp_mode and objname then
local eat_health = ini_sys:r_float_ex(objname, "eat_health")
if eat_health>0 then
db.actor:change_health(-eat_health)
end
--item.boost_time = ini_sys:r_float_ex(sec, "boost_time")
--if item.boost_time and item.boost_time ~= 0 then
-- item.boost_health_restore = ini_sys:r_float_ex(sec, "boost_health_restore")
--end
end
MedicineUsed(objname,health,timedheal,surgeryhp,0)
SaveHealthStatus()
end
local function InitializePreviewBars()
-- db.actor:give_game_news("init", "yes", db.actor:character_icon(), 0, 10000)
-- xr_sound.set_sound_play(db.actor:id(), "pda_tips")
preview.health.head=health.head
preview.health.torso=health.torso
preview.health.rightarm=health.rightarm
preview.health.leftarm=health.leftarm
preview.health.rightleg=health.rightleg
preview.health.leftleg=health.leftleg
preview.bonus.head=timedhp.head
preview.bonus.torso=timedhp.torso
preview.bonus.rightarm=timedhp.rightarm
preview.bonus.leftarm=timedhp.leftarm
preview.bonus.rightleg=timedhp.rightleg
preview.bonus.leftleg=timedhp.leftleg
end
local function EmptyPreviewBars()
-- db.actor:give_game_news("empty", "yes", db.actor:character_icon(), 0, 10000)
-- xr_sound.set_sound_play(db.actor:id(), "pda_tips")
for k,v in pairs(preview.health) do
preview.health[k]=nil
end
for k,v in pairs(preview.bonus) do
preview.bonus[k]=nil
end
for k,v in pairs(preview.surgeryhp) do
preview.surgeryhp[k]=nil
end
end
local focused_item
local function copy_table(t)
local n={}
for k,v in pairs(t) do
if type(v)=='table' then
n[k]=copy_table(v)
else
n[k]=v
end
end
return n
end
local function ActorMenu_on_item_focus_receive(item)
if item:id()~=focused_item then
EmptyPreviewBars()
end
local item_name=item:section()
focused_item=item:id()
--printf("Focused %s item",item_name)
if healhelplist[item_name] or splintlist[item_name] or painkillerlist[item_name] or healonelist[item_name] or surgerylist[item_name] then
--printf("It was a medical item")
-- InitializePreviewBars()
preview.health=copy_table(health)
preview.bonus=copy_table(timedhp)
preview.surgeryhp=copy_table(surgeryhp)
MedicineUsed(item_name,preview.health,preview.bonus,preview.surgeryhp,1)
end
end
local function ActorMenu_on_item_focus_lost(item)
--printf("! on item focus lost "..(item and item:section() or "nil"))
if focused_item==item:id() then
EmptyPreviewBars()
focused_item=nil
end
end
local function ActorMenu_on_mode_changed(mode,last_mode)
if last_mode==1 then --inv closed
EmptyPreviewBars()
focused_item=nil
elseif last_mode==4 then --looting closed
EmptyPreviewBars()
focused_item=nil
end
end
function on_game_start()
RegisterScriptCallback("on_option_change", on_option_change) -- xcvb
RegisterScriptCallback("actor_on_first_update",actor_on_first_update) -- xcvb
RegisterScriptCallback("on_key_press",on_key_press)
RegisterScriptCallback("save_state",save_state) -- xcvb
RegisterScriptCallback("load_state",load_state) -- xcvb
RegisterScriptCallback("actor_on_weapon_zoom_in",actor_on_weapon_zoom_in) -- xcvb
RegisterScriptCallback("actor_on_weapon_zoom_out",actor_on_weapon_zoom_out) -- xcvb
RegisterScriptCallback("actor_on_footstep",actor_on_footstep) -- xcvb
RegisterScriptCallback("actor_on_sleep",actor_on_sleep)
if not grok_actor_damage_balancer then
RegisterScriptCallback("actor_on_before_hit",actor_on_before_hit)
end
RegisterScriptCallback("actor_on_hit_callback",actor_on_hit_callback)
RegisterScriptCallback("actor_on_update",actor_on_update)
RegisterScriptCallback("actor_on_before_death",actor_on_before_death)
RegisterScriptCallback("actor_on_item_use",actor_on_item_use)
RegisterScriptCallback("ActorMenu_on_item_focus_receive",ActorMenu_on_item_focus_receive)
RegisterScriptCallback("ActorMenu_on_item_focus_lost",ActorMenu_on_item_focus_lost)
RegisterScriptCallback("ActorMenu_on_mode_changed",ActorMenu_on_mode_changed)
end