2656 lines
91 KiB
Plaintext
2656 lines
91 KiB
Plaintext
|
-- 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
|