Divergent/mods/Headgear Animations/gamedata/scripts/headgear_animations_hotkey....

148 lines
5.4 KiB
Plaintext
Raw Permalink Normal View History

2024-03-17 20:18:03 -04:00
--[[ Script to take off/put on your helmet by holding hotkey. ]]--
local holdDelay = 0.5 --Delay in seconds while holding key before action for non MCM version
local lastHelmet
local lastHelmetId = nil
local KEY = headgear_animations_mcm.get_config("keybind") --change this if you don't use MCM or havn't updated to the curent version
local modifier = headgear_animations_mcm.get_config("modifier")
local mode = headgear_animations_mcm.get_config("mode")
local mcm_keybinds = ui_mcm and ui_mcm.key_hold --there will be a better way to test for MCM versions soon, but this will always be a solid way to check for keybind support
-----------------------------------------------------------------------------------------------------------------------
-- Callbacks
-----------------------------------------------------------------------------------------------------------------------
function on_game_start()
RegisterScriptCallback("on_option_change", on_option_change)
RegisterScriptCallback("on_key_hold", on_key_hold)
RegisterScriptCallback("on_key_press", on_key_press)
RegisterScriptCallback("on_key_release", on_key_release)
RegisterScriptCallback("load_state", on_load_state)
RegisterScriptCallback("save_state", on_save_state)
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
end
-----------------------------------------------------------------------------------------------------------------------
--
-----------------------------------------------------------------------------------------------------------------------
function on_option_change() --new in mcm 1.6.0 mcm passes true to the on_option_change callback
KEY = headgear_animations_mcm.get_config("keybind") -- if it can't find the option it will return nil this form insures that with old versions of mcm the key doesn't get reset
modifier = headgear_animations_mcm.get_config("modifier")
mode = headgear_animations_mcm.get_config("mode")
end
-----------------------------------------------------------------------------------------------------------------------
-- MCM Keybinding setup
-----------------------------------------------------------------------------------------------------------------------
function on_key_hold(key)
if mcm_keybinds and (key == KEY) and (mode == 2) and ui_mcm.get_mod_key(modifier) and ui_mcm.key_hold("liz_qht",key) then --repeating after 5 seconds for demo pourposes.
toggle_helmet()
end
end
function on_key_press(key)
if key ~= KEY then return end
if (not mcm_keybinds) then --No MCM case
CreateTimeEvent("quick_actions", "toggleHelmet", holdDelay, toggle_helmet)
return
end
if (mode == 0) and ui_mcm.get_mod_key(modifier) then
ui_mcm.simple_press("liz_qht", key, toggle_helmet)
end
if (mode == 1) and ui_mcm.get_mod_key(modifier) and ui_mcm.double_tap("liz_qht",key) then
toggle_helmet()
return
end
end
function on_key_release(key)
if mcm_keybinds then return end
if key == KEY then --if the released key matches, remove our event to stop it from firing if released earlier than holdDelay
RemoveTimeEvent("quick_actions","toggleHelmet")
end
end
-----------------------------------------------------------------------------------------------------------------------
-- Persistance
-----------------------------------------------------------------------------------------------------------------------
function on_save_state(m_data)
if lastHelmet then
m_data.lastHelmetId = lastHelmet:id()
end
end
function on_load_state(m_data)
lastHelmetId = m_data.lastHelmetId
end
function actor_on_first_update()
local function itr(actor, item)
if item:id() == lastHelmetId then
lastHelmet = item
return
end
end
if lastHelmetId ~= nil then
db.actor:iterate_ruck(itr, nil)
end
end
-----------------------------------------------------------------------------------------------------------------------
-- Main
-----------------------------------------------------------------------------------------------------------------------
function toggle_helmet()
if (not db.actor) and (not db.actor:alive()) then return end
if enhanced_animations.used_item ~= nil then return end
local currentHelmet = db.actor:item_in_slot(12) --set currentHelmet to whatever player has equipped in helmet slot
if currentHelmet then --if it's a helmet, move it to inventory and save it for re-equipping later
headgear_animations.on_toggle_unequip(currentHelmet)
lastHelmet = currentHelmet
elseif lastHelmet then --if not, and lastHelmet is set, check player inventory for previously worn helmet
if not is_have_helmet() then --if helmet slot is empty and not blocked by armor
db.actor:iterate_ruck(function (actor, item)
if item:id() == lastHelmet:id() then
headgear_animations.on_toggle_equip(item)
end
end, nil)
end
end
end
function is_have_helmet()
--check if we have helmet in helmet slot
local o_helm = db.actor:item_in_slot(12)
if o_helm then
local m_headgear_is_in_whitelist = ini_whitelist:section_exist(o_helm:section())
if not m_headgear_is_in_whitelist then
return true
else
return false
end
end
--if not check if we have outfit that have integrated helmet
local o_outfit = db.actor:item_in_slot(7)
if o_outfit then
local c_outfit = o_outfit:cast_CustomOutfit()
if not c_outfit.bIsHelmetAvaliable then return true end
end
return false
end