141 lines
4.9 KiB
Plaintext
141 lines
4.9 KiB
Plaintext
|
local mcm_key_firemode = DIK_keys.DIK_X
|
||
|
local mcm_modifier_prevmode = 1
|
||
|
local fire_mode_names = { [-1] = "Full-Auto", [1] = "Single", [2] = "Burst", [3] = "Burst" }
|
||
|
local hide_fire_mode = true
|
||
|
|
||
|
function on_game_start()
|
||
|
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
|
||
|
RegisterScriptCallback("on_option_change", on_option_change)
|
||
|
RegisterScriptCallback("on_before_key_press", on_before_key_press)
|
||
|
RegisterScriptCallback("on_key_hold", on_key_hold)
|
||
|
end
|
||
|
|
||
|
function on_mcm_load()
|
||
|
op = {
|
||
|
id = "firemode",
|
||
|
sh = true,
|
||
|
gr = {
|
||
|
{ id = "slide_onekey_firemode", type = "slide", link = "ui_options_slider_player", text = "ui_mcm_title_onekey_firemode", size = { 512, 50 }, spacing = 20 },
|
||
|
{ id = "desc_onekey_firemode", type = "desc", text = "ui_mcm_onekey_key_firemode_desc" },
|
||
|
{ id = "key_firemode", type = "key_bind", val = 2, def = DIK_keys.DIK_X, hint = "onekey_key_firemode" },
|
||
|
{ id = "modifier_prev_firemode", type = "radio_h", val = 2, def = 1, hint = "onekey_modifier_prev_firemode", content = { {1,"mcm_kb_mod_shift"} , {2,"mcm_kb_mod_ctrl"}, {3,"mcm_kb_mod_alt"} } },
|
||
|
{ id = "hide_fire_mode", type = "check", val = 1, def = true, hint = "onekey_hide_fire_mode" },
|
||
|
}
|
||
|
}
|
||
|
return op, "onekey"
|
||
|
end
|
||
|
|
||
|
|
||
|
function actor_on_first_update()
|
||
|
on_option_change()
|
||
|
end
|
||
|
|
||
|
function on_option_change()
|
||
|
if ui_mcm then
|
||
|
mcm_key_firemode = ui_mcm.get("onekey/firemode/key_firemode")
|
||
|
mcm_modifier_prevmode = ui_mcm.get("onekey/firemode/modifier_prev_firemode")
|
||
|
hide_fire_mode = ui_mcm.get("onekey/firemode/hide_fire_mode")
|
||
|
end
|
||
|
pos = ActorMenu.get_maingame().m_ui_hud_states.m_fire_mode:GetWndPos()
|
||
|
pos.x = ((hide_fire_mode and pos.x > 0) or ((not hide_fire_mode) and pos.x < 0)) and (-1 * pos.x) or pos.x
|
||
|
ActorMenu.get_maingame().m_ui_hud_states.m_fire_mode:SetWndPos(pos)
|
||
|
end
|
||
|
|
||
|
function on_before_key_press(key, bind, dis, flags)
|
||
|
if key == mcm_key_firemode then
|
||
|
local weapon = db.actor:active_item()
|
||
|
if not is_supported_weapon(weapon) then
|
||
|
flags.ret_value = true
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if is_supported_weapon(weapon) and has_multiple_fire_modes(weapon) and is_weapon_ready(weapon) then
|
||
|
local old_fire_mode = weapon:cast_Weapon():GetFireMode()
|
||
|
|
||
|
if ui_mcm.get_mod_key(mcm_modifier_prevmode) then
|
||
|
ui_mcm.simple_press("onekey_press", key, prev_fire_mode, weapon, old_fire_mode)
|
||
|
else
|
||
|
ui_mcm.simple_press("onekey_press", key, next_fire_mode, weapon, old_fire_mode)
|
||
|
end
|
||
|
flags.ret_value = false
|
||
|
return
|
||
|
end
|
||
|
|
||
|
flags.ret_value = true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function on_key_hold(key)
|
||
|
if key == mcm_key_firemode and ui_mcm.key_hold("onekey", key) then
|
||
|
show_fire_mode(nil)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function next_fire_mode(weapon, old_fire_mode)
|
||
|
level.press_action(bind_to_dik(key_bindings.kWPN_FIREMODE_NEXT))
|
||
|
level.release_action(bind_to_dik(key_bindings.kWPN_FIREMODE_NEXT))
|
||
|
CreateTimeEvent("onekey", "show_firemode_delayed", 0, show_fire_mode, old_fire_mode)
|
||
|
end
|
||
|
|
||
|
function prev_fire_mode(weapon, old_fire_mode)
|
||
|
level.press_action(bind_to_dik(key_bindings.kWPN_FIREMODE_PREV))
|
||
|
level.release_action(bind_to_dik(key_bindings.kWPN_FIREMODE_PREV))
|
||
|
CreateTimeEvent("onekey", "show_firemode_delayed", 0, show_fire_mode, old_fire_mode)
|
||
|
end
|
||
|
|
||
|
function show_fire_mode(old_fire_mode)
|
||
|
local weapon = db.actor:active_item()
|
||
|
if not is_supported_weapon(weapon) then
|
||
|
return true
|
||
|
end
|
||
|
if not has_multiple_fire_modes(weapon) then
|
||
|
return true
|
||
|
end
|
||
|
if not is_weapon_ready(weapon) then
|
||
|
return true
|
||
|
end
|
||
|
local fire_mode = weapon:cast_Weapon():GetFireMode()
|
||
|
-- Waiting for fire-select animation
|
||
|
if old_fire_mode ~= nil and fire_mode == old_fire_mode then
|
||
|
return false
|
||
|
else
|
||
|
local message = fire_mode_names[fire_mode]
|
||
|
actor_menu.set_msg(1, message, 2)
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function is_supported_weapon(wpn)
|
||
|
return wpn and IsWeapon(wpn) and (not IsItem("fake_ammo_wpn", wpn:section()))
|
||
|
end
|
||
|
|
||
|
function is_weapon_ready(wpn)
|
||
|
local state = wpn:get_state()
|
||
|
return state == 0 -- eIdle
|
||
|
end
|
||
|
|
||
|
function has_multiple_fire_modes(wpn)
|
||
|
section = wpn:section()
|
||
|
|
||
|
local fire_modes = parse_list(ini_sys, section, "fire_modes")
|
||
|
|
||
|
if fire_modes and table.getn(fire_modes) > 1 then
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
local has_firemode_upgrade = false
|
||
|
|
||
|
wpn:iterate_installed_upgrades(function(upgr_sec)
|
||
|
local upgr_prop_sec = ini_sys:r_string_ex(upgr_sec, "section")
|
||
|
if upgr_prop_sec then
|
||
|
local upgr_fire_modes = parse_list(ini_sys, upgr_prop_sec, "fire_modes")
|
||
|
if upgr_fire_modes and table.getn(upgr_fire_modes) > 1 then
|
||
|
has_firemode_upgrade = true
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
return has_firemode_upgrade
|
||
|
end
|