---------------------------------------------------------------- -- -- To add hotkeys to an object (such as a Brick Oven), you will -- be adding a function 'lookhotkeys' to the appropriate class, -- like this: -- -- function brickoven.lookhotkeys(keys) -- keys:add("X", "Light Oven", function () ... end) -- keys:add("A", "Add Fuel", function () ... end) -- end -- -- This function will get called twice: once in a 'probe' when -- Unreal wants to know what hotkeys exist, and a second time in -- an 'invoke' to find the right closure. -- -- When the probe happens, we construct a "hotkeylist" to hold -- the complete list of hotkeys. We populate this hotkeylist as -- follows: -- -- local keys = hotkeylist.create() -- brickoven.lookhotkeys(keys) -- -- At this point, if you were to pprint(keys), the output would -- look like this: -- -- { "hotkeys", "X", "Light Oven", "A", "Add Fuel" } -- -- The first array element is always the word "hotkeys". Notice -- also that a hotkeylist doesn't store the closures, they are -- silently ignored. The resulting array is in a format that can -- be returned directly to Unreal. -- -- Later, when the user presses a key, such as the "Light Oven" key, -- we will construct a "hotkeypress" object whose job is to record -- the name of the hotkey that was pressed, and the closure that -- goes with it. We populate this object as follows: -- -- local keys = hotkeypress.create("Light Oven") -- brickoven.lookhotkeys(keys) -- -- So as you can see, we're using the same 'brickoven.lookhotkeys' -- function, but this time, we've passed in a parameter of class -- hotkeypress instead of a parameter of class hotkeylist. This -- changes the behavior of the 'add' method: the add function of -- a hotkeylist stores all the hotkeys into the list. But the 'add' -- function of a hotkeypress only stores the one closure that -- we are interested in. If you were to pprint(keys), the result -- would look like this: -- -- { pressed="Light Oven", closure= } -- -- So the only data stored by a 'hotkeypress' object is the name -- of the pressed hotkey, and the closure that goes with it. -- ---------------------------------------------------------------- makeclass("hotkeylist") makeclass("hotkeypress") function hotkeylist.create() local result = { "hotkeys" } setmetatable(result, hotkeylist) return result end function hotkeylist.add(self, key, action, closure) table.insert(self, key) table.insert(self, action) end function hotkeypress.create(key) local result = { pressed=key } setmetatable(result, hotkeypress) return result end function hotkeypress.add(self, key, action, closure) if action == self.pressed then self.closure = closure end end