myspace / CommonLua /X /XLayers.lua
sirnii's picture
Upload 1816 files
b6a38d7 verified
----- XPauseLayer
DefineClass.XPauseLayer = {
__parents = { "XLayer" },
properties = {
{ category = "General", id = "keep_sounds", name = "Keep Sounds", editor = "bool", default = false },
{ category = "General", id = "togglePauseDialog", name = "Toggle Pause Dialog", editor = "bool", default = true },
},
Dock = "ignore",
HandleMouse = false,
}
function XPauseLayer:Init()
CreateRealTimeThread(function(self)
if self.window_state ~= "destroying" then
SetPauseLayerPause(true, self, self.keep_sounds)
if self.togglePauseDialog then
ShowPauseDialog(true)
end
ShowMouseCursor(self)
end
end, self)
end
function XPauseLayer:Done()
SetPauseLayerPause(false, self, self.keep_sounds)
if self.togglePauseDialog then
ShowPauseDialog(false)
end
HideMouseCursor(self)
end
--override in project specific file
function SetPauseLayerPause(pause, layer, keep_sounds)
if pause then
Pause(layer, keep_sounds)
else
Resume(layer)
end
end
function ShowPauseDialog(bShow)
--implement in project specific file
end
----- XSuppressInputLayer
DefineClass.XSuppressInputLayer = {
__parents = { "XLayer" },
properties = {
{ id = "SuppressTemporarily", editor = "bool", default = true, help = "If true, will suppress any input only for a short time" },
},
target = false,
Dock = "ignore",
HandleMouse = false,
}
local passthrough_events = {
OnSystemSize = true,
OnSystemActivate = true,
OnSystemInactivate = true,
OnSystemMinimize = true,
}
function XSuppressInputLayer:Init()
local function stub_break(target, event)
if not IsValidThread(SwitchControlQuestionThread) and not passthrough_events[event] then
return "break"
end
end
self.target = TerminalTarget:new{
MouseEvent = stub_break,
KeyboardEvent = stub_break,
SysEvent = stub_break,
XEvent = stub_break,
terminal_target_priority = 10000000,
}
terminal.AddTarget(self.target)
end
function XSuppressInputLayer:Open(...)
XLayer.Open(self, ...)
if self.SuppressTemporarily then
self:CreateThread(function()
Sleep(self:ResolveValue("SuppressTime") or 200)
self:delete()
end)
end
end
function XSuppressInputLayer:Done()
terminal.RemoveTarget(self.target)
end
DefineClass.XShowMouseCursorLayer = {
__parents = { "XLayer" },
Dock = "ignore",
HandleMouse = false,
}
function XShowMouseCursorLayer:Open(...)
ShowMouseCursor("XShowMouseCursorLayer")
return XLayer.Open(self, ...)
end
function XShowMouseCursorLayer:Done()
HideMouseCursor("XShowMouseCursorLayer")
end
----- XHideInGameInterfaceLayer
DefineClass.XHideInGameInterfaceLayer = {
__parents = { "XLayer" },
Dock = "ignore",
HandleMouse = false,
}
function XHideInGameInterfaceLayer:Init()
ShowInGameInterface(false)
end
function XHideInGameInterfaceLayer:Done()
if GetInGameInterface() then
ShowInGameInterface(true)
end
end
----- XCameraLockLayer
DefineClass.XCameraLockLayer = {
__parents = { "XLayer" },
properties = {
{ category = "General", id = "lock_id", name = "LockId", editor = "text", default = false },
},
Dock = "ignore",
HandleMouse = false,
}
function XCameraLockLayer:Open()
LockCamera(self.lock_id or self)
XLayer.Open(self)
end
function XCameraLockLayer:Done()
UnlockCamera(self.lock_id or self)
end
----- XChangeCameraTypeLayer
local cameraTypes = { "cameraRTS", "cameraFly", "camera3p", "cameraMax", "cameraTac" }
DefineClass.XChangeCameraTypeLayer = {
__parents = { "XLayer" },
properties = {
{ id = "CameraType", editor = "choice", default = "cameraMax", items = cameraTypes },
{ id = "CameraClampZ", editor = "number", default = 0, },
{ id = "CameraClampXY", editor = "number", default = 0, },
},
Dock = "ignore",
HandleMouse = false,
old_camera = false,
old_limits = false,
}
function XChangeCameraTypeLayer:Init()
self.old_camera = pack_params(GetCamera())
self.old_limits = {}
if self.CameraClampZ ~= 0 then
self.old_limits.CameraMaxClampZ = hr.CameraMaxClampZ
hr.CameraMaxClampZ = self.CameraClampZ
end
if self.CameraClampXY ~= 0 then
self.old_limits.CameraMaxClampXY = hr.CameraMaxClampXY
hr.CameraMaxClampXY = self.CameraClampXY
end
ForceUnlockCameraStart(self)
_G[self.CameraType].Activate(1)
end
function XChangeCameraTypeLayer:Done()
SetCamera(unpack_params(self.old_camera))
ForceUnlockCameraEnd(self)
for key, val in pairs(self.old_limits or empty_table) do
hr[key] = val
end
end
-- XMuteSounds
DefineClass.XMuteSounds = {
__parents = { "XLayer" },
Dock = "ignore",
HandleMouse = false,
properties = {
{ id = "MuteAll", editor = "bool", default = false },
{ id = "FadeTime", editor = "number", default = 500 },
{ id = "AudioGroups", editor = "set", default = set(), items = PresetGroupsCombo("SoundTypePreset"), no_edit = PropGetter("MuteAll") },
},
}
function XMuteSounds:ApplyMute(apply, time)
local groups = self.MuteAll and PresetGroupNames("SoundTypePreset") or table.keys(self.AudioGroups, true)
for _, group in ipairs(groups) do
SetGroupVolumeReason(self, group, apply and 0, self.FadeTime)
end
end
function XMuteSounds:Open()
self:ApplyMute(true)
XLayer.Open(self)
end
function XMuteSounds:Done()
self:ApplyMute(false)
end
----- XHROption
DefineClass.XHROption = {
__parents = { "XWindow" },
Dock = "ignore",
properties = {
{ category = "General", id = "Option", editor = "choice", default = "", items = function () return table.keys2(EnumEngineVars("hr."), true, "") end },
{ category = "General", id = "Value", editor = function(self)
return type(GetEngineVar("hr.", self.Option or "")) == "number" and "number" or "bool"
end, default = false, scale = 1000 },
},
}
function XHROption:Open()
self:SetVisible(false)
if self.Option ~= "" then
if type(GetEngineVar("hr.", self.Option or "")) == "number" then
table.change(hr, self, { [self.Option] = (self.Value or 0) / 1000.0 })
else
table.change(hr, self, { [self.Option] = self.Value })
end
end
XWindow.Open(self)
end
function XHROption:Done()
table.restore(hr, self, true)
end