182 lines
4.5 KiB
Plaintext
182 lines
4.5 KiB
Plaintext
|
scriptname SKI_WidgetManager extends SKI_QuestBase
|
||
|
|
||
|
; CONSTANTS ---------------------------------------------------------------------------------------
|
||
|
|
||
|
string property HUD_MENU = "HUD Menu" autoReadOnly
|
||
|
|
||
|
|
||
|
; PRIVATE VARIABLES -------------------------------------------------------------------------------
|
||
|
|
||
|
SKI_WidgetBase[] _widgets
|
||
|
string[] _widgetSources
|
||
|
int _curWidgetID = 0
|
||
|
int _widgetCount = 0
|
||
|
|
||
|
|
||
|
; INITIALIZATION ----------------------------------------------------------------------------------
|
||
|
|
||
|
event OnInit()
|
||
|
_widgets = new SKI_WidgetBase[128]
|
||
|
_widgetSources = new string[128]
|
||
|
|
||
|
; Wait until all widgets have registered their callbacks
|
||
|
Utility.Wait(0.5)
|
||
|
|
||
|
OnGameReload()
|
||
|
endEvent
|
||
|
|
||
|
event OnGameReload()
|
||
|
RegisterForModEvent("SKIWF_widgetLoaded", "OnWidgetLoad")
|
||
|
RegisterForModEvent("SKIWF_widgetError", "OnWidgetError")
|
||
|
|
||
|
CleanUp()
|
||
|
|
||
|
; Init now, or delay until hudmenu has been loaded
|
||
|
if (UI.IsMenuOpen(HUD_MENU))
|
||
|
InitWidgetLoader()
|
||
|
else
|
||
|
RegisterForMenu(HUD_MENU)
|
||
|
endIf
|
||
|
endEvent
|
||
|
|
||
|
event OnMenuOpen(string a_menuName)
|
||
|
if (a_menuName == HUD_MENU)
|
||
|
UnregisterForMenu(HUD_MENU)
|
||
|
InitWidgetLoader()
|
||
|
endIf
|
||
|
endEvent
|
||
|
|
||
|
function CleanUp()
|
||
|
_widgetCount = 0
|
||
|
int i = 0
|
||
|
|
||
|
while (i < _widgets.length)
|
||
|
if (_widgets[i] == none || _widgets[i].GetFormID() == 0)
|
||
|
; Widget no longer exists
|
||
|
_widgets[i] = none
|
||
|
_widgetSources[i] = ""
|
||
|
else
|
||
|
_widgetCount += 1
|
||
|
endIf
|
||
|
i += 1
|
||
|
endWhile
|
||
|
endFunction
|
||
|
|
||
|
function InitWidgetLoader()
|
||
|
Debug.Trace("InitWidgetLoader()")
|
||
|
|
||
|
int releaseIdx = UI.GetInt(HUD_MENU, "_global.WidgetLoader.SKYUI_RELEASE_IDX")
|
||
|
|
||
|
; Not injected yet
|
||
|
if (releaseIdx == 0)
|
||
|
|
||
|
; Interface/
|
||
|
string rootPath = ""
|
||
|
|
||
|
string[] args = new string[2]
|
||
|
args[0] = "widgetLoaderContainer"
|
||
|
args[1] = "-1000"
|
||
|
|
||
|
; Create empty container clip
|
||
|
UI.InvokeStringA(HUD_MENU, "_root.createEmptyMovieClip", args)
|
||
|
|
||
|
; Try to load from Interface/exported/hudmenu.gfx
|
||
|
UI.InvokeString(HUD_MENU, "_root.widgetLoaderContainer.loadMovie", "skyui/widgetloader.swf")
|
||
|
Utility.Wait(0.5)
|
||
|
releaseIdx = UI.GetInt(HUD_MENU, "_global.WidgetLoader.SKYUI_RELEASE_IDX")
|
||
|
|
||
|
; If failed, try to load from Interface/hudmenu.swf
|
||
|
if (releaseIdx == 0)
|
||
|
; Interface/exported
|
||
|
rootPath = "exported/"
|
||
|
UI.InvokeString(HUD_MENU, "_root.widgetLoaderContainer.loadMovie", "exported/skyui/widgetloader.swf")
|
||
|
Utility.Wait(0.5)
|
||
|
releaseIdx = UI.GetInt(HUD_MENU, "_global.WidgetLoader.SKYUI_RELEASE_IDX")
|
||
|
endIf
|
||
|
|
||
|
; Injection failed
|
||
|
if (releaseIdx == 0)
|
||
|
Debug.Trace("InitWidgetLoader(): load failed")
|
||
|
return
|
||
|
endIf
|
||
|
|
||
|
UI.InvokeString(HUD_MENU, "_root.widgetLoaderContainer.widgetLoader.setRootPath", rootPath)
|
||
|
endIf
|
||
|
|
||
|
; Load already registered widgets
|
||
|
UI.InvokeStringA(HUD_MENU, "_root.widgetLoaderContainer.widgetLoader.loadWidgets", _widgetSources)
|
||
|
|
||
|
SendModEvent("SKIWF_widgetManagerReady")
|
||
|
endFunction
|
||
|
|
||
|
|
||
|
; EVENTS ------------------------------------------------------------------------------------------
|
||
|
|
||
|
event OnWidgetLoad(string a_eventName, string a_strArg, float a_numArg, form a_sender)
|
||
|
int widgetID = a_strArg as int
|
||
|
SKI_WidgetBase client = _widgets[widgetID]
|
||
|
|
||
|
if (client != none)
|
||
|
client.OnWidgetLoad()
|
||
|
endIf
|
||
|
endEvent
|
||
|
|
||
|
event OnWidgetError(string a_eventName, string a_strArg, float a_numArg, form a_sender)
|
||
|
int widgetID = a_numArg as int
|
||
|
string errorType = a_strArg
|
||
|
|
||
|
Debug.Trace("WidgetError: " + (_widgets[widgetID] as string) + ": " + errorType)
|
||
|
endEvent
|
||
|
|
||
|
|
||
|
; FUNCTIONS ---------------------------------------------------------------------------------------
|
||
|
|
||
|
int function RequestWidgetID(SKI_WidgetBase a_client)
|
||
|
if (_widgetCount >= 128)
|
||
|
return -1
|
||
|
endIf
|
||
|
|
||
|
int widgetID = NextWidgetID()
|
||
|
_widgets[widgetID] = a_client
|
||
|
_widgetCount += 1
|
||
|
|
||
|
return widgetID
|
||
|
endFunction
|
||
|
|
||
|
int function NextWidgetID()
|
||
|
int startIdx = _curWidgetID
|
||
|
|
||
|
while (_widgets[_curWidgetID] != none)
|
||
|
_curWidgetID += 1
|
||
|
if (_curWidgetID >= 128)
|
||
|
_curWidgetID = 0
|
||
|
endIf
|
||
|
if (_curWidgetID == startIdx)
|
||
|
return -1 ; Should never happen because we have widgetCount. Just to be sure.
|
||
|
endIf
|
||
|
endWhile
|
||
|
|
||
|
return _curWidgetID
|
||
|
endFunction
|
||
|
|
||
|
function CreateWidget(int a_widgetID, string a_widgetSource)
|
||
|
_widgetSources[a_widgetID] = a_widgetSource
|
||
|
string[] args = new string[2]
|
||
|
args[0] = a_widgetID as string
|
||
|
args[1] = a_widgetSource
|
||
|
UI.InvokeStringA(HUD_MENU, "_root.widgetLoaderContainer.widgetLoader.loadWidget", args);
|
||
|
endFunction
|
||
|
|
||
|
SKI_WidgetBase[] function GetWidgets()
|
||
|
; Return a copy
|
||
|
SKI_WidgetBase[] widgetsCopy = new SKI_WidgetBase[128]
|
||
|
int i = 0
|
||
|
|
||
|
while (i < _widgets.length)
|
||
|
widgetsCopy[i] = _widgets[i]
|
||
|
i += 1
|
||
|
endWhile
|
||
|
|
||
|
return widgetsCopy
|
||
|
endFunction
|