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:
2026-07-01 18:36:23 -04:00
parent ffa72a8f24
commit 159c554a86
7 changed files with 987 additions and 0 deletions
+21
View File
@@ -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
# ---------------------------------------------------------------------------