class_name ChatMenu extends Control #region Onready Variables @onready var scroll_container = $AspectRatioContainer/MarginContainer/VBoxContainer/ScrollContainer @onready var command_text_edit = $AspectRatioContainer/MarginContainer/VBoxContainer/CommandScrollContainer/CommandTextEdit @onready var message_container = $AspectRatioContainer/MarginContainer/VBoxContainer/ScrollContainer/MessageContainer @onready var visible_timer = $VisibleTimer #endregion #region Variables var opened : bool = false var clear_command_text : bool = false #endregion #region Signals signal chat_opened() signal spawn_item(item_name : String, x : String, y : String, z : String) signal lobby_move(x : String, z : String) #endregion #region Godot Functions func _ready() -> void: hide() opened = false command_text_edit.gui_input.connect(_command_text_edit_gui_input) visible_timer.timeout.connect(hide) func _process(_delta : float): if clear_command_text == true: command_text_edit.text = "" clear_command_text = false if opened == true: if Input.is_action_just_pressed("pause"): remove_focus() visible_timer.start() return if Input.is_action_just_pressed("open_chat"): visible_timer.stop() chat_opened.emit() show() focus() if Input.is_action_just_pressed("open_chat_as_command"): visible_timer.stop() command_text_edit.text = "/" chat_opened.emit() show() focus() command_text_edit.set_caret_column(1, false, 0) #endregion #region Public Functions func focus(): mouse_filter = Control.MOUSE_FILTER_STOP opened = true Global.in_menu = true command_text_edit.grab_focus() func remove_focus(): mouse_filter = Control.MOUSE_FILTER_IGNORE opened = false command_text_edit.release_focus() Global.in_menu = false func send_message(message : String, keep_focus : bool, label_color : Color = Color(1, 1, 1, 1)): visible_timer.stop() show() var message_label : Label = Label.new() message_label.text = message message_label.label_settings = LabelSettings.new() message_label.label_settings.font_color = label_color message_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART message_container.add_child(message_label) if keep_focus == false: remove_focus() visible_timer.start() get_tree().create_timer(0.01).timeout.connect( func() -> void: scroll_container.scroll_vertical = scroll_container.get_v_scroll_bar().max_value ) #endregion #region Signal Functions func _command_text_edit_gui_input(event : InputEvent): if event.is_action_pressed("chat_send"): send_message(command_text_edit.text, false) check_command(command_text_edit.text) clear_command_text = true #endregion #region "Private" Functions func check_command(command : String): command.strip_edges(true, true) if command.begins_with("/") == false: return if Global.is_admin == false: send_message("Cannot run command without admin status", false) return command = command.lstrip("/") # ~ SPAWN ~ # if command.begins_with("spawn ") or command == "spawn": command = command.lstrip("spawn ") command = command.trim_prefix(" ") #get the item name and check that it exists var item_next_space : int = command.find(" ") if item_next_space == -1: send_message("Spawn Syntax error, spawn command looks like `spawn x y z`", false, Color(1, 0, 0, 1)) return var item_name : String = command.substr(0, item_next_space) command = command.lstrip(item_name) command = command.trim_prefix(" ") # if EntityResource.ids_by_name.has(item_name) == false: # var entity_names = "" # for key in EntityResource.data: # if EntityResource.data[key].spawnable == false: # continue # entity_names += EntityResource.data[key].name + " " # send_message("Entity: \"" + item_name + "\" was not found, cannot spawn. Entity List is: " + entity_names, false, Color(1, 0, 0, 1)) # return #get x item_next_space = command.find(" ") if item_next_space == -1: send_message("Spawn Syntax error, spawn command looks like `spawn x y z`", false, Color(1, 0, 0, 1)) return var x_name : String = command.substr(0, item_next_space) command = command.lstrip(x_name) command = command.trim_prefix(" ") if x_name != "~" and x_name.is_valid_int() == false: send_message("Spawn Syntax error: x value was not ~ or int", false, Color(1, 0, 0, 1)) return #get y item_next_space = command.find(" ") if item_next_space == -1: send_message("Spawn Syntax error, spawn command looks like `spawn x y z`", false, Color(1, 0, 0, 1)) return var y_name : String = command.substr(0, item_next_space) command = command.lstrip(y_name) command = command.trim_prefix(" ") if y_name != "~" and y_name.is_valid_int() == false: send_message("Spawn Syntax error: y value was not ~ or int", false, Color(1, 0, 0, 1)) return #check z (which is what is left in command) command = command.trim_prefix(" ") command = command.trim_suffix(" ") if command == "": send_message("Spawn Syntax error, spawn command looks like `spawn x y z`", false, Color(1, 0, 0, 1)) if command != "~" and command.is_valid_int() == false: send_message("Item Spawn Syntax error: z value was not ~ or int", false, Color(1, 0, 0, 1)) return #call spawn item spawn_item.emit(item_name, x_name, y_name, command) return # ~ LOBBY ~ # if command.begins_with("lobby ") or command == "lobby": command = command.lstrip("lobby ") command = command.trim_prefix(" ") #get the type name and check that it exists var type_next_space : int = command.find(" ") if type_next_space == -1: send_message("Lobby Syntax error, lobby command looks like `lobby [args]`", false, Color(1, 0, 0, 1)) return # ~ move ~ # if command.begins_with("move ") or command == "move": command = command.lstrip("move ") command = command.trim_prefix(" ") #error check for if there is no position if command == "": send_message("Lobby Move Syntax error, lobby move command looks like `lobby move x z`", false, Color(1, 0, 0, 1)) return #get x var position_space : int = command.find(" ") if position_space == -1: send_message("Lobby Move Syntax error, lobby move command looks like `lobby move x z`", false, Color(1, 0, 0, 1)) return var x_name : String = command.substr(0, position_space) command = command.lstrip(x_name) command = command.trim_prefix(" ") if x_name != "~" and x_name.is_valid_int() == false: send_message("Lobby Move Syntax error: x value was not ~ or int", false, Color(1, 0, 0, 1)) return #check z (which is what is left in command) command = command.trim_prefix(" ") command = command.trim_suffix(" ") if command == "": send_message("Lobby Move Syntax error, lobby move command looks like `lobby move x z`", false, Color(1, 0, 0, 1)) if command != "~" and command.is_valid_int() == false: send_message("Lobby Move Syntax error: z value was not ~ or int", false, Color(1, 0, 0, 1)) return #call spawn item lobby_move.emit(x_name, command) return #endregion