One_Eleven_Android/addons/godot-twicil/helpers/interactive_commands.gd
2024-11-10 03:34:28 +03:00

67 lines
2.1 KiB
GDScript

class_name InteractiveCommands
class FuncRefEx extends FuncRef:
func _init(instance:Object, method:String):
.set_instance(instance)
.set_function(method)
class InteractiveCommand:
var func_ref:FuncRef
var params_count:int
var variable_params_count:int
func _init(func_ref:FuncRef, params_count:int, variable_params_count:bool = false):
self.func_ref = func_ref
self.params_count = params_count
self.variable_params_count = variable_params_count
func call_command(params:Array)->void :
func_ref.call_func(params)
var interactive_commands = {}
func add(
chat_command:String,
target:Object,
method_name:String,
params_count:int = 1,
variable_params_count:bool = false
)->void :
interactive_commands[chat_command] = InteractiveCommand.new(
FuncRefEx.new(target, method_name) as FuncRef, params_count, variable_params_count)
func add_aliases(chat_command:String, new_aliases:Array)->void :
if interactive_commands.has(chat_command):
for new_alias in new_aliases:
interactive_commands[new_alias] = interactive_commands[chat_command]
func remove(chat_command:String)->void :
if interactive_commands.has(chat_command):
interactive_commands[chat_command]
interactive_commands.erase(chat_command)
func _on_message_recieved(sender:String, text:String, emotes:Array)->void :
var input_cmd:Array = text.split(" ")
for cmd in interactive_commands:
if input_cmd[0] == cmd:
if not interactive_commands[cmd].variable_params_count and input_cmd.size() - 1 < interactive_commands[cmd].params_count:
return
var params:Array = [sender]
var params_count:int = clamp(
input_cmd.size() - 1,
0,
interactive_commands[cmd].params_count
)
if params_count >= 1:
for i in range(params_count):
params.append(input_cmd[i + 1])
interactive_commands[cmd].call_command(params)