Divergent/mods/Fluid Aim/gamedata/scripts/fluid_aim.script

203 lines
6.8 KiB
Plaintext

local fluid_aim_fire = 0
local fluid_aim_aim = 0
local fluid_aim_jammed = false
local fluid_aim_switch_weapon = false
local fluid_aim_toggle = false
local fluid_aim_reset_fire_on_load = true
-- TimeEvents
-- Need to re-evaluate Attempt to fire and Attempt to aim is necesary
-- Attempt to fire
local function fluid_aim_delay_fire_func()
if fluid_aim_fire then
level.press_action(bind_to_dik(key_bindings.kWPN_FIRE))
end
return true
end
-- Attempt to aim
local function fluid_aim_delay_aim_func()
if fluid_aim_aim then
level.press_action(bind_to_dik(key_bindings.kWPN_ZOOM))
end
return true
end
-- Delay before weapon can aim after switch
local function fluid_aim_delay_switch_weapon_func()
fluid_aim_switch_weapon = true
return true
end
-- Actor On Update(Every tick)
local function actor_on_update()
if not (db.actor:alive()) then
return
end
-- Check if fire or aim is pressed
fluid_aim_fire = key_state(bind_to_dik(key_bindings.kWPN_FIRE)) ~= 0
if ui_options.get("control/general/aim_toggle") then
if not (fluid_aim_toggle) then
fluid_aim_aim = key_state(bind_to_dik(key_bindings.kWPN_ZOOM)) ~= 0
end
else
fluid_aim_aim = key_state(bind_to_dik(key_bindings.kWPN_ZOOM)) ~= 0
end
-- Check if it's a weapon or binocular
local wpn = db.actor:active_item()
local is_weapon = wpn and (IsWeapon(wpn) or SYS_GetParam(0,wpn:section(),"class") == "WP_BINOC") or false
if (is_weapon) then
local state = wpn:get_state()
-- Melee
if (SYS_GetParam(0,wpn:section(),"kind") == "w_melee") then
-- Not in menus
if (actor_menu.last_mode == 0) and (pda.dialog_closed == true) and (not Check_UI()) and (not db.actor:has_info("ui_pda")) then
if fluid_aim_fire and not (state == 5) and not fluid_aim_reset_fire_on_load then
level.press_action(bind_to_dik(key_bindings.kWPN_FIRE))
elseif fluid_aim_aim and not (state == 6) then
level.press_action(bind_to_dik(key_bindings.kWPN_ZOOM))
end
end
-- Firearms
elseif not (SYS_GetParam(0,wpn:section(),"kind") == "w_melee") then
-- First frame when weapon is being equip
if state == 3 then
fluid_aim_switch_weapon = false
local wpn_kind = SYS_GetParam(0,wpn:section(),"kind")
-- Implement ltx weapon name list for custom equip aim time
-- Time require before you can aim when switching weapons
-- Default Pistol
if (wpn_kind == "w_pistol") then
CreateTimeEvent("fluid_aim_delay_switch_weapon", "fluid_aim_delay_switch_weapon", 0.1, fluid_aim_delay_switch_weapon_func)
-- Seems a bit over powered
-- Default Smg
--elseif (wpn_kind == "w_smg") then
--CreateTimeEvent("fluid_aim_delay_switch_weapon", "fluid_aim_delay_switch_weapon", 0.6, fluid_aim_delay_switch_weapon_func)
-- Default Shotgun
--elseif (wpn_kind == "w_shotgun") then
--CreateTimeEvent("fluid_aim_delay_switch_weapon", "fluid_aim_delay_switch_weapon", 0.8, fluid_aim_delay_switch_weapon_func)
-- Default Rifle
--elseif (wpn_kind == "w_rifle") then
--CreateTimeEvent("fluid_aim_delay_switch_weapon", "fluid_aim_delay_switch_weapon", 0.9, fluid_aim_delay_switch_weapon_func)
-- Default Sniper aim delay
--elseif (wpn_kind == "w_sniper") then
--CreateTimeEvent("fluid_aim_delay_switch_weapon", "fluid_aim_delay_switch_weapon", 1.2, fluid_aim_delay_switch_weapon_func)
-- Unlisted
--else
--CreateTimeEvent("fluid_aim_delay_switch_weapon", "fluid_aim_delay_switch_weapon", 0.9, fluid_aim_delay_switch_weapon_func)
end
end
-- Not in menus
if (actor_menu.last_mode == 0) and (pda.dialog_closed == true) and (not Check_UI()) and (not db.actor:has_info("ui_pda")) then
-- Override weapon to idle state after delay timer
switch_weapon_state(wpn, fluid_aim_switch_weapon)
-- Fire weapon logic
if fluid_aim_fire and not IsMoveState("mcSprint") and not fluid_aim_reset_fire_on_load then
if state == 5 then
fluid_aim_jammed = false
end
-- Automatic weapon continue fire after ADS
if axr_main.weapon_is_zoomed and not (state == 5 or fluid_aim_jammed) and (wpn:get_ammo_in_magazine() > 0) and wpn:cast_Weapon():GetFireMode() == -1 then
level.release_action(bind_to_dik(key_bindings.kWPN_FIRE))
CreateTimeEvent("fluid_aim_delay_fire", "fluid_aim_delay_fire", 0, fluid_aim_delay_fire_func)
end
-- Queue fire
if game.actor_weapon_lowered() or not (state == 0 or state == 2 or state == 3 or state == 5) then
CreateTimeEvent("fluid_aim_delay_fire", "fluid_aim_delay_fire", 0, fluid_aim_delay_fire_func)
end
end
-- Aim weapon logic
if fluid_aim_aim then
if not (axr_main.weapon_is_zoomed) and (game.actor_weapon_lowered() or not (state == 2 or state == 3 or state == 5)) then
CreateTimeEvent("fluid_aim_delay_aim", "fluid_aim_delay_aim", 0, fluid_aim_delay_aim_func)
end
end
end
end
end
wpn = nil
end
-- Weapons states found in xrs debug tools
-- local states = {
-- eIdle, --= 0
-- eShowing, --= 1
-- eHiding, --= 2
-- eHidden, --= 3
-- eBore, --= 4
-- eFire, --= 5
-- eFire2, --= 6
-- eReload, --= 7
-- eMisfire, --= 8
-- eMagEmpty, --= 9
-- eSwitch --= 10
-- }
-- Functions
-- Prematurely force the weapon to aim or shoot after weapon switch delay
function switch_weapon_state (wpn, fluid_aim_switch_weapon)
if wpn:get_state() == 1 and not (wpn:weapon_is_scope()) and not (SYS_GetParam(0,wpn:section(),"kind") == "w_sniper") then
if fluid_aim_switch_weapon == true then
wpn:switch_state(0)
fluid_aim_switch_weapon = false
end
end
end
-- Weapon Jammed to prevent jam sound when aiming and shooting
local function actor_on_weapon_jammed()
fluid_aim_jammed = true
end
-- Key press to prevent toggle aim release from aiming instantly again
local function on_key_press(key)
if (key == bind_to_dik(key_bindings.kWPN_FIRE)) then
fluid_aim_reset_fire_on_load = false
end
if (key == bind_to_dik(key_bindings.kWPN_ZOOM)) then
if ui_options.get("control/general/aim_toggle") and axr_main.weapon_is_zoomed then
fluid_aim_toggle = true
end
end
end
-- Key release to reset toggle aim release
local function on_key_release(key)
if (key == bind_to_dik(key_bindings.kWPN_ZOOM)) then
if ui_options.get("control/general/aim_toggle") then
fluid_aim_toggle = false
end
end
end
-- Prevent fire weapon button state from firing the weapon when dying and loading last save
local function ignore_fire_key_press()
fluid_aim_reset_fire_on_load = true
end
function on_game_start()
RegisterScriptCallback("on_key_press", on_key_press)
RegisterScriptCallback("on_key_release", on_key_release)
RegisterScriptCallback("actor_on_update",actor_on_update)
RegisterScriptCallback("actor_on_weapon_jammed",actor_on_weapon_jammed)
RegisterScriptCallback("on_actor_first_update", ignore_fire_key_press)
RegisterScriptCallback("on_option_change", ignore_fire_key_press)
end