FrameworkZ 10.8.3
Provides a framework for Project Zomboid with various systems.
Loading...
Searching...
No Matches
Plugins.lua
Go to the documentation of this file.
1local Events = Events
2
3--! \brief Plugins module for FrameworkZ. Extends the framework with modular plugins.
4--! \class FrameworkZ.Plugins
5FrameworkZ.Plugins = {}
6FrameworkZ.Plugins.__index = FrameworkZ.Plugins
7FrameworkZ.Plugins.RegisteredPlugins = {}
8FrameworkZ.Plugins.Commands = {}
9FrameworkZ.Plugins.LoadedPlugins = {}
10FrameworkZ.Plugins.EventHandlers = {}
11FrameworkZ.Plugins = FrameworkZ.Foundation:NewModule(FrameworkZ.Plugins, "Plugins")
12
13-- Define the base plugin metatable
14FrameworkZ.Plugins.BasePlugin = {}
15FrameworkZ.Plugins.BasePlugin.__index = FrameworkZ.Plugins.BasePlugin
16
17-- Function to initialize a new plugin
18function FrameworkZ.Plugins:CreatePlugin(name)
19 local plugin = setmetatable({}, self.BasePlugin)
20 plugin.Meta = {
21 Author = "N/A",
22 Name = name,
23 Description = "No description set.",
24 Version = "1.0.0",
25 Compatibility = ""
26 }
27
28 return plugin
29end
30
31-- TODO add to FrameworkZ.Utilities library?
32local function mergeTables(t1, t2)
33 for k, v in pairs(t2) do
34 if type(v) == "table" and type(t1[k]) == "table" then
35 mergeTables(t1[k], v)
36 else
37 t1[k] = v
38 end
39 end
40
41 return t1
42end
44--! \brief Register a plugin.
45--! \param pluginName \string The name of the plugin.
46--! \param pluginTable \table The table containing the plugin's functions and data.
47--! \param metadata \table Optional metadata for the plugin.
48function FrameworkZ.Plugins:RegisterPlugin(plugin, overwrite)
49 local name = plugin.Meta.Name
50
51 if not self.RegisteredPlugins[name] or overwrite then
52 self.RegisteredPlugins[name] = plugin
53 FrameworkZ.Foundation:RegisterPluginHandler(self.RegisteredPlugins[name])
54 else
55 FrameworkZ.Foundation:UnregisterPluginHandler(self.RegisteredPlugins[name])
56 self.RegisteredPlugins[name] = mergeTables(self.RegisteredPlugins[name], plugin)
57 FrameworkZ.Foundation:RegisterPluginHandler(self.RegisteredPlugins[name])
58 end
59
60 self:LoadPlugin(name)
61end
62
63function FrameworkZ.Plugins:GetPlugin(pluginName)
64 return self.RegisteredPlugins[pluginName]
65end
66
67--! \brief Load a registered plugin.
68--! \param pluginName \string The name of the plugin to load.
69function FrameworkZ.Plugins:LoadPlugin(pluginName)
70 local plugin = self.RegisteredPlugins[pluginName]
71 if plugin and not self.LoadedPlugins[pluginName] then
72 if plugin.Initialize then
73 plugin:Initialize()
74 end
75
76 self.LoadedPlugins[pluginName] = plugin
77 --self:RegisterPluginEventHandlers(plugin)
78 end
79end
80
81--! \brief Unload a loaded plugin.
82--! \param pluginName \string The name of the plugin to unload.
83function FrameworkZ.Plugins:UnloadPlugin(pluginName)
84 local plugin = self.LoadedPlugins[pluginName]
85 if plugin then
86 self:UnregisterPluginEventHandlers(plugin)
87
88 if plugin.Cleanup then
89 plugin:Cleanup()
90 end
91
92 self.LoadedPlugins[pluginName] = nil
93 end
94end
95
96--! \brief Register event handlers for a plugin.
97--! \param plugin \table The plugin table containing the functions.
98function FrameworkZ.Plugins:RegisterPluginEventHandlers(plugin)
99 for _, eventName in ipairs(self.EventHandlers) do
100 if plugin[eventName] then
101 FrameworkZ.Hooks:RegisterHandler(eventName, plugin[eventName], plugin, eventName)
102 end
103 end
104end
105
106--! \brief Unregister event handlers for a plugin.
107--! \param plugin \table The plugin table containing the functions.
108function FrameworkZ.Plugins:UnregisterPluginEventHandlers(plugin)
109 for _, eventName in ipairs(self.EventHandlers) do
110 if plugin[eventName] then
111 FrameworkZ.Hooks:UnregisterHandler(eventName, plugin[eventName], plugin, eventName)
112 end
113 end
114end
115
116--! \brief Add a new event handler to the list.
117--! \param eventName \string The name of the event handler to add.
118function FrameworkZ.Plugins:AddEventHandler(eventName)
119 table.insert(self.EventHandlers, eventName)
120end
121
122--! \brief Remove an event handler from the list.
123--! \param eventName \string The name of the event handler to remove.
124function FrameworkZ.Plugins:RemoveEventHandler(eventName)
125 for i, handler in ipairs(self.EventHandlers) do
126 if handler == eventName then
127 table.remove(self.EventHandlers, i)
128 break
129 end
130 end
131end
132
133--! \brief Unregister a specific hook for a plugin.
134--! \param pluginName \string The name of the plugin.
135--! \param hookName \string The name of the hook to unregister.
136function FrameworkZ.Plugins:UnregisterPluginHook(pluginName, hookName)
137 local plugin = self.LoadedPlugins[pluginName]
138 if plugin and plugin[hookName] then
139 FrameworkZ.Hooks:UnregisterHandler(hookName, plugin[hookName], plugin, hookName)
140 plugin[hookName] = nil
141 end
142end
143
144--! \brief Execute a hook for all loaded plugins.
145--! \param hookName \string The name of the hook to execute.
146--! \param ... \vararg Additional arguments to pass to the hook functions.
147function FrameworkZ.Plugins:ExecutePluginHook(hookName, ...)
148 for pluginName, plugin in pairs(self.LoadedPlugins) do
149 if plugin[hookName] then
150 local handlers = FrameworkZ.Hooks.RegisteredHooks[hookName]
151
152 if handlers then
153 for _, handler in ipairs(handlers) do
154 if handler.object and handler.functionName then
155 handler.handler(...)
156 else
157 plugin[hookName](...)
158 end
159 end
160 end
161 end
162 end
163end
164
165--! \brief Log a message for debugging purposes.
166--! \param message \string The message to log.
167function FrameworkZ.Plugins:Log(message)
168 print("[FrameworkZ.Plugins] " .. message)
169end
170
171--! \brief Register a custom command for a plugin.
172--! \param commandName \string The name of the command.
173--! \param callback \function The function to call when the command is executed.
174function FrameworkZ.Plugins:RegisterCommand(commandName, callback)
175 if not self.Commands then
176 self.Commands = {}
177 end
178 self.Commands[commandName] = callback
179end
180
181--! \brief Execute a custom command.
182--! \param commandName \string The name of the command.
183--! \param ... \vararg Additional arguments to pass to the command function.
184function FrameworkZ.Plugins:ExecuteCommand(commandName, ...)
185 local command = self.Commands and self.Commands[commandName]
186 if command then
187 command(...)
188 else
189 print("Command not found:", commandName)
190 end
191end
void type()
void local message
void self self
Definition MainMenu.lua:89
void t1()
void local Events()
void if type v()
void local name()
void plugin()
void local callback()
Plugins module for FrameworkZ. Extends the framework with modular plugins.
Definition Plugins.lua:5
FrameworkZ Plugins RegisteredPlugins
Definition Plugins.lua:9
void RegisterPlugin(plugin, overwrite)
Register a plugin.
void UnregisterPluginEventHandlers(plugin)
Unregister event handlers for a plugin.
void AddEventHandler(eventName)
Add a new event handler to the list.
void RemoveEventHandler(eventName)
Remove an event handler from the list.
FrameworkZ Plugins __index
Definition Plugins.lua:7
void UnloadPlugin(pluginName)
Unload a loaded plugin.
void RegisterCommand(commandName, callback)
Register a custom command for a plugin.
FrameworkZ Plugins BasePlugin
Definition Plugins.lua:19
void Log(message)
Log a message for debugging purposes.
void ExecuteCommand(commandName,...)
Execute a custom command.
void ExecutePluginHook(hookName,...)
Execute a hook for all loaded plugins.
void GetPlugin(pluginName)
FrameworkZ Plugins EventHandlers
Definition Plugins.lua:15
void UnregisterPluginHook(pluginName, hookName)
Unregister a specific hook for a plugin.
void CreatePlugin(name)
void LoadPlugin(pluginName)
Load a registered plugin.
void RegisterPluginEventHandlers(plugin)
Register event handlers for a plugin.
FrameworkZ Plugins LoadedPlugins
Definition Plugins.lua:13
FrameworkZ Plugins Commands
Definition Plugins.lua:11