Files
whale_town/Scripts/UI/ChatHUD.gd
WangXiang 6119faf53e init
2025-12-22 18:57:51 +08:00

72 lines
2.5 KiB
GDScript

extends CanvasLayer
@onready var chat_log = $PanelContainer/VBoxContainer/RichTextLabel
@onready var input_field = $PanelContainer/VBoxContainer/LineEdit
var private_target_id: int = -1
var private_target_name: String = ""
func _ready():
NetworkManager.chat_message_received.connect(_on_chat_message_received)
NetworkManager.private_chat_message_received.connect(_on_private_message_received)
input_field.text_submitted.connect(_on_text_submitted)
func _input(event):
if event.is_action_pressed("ui_cancel"): # ESC
set_private_target(-1, "")
input_field.release_focus()
elif event.is_action_pressed("ui_accept"): # Enter
if not input_field.has_focus():
input_field.grab_focus()
get_viewport().set_input_as_handled()
func set_private_target(id: int, p_name: String):
private_target_id = id
private_target_name = p_name
if id != -1:
input_field.placeholder_text = "[Private] To " + p_name + "..."
input_field.add_theme_color_override("font_color", Color(1, 0.5, 1)) # Pink for private
# input_field.grab_focus() # Don't grab focus automatically, let user move
else:
input_field.placeholder_text = "Press Enter to chat..."
input_field.remove_theme_color_override("font_color")
func _on_text_submitted(new_text):
if new_text.strip_edges().is_empty():
input_field.release_focus()
return
if private_target_id != -1:
NetworkManager.send_private_message(private_target_id, new_text)
# Show my own private message in log
chat_log.append_text("[color=#FF88FF][Private -> %s]: %s[/color]\n" % [private_target_name, new_text])
else:
NetworkManager.send_message(new_text)
input_field.clear()
input_field.release_focus()
func _on_chat_message_received(sender_id, text):
var sender_name = str(sender_id)
print("Chat Debug: Msg from ", sender_id, " (Type: ", typeof(sender_id), ")")
print("Known Players: ", NetworkManager.players.keys())
if NetworkManager.players.has(sender_id):
sender_name = NetworkManager.players[sender_id].get("name", str(sender_id))
# Debug empty name
if sender_name == "":
sender_name = "Player_" + str(sender_id)
else:
print("Chat Debug: Player ID not found in NetworkManager.players")
chat_log.append_text("[color=yellow]%s[/color]: %s\n" % [sender_name, text])
func _on_private_message_received(sender_id, text):
var sender_name = str(sender_id)
if NetworkManager.players.has(sender_id):
sender_name = NetworkManager.players[sender_id].get("name", str(sender_id))
chat_log.append_text("[color=#FF88FF][Private From %s]: %s[/color]\n" % [sender_name, text])