Divergent/mods/Glowsticks Reanimated/gamedata/scripts/zz_glowstick_mcm.script

1050 lines
30 KiB
Plaintext

----------------------------------------------------------------------------------------------------
-- Glowstick Script made by Lucy c:
----------------------------------------------------------------------------------------------------
local despawn_time = 120 -- Time (in seconds) to despawn a glowstick after it stopped emitting light
local enable_bs_mm_flicker = false -- Will be overwritten by MCM setting if MCM is installed
local throw_force = 8000 -- Will be overwritten by MCM setting if MCM is installed
local throw_key = key_bindings.kUSE -- Will be overwritten by MCM setting if MCM is installed
local glowstick_stash_chance = 0.1 -- Will be overwritten by MCM setting if MCM is installed
local glowstick_loot_chance = 1 -- Will be overwritten by MCM setting if MCM is installed
--liz
local sort_worst = false
local mcm_equip_next = false
local mcm_keybind = bind_to_dik(key_bindings.kUSE)
local mcm_mode = 2
local mcm_modifier = 0
local enable_take = false
local enable_animations = false
----------------------------------------------------------------------------------------------------
local glowsticks = {}
local press_begin = 0
local last_det_state = 0
local next_gs_upd = 0
local throw_time_after = 0
local active_gs_drain = 0
local mcm_keybinds = ui_mcm and ui_mcm.key_hold --liz
function actor_on_hud_animation_end(item, section, motion, state, slot)
if (string.find(section, "glowstick")) then
if (motion == "anm_throw_stick") then
local function hide_anm(sec)
game.play_hud_motion(1, "device_glowstick_hud_base", "anm_throw_hide", true, 2)
equip_next(sec)
return true
end
CreateTimeEvent("glowstick","hide_anm",0.007,hide_anm,item:section())
alife_release_id(item:id())
return
end
-- if (state == 1) then
-- -- local speed = ((motion == "anm_show_fast" or "anm_zoom_show_fast") and 2 or 1)
-- -- item:play_hud_motion(string.find(motion, "zoom") and "anm_zoom_show_real" or "anm_show_real", false, 0, 1, 0)
-- local m_motion = string.find(motion, "zoom") and "anm_zoom_show_real" or "anm_show_real"
-- game.play_hud_motion(1, "device_glowstick_hud", m_motion, false, 1) --liz. item:play_hud_motion didn't worked for some reason
-- end
end
end
function actor_on_update()
local actor = db.actor
local det = actor:active_detector()
if (det) then
if (time_global() > next_gs_upd) then
if (string.find(det:section(), "glowstick")) then
if (det:condition() > 0.01) then
local new_c = clamp(det:condition() - active_gs_drain, 0.01, 0.9999)
det:set_condition(new_c)
end
end
next_gs_upd = time_global() + 1000
end
if (det:get_state() ~= last_det_state) then
last_det_state = det:get_state()
active_gs_drain = ini_sys:r_float_ex(det:section(), "power_drain", 0.001)
-- -- Makes the glowstick light up before the draw animation ended
-- if (string.find(det:section(), "glowstick")) then
-- if (det:get_state() == 1 and axr_main.weapon_is_zoomed) then
-- det:switch_state(0)
-- -- det:play_hud_motion("anm_zoom_show_real", false, 0, 1, 0)
-- game.play_hud_motion(1, "device_glowstick_hud", "anm_zoom_show_real", false, 1) --liz. item:play_hud_motion didn't worked for some reason
-- end
-- -- Ugly fix for the broken flashlight draw animation
-- elseif (string.find(det:section(), "flashlight")) then
--liz. not sure exactly what it fixes, but I'll leave it here
if (string.find(det:section(), "flashlight")) then
if (det:get_state() == 1 and not axr_main.weapon_is_zoomed) then
local prev_con = det:condition()
det:set_condition(0.001)
det:switch_state(0)
local tm = det:play_hud_motion("anm_show", false, 1, 1, 0) / 1000
local function flashlight_fix(id,con_d)
local obj = level.object_by_id(id)
if (obj) then
obj:set_condition(con_d)
end
return true
end
CreateTimeEvent("glowstick","flashlight_fix",clamp(tm-0.5,0.1,999),flashlight_fix,det:id(),prev_con)
end
end
end
if (press_begin ~= 0) then
local shift_pressed = (key_state(DIK_keys.DIK_LSHIFT) == 1) or (key_state(DIK_keys.DIK_RSHIFT) == 1)
if (det:get_state() ~= 0 or shift_pressed or not is_empty(_GUIs) or not game.hud_motion_allowed() or game.only_movekeys_allowed() or not string.find(det:section(), "glowstick")) then
press_begin = 0
return
end
if (time_global() > press_begin + 250) then
local rand = math.random(1,4)
local tm = det:play_hud_motion("anm_throw_stick", true, 0, 1, 0) / 1000
level.add_cam_effector("camera_effects\\switch\\strong"..rand..".anm", 13370, false, '')
game.play_hud_anm("script\\gasmask.anm", 0, 0.6, 0.35, false)
game.only_allow_movekeys(true)
press_begin = 0
CreateTimeEvent("glowstick","drop",tm-0.2,spawn_glowstick,det:id(),true)
return
end
end
end
end
function spawn_glowstick(id, throw)
if (not id or not alife_object(id)) then return true end
local itm = level.object_by_id(id)
if (not itm or (not throw and itm:parent())) then return true end
local actor = db.actor
local section = itm:section()
local pos = actor:bone_position(throw and "eye_left" or "bip01_l_hand")
pos.y = pos.y + 0.1
local obj = alife_create("lights_glowstick", pos, actor:level_vertex_id(), actor:game_vertex_id())
if (not obj) then
printf("!Couldn't spawn Glowstick!")
return true
end
local data = utils_stpk.get_lamp_data(obj)
if (not data) then
printf("!Couldn't get Glowstick data!")
return true
end
local angle = device().cam_dir
angle.x = angle.x + math.random(-5,5)
angle.y = angle.y + math.random(-5,5)
angle.z = angle.z + math.random(-5,5)
obj.angle = angle
local con_d = itm:condition()
if (not throw) then
alife_release_id(itm:id())
end
local light_section = ini_sys:r_string_ex(section, "light_section", "glowstick_definition")
local hud_section = ini_sys:r_string_ex(section, "hud", "device_glowstick_hud")
data.visual_name = ini_sys:r_string_ex(section, "visual", "dynamics\\devices\\dev_glowstick\\dev_glowstick_glow")
data.light_flags = 47 -- Change to 47 for shadows
-- Volumetric light
if (ini_sys:r_bool_ex(light_section, "volumetric", false)) then
data.light_flags = data.light_flags + 64
data.volumetric_quality = ini_sys:r_float_ex(light_section, "volumetric_quality", 0.5)
data.volumetric_intensity = ini_sys:r_float_ex(light_section, "volumetric_intensity", 0.5)
data.volumetric_distance = ini_sys:r_float_ex(light_section, "volumetric_distance", 0.5)
end
-- Color
local color_s = ini_sys:r_string_ex(light_section, "color_r2", "0.0,0.4,0.3,0.8")
local _s = str_explode(color_s,",")
for i=1,#_s do
_s[i] = clamp(round(tonumber(_s[i]) * 255), 0, 255)
end
local function lshift(x, by)
return x * 2 ^ by
end
data.main_color = lshift(bit_and(_s[4],0xff), 24) + lshift(bit_and(_s[1],0xff), 16) + lshift(bit_and(_s[2],0xff), 8) + bit_and(_s[3],0xff)
data.main_brightness = con_d <= 0.01 and 0 or (_s[1]/255 + _s[2]/255 + _s[3]/255) / 3 + 1
data.main_color_animator = ini_sys:r_string_ex(light_section, "color_animator", "empty")
data.main_bone = ini_sys:r_string_ex(hud_section, "fire_bone", "light_bone_2")
data.main_range = ini_sys:r_float_ex(light_section, "range_r2", 15)
glowsticks[obj.id] = {section, con_d}
utils_stpk.set_lamp_data(data, obj)
local function applyForce(id,throw)
local gl = level.object_by_id(id)
if (not gl) then return false end
local dir = device().cam_dir
dir:mul(throw and throw_force or 100)
gl:get_physics_shell():apply_force(dir.x, dir.y, dir.z)
return true
end
CreateTimeEvent("glowstick","throw",0,applyForce,obj.id,throw)
return true
end
function actor_on_item_drop(itm)
if (not itm or not alife_object(itm:id())) then return end
if (not string.find(itm:section(),"glowstick")) then return end
CreateTimeEvent("glowstick","drop",0.01,spawn_glowstick,itm:id(),false)
end
function actor_on_first_update()
for n,p in pairs(glowsticks) do
if glowsticks[n][2] <= 0.01 then
if (alife_object(n)) then
alife_release_id(n)
end
glowsticks[n] = nil
end
end
throw_time_after = game.get_motion_length("device_glowstick_hud_base", "anm_throw_hide", 2.5) / 1000
if (ui_mcm) then
enable_bs_mm_flicker = ui_mcm.get("glowsticks/enable_bs_mm_flicker")
throw_force = ui_mcm.get("glowsticks/throw_force") * 1000
throw_key = tonumber(ui_mcm.get("glowsticks/throw_key"))
glowstick_stash_chance = ui_mcm.get("glowsticks/stash_chance")
glowstick_loot_chance = ui_mcm.get("glowsticks/loot_chance")
sort_worst = ui_mcm.get("glowsticks/sort_worst") -- liz
mcm_equip_next = ui_mcm.get("glowsticks/equip_next") -- liz
mcm_keybind = ui_mcm.get("glowsticks/keybind") -- liz
mcm_mode = ui_mcm.get("glowsticks/mode") -- liz
mcm_modifier = ui_mcm.get("glowsticks/modifier") -- liz
enable_take = ui_mcm.get("EA_settings/take_item_anim") -- liz
enable_animations = ui_mcm and ui_mcm.get("EA_settings/enable_animations") or ui_options.get("video/player/animations") -- liz
end
end
function equip_next(section)
if not mcm_equip_next then
game.only_allow_movekeys(false)
return true
end
local actor = db.actor
local next = actor:object(section)
local function activate_detector()
game.only_allow_movekeys(false)
db.actor:show_detector()
return true
end
if (next) then
actor:move_to_slot(next,9)
else
-- local function search(temp, item)
-- if (item and string.find(item:section(), "glowstick") and ini_sys:r_string_ex(item:section(), "class", nil) == "D_FLALIT") then
-- actor:move_to_slot(item,9)
-- return true
-- end
-- end
-- actor:iterate_ruck(search)
local glowsticks_in_ruck = {}
--find all glowsticks and their condition
actor:iterate_ruck(function (temp, obj)
local sec = obj and obj:section()
if string.find(sec, "glowstick") and ini_sys:r_string_ex(sec, "class", nil) == "D_FLALIT" then
glowsticks_in_ruck[#glowsticks_in_ruck+1] = {
["object"] = obj,
["weight"] = obj:condition()
}
end
end)
--if we have something, sort them from worst condition to best condition and pick first in list
if not is_empty(glowsticks_in_ruck) then
if sort_worst then
table.sort(glowsticks_in_ruck, function (a, b) return a.weight < b.weight end)
else
table.sort(glowsticks_in_ruck, function (a, b) return a.weight > b.weight end)
end
actor:move_to_slot(glowsticks_in_ruck[1].object, 9)
end
end
CreateTimeEvent("glowstick","draw_next",throw_time_after+0.3,activate_detector)
return true
end
--liz. doesn't used?
function _draw_detector()
db.actor:show_detector()
return true
end
function try_draw_on_take(id)
local actor = db.actor
if (actor:item_in_slot(9)) then return true end
if (not actor:object_id(id)) then return true end
actor:move_to_slot(actor:object_id(id),9)
local itm = actor:active_item()
if (itm) then
local slot = ini_sys:r_s32(itm:section(), "slot")
if (slot ~= 0 and slot ~= 1 and slot ~= 5) then return true end
end
local function __draw_detector()
db.actor:show_detector()
return true
end
CreateTimeEvent("glowstick","draw_next",0.1,__draw_detector)
return true
end
--liz
function start_glowstick_throw()
--liz. some vanilla safety checks. Maybe I should refactor this stuff somehow
local actor = db.actor
local det = actor:active_detector()
if not det then return end
local shift_pressed = (key_state(DIK_keys.DIK_LSHIFT) == 1) or (key_state(DIK_keys.DIK_RSHIFT) == 1)
if det:get_state() ~= 0 then return end
if shift_pressed then return end
if not is_empty(_GUIs) then return end
if not game.hud_motion_allowed() then return end
if game.only_movekeys_allowed() then return end
if not string.find(det:section(), "glowstick") then return end
local rand = math.random(1,4)
local tm = det:play_hud_motion("anm_throw_stick", true, 0, 1, 0) / 1000
level.add_cam_effector("camera_effects\\switch\\strong"..rand..".anm", 13370, false, '')
game.play_hud_anm("script\\gasmask.anm", 0, 0.6, 0.35, false)
game.only_allow_movekeys(true)
-- press_begin = 0
CreateTimeEvent("glowstick","drop",tm-0.2,spawn_glowstick,det:id(),true)
end
function on_key_hold(key)
if mcm_keybinds and (key == mcm_keybind) and (mcm_mode == 2) and ui_mcm.get_mod_key(mcm_modifier) and ui_mcm.key_hold("liz_glowstick", key) then
start_glowstick_throw()
end
end
function on_key_press(key)
--liz mcm keybind
if key == mcm_keybind then
if (mcm_mode == 0) and ui_mcm.get_mod_key(mcm_modifier) then
ui_mcm.simple_press("liz_glowstick", key, start_glowstick_throw)
end
if (mcm_mode == 1) and ui_mcm.get_mod_key(mcm_modifier) and ui_mcm.double_tap("liz_glowstick", key) then
start_glowstick_throw()
return
end
end
local bind = dik_to_bind(key)
if not mcm_keybinds and (bind == throw_key) then
press_begin = time_global()
end
--liz. handles pickup
if (bind == key_bindings.kUSE) then
if anim_plays then return end --if already playing pickup animation don't do anyting
if enhanced_animations and enhanced_animations.used_item then return end --if fdda anim plays don't do anything
if headgear_animations and not headgear_animations.enable_animations then return end --if headgear animatins animation play don't do anything
if not is_empty(_GUIs) then return end --if in backpack or other interface don't do anything
if not game.hud_motion_allowed() then return end --?
if game.only_movekeys_allowed() then return end --if can only move don't do anything
local function iter(obj)
if (obj and obj:section() == "lights_glowstick") then
local pos2d = game.world2ui(obj:position())
if (pos2d.x < 350 or pos2d.x > 750 or pos2d.y < 250 or pos2d.y > 500) then return false end
if (not glowsticks[obj:id()]) then return false end
if (not obj:get_hanging_lamp():is_on()) then return false end
--liz. add check for pickup animation enable option in mcm
if (not take_item_anim) or (not enable_take) or (not enable_animations) then
local section = glowsticks[obj:id()][1] or "device_glowstick"
local con_d = glowsticks[obj:id()][2]
local newid = alife_create_item(section, db.actor, {cond = con_d}).id
glowsticks[obj:id()] = nil
alife_release_id(obj:id())
CreateTimeEvent("glowstick","try_draw_on_take",0.1,try_draw_on_take,newid)
else
play_pickup_animation(function ()
local section = glowsticks[obj:id()][1] or "device_glowstick"
local con_d = glowsticks[obj:id()][2]
local newid = alife_create_item(section, db.actor, { cond = con_d }).id
glowsticks[obj:id()] = nil
alife_release_id(obj:id())
CreateTimeEvent("glowstick", "try_draw_on_take", 0.78, try_draw_on_take, newid)
end)
end
-- Compatibility with FeelFried's pickup animation :3
-- if (take_item_anim and take_item_anim.actor_on_item_take) then
-- local actor = db.actor
-- if (not actor:item_in_slot(9)) then
-- local itm = actor:active_item()
-- if (itm) then
-- local slot = ini_sys:r_s32(itm:section(), "slot")
-- if (slot == 0 or slot == 1 or slot == 5) then return true end -- Don't play item take animation if we're going to draw the next glowstick
-- end
-- end
-- take_item_anim.actor_on_item_take(obj)
-- end
return true
end
end
level.iterate_nearest(db.actor:position(), 2, iter)
end
end
--liz. item pickup aniamtion. All other metods didn't worked so we use neclear solutions
local anim_plays = nil
function play_pickup_animation(callback)
game.play_hud_motion(db.actor:active_slot() == 0 and 2 or 1, "item_ea_take_hud", "anm_ea_take", true, 1.4)
game.play_hud_anm("camera_effects\\weapon\\two_handed_weapon_effect.anm", 0, 1.4, 1, false)
CreateTimeEvent("glowstick", "take_delay", 0.65, function ()
callback()
return true
end)
CreateTimeEvent("glowstick", "anim_delay", 1.33, function ()
anim_plays = nil
return true
end)
anim_plays = true
end
function on_key_release(key)
if mcm_keybinds then return end --liz. fallback to default code if we don't have mcm
local bind = dik_to_bind(key)
if (bind == throw_key) then
press_begin = 0
end
end
function save_state(MDATA)
MDATA.glowsticks = glowsticks
end
function load_state(MDATA)
glowsticks = MDATA.glowsticks or {}
end
RegisterScriptCallback("actor_on_hud_animation_end", actor_on_hud_animation_end)
RegisterScriptCallback("actor_on_item_drop", actor_on_item_drop)
RegisterScriptCallback("actor_on_update", actor_on_update)
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
RegisterScriptCallback("on_key_press", on_key_press)
RegisterScriptCallback("on_key_hold", on_key_hold) -- liz
RegisterScriptCallback("on_key_release", on_key_release)
RegisterScriptCallback("save_state", save_state)
RegisterScriptCallback("load_state", load_state)
----------------------------------------------------------------------------------------------------
-- Glowstick binder
----------------------------------------------------------------------------------------------------
function init(obj)
obj:bind_object(glowstick_binder(obj))
end
----------------------------------------------------------------------------------------------------
class "glowstick_binder" (object_binder)
function glowstick_binder:__init(obj) super(obj)
self.first_update = true
self.next_update = time_global()
end
function glowstick_binder:update(delta)
if (self.first_update) then
local con_d = glowsticks[self.object:id()] and glowsticks[self.object:id()][2] or 0.01
if (con_d > 0.01) then
self.object:get_hanging_lamp():turn_on()
self.object:set_tip_text("inventory_item_use")
end
self.power_drain = ini_sys:r_float_ex(glowsticks[self.object:id()] and glowsticks[self.object:id()][1] or "device_glowstick", "power_drain", 0.001)
self.first_update = nil
end
if (time_global() > self.next_update ) then
if (not glowsticks[self.object:id()]) then return end
local con_d = glowsticks[self.object:id()][2]
if (con_d > 0.01) then
local new_c = clamp(con_d - self.power_drain, 0.01, 0.9999)
glowsticks[self.object:id()][2] = new_c
if (not self.object:get_hanging_lamp():is_on()) then
self.object:set_tip_text_default()
self.next_update = time_global() + 1000 * despawn_time
con_d = 0.01
return
end
elseif (self.object:get_hanging_lamp():is_on()) then
self.object:get_hanging_lamp():turn_off()
self.object:set_tip_text_default()
self.next_update = time_global() + 1000 * despawn_time
return
else
glowsticks[self.object:id()] = nil
alife_release_id(self.object:id())
end
self.next_update = time_global() + 1000
end
end
function glowstick_binder:net_destroy()
glowsticks[self.object:id()] = nil
end
----------------------------------------------------------------------------------------------------
function glowstick_binder:net_save_relevant()
return true
end
function glowstick_binder:save(packet)
end
function glowstick_binder:load(reader)
end
function glowstick_binder:reload(section)
end
function glowstick_binder:reinit()
end
function glowstick_binder:net_spawn(data)
end
----------------------------------------------------------------------------------------------------
-- Mod Configuration Menu
----------------------------------------------------------------------------------------------------
function on_mcm_load()
options =
{
id = "glowsticks", sh = true ,gr=
{
{ id = "title", type = "slide", link = "Glowstick_Banner.dds", size = {706,50}, spacing = 20 },
{ id = "enable_bs_mm_flicker", type = "check", val = 1, def = false },
{ id = "throw_force", type="track", val=2, min=5, max=20, step=1, def=8 },
{ id = "stash_chance", type="track", val=2, min=0.01, max=0.5, step=0.01, def=0.1 },
{ id = "loot_chance", type="track", val=2, min=0.1, max=2, step=0.1, def=1 },
{
id = "throw_key",
type="list",
val=0,
no_str = true ,
def="kb_use",
content = { {tostring(key_bindings.kUSE),"kb_use"}, {tostring(key_bindings.kWPN_FUNC),"kb_func"}, },
precondition = { function() return not (ui_mcm and ui_mcm.key_hold) end },
},
{
id = "keybind",
type = "key_bind",
val = 2,
def = mcm_keybind,
precondition = { function() return (ui_mcm and ui_mcm.key_hold) end }
},
{
id = "mode",
type = ui_mcm.kb_mod_radio,
val = 2,
def = 2,
hint = "mcm_kb_mode",
content = { { 0, "mcm_kb_mode_press" }, { 1, "mcm_kb_mode_dtap" }, { 2, "mcm_kb_mode_hold" } },
precondition = { function() return (ui_mcm and ui_mcm.key_hold) end }
},
{
id = "modifier",
type = ui_mcm.kb_mod_radio,
val = 2,
def = 0,
hint = "mcm_kb_modifier",
content = { { 0, "mcm_kb_mod_none" }, { 1, "mcm_kb_mod_shift" }, { 3, "mcm_kb_mod_alt" } },
precondition = { function() return (ui_mcm and ui_mcm.key_hold) end }
},
{
id = "desc_mcm",
type = "desc",
text = "ui_mcm_liz_rd_update_mcm",
clr = { 255, 175, 0, 0 },
precondition = { function () return not (ui_mcm and ui_mcm.key_hold) end }
},
{ id = "divider", type = "line" },
{ id = "equip_next", type = "check", val = 1, def = false }, --liz
{ id = "sort_worst", type = "check", val = 1, def = false }, --liz
{ id = "divider", type = "line" },
}
}
return options
end
function on_option_change()
if (ui_mcm) then
enable_bs_mm_flicker = ui_mcm.get("glowsticks/enable_bs_mm_flicker")
throw_force = ui_mcm.get("glowsticks/throw_force") * 1000
throw_key = tonumber(ui_mcm.get("glowsticks/throw_key"))
glowstick_stash_chance = ui_mcm.get("glowsticks/stash_chance")
glowstick_loot_chance = ui_mcm.get("glowsticks/loot_chance")
sort_worst = ui_mcm.get("glowsticks/sort_worst") -- liz
mcm_equip_next = ui_mcm.get("glowsticks/equip_next") -- liz
mcm_keybind = ui_mcm.get("glowsticks/keybind") -- liz
mcm_mode = ui_mcm.get("glowsticks/mode") -- liz
mcm_modifier = ui_mcm.get("glowsticks/modifier") -- liz
enable_take = ui_mcm.get("EA_settings/take_item_anim") -- liz
enable_animations = ui_mcm and ui_mcm.get("EA_settings/enable_animations") or ui_options.get("video/player/animations") -- liz
end
end
RegisterScriptCallback("on_option_change",on_option_change)
----------------------------------------------------------------------------------------------------
-- Miracle Machine + Brain Scorcher lights flicker (optional)
----------------------------------------------------------------------------------------------------
base_get_light_flicker = level_environment.get_light_flicker()
function level_environment.get_light_flicker()
if (enable_bs_mm_flicker) then
local levelname = level.present() and level.name() or nil
-- Miracle Machine
if (levelname == "l08u_brainlab" and not has_alife_info("yan_labx16_switcher_primary_off")) then
return true
-- Brain Scorcher
elseif (levelname == "l10u_bunker" and not has_alife_info("bar_deactivate_radar_done")) then
return true
end
end
return base_get_light_flicker
end
----------------------------------------------------------------------------------------------------
-- Trader Autoinject (thx arty <3) + Dead Body Loot + New Game Loadouts + Stashes
----------------------------------------------------------------------------------------------------
local trade_table = {
["bandit"] = {
[1] = {
["device_glowstick_orange"] = 1
},
[2] = {
["device_glowstick_orange"] = 2,
["device_glowstick_red"] = 1
},
[3] = {
["device_glowstick_orange"] = 3,
["device_glowstick_red"] = 2
},
},
["dolg"] = {
[1] = {
["device_glowstick_red"] = 1
},
[2] = {
["device_glowstick_red"] = 2
},
[3] = {
["device_glowstick_red"] = 3
},
},
["ecolog"] = {
[1] = {
["device_glowstick_orange"] = 1,
["device_glowstick_blue"] = 1
},
[2] = {
["device_glowstick_orange"] = 2,
["device_glowstick_blue"] = 2
},
[3] = {
["device_glowstick_orange"] = 3,
["device_glowstick_blue"] = 3
},
},
["freedom"] = {
[1] = {
["device_glowstick"] = 1
},
[2] = {
["device_glowstick"] = 2
},
[3] = {
["device_glowstick_orange"] = 2,
["device_glowstick"] = 3
},
},
["killer"] = {
[1] = {
["device_glowstick_blue"] = 1
},
[2] = {
["device_glowstick_blue"] = 2
},
[3] = {
["device_glowstick_blue"] = 3
},
},
["army"] = {
[1] = {
["device_glowstick_red"] = 1
},
[2] = {
["device_glowstick_red"] = 2
},
[3] = {
["device_glowstick_red"] = 3
},
},
["monolith"] = {
[1] = {
["device_glowstick_blue"] = 1
},
[2] = {
["device_glowstick_blue"] = 2
},
[3] = {
["device_glowstick_blue"] = 3
},
},
["greh"] = {
[1] = {
["device_glowstick_orange"] = 1
},
[2] = {
["device_glowstick_orange"] = 2,
["device_glowstick_red"] = 1
},
[3] = {
["device_glowstick_orange"] = 3,
["device_glowstick_red"] = 2
},
},
["stalker"] = {
[1] = {
["device_glowstick"] = 1
},
[2] = {
["device_glowstick"] = 2
},
[3] = {
["device_glowstick"] = 3
},
},
["csky"] = {
[1] = {
["device_glowstick_blue"] = 1
},
[2] = {
["device_glowstick_blue"] = 2
},
[3] = {
["device_glowstick_blue"] = 3
},
},
["isg"] = {
[1] = {
["device_glowstick"] = 1
},
[2] = {
["device_glowstick"] = 2,
},
[3] = {
["device_glowstick"] = 3,
},
},
["renegade"] = {
[1] = {
["device_glowstick_orange"] = 1
},
[2] = {
["device_glowstick_orange"] = 2,
["device_glowstick_red"] = 1
},
[3] = {
["device_glowstick_orange"] = 3,
["device_glowstick_red"] = 2
},
},
}
-- Trader stuff
function spawn_glowosticks(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, 3)
if trader_table[supply_level] then
trader_autoinject.spawn_items(npc, trader_table[supply_level], true)
end
end
local loot_table = {
["bandit"] = {
[1] = "device_glowstick_orange",
[2] = "device_glowstick",
},
["dolg"] = {
[1] = "device_glowstick_red",
},
["ecolog"] = {
[1] = "device_glowstick_orange",
[2] = "device_glowstick",
[3] = "device_glowstick_red",
},
["freedom"] = {
[1] = "device_glowstick",
},
["killer"] = {
[1] = "device_glowstick_blue",
[2] = "device_glowstick_orange",
[3] = "device_glowstick",
},
["army"] = {
[1] = "device_glowstick_red",
[2] = "device_glowstick_orange",
[3] = "device_glowstick_blue",
},
["monolith"] = {
[1] = "device_glowstick_blue",
},
["greh"] = {
[1] = "device_glowstick_orange",
},
["stalker"] = {
[1] = "device_glowstick_blue",
[2] = "device_glowstick_orange",
[3] = "device_glowstick_red",
[4] = "device_glowstick",
},
["zombied"] = {
[1] = "device_glowstick_orange",
[2] = "device_glowstick_blue",
[3] = "device_glowstick_red",
[4] = "device_glowstick",
},
["csky"] = {
[1] = "device_glowstick_blue",
[2] = "device_glowstick_orange",
[3] = "device_glowstick_red",
[4] = "device_glowstick",
},
["isg"] = {
[1] = "device_glowstick",
},
["renegade"] = {
[1] = "device_glowstick_orange",
[2] = "device_glowstick_red",
},
}
local rank_table = {
["novice"] = 0.05,
["trainee"] = 0.1,
["experienced"] = 0.15,
["professional"] = 0.2,
["veteran"] = 0.15,
["expert"] = 0.15,
["master"] = 0.1,
["legend"] = 0.1,
}
local sections_table = {
[1] = "device_glowstick",
[2] = "device_glowstick_red",
[3] = "device_glowstick_blue",
[4] = "device_glowstick_orange",
}
-- Dead body loot stuff
function spawn_glowostick(npc, npc_rank, npc_comm)
local spawnchance = math.random()
local rank = npc_rank or "novice"
local comm = npc_comm or "stalker"
local rank_chance = rank_table[rank] or rank_table["novice"]
if (spawnchance < rank_chance * glowstick_loot_chance) then
local looting_table = loot_table[comm] or loot_table["stalker"]
local sec_to_spawn = looting_table[math.random(1,#looting_table)] or "device_glowstick"
death_manager.spawn_with_condition(npc, sec_to_spawn, math.random(20,80)/100)
end
end
TraderAuto = trader_autoinject.update
function trader_autoinject.update(npc)
TraderAuto(npc)
spawn_glowosticks(npc)
end
SpawnCosmetics = death_manager.spawn_cosmetics
function death_manager.spawn_cosmetics(npc, npc_id, npc_comm, npc_rank, visual, rand_condition)
SpawnCosmetics(npc, npc_id, npc_comm, npc_rank, visual, rand_condition)
spawn_glowostick(npc, npc_rank, npc_comm)
end
TrySpawnTreasure = treasure_manager.try_spawn_treasure
function treasure_manager.try_spawn_treasure(box)
local id = box:id()
if not (treasure_manager.caches[id]) then
return
end
if not (type(treasure_manager.caches[id]) == "string") then
return
end
if (math.random() < glowstick_stash_chance) then
alife_create_item(sections_table[math.random(1,4)], box, {cond_r = {30,70}})
end
TrySpawnTreasure(box)
end
_LoadLoadout = ui_mm_faction_select.UINewGame.LoadLoadout
function ui_mm_faction_select.UINewGame.LoadLoadout(self, rand)
_LoadLoadout(self, rand)
-- Copy existing loadout but remove the flashlight
local inv_sect_list = {}
local inv_point_list = {}
local i_size = 0
for idx,ci in pairs(self.CC["inventory"].cell) do
if (ci.section ~= "device_flashlight") then
i_size = i_size + 1
inv_sect_list[i_size] = ci.section
inv_point_list[i_size] = 0
end
end
-- Add a glowstick
i_size = i_size + 1
inv_sect_list[i_size] = loot_table[self.selected_faction][1] or "device_glowstick"
inv_point_list[i_size] = 0
-- Load the existing faction "shop"
i_size = 0
local load_sect_list = {}
local load_point_list = {}
for idx,ci in pairs(self.CC["loadout"].cell) do
i_size = i_size + 1
load_sect_list[i_size] = ci.section
load_point_list[i_size] = ci.flags.info or 0
end
-- Add glowsticks
for i=1,#sections_table do
if (sections_table[i] ~= inv_sect_list[#inv_sect_list]) then
i_size = i_size + 1
load_sect_list[i_size] = sections_table[i]
load_point_list[i_size] = 2
end
end
-- Add flashlight
i_size = i_size + 1
load_sect_list[i_size] = "device_flashlight"
load_point_list[i_size] = 4
-- Reinit inventories to apply the changes
self.CC["inventory"]:Reinit(inv_sect_list, inv_point_list)
for idx,ci in pairs(self.CC["inventory"].cell) do
if ci:IsShown() then
local val = ci.flags.info or 0
ci.flags.value = val
ci.flags.value_str = game.translate_string("st_mm_new_game_points") .. ": " .. val
end
end
self.CC["loadout"]:Reinit(load_sect_list, load_point_list)
for idx,ci in pairs(self.CC["loadout"].cell) do
if ci:IsShown() then
local val = ci.flags.info or 0
ci.flags.value = val
ci.flags.value_str = game.translate_string("st_mm_new_game_points") .. ": " .. val
end
end
end