Added, Updated and Removed Mods; Removed Backups

This commit is contained in:
2024-04-05 05:57:24 -04:00
parent 5caee9fba5
commit 6f19f2c70f
1209 changed files with 27057 additions and 41484 deletions
@@ -0,0 +1,111 @@
[itm_campfire]:booster
GroupControlSection = spawn_group
discovery_dependency =
$spawn = "food and drugs\antirad"
$prefetch = 32
;class = II_ANTIR
kind = i_kit
cform = skeleton
visual = dynamics\equipments\sumka2.ogf ;dynamics\equipments\item_tent.ogf
inv_weight = 3.68
description = st_itms_campfire_descr
inv_name = st_itms_campfire_name
inv_name_short = st_itms_campfire_name
icons_texture = ui\ui_campfire_placeable
inv_grid_width = 2
inv_grid_height = 1
inv_grid_x = 0
inv_grid_y = 0
cost = 550
eat_health = 0
eat_satiety = 0
eat_power = 0
eat_radiation = 0
eat_alcohol = 0
wounds_heal_perc = 0
animation_slot = 4
remove_after_use = false
hud = wpn_vodka_hud
placeable_section = ph_campfiremod
tier = 1
[itm_xcvb_1]:booster
$spawn = "food and drugs\bread"
visual = dynamics\devices\dev_bred\dev_bred.ogf
kind = i_food
description = st_bread_descr
cost = 1
inv_name = st_bread
inv_name_short = st_bread
inv_weight = 0.01
icons_texture = ui\ui_campfire_placeable
inv_grid_width = 1
inv_grid_height = 1
inv_grid_x = 1
inv_grid_y = 1
attach_angle_offset = -0.287979, 1.560923, 1.544060
attach_position_offset = 0.096910, -0.013594, 0.107925
attach_bone_name = bip01_r_hand
auto_attach = false
bone_name = bip01_r_hand
position_offset = 0.0,0.0,0.0
angle_offset = 1.570790,1.570790,3.92699
eat_satiety = -0.225
eat_sleepiness = 0.75
eat_thirstiness = 2.0
use_sound = interface\axe_wood_chop
tier = 1
[itm_xcvb_2]:booster
$spawn = "food and drugs\bread"
visual = dynamics\devices\dev_bred\dev_bred.ogf
kind = i_food
description = st_bread_descr
cost = 1
inv_name = st_bread
inv_name_short = st_bread
inv_weight = 0.01
icons_texture = ui\ui_campfire_placeable
inv_grid_width = 1
inv_grid_height = 1
inv_grid_x = 1
inv_grid_y = 1
attach_angle_offset = -0.287979, 1.560923, 1.544060
attach_position_offset = 0.096910, -0.013594, 0.107925
attach_bone_name = bip01_r_hand
auto_attach = false
bone_name = bip01_r_hand
position_offset = 0.0,0.0,0.0
angle_offset = 1.570790,1.570790,3.92699
eat_satiety = -0.15
eat_sleepiness = 0.5
eat_thirstiness = 1.32
use_sound = interface\axe_wood_chop
tier = 1
[itm_xcvb_3]:booster
$spawn = "food and drugs\bread"
visual = dynamics\devices\dev_bred\dev_bred.ogf
kind = i_food
description = st_bread_descr
cost = 1
inv_name = st_bread
inv_name_short = st_bread
inv_weight = 0.01
icons_texture = ui\ui_campfire_placeable
inv_grid_width = 1
inv_grid_height = 1
inv_grid_x = 1
inv_grid_y = 1
attach_angle_offset = -0.287979, 1.560923, 1.544060
attach_position_offset = 0.096910, -0.013594, 0.107925
attach_bone_name = bip01_r_hand
auto_attach = false
bone_name = bip01_r_hand
position_offset = 0.0,0.0,0.0
angle_offset = 1.570790,1.570790,3.92699
eat_satiety = -0.113
eat_sleepiness = 0.375
eat_thirstiness = 0.99
use_sound = interface\axe_wood_chop
tier = 1
@@ -0,0 +1,683 @@
;***************************************************************
;* ÍÅ ÈÇÌÅÍßÒÜ!!!!!!!!!!!!!!! *
;***************************************************************
[physic_object]
GroupControlSection = spawn_group
$spawn = "physics\object"
$prefetch = 8
class = O_PHYSIC ;Change to O_PHYS_S if you want to use se_item.se_physic
remove_time = 60; after this time unbreaked removable bone will be removed
script_binding = bind_physic_object.init
[physic_destroyable_object]
GroupControlSection = spawn_group
$spawn = "physics\destroyable_object"
;$prefetch = 8
class = P_DSTRBL ;Change to O_DSTR_S if you want to use se_item.se_physic script binding
remove_time = 60; after this time unbreaked removable bone will be removed
script_binding = bind_physic_object.init
[physic_door]:physic_destroyable_object
GroupControlSection = spawn_group
$spawn = "physics\door"
is_ai_obstacle = false
;*******************************************************************************
;* ÄÀËÜØÅ ÌÎÆÍÎ ÌÅÍßÒÜ:-) *
;*******************************************************************************
;[phys_obj_test]:physic_object
;$spawn = "dynamic_objects\test_object"
;visual = dynamics\equipments\novice_suit
;startup_animation =
;fixed_bones =
;[phys_destroyable_obj_test]:physic_destroyable_object
;$spawn = "dynamic_objects\test_destroyable_object"
;visual = dynamics\equipments\novice_suit
;startup_animation =
;fixed_bones =
;*** scene_objects ***************************************************************
[jup_b43_af_fuzz_kolobok]:physic_object
$spawn = "dynamic_objects\scene_objects\jup_b43_af_fuzz_kolobok"
visual = dynamics\artefacts\af_fuzz_kolobok.ogf
startup_animation = idle
fixed_bones = link
[jup_b43_af_mincer_meat]:physic_object
$spawn = "dynamic_objects\scene_objects\jup_b43_af_mincer_meat"
visual = dynamics\artefacts\af_mincer_meat.ogf
startup_animation = idle
fixed_bones = link
[jup_b41_af_oasis_heart]:physic_object
$spawn = "dynamic_objects\scene_objects\jup_b41_af_oasis_heart"
visual = dynamics\artefacts\af_cristall_plant.ogf
startup_animation = idle
fixed_bones = link
[jup_b41_af_half_artifact]:physic_object
$spawn = "dynamic_objects\scene_objects\jup_b41_half_artifact"
visual = dynamics\artefacts\af_psi_field.ogf
startup_animation = idle
fixed_bones = link
[jup_b32_ph_scanner]:physic_object
$spawn = "dynamic_objects\scene_objects\jup_b32_ph_scanner"
visual = dynamics\equipments\quest\scanner_artefact.ogf
startup_animation = idle
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[jup_b209_ph_scanner]:physic_object
$spawn = "dynamic_objects\scene_objects\jup_b209_ph_scanner"
visual = dynamics\equipments\quest\scanner_anomaly.ogf
custom_data = scripts\jupiter\jup_b209_scanner.ltx
startup_animation = idle
fixed_bones = link
story_id = jup_b209_ph_scanner
[jup_b207_depot_cover]:physic_object
$spawn = "dynamic_objects\scene_objects\jup_b207_depot_cover"
visual = dynamics\fence\debris_01.ogf
story_id = jup_b207_depot_cover_id
[pri_a28_actor_hideout]:physic_object
$spawn = "dynamic_objects\scene_objects\pri_a28_actor_hideout"
visual = dynamics\fence\debris_01.ogf
[jup_b219_gate]:physic_object
$spawn = "dynamic_objects\scene_objects\jup_b219_gate"
visual = dynamics\door\door_katakomb_big_4.ogf
story_id = jup_b219_gate_id
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[pri_a25_explosive_charge]:physic_object
$spawn = "dynamic_objects\scene_objects\pri_a25_explosive_charge"
visual = dynamics\equipments\quest\explosive_charge.ogf
startup_animation = idle
fixed_bones = link
story_id = pri_a25_explosive_charge_id
custom_data = models\objects\ignore_static.ltx
[zat_b57_ph_gas]:physic_object
$spawn = "dynamic_objects\scene_objects\zat_b57_ph_gas"
visual = dynamics\equipments\quest\balloon_poison_gas.ogf
startup_animation = idle
fixed_bones = link
story_id = zat_b57_ph_gas
custom_data = models\objects\ignore_static.ltx
[pri_a28_earth_helli_1]:physic_object
$spawn = "dynamic_objects\scene_objects\pri_a28_earth_helli_1"
visual = dynamics\vehicles\mi24\veh_mi24_u_02.ogf
startup_animation = idle
fixed_bones = korpus1
story_id = pri_a28_earth_helli_1
custom_data = models\objects\ignore_static.ltx
[pri_a28_earth_helli_2]:physic_object
$spawn = "dynamic_objects\scene_objects\pri_a28_earth_helli_2"
visual = dynamics\vehicles\mi24\veh_mi24_u_02.ogf
startup_animation = idle
fixed_bones = korpus1
story_id = pri_a28_earth_helli_2
custom_data = models\objects\ignore_static.ltx
[door_lab_x8]:physic_object
$spawn = "physics\door_lab_x8"
script_binding = bind_door_labx8.bind
[jup_b206_plant_ph]:physic_destroyable_object
$spawn = "dynamic_objects\scene_objects\jup_b206_plant_ph"
visual = dynamics\equipments\quest\anomaly_plant.ogf
startup_animation = idle
fixed_bones = link
story_id = jup_b206_plant_ph
custom_data = models\objects\ignore_static.ltx
;*******************************************************************************
;*** armory_room ***************************************************************
[shooting_target_1]:physic_destroyable_object
$spawn = "dynamic_objects\armory_room\shooting_target_1"
visual = dynamics\armory_room\shooting_target_1.ogf
startup_animation = shooting_target_1_down
fixed_bones = link
;*******************************************************************************
;*** balon *********************************************************************
[balon_01]:physic_destroyable_object
$spawn = "dynamic_objects\balon\balon_01"
visual = dynamics\balon\balon_01.ogf
[balon_02]:physic_destroyable_object
$spawn = "dynamic_objects\balon\balon_02"
visual = dynamics\balon\balon_02.ogf
[balon_02link]:physic_destroyable_object
$spawn = "dynamic_objects\balon\balon_02link"
visual = dynamics\balon\balon_02.ogf
fixed_bones = bone01, bone02, bone03
[balon_02a]:physic_destroyable_object
$spawn = "dynamic_objects\balon\balon_02a"
visual = dynamics\balon\balon_02a.ogf
[bidon]:physic_destroyable_object
$spawn = "dynamic_objects\balon\bidon"
visual = dynamics\balon\bidon.ogf
[bochka_close_1]:physic_destroyable_object
$spawn = "dynamic_objects\balon\bochka_close_1"
visual = dynamics\balon\bochka_close_1.ogf
[bochka_close_2]:physic_destroyable_object
$spawn = "dynamic_objects\balon\bochka_close_2"
visual = dynamics\balon\bochka_close_2.ogf
[bochka_close_3]:physic_destroyable_object
$spawn = "dynamic_objects\balon\bochka_close_3"
visual = dynamics\balon\bochka_close_3.ogf
[bochka_close_4]:physic_destroyable_object
$spawn = "dynamic_objects\balon\bochka_close_4"
visual = dynamics\balon\bochka_close_4.ogf
[gaz_balon]:physic_destroyable_object
$spawn = "dynamic_objects\balon\gaz_balon"
visual = dynamics\balon\gaz_balon.ogf
;*******************************************************************************
;*** box ***********************************************************************
;*******************************************************************************
;*** el_tehnika ****************************************************************
[disel_generator]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\disel_generator"
visual = dynamics\el_tehnika\disel_generator.ogf
startup_animation = idle
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[krisagenerator]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\krisagenerator"
visual = dynamics\el_tehnika\krisagenerator.ogf
startup_animation = idle
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[ventilator_01]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\ventilator_01"
visual = dynamics\el_tehnika\ventilator_01.ogf
startup_animation = idle
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[ventilator_02]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\ventilator_02"
visual = dynamics\el_tehnika\ventilator_02.ogf
startup_animation = idle
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[ventilator_03]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\ventilator_03"
visual = dynamics\el_tehnika\ventilator_03.ogf
startup_animation = idle
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[ventilator_04]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\ventilator_04"
visual = dynamics\el_tehnika\ventilator_04.ogf
startup_animation = idle
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[ventilator_05]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\ventilator_05"
visual = dynamics\el_tehnika\ventilator_05.ogf
startup_animation = idle
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[speakerphone]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\speakerphone"
visual = dynamics\el_tehnika\speakerphone.ogf
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
[notebook]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\notebook"
visual = dynamics\el_tehnika\notebook.ogf
[priemnik_gorizont]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\priemnik_gorizont"
visual = dynamics\el_tehnika\priemnik_gorizont.ogf
[rupor]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\rupor"
visual = dynamics\el_tehnika\rupor.ogf
fixed_bones = link
[transiver]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\transiver"
visual = dynamics\el_tehnika\transiver.ogf
[tv_1]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\tv_1"
visual = dynamics\el_tehnika\tv_1.ogf
[table_lamp_01]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\table_lamp_01"
visual = dynamics\el_tehnika\table_lamp_01.ogf
fixed_bones = link
[komp_monitor]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\komp_monitor"
visual = dynamics\el_tehnika\komp_monitor.ogf
[komp_klava]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\komp_klava"
visual = dynamics\el_tehnika\komp_klava.ogf
[komp_block]:physic_destroyable_object
$spawn = "dynamic_objects\el_tehnika\komp_block"
visual = dynamics\el_tehnika\komp_blok.ogf
;*******************************************************************************
;*** fence *********************************************************************
;*******************************************************************************
[debris_01]:physic_destroyable_object
$spawn = "dynamic_objects\fence\debris_01"
visual = dynamics\fence\debris_01.ogf
[wood_fence_1]:physic_destroyable_object
$spawn = "dynamic_objects\fence\wood_fence_1"
fixed_bones = link
visual = dynamics\fence\wood_fence_1.ogf
[wood_fence_2]:physic_destroyable_object
$spawn = "dynamic_objects\fence\wood_fence_2"
fixed_bones = link
visual = dynamics\fence\wood_fence_2.ogf
[wood_fence_3]:physic_destroyable_object
$spawn = "dynamic_objects\fence\wood_fence_3"
fixed_bones = link
visual = dynamics\fence\wood_fence_3.ogf
[wood_fence_4]:physic_destroyable_object
$spawn = "dynamic_objects\fence\wood_fence_4"
fixed_bones = link
visual = dynamics\fence\wood_fence_4.ogf
;*** workshop_room *************************************************************
;*******************************************************************************
[banka_kraski_1]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\banka_kraski_1"
visual = dynamics\workshop_room\banka_kraski_1.ogf
[tiski]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\tiski"
visual = dynamics\workshop_room\tiski.ogf
[kanistra_02]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\kanistra_02"
visual = dynamics\workshop_room\kanistra_02.ogf
[vedro_01]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\vedro_01"
visual = dynamics\workshop_room\vedro_01.ogf
[axe]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\axe"
visual = dynamics\workshop_room\axe.ogf
[hammer]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\hammer"
visual = dynamics\workshop_room\hammer.ogf
[hatch_01]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\hatch_01"
visual = dynamics\workshop_room\hatch_01.ogf
[keyga]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\keyga"
visual = dynamics\workshop_room\keyga.ogf
[lopata]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\lopata"
visual = dynamics\workshop_room\lopata.ogf
[molot]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\molot"
visual = dynamics\workshop_room\molot.ogf
[pick]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\pick"
visual = dynamics\workshop_room\pick.ogf
[riffler]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\riffler"
visual = dynamics\workshop_room\riffler.ogf
[saw]:physic_destroyable_object
$spawn = "dynamic_objects\workshop_room\saw"
visual = dynamics\workshop_room\saw.ogf
;***kitchen_room****************************************************************
[bottle_3L]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\bottle_3L"
visual = dynamics\kitchen_room\bottle_3l.ogf
[freezer]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\freezer"
visual = dynamics\kitchen_room\freezer.ogf
[bludo]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\bludo"
visual = dynamics\kitchen_room\kitchen_bludo.ogf
[kastrula]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\kastrula"
visual = dynamics\kitchen_room\kitchen_kastrula.ogf
[kastrula_up]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\kastrula_up"
visual = dynamics\kitchen_room\kitchen_kastrula_up.ogf
[krujka]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\krujka"
visual = dynamics\kitchen_room\kitchen_krujka.ogf
[lojka]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\lojka"
visual = dynamics\kitchen_room\kitchen_lojka.ogf
[miska]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\miska"
visual = dynamics\kitchen_room\kitchen_miska.ogf
[tarelka1]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\tarelka1"
visual = dynamics\kitchen_room\kitchen_tarelka1.ogf
[tarelka2]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\tarelka2"
visual = dynamics\kitchen_room\kitchen_tarelka2.ogf
[teapot_1]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\teapot_1"
visual = dynamics\kitchen_room\teapot_1.ogf
[gaz_plita]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\gaz_plita"
visual = dynamics\kitchen_room\gaz_plita.ogf
[gaz_plita_small]:physic_destroyable_object
$spawn = "dynamic_objects\kitchen_room\gaz_plita_small"
visual = dynamics\kitchen_room\gaz_plita_small.ogf
;*******************************************************************************
;*** box ***********************************************************************
[box_1a]:physic_destroyable_object
$spawn = "dynamic_objects\box\box_1a"
visual = dynamics\box\box_1a.ogf
[box_1b]:physic_destroyable_object
$spawn = "dynamic_objects\box\box_1b"
visual = dynamics\box\box_1b.ogf
[box_1c]:physic_destroyable_object
$spawn = "dynamic_objects\box\box_1c"
visual = dynamics\box\box_1c.ogf
[box_bottle_1]:physic_destroyable_object
$spawn = "dynamic_objects\box\box_bottle_1"
visual = dynamics\box\box_bottle_1.ogf
[box_metall_01]:physic_destroyable_object
$spawn = "dynamic_objects\box\box_metall_01"
visual = dynamics\box\box_metall_01.ogf
[box_wood_01]:physic_destroyable_object
$spawn = "dynamic_objects\box\box_wood_01"
visual = dynamics\box\box_wood_01.ogf
[box_wood_02]:physic_destroyable_object
$spawn = "dynamic_objects\box\box_wood_02"
visual = dynamics\box\box_wood_02.ogf
[box_paper]:physic_destroyable_object
$spawn = "dynamic_objects\box\box_paper"
visual = dynamics\box\box_paper.ogf
;*******************************************************************************
;***medical_object**************************************************************
[kolyaska_01]:physic_destroyable_object
$spawn = "dynamic_objects\medical_object\kolyaska_01"
visual = dynamics\medical_object\kolyaska_01.ogf
[kolyaska_01_braked]:physic_destroyable_object
$spawn = "dynamic_objects\medical_object\kolyaska_01_braked"
visual = dynamics\medical_object\kolyaska_01_braked.ogf
[kolyaska_wheel_01_braked]:physic_destroyable_object
$spawn = "dynamic_objects\medical_object\kolyaska_wheel_01_braked"
visual = dynamics\medical_object\kolyaska_wheel_01_braked.ogf
[wheel_litter_01]:physic_destroyable_object
$spawn = "dynamic_objects\medical_object\wheel_litter_01"
visual = dynamics\medical_object\wheel_litter_01.ogf
[wheel_litter_01_braked]:physic_destroyable_object
$spawn = "dynamic_objects\medical_object\wheel_litter_01_braked"
visual = dynamics\medical_object\wheel_litter_01_braked.ogf
[med_stolik_01]:physic_destroyable_object
$spawn = "dynamic_objects\medical_object\med_stolik_01"
visual = dynamics\medical_object\med_stolik_01.ogf
;*******************************************************************************
;*** firestation ***************************************************************
[fire_vedro]:physic_destroyable_object
$spawn = "dynamic_objects\firestation\fire_vedro"
visual = dynamics\firestation\fire_vedro.ogf
[ognetushitel]:physic_destroyable_object
$spawn = "dynamic_objects\firestation\ognetushitel"
visual = dynamics\firestation\ognetushitel.ogf
;*******************************************************************************
;*** stul **********************************************************************
[stul_wood_01]:physic_destroyable_object
$spawn = "dynamic_objects\stul\stul_wood_01"
visual = dynamics\stul\stul_wood_01.ogf
[child_bench]:physic_destroyable_object
$spawn = "dynamic_objects\stul\child_bench"
visual = dynamics\stul\child_bench.ogf
[stul_child_01]:physic_destroyable_object
$spawn = "dynamic_objects\stul\stul_child_01"
visual = dynamics\stul\stul_child_01.ogf
[stul_school_01]:physic_destroyable_object
$spawn = "dynamic_objects\stul\stul_school_01"
visual = dynamics\stul\stul_school_01.ogf
[stul_school_01_br]:physic_destroyable_object
$spawn = "dynamic_objects\stul\stul_school_01_br"
visual = dynamics\stul\stul_school_01_br.ogf
[taburet_village]:physic_destroyable_object
$spawn = "dynamic_objects\stul\taburet_village"
visual = dynamics\stul\taburet_village.ogf
[taburet_wood_01]:physic_destroyable_object
$spawn = "dynamic_objects\stul\taburet_wood_01"
visual = dynamics\stul\taburet_wood_01.ogf
;*******************************************************************************
;*** museum weapons ************************************************************
[museum_abakan]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_abakan"
visual = dynamics\weapons\wpn_abakan\wpn_abakan.ogf
fixed_bones = wpn_body
[museum_ak74]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_ak74"
visual = dynamics\weapons\wpn_ak74\wpn_ak74.ogf
fixed_bones = wpn_body
[museum_ak74u]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_ak74u"
visual = dynamics\weapons\wpn_ak74u\wpn_ak74u.ogf
fixed_bones = wpn_body
[museum_groza]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_groza"
visual = dynamics\weapons\wpn_groza\wpn_groza.ogf
fixed_bones = wpn_body
[museum_lr300]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_lr300"
visual = dynamics\weapons\wpn_lr300\wpn_lr300.ogf
fixed_bones = wpn_body
[museum_rg6]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_rg6"
visual = dynamics\weapons\wpn_rg6\wpn_rg6.ogf
fixed_bones = wpn_body
[museum_rpg7]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_rpg7"
visual = dynamics\weapons\wpn_rpg7\wpn_rpg7.ogf
fixed_bones = wpn_body
[museum_sig550]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_sig550"
visual = dynamics\weapons\wpn_sig550\wpn_sig550.ogf
fixed_bones = wpn_body
[museum_spas12]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_spas12"
visual = dynamics\weapons\wpn_spas12\wpn_spas12.ogf
fixed_bones = wpn_body
[museum_svd]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_svd"
visual = dynamics\weapons\wpn_svd\wpn_svd.ogf
fixed_bones = wpn_body
[museum_bm16]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_bm16"
visual = dynamics\weapons\wpn_bm16\wpn_bm16.ogf
fixed_bones = wpn_body
[museum_toz34]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_toz34"
visual = dynamics\weapons\wpn_toz34\wpn_toz34.ogf
fixed_bones = wpn_body
[museum_val]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_val"
visual = dynamics\weapons\wpn_val\wpn_val.ogf
fixed_bones = wpn_body
[museum_vintorez]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_vintorez"
visual = dynamics\weapons\wpn_vintorez\wpn_vintorez.ogf
fixed_bones = wpn_body
[museum_winchester1300]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_winchester1300"
visual = dynamics\weapons\wpn_winchester1300\wpn_winchester1300.ogf
fixed_bones = wpn_body
[museum_ammo_545x39_fmj]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_ammo_545x39_fmj"
visual = dynamics\weapons\wpn_ammo\ammo_545x39_fmj.ogf
fixed_bones = link
[museum_ammo_12x70_buck]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_ammo_12x70_buck"
visual = dynamics\weapons\wpn_ammo\ammo_12x70_buck.ogf
fixed_bones = link
[museum_ammo_762x54_7h14]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\museum_ammo_762x54_7h14"
visual = dynamics\weapons\wpn_ammo\ammo_762x54_7h14.ogf
fixed_bones = link
;*******************************************************************************
[balloon_poison_gas]:physic_destroyable_object
$spawn = "dynamic_objects\museum_weapons\balloon_poison_gas"
visual = dynamics\equipments\quest\balloon_poison_gas.ogf
fixed_bones = link
;*********************************************************************************
[ph_sleepbag]:physic_destroyable_object
visual = dynamics\equipments\mattress02.ogf
script_binding = bind_physic_object.init
custom_data = scripts\ph_sleepbag.ltx
;custom_data = models\objects\ignore_static.ltx
;fixed_bones = bone01_(1),bone01_(2),bone01_(3),bone02_(1),bone02_(2),bone02_(3),bone03
[ph_tent]:physic_destroyable_object
visual = dynamics\equipments\item_tent.ogf
script_binding = bind_physic_object.init
custom_data = scripts\ph_tent.ltx
[ph_sleepbag_npc]:physic_destroyable_object
visual = dynamics\equipments\mattress02.ogf
script_binding = bind_physic_object.init
custom_data = models\objects\ignore_static.ltx
fixed_bones = bone01_(1),bone01_(2),bone01_(3),bone02_(1),bone02_(2),bone02_(3),bone03
[artefact_monolit_ghost]:physic_destroyable_object
$spawn = "dynamics\anomaly\artefact_monolit_ghost"
visual = dynamics\anomaly\artefact_monolit_ghost.ogf
story_id = artefact_monolit_ghost
startup_animation = idle
fixed_bones = link
custom_data = models\objects\ignore_static.ltx
;************************************* HOLDER ENTITY OBJECT ****************************
[holder_stul]
$spawn = "holders\holder_stul"
GroupControlSection = spawn_group
cform = skeleton
class = O_HLDR_E
visual = dynamics\stul\stul_school_01.ogf
allow_weapon = true
camera_pos = 0,1.5,0
camera_angle = 0,0,0 ;0 to 3.14 (PI)
exit_pos = 0,0,0
lock_enter = false
lock_exit = false
use_action_hint = st_use_action_sit
;************************************* xcvb cringefires ****************************
[ph_campfiremod]:physic_destroyable_object
visual = dynamics\equipments\campfiremod.ogf
script_binding = bind_physic_object.init
custom_data = scripts\ph_campfiremod.ltx
@@ -0,0 +1,8 @@
[logic]
active = ph_idle@open
[ph_idle@open]
nonscript_usable = true
[collide]
ignore_static
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_itms_campfire_name">
<text>Firewood</text>
</string>
<string id="st_itms_campfire_descr">
<text>Although it is easy to find wood in the Zone, but high-quality firewood suitable for a campfire is a rarity. Despite of being rare it is very cheap, but also heavy. It can become an essential thing for hiking and raids. Helps to keep warm at night and gives the opportunity to cook food.
</text>
</string>
<string id="st_bad_surface">
<text>Surface does not suit.</text>
</string>
<string id="st_gather_wood">
<text>Ñhop wood</text>
</string>
</string_table>
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="windows-1251"?>
<!--
MCM
-->
<string_table>
<string id="ui_mcm_campfire_placeable_title">
<text>Campfires Placeable</text>
</string>
<string id="ui_mcm_menu_campfire_placeable">
<text>Campfires Placeable</text>
</string>
<string id="ui_mcm_campfire_placeable_place_radius">
<text>Fire installation radius</text>
</string>
<string id="ui_mcm_campfire_placeable_place_radius_desc">
<text>The radius of the surface around the player, which should be more or less flat so that it is possible to set a campfire. \n
\n Default: 3.0</text>
</string>
<string id="ui_mcm_campfire_placeable_dot_dist_diff">
<text>Surface control</text>
</string>
<string id="ui_mcm_campfire_placeable_dot_dist_diff_desc">
<text>Difference limit in distance between rays casted to surface, used to figure if surface is flat. Increase slider if you want to be able to place campfires on more uneven surfaces. \n
\n Default: 0.4</text>
</string>
<string id="ui_mcm_campfire_placeable_transition_delete_items">
<text>Delete placed campfires on level change</text>
</string>
<string id="ui_mcm_campfire_placeable_transition_delete_items_desc">
<text>Removes placed campfires on every level transition. \n
\n Default: On</text>
</string>
<string id="ui_mcm_campfire_placeable_delete_items">
<text>DELETE NEW OBJECTS (Addon removal)</text>
</string>
<string id="ui_mcm_campfire_placeable_delete_items_desc">
<text>To prevent save file corruption, this option will delete all new items added by this addon on next load. \n
\n So, if you want to delete addon: \n
\n 1) Enable this option; \n
\n 2) Save, load, save again; \n
\n 3) Quit game and disable addon.</text>
</string>
</string_table>
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_itms_campfire_name">
<text>Дрова</text>
</string>
<string id="st_itms_campfire_descr">
<text>Хотя в Зоне и легко найти древесину, высококачественные дрова, подходящие для костра - большая редкость. Несмотря на свою редкость, они очень дешевые, но так же тяжелые. Может стать незаменимой вещью для походов и рейдов. Помогает согреться ночью и дает возможность приготовить еду.
</text>
</string>
<string id="st_bad_surface">
<text>Поверхность не подходит.</text>
</string>
<string id="st_gather_wood">
<text>Нарубить дров</text>
</string>
</string_table>
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="windows-1251"?>
<!--
MCM
-->
<string_table>
<string id="ui_mcm_campfire_placeable_title">
<text>Размещаемые костры</text>
</string>
<string id="ui_mcm_menu_campfire_placeable">
<text>Размещаемые костры</text>
</string>
<string id="ui_mcm_campfire_placeable_place_radius">
<text>Радиус установки костра</text>
</string>
<string id="ui_mcm_campfire_placeable_place_radius_desc">
<text>Радиус поверхности от игрока, который должен быть более менее ровным, чтобы была возможность установить костер. \n
\n По умолчанию: 3.0</text>
</string>
<string id="ui_mcm_campfire_placeable_dot_dist_diff">
<text>Контроль поверхности</text>
</string>
<string id="ui_mcm_campfire_placeable_dot_dist_diff_desc">
<text>Предел разницы в расстоянии между лучами, направленными на поверхность, используется для определения того, плоская ли поверхность. Увеличьте ползунок, если вы хотите иметь возможность размещать костры на более неровных поверхностях. \n
\n По умолчанию: 0.4</text>
</string>
<string id="ui_mcm_campfire_placeable_transition_delete_items">
<text>Удаление размещенных костров при изменении уровня</text>
</string>
<string id="ui_mcm_campfire_placeable_transition_delete_items_desc">
<text>Удаляет размещенные костры при каждом переходе уровня. \n
\n По умолчанию: Вкл</text>
</string>
<string id="ui_mcm_campfire_placeable_delete_items">
<text>УДАЛЕНИЕ НОВЫХ ОБЪЕКТОВ (удаление аддона)</text>
</string>
<string id="ui_mcm_campfire_placeable_delete_items_desc">
<text>Чтобы предотвратить повреждение файла сохранения, эта опция удалит все новые предметы, добавленные этим аддоном при следующей загрузке. \n
\n Итак, если вы хотите удалить аддон: \n
\n 1) Включите эту опцию; \n
\n 2) Сохранитесь, загрузитесь и сохранитесь снова; \n
\n 3) Выйдите из игры и отключите аддон.</text>
</string>
</string_table>
@@ -0,0 +1,427 @@
local ray_pos = {}
--local se_campfires = {}
local se_anoms = {}
local prev_level = {}
local chop_allowed = true
--[[
local axes = {
["wpn_axe"] = { degr = 0.15, item_to_use = "itm_xcvb_1", hours = 1, minutes = 30},
["wpn_axe2"] = { degr = 0.1, item_to_use = "itm_xcvb_2", hours = 1, minutes = 0},
["wpn_axe3"] = { degr = 0.05, item_to_use = "itm_xcvb_3", hours = 0, minutes = 45},
}
--]]
local axes = {
["wpn_axe"] = { degr = 13, item_to_use = "itm_xcvb_1", minutes = 90},
["wpn_axe2"] = { degr = 9, item_to_use = "itm_xcvb_2", minutes = 61},
["wpn_axe3"] = { degr = 5, item_to_use = "itm_xcvb_3", minutes = 45},
}
function save_state(m_data)
-- m_data.se_campfires = se_campfires
m_data.se_anoms = se_anoms
m_data.prev_level = prev_level
end
function load_state(m_data)
-- se_campfires = m_data.se_campfires or {}
se_anoms = m_data.se_anoms or {}
prev_level = m_data.prev_level or {}
end
function actor_on_first_update()
if campfire_placeable_mcm.get_config("delete_items") then
for i = 1, 65534 do
local se_obj = alife_object(i)
if se_obj and (se_obj:section_name() == "itm_campfire" or se_obj:section_name() == "ph_campfiremod" or se_anoms[se_obj.id]) then
alife_release(se_obj)
end
end
-- se_campfires = {}
se_anoms = {}
end
-- del obj on level change
local curr_level = level.name()
if (is_empty(prev_level)) then
prev_level.level_name = curr_level
printf("tbl is empty || .level_name is now: %s", prev_level.level_name)
elseif (prev_level.level_name) then
printf("tbl is not empty")
if (prev_level.level_name ~= curr_level) and (campfire_placeable_mcm.get_config("transition_delete_items")) then
printf(".level_name is not equal curr_level")
-- del
for i = 1, 65534 do
local se_obj = alife_object(i)
if se_obj and (se_obj:section_name() == "ph_campfiremod" or se_anoms[se_obj.id]) then
alife_release(se_obj)
printf("- Object deleted (id): %s", se_obj.id)
end
end
se_anoms = {}
prev_level.level_name = curr_level
end
end
end
function ray_main(add_pos_x, add_pos_y, add_pos_z, dir)
local pick = ray_pick()
local pos = device().cam_pos
pos.x = pos.x + add_pos_x
pos.y = pos.y + add_pos_y
pos.z = pos.z + add_pos_z
pick:set_position(pos)
pick:set_direction(dir)
pick:set_flags(2)
pick:set_range(200)
pick:query()
local distance = pick:get_distance()
return distance
end
function is_flat_surface()
local radius = campfire_placeable_mcm.get_config("place_radius")
local diff = campfire_placeable_mcm.get_config("dot_dist_diff")
local dir = vector():set(0, -0.5, 0)
ray_pos[1] = ray_main(0, 0, 0, dir)
ray_pos[2] = ray_main(radius, 0, 0, dir)
ray_pos[3] = ray_main(-radius, 0, 0, dir)
ray_pos[4] = ray_main(0, 0, radius, dir)
ray_pos[5] = ray_main(0, 0, -radius, dir)
-- printf("-----------------------------------")
local cnt = 0
for k, v in pairs(ray_pos) do
-- printf("[%s] = %s", k, v)
for i = 1, #ray_pos do
if ray_pos[i] + diff < v or ray_pos[i] - diff > v then
cnt = cnt + 1
end
end
end
-- news_manager.send_tip(db.actor, string.format("surface comparison count: [ %s ]", (cnt)), 0, nil, 1500)
local front = ray_main(0, 0, 0, device().cam_dir) -- dist to obstacle infront
if cnt < 3 and front > 3 then
-- actor_menu.set_msg(1, strformat("Surface around is FLAT"))
return true
end
-- actor_menu.set_msg(1, strformat("Surface is meh"))
return false
end
function prepare_campfire()
local game_minutes = math.random(5, 10)
level.add_pp_effector("fade_nine_sec.ppe", 855121, false)
level.change_game_time(0, 0, game_minutes)
CreateTimeEvent("placing_cf", "placing_cf", 2, place_campfire)
end
function place_campfire()
-- local snd = sound_object("no_sound_yet\\feels_bad")
-- snd:play_no_feedback(db.actor, sound_object.s2d, 0, VEC_ZERO, 1.0, 1.0)
local function apply_force_to_campfire(obj_id)
local game_obj = get_object_by_id(obj_id)
if game_obj then
game_obj:get_physics_shell():apply_force(0, 1, 0)
CreateTimeEvent("spawn_anomaly_cf", "spawn_anomaly_cf", 1, spawn_anomaly_campfire, game_obj)
return true
end
return false
end
local pos = db.actor:position()
local dir = db.actor:direction()
pos = pos:add(dir:mul(2))
local ph_sec = ini_sys:r_string_ex("itm_campfire", "placeable_section")
local se_obj = alife_create(ph_sec or "ph_campfiremod", pos, db.actor:level_vertex_id(), db.actor:game_vertex_id())
-- se_campfires[se_obj.id] = true
CreateTimeEvent("apply_force_to_cf", "apply_force_to_cf", 0.5, apply_force_to_campfire, se_obj.id)
return true
end
function spawn_anomaly_campfire(obj)
local pos = obj:position()
local new_pos = vector():set(pos.x - 0.05, pos.y + 0.15, pos.z + 0.05)
local se_obj = alife_create("campfire", new_pos, obj:level_vertex_id(), obj:game_vertex_id())
se_anoms[se_obj.id] = true
local data = utils_stpk.get_anom_zone_data(se_obj)
if not (data) then return end
data.shapes[1] = {}
data.shapes[1].shtype = 0
data.shapes[1].offset = vector():set(0, 0, 0)
data.shapes[1].center = vector():set(0, 0, 0)
data.shapes[1].radius = 0.85
utils_stpk.set_anom_zone_data(data, se_obj)
return true
end
function actor_on_item_use(obj)
local sec = obj:section()
if (sec == "itm_campfire") then
if not (is_flat_surface()) then
news_manager.send_tip(db.actor, game.translate_string("st_bad_surface"), 0, nil, 1500)
else
alife_release(obj)
prepare_campfire()
hide_hud_inventory()
end
end
end
-------------------------- gather wood xd -------------------------
function allowing_chop()
chop_allowed = true
return true
end
function gather_wood(obj)
chop_allowed = false
CreateTimeEvent("allowing_chop_again", "allowing_chop_again", 7, allowing_chop)
local sec = obj:section()
-- spawn fake item in inv and eat it
local itm_to_spawn = axes[sec].item_to_use
alife_create_item(itm_to_spawn, db.actor)
local function delay_item_use()
local itm_obj
db.actor:iterate_inventory( function(owner, item)
if item:section() == itm_to_spawn then
itm_obj = item
end
end)
db.actor:eat(itm_obj)
return true
end
CreateTimeEvent("eat_xcvb", "eat_xcvb", 0.25, delay_item_use) -- item spawn has small delay apparently ;[
-- degradate axe
local cond = obj:condition()
local degr_for = axes[sec].degr
degr_for = (math.random(degr_for - 2, degr_for + 3)) / 100
printf("%s degraded for: %s %", sec, degr_for * 100)
if cond > degr_for then
obj:set_condition(cond - degr_for)
else
obj:set_condition(0.01)
end
-- change time + fade out + play sound
local minutes = axes[sec].minutes
minutes = math.random(minutes - 15, minutes + 15)
hide_hud_inventory()
level.change_game_time(0, 0, minutes)
printf("Time spent on chopping wood: %s Minutes", minutes)
level.add_pp_effector("fade_nine_sec.ppe", 8551213, false)
-- spawn campfire in inv
alife_create_item("itm_campfire", db.actor)
end
function menu_gather_wood(obj)
local p = obj:parent()
if not (p and p:id() == AC_ID) then return end
return game.translate_string("st_gather_wood")
end
function func_gather_wood(obj)
local p = obj:parent()
if not (p and p:id() == AC_ID) then return end
gather_wood(obj)
end
NameCustom = ui_inventory.UIInventory.Name_Custom
function ui_inventory.UIInventory:Name_Custom(obj, bag, temp, i)
local active_item = db.actor:active_item()
local active_id = active_item and active_item:id()
obj = self:CheckItem(obj,"Name_Custom " .. i)
if i == 9 and axes[obj:section()] and chop_allowed and (not (level_weathers.bLevelUnderground)) then
if obj:condition() >= 0.05 then
return menu_gather_wood(obj)
else
return NameCustom(self, obj, bag, temp, i)
end
else
return NameCustom(self, obj, bag, temp, i)
end
end
ActionCustom = ui_inventory.UIInventory.Action_Custom
function ui_inventory.UIInventory:Action_Custom(obj, bag, temp, i)
local active_item = db.actor:active_item()
local active_id = active_item and active_item:id()
obj = self:CheckItem(obj,"Action_Custom " .. i)
if i == 9 and axes[obj:section()] and chop_allowed and (not (level_weathers.bLevelUnderground)) then
if obj:condition() >= 0.05 then
func_gather_wood(obj)
else
ActionCustom(self, obj, bag, temp, i)
end
else
ActionCustom(self, obj, bag, temp, i)
end
end
-------------------------- trader artiinject -------------------------
local trade_table = {
["bandit"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["dolg"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["ecolog"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["freedom"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["killer"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["army"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["monolith"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["greh"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["stalker"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["csky"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["isg"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
["renegade"] = {
[1] = {
["itm_campfire"] = 3,
},
[2] = {
["itm_campfire"] = 4,
},
},
}
function campfires_stock(npc)
local is_trader = trader_autoinject.get_trader_type(npc) == trader_autoinject.SUPPLIER
if not is_trader then return end
local community = npc:character_community() or "stalker"
local trader_table = trade_table[community] or trade_table["stalker"]
local supply_level = clamp(trader_autoinject.supply_level(npc, true) or 1, 1, 2)
if trader_table[supply_level] then
trader_autoinject.spawn_items(npc, trader_table[supply_level], true)
end
end
TraderAuto = trader_autoinject.update
function trader_autoinject.update(npc)
TraderAuto(npc)
campfires_stock(npc)
end
------------------------------------------------------------
function on_game_start()
RegisterScriptCallback("save_state", save_state)
RegisterScriptCallback("load_state", load_state)
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
RegisterScriptCallback("actor_on_item_use", actor_on_item_use)
end
@@ -0,0 +1,27 @@
-- If you don't use MCM, change your defaults from here.
local defaults = {
["place_radius"] = 3,
["dot_dist_diff"] = 0.4,
["transition_delete_items"] = true,
["delete_items"] = false,
}
function get_config(key)
if ui_mcm then return ui_mcm.get("campfire_placeable/"..key) else return defaults[key] end
end
function on_mcm_load()
op = { id= "campfire_placeable",sh=true ,gr={
{ id= "title",type= "slide",link= "ui_options_slider_player",text="ui_mcm_campfire_placeable_title",size= {512,50},spacing= 20 },
{id= "divider", type = "line" },
{id = "place_radius", type = "track", val = 2, min=0.5,max=5,step=0.25, def = 3},
{id = "dot_dist_diff", type = "track", val = 2, min=0.1,max=5,step=0.05, def = 0.4},
{id = "transition_delete_items", type = "check", val = 1, def = true},
{id= "divider", type = "line" },
{id= "divider", type = "line" },
{id = "delete_items", type = "check", val = 1, def = false},
}
}
return op
end
@@ -0,0 +1,197 @@
--[[
Wrapper class to let you autoinject things via monkey patch to all traders, respecting the restock time.
How to use: Monkey patch the update function here in your script.
ex:
TraderAuto = trader_autoinject.update
function trader_autoinject.update(npc)
TraderAuto(npc)
add_custom_crap(npc) -- you define this function ok
end
Some functions provided below for convenience.
Note: If you want to iterate NPC inventory to check for items, fire a time event to allow the items to register on new game.
--]] --
find = string.find
local function t2c(t)
if not t then return nil end
local ct = game.CTime()
ct:set(t.Y,t.M,t.D,t.h,t.m,t.s,t.ms)
return ct
end
local function c2t(ct)
if not ct then return nil end
-- printf('%s, %s',ct,type(ct))
local Y, M, D, h, m, s, ms = 0, 0, 0, 0, 0, 0, 0
Y, M, D, h, m, s, ms = ct:get(Y, M, D, h, m, s, ms)
return { Y=Y, M=M, D=D, h=h, m=m, s=s, ms=ms }
end
TraderUpdate = trade_manager.update
function trade_manager.update(npc, force_refresh)
local id = npc:id()
if not npc:alive() then
return default
end
local reup_time = trade_manager.get_trade_profile(id, "resupply_time")
TraderUpdate(npc, force_refresh)
local restock_time = game_difficulties.get_eco_factor("restock") or 24
if force_refresh then restock_time = 0 end
if reup_time and game.get_game_time():diffSec(t2c(reup_time)) < (restock_time * 3600) then
-- print_dbg("Not time to resupply yet!")
return
end
disable_info("sleep_active")
CreateTimeEvent("custom_update"..npc:id(), "custom_resupply"..npc:id(), 0.1, timed_update, npc)
end
function timed_update(npc)
update(npc)
return true
end
-- monkeypatch me
function update(npc)
end
-- util functions to help with monkey patching
function get_faction_goodwill(faction)
end
COMPANION = 0 -- companions got special trade logic, this is just to catch errors
MECHANIC = 1 -- mechanics/techs
BARMAN = 2 -- exclusive food suppliers like Spirit
MEDIC = 3 -- medics
SUPPLIER = 4 -- everyone else that sells crap
-- return trader type as int, or nil if error
function get_trader_type(npc)
local st = db.storage[npc:id()]
if not st then return -1 end
local trader = false
if npc:character_community() == "trader" or npc:clsid() == clsid.script_trader or npc:clsid() == clsid.trader then
trader = true
end
if find(npc:section(),"trader") then
trader = true
end
local cini = st.ini
local logic = st.section_logic
if not logic and not trader then return -1 end
local trade_logic = cini and cini:r_string_ex(logic, "trade")
if not trade_logic then return -1 end
if find(trade_logic, "companion") then
return COMPANION
elseif find(trade_logic, "trade_generic_mechanic") then
return MECHANIC
elseif find(trade_logic, "trade_generic_barman") then
return BARMAN
elseif find(trade_logic, "trade_generic_medic") then
return MEDIC
else
return SUPPLIER
end
end
-- return supply level of npc, like suppy_1, supply_2, etc
-- as_number removes the supply_ prefix and only returns as int
function supply_level(npc, as_number)
local profile = trade_manager.get_trade_profile(npc:id(), "cfg_ltx")
-- printf("Profile is %s", profile)
local config = trade_manager.get_trade_cfg(profile)
if not config then return end
local str = config:r_string_ex("trader", "buy_supplies")
if not (str) then
return -- no buy_supplies this is normal
end
local condlist = xr_logic.parse_condlist(npc, "trader", "buy_supplies", str)
str = condlist and xr_logic.pick_section_from_condlist(db.actor, npc, condlist)
if as_number then
local num = str_explode(str, "_")
return tonumber(num[2])
else
return str
end
end
-- collapse several tables into one table, the way sections work in ltx files
-- tables should be in section -> amount format
-- precedence goes up to last table, meaning whatever is in the last table will be the last changes applied
function merge_tables(tables)
local final_table = {}
if #tables > 0 then
copy_table(final_table, tables[1])
if #tables > 1 then
for i=2, #tables do
for k,v in pairs(tables[i]) do
final_table[k] = v
end
end
end
end
return final_table
end
local furniture = {
["esc_m_trader"] = true,
["red_m_lesnik"] = true
}
local blacklisted_comms = {
["trader"] = true,
["monster"] = true
}
-- used to get the real community of the NPC by checking spawn id
-- author: HarukaSai
function get_real_community(npc, default)
if furniture[npc:name()] then
return "stalker"
end
local community = character_community(npc)
if not blacklisted_comms[community] then
return community
end
local squad_community = get_object_squad(npc):get_squad_community()
if not blacklisted_comms[squad_community] then
return squad_community
else
return default
end
end
-- to_spawn should be table of sections to amount
-- if check_existing is true, only spawns up to that amount in trader inventory. else arbitrarily spawns
function spawn_items(npc, to_spawn, check_existing)
local npc_name = npc:name()
local alive_or_furniture = xr_conditions.is_alive(db.actor, npc) or furniture[npc_name]
if not alive_or_furniture then return end
local supply_table = {}
copy_table(supply_table, to_spawn)
if check_existing then
local function itr_inv(temp, item)
if supply_table[item:section()] and supply_table[item:section()] > 0 then
-- printf("Found 1 of %s", item:section())
supply_table[item:section()] = supply_table[item:section()] - 1
end
end
npc:iterate_inventory(itr_inv)
end
for k,v in pairs(supply_table) do
-- printf("Creating %s of %s", v, k)
for i=1, v do
-- printf("Created %s", k)
alife_create_item(k, npc)
end
end
end
+28
View File
@@ -0,0 +1,28 @@
[General]
gameName=stalkeranomaly
modid=0
version=d2024.4.4.0
newestVersion=
category="-1,"
nexusFileStatus=1
installationFile=Campfires_placeable_0.22.zip
repository=Nexus
ignoredVersion=
comments=
notes=
nexusDescription=
url=
hasCustomURL=true
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-04-05T02:49:55Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
tracked=0
[installedFiles]
1\modid=0
1\fileid=0
size=1