cadastery/scripts/ui/chat.gd

77 lines
2.1 KiB
GDScript

class_name Chat
extends CanvasLayer
var open: bool = false
var _chat_message_scene := preload("res://scenes/ui/chat_message.tscn")
@onready var _msg_scroll: ScrollContainer = $MsgMargin/MsgVBox/MsgScroll
@onready
var _msg_container: Container = $MsgMargin/MsgVBox/MsgScroll/MsgMargin/MsgContainer
@onready var _msg_margin: Container = $MsgMargin/MsgVBox/MsgScroll/MsgMargin
@onready var _message_edit: LineEdit = $EditMargin/EditVBox/MessageEdit
func _ready() -> void:
_message_edit.text_submitted.connect(_on_message_edit_text_submitted)
_message_edit.visible = false
_msg_margin.minimum_size_changed.connect(_on_message_margin_minimum_size_changed)
Referencer.chat = self
func _exit_tree() -> void:
Referencer.chat = null
func _input(event: InputEvent) -> void:
if event.is_action_pressed("menu"):
call_deferred("_close")
func _unhandled_input(event: InputEvent) -> void:
if Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED:
return
if event.is_action_pressed("chat") and not open:
open = true
_message_edit.visible = true
_message_edit.grab_focus()
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
func _close() -> void:
open = false
_message_edit.release_focus()
_message_edit.visible = false
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
@rpc("any_peer", "call_local", "reliable", 1)
func _send_message(message: String) -> void:
var player_name := (
Networker.players[multiplayer.get_remote_sender_id()]["name"] as String
)
var message_node := _make_message_node(player_name, message)
_msg_container.add_child(message_node)
print(player_name + ": " + message)
func _make_message_node(player_name: String, message: String) -> RichTextLabel:
var node := _chat_message_scene.instantiate() as RichTextLabel
node.text = "[b]" + player_name + ":[/b] " + message
return node
func _on_message_edit_text_submitted(message: String) -> void:
if _message_edit.text == "":
return
_message_edit.text = ""
_send_message.rpc(message)
func _on_message_margin_minimum_size_changed() -> void:
_msg_scroll.set_deferred(
"scroll_vertical", int(_msg_scroll.get_v_scroll_bar().max_value) + 100
)