t_p6_api: build plugin scripting system
- Add PluginBase (plugin_base.gd) — abstract base class with 12 virtual hooks - Add PluginManifest (plugin_manifest.gd) — custom Resource for plugin metadata - Add PluginManager (plugin_manager.gd) — autoload singleton: directory scan, hook dispatch, lifecycle (load/unload/reload/rescan), cvar integration - Add hello_world example plugin with all hooks demonstrating usage - Register PluginManager autoload in project.godot - Extend rcon_command_handler.gd with 'plugin' subcommand (list/load/unload/ reload/info/rescan) delegating to PluginManager
This commit is contained in:
@@ -11,6 +11,10 @@ extends Node
|
||||
# help, echo/ping, status (engine-level stats), quit
|
||||
# cvarlist, cvar_get, cvar_set (via CvarRegistry singleton if available)
|
||||
#
|
||||
# Plugin commands are delegated to PluginManager singleton:
|
||||
# plugin list, plugin load, plugin unload, plugin reload,
|
||||
# plugin info, plugin rescan
|
||||
#
|
||||
# Commands dispatched via signal:
|
||||
# changelevel, kick, ban, unban, say, msg, players, exec
|
||||
#
|
||||
@@ -51,6 +55,8 @@ func handle_command(cmd: String, args: PackedStringArray) -> String:
|
||||
return _cmd_cvar_get(args)
|
||||
"cvar_set":
|
||||
return _cmd_cvar_set(args)
|
||||
"plugin":
|
||||
return _cmd_plugin(args)
|
||||
"say", "msg", "players", "changelevel", "kick", "ban", "unban", "exec":
|
||||
return _cmd_dispatch(cmd, args)
|
||||
_:
|
||||
@@ -76,6 +82,7 @@ func _cmd_help(_args: PackedStringArray) -> String:
|
||||
" cvarlist [pattern] List cvars (optional filter)",
|
||||
" cvar_get <name> Get a cvar's value",
|
||||
" cvar_set <name> <value> Set a writable cvar",
|
||||
" plugin <subcommand> [args] Plugin management (list/load/unload/reload/info/rescan)",
|
||||
" quit Shut down the server gracefully",
|
||||
]
|
||||
return "\r\n".join(lines) + "\r\n"
|
||||
@@ -215,6 +222,20 @@ func _cmd_cvar_set(args: PackedStringArray) -> String:
|
||||
|
||||
return "Cvar registry not available.\r\n"
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Plugin management — delegates to PluginManager singleton
|
||||
# ---------------------------------------------------------------------------
|
||||
func _cmd_plugin(args: PackedStringArray) -> String:
|
||||
# Try to find PluginManager singleton (autoload)
|
||||
var pm = get_node("/root/PluginManager")
|
||||
if not pm:
|
||||
return "PluginManager not available. Ensure PluginManager is registered as an autoload in project.godot.\r\n"
|
||||
|
||||
if not pm.has_method("rcon_command"):
|
||||
return "PluginManager does not support RCON commands.\r\n"
|
||||
|
||||
return pm.rcon_command(args)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Delegated commands — emit signal for game logic to handle
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user