Darktide-Mod-Framework/vmf_source/scripts/mods/vmf/modules/gui.lua
2018-01-22 12:10:53 +03:00

294 lines
No EOL
10 KiB
Lua

local vmf = get_mod("VMF")
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
local injected_materials = {}
local none_atlas_textures = {}
-- @TODO: can several materials be specified via 1 material file? Figure it out.
function inject_material(material_path, material_name, ...)
--print("[FUCK]: Mods.gui.inject_material " .. material_path .. material_name)
local material_users = {...}
if #material_users == 0 then
material_users = {"all"}
end
for _, material_user in ipairs(material_users) do
if not injected_materials[material_user] then
injected_materials[material_user] = {}
end
table.insert(injected_materials[material_user], material_path)
end
none_atlas_textures[material_name] = true
end
--table.dump(injected_materials, "injected_materials", 2)
vmf:hook("UIRenderer.create", function(func, world, ...)
local ui_renderer_creator = nil
-- extract the part with actual callstack
local callstack = Script.callstack():match('Callstack>(.-)<')
if callstack then
-- get the name of lua script which called 'UIRenderer.create'
-- it's always the 4th string of callstack ([ ] [0] [1] >[2]<)
-- print(callstack) -- @DEBUG
local i = 0
for s in callstack:gmatch("(.-)\n") do
i = i + 1
if i == 4 then
ui_renderer_creator = s:match("([^%/]+)%.lua")
break --@TODO: uncomment after debugging or ... (?)
end
--EchoConsole(s) -- @DELETEME
end
end
if ui_renderer_creator then
print("UI_RENDERER CREATED BY: " .. ui_renderer_creator) -- @DEBUG
else
--EchoConsole("You're never supposed to see this.")
--assert(true, "That's not right. That's not right at all!")
--EchoConsole(callstack)
return func(world, ...)
end
local ui_renderer_materials = {...}
if injected_materials[ui_renderer_creator] then
for _, material in ipairs(injected_materials[ui_renderer_creator]) do
table.insert(ui_renderer_materials, "material")
table.insert(ui_renderer_materials, material)
end
end
if injected_materials["all"] then
for _, material in ipairs(injected_materials["all"]) do
table.insert(ui_renderer_materials, "material")
table.insert(ui_renderer_materials, material)
end
end
table.dump(ui_renderer_materials, "UI_RENDERER MATERIALS", 2) -- @DEBUG
local wtf = func(world, unpack(ui_renderer_materials))
print (tostring(wtf))
return wtf
end)
vmf:hook("UIAtlasHelper.get_atlas_settings_by_texture_name", function(func, texture_name)
if none_atlas_textures[texture_name] then
return
end
return func(texture_name)
end)
--inject_material("materials/yoba_face", "yoba_face", "ui_passes", "ingame_ui")
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
-- @TODO: close and unload menu on_reload
-- something for hotkeys
--IngameUI.init to make hotkeys? no
local views_settings = {}
local transitions = {}
VMFMod.register_new_view = function (self, new_view_data)
views_settings[new_view_data.view_name] = new_view_data.view_settings
for transition_name, transition_function in pairs(new_view_data.view_transitions) do
transitions[transition_name] = transition_function
end
-- @TODO: maybe there's better way to do this?
-- can be called only on reloading vmf
local ingame_ui_exists, ingame_ui = pcall(function () return Managers.player.network_manager.matchmaking_manager.matchmaking_ui.ingame_ui end)
if ingame_ui_exists then
-- set 'ingame_ui.views'
local new_view_name = new_view_data.view_name
local new_view_init_function = new_view_data.view_settings.init_view_function
if not ingame_ui.views[new_view_name] then --@TODO: since I do this check, close and unload custom menus while reloading
ingame_ui.views[new_view_name] = new_view_init_function(ingame_ui.ingame_ui_context)
end
-- set 'ingame_ui.blocked_transitions'
local blocked_transitions = new_view_data.view_settings.blocked_transitions
local current_blocked_transitions = ingame_ui.is_in_inn and blocked_transitions.inn or blocked_transitions.ingame
for blocked_transition_name, _ in pairs(current_blocked_transitions) do
ingame_ui.blocked_transitions[blocked_transition_name] = true
end
vmf:echo("INGAME_UI EXISTS")
else
vmf:echo("INGAME_UI DOESN'T EXIST")
end
end
--@TODO: hotkey_mapping
vmf:hook("IngameUI.setup_views", function(func, self, ingame_ui_context)
func(self, ingame_ui_context)
for view_name, view_settings in pairs(views_settings) do
if self.is_in_inn then
if view_settings.active.inn then
self.views[view_name] = view_settings.init_view_function(ingame_ui_context)
--self.hotkey_mapping = view_settings.hotkey_mapping
end
for blocked_transition_name, _ in pairs(view_settings.blocked_transitions.inn) do
self.blocked_transitions[blocked_transition_name] = true
end
else
if view_settings.active.ingame then
self.views[view_name] = view_settings.init_view_function(ingame_ui_context)
--self.hotkey_mapping = view_settings.hotkey_mapping
end
for blocked_transition_name, _ in pairs(view_settings.blocked_transitions.ingame) do
self.blocked_transitions[blocked_transition_name] = true
end
end
end
end)
vmf:hook("IngameUI.handle_transition", function(func, self, new_transition, ...)
local successful_execution = pcall(func, self, new_transition, ...)
if successful_execution then
return
else
if not transitions[new_transition] then -- @TODO: is it right?
vmf:echo("Some mod is trying to use non existing view transition: " .. new_transition)
return
end
-- this block is pure copypasta from 'IngameUI.handle_transition'
local blocked_transitions = self.blocked_transitions
if blocked_transitions and blocked_transitions[new_transition] then
return
end
local previous_transition = self._previous_transition
if not self.is_transition_allowed(self, new_transition) or (previous_transition and previous_transition == new_transition) then
return
end
local transition_params = {
...
}
if self.new_transition_old_view then
return
end
local old_view = self.current_view
transitions[new_transition](self, unpack(transition_params))
local new_view = self.current_view
if old_view ~= new_view then
if self.views[old_view] and self.views[old_view].on_exit then
printf("[IngameUI] menu view on_exit %s", old_view)
self.views[old_view]:on_exit(unpack(transition_params))
end
if new_view and self.views[new_view] and self.views[new_view].on_enter then
printf("[IngameUI] menu view on_enter %s", new_view)
self.views[new_view]:on_enter(unpack(transition_params))
Managers.state.event:trigger("ingame_ui_view_on_enter", new_view)
end
end
self.new_transition = new_transition
self.new_transition_old_view = old_view
self.transition_params = transition_params
self._previous_transition = new_transition
end
end)
--[[
Mods.hook.set("whatever", "IngameUI.update", function(func, self, dt, t, disable_ingame_ui, end_of_level_ui)
func(self, dt, t, disable_ingame_ui, end_of_level_ui)
local end_screen_active = self.end_screen_active(self)
local gdc_build = Development.parameter("gdc")
local input_service = self.input_manager:get_service("ingame_menu")
if not self.pending_transition(self) and not end_screen_active and not self.menu_active and not self.leave_game and not self.return_to_title_screen and not gdc_build and not self.popup_join_lobby_handler.visible and input_service.get(input_service, "cancel_matchmaking", true) then
self.handle_transition(self, "vmf_options_view_force")
--MOOD_BLACKBOARD.menu = true
end
end)
]]
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
local mod = new_mod("DisableThings")
mod:hook("StateSplashScreen.on_enter", function(func, self)
self._skip_splash = true
func(self)
end)
mod:hook("SplashView.init", function(self, input_manager, world)
return
end)
mod:hook("SplashView.set_index", function(self, index)
return
end)
mod:hook("StateSplashScreen.setup_splash_screen_view", function(func, self)
func(self)
self.splash_view = nil
end)