67 lines
2.1 KiB
GDScript
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)
|