469 lines
15 KiB
GDScript
469 lines
15 KiB
GDScript
#玩家登录注册面板
|
||
extends PanelContainer
|
||
|
||
#玩家登录账号,用QQ号代替
|
||
@onready var username_input : LineEdit = $VBox/UserName/username_input
|
||
#用户登录密码
|
||
@onready var password_input : LineEdit = $VBox/Password1/password_input
|
||
#登录按钮
|
||
@onready var login_button : Button = $VBox/LoginRegister/login_button
|
||
|
||
#下面是注册相关的
|
||
#注册按钮
|
||
@onready var register_button : Button = $VBox/LoginRegister/register_button
|
||
#注册账号时二次确认密码
|
||
@onready var password_input_2 : LineEdit = $VBox/Password2/password_input2
|
||
#农场名称
|
||
@onready var farmname_input : LineEdit = $VBox/FarmName/farmname_input
|
||
#玩家昵称
|
||
@onready var playername_input :LineEdit = $VBox/PlayerName/playername_input
|
||
#邮箱验证码
|
||
@onready var verificationcode_input :LineEdit = $VBox/VerificationCode/verificationcode_input
|
||
#发送验证码按钮
|
||
@onready var send_button :Button = $VBox/VerificationCode/SendButton
|
||
#状态提示标签
|
||
@onready var status_label : Label = $VBox/status_label
|
||
|
||
# 记住密码选项
|
||
var remember_password : bool = true # 默认记住密码
|
||
|
||
# 引用主场景和全局函数
|
||
@onready var main_game = get_node("/root/main")
|
||
@onready var land_panel = get_node("/root/main/UI/LandPanel")
|
||
@onready var crop_store_panel = get_node("/root/main/UI/PlayerBagPanel")
|
||
@onready var player_ranking_panel = get_node("/root/main/UI/PlayerRankingPanel")
|
||
@onready var player_bag_panel = get_node("/root/main/UI/PlayerBagPanel")
|
||
@onready var tcp_network_manager = get_node("/root/main/UI/TCPNetworkManager")
|
||
|
||
# 准备函数
|
||
func _ready():
|
||
|
||
# 连接按钮信号
|
||
login_button.pressed.connect(self._on_login_button_pressed)
|
||
register_button.pressed.connect(self._on_register_button_pressed)
|
||
send_button.pressed.connect(self._on_send_button_pressed)
|
||
|
||
# 加载保存的登录信息
|
||
_load_login_info()
|
||
|
||
# 显示客户端版本号
|
||
_display_version_info()
|
||
|
||
# 处理登录按钮点击
|
||
func _on_login_button_pressed():
|
||
var user_name = username_input.text.strip_edges() # 修剪前后的空格
|
||
var user_password = password_input.text.strip_edges()
|
||
var farmname = farmname_input.text.strip_edges()
|
||
|
||
if user_name == "" or user_password == "":
|
||
status_label.text = "用户名或密码不能为空!"
|
||
status_label.modulate = Color.RED
|
||
return
|
||
|
||
# 检查网络连接状态
|
||
if !tcp_network_manager.client.is_client_connected():
|
||
status_label.text = "未连接到服务器,正在尝试连接..."
|
||
status_label.modulate = Color.YELLOW
|
||
# 尝试自动连接到服务器
|
||
tcp_network_manager.connect_to_current_server()
|
||
await get_tree().create_timer(2.0).timeout
|
||
|
||
# 再次检查连接状态
|
||
if !tcp_network_manager.client.is_client_connected():
|
||
status_label.text = "连接服务器失败,正在尝试其他服务器..."
|
||
status_label.modulate = Color.YELLOW
|
||
# 等待自动服务器切换完成
|
||
await get_tree().create_timer(3.0).timeout
|
||
|
||
|
||
# 禁用按钮,防止重复点击
|
||
login_button.disabled = true
|
||
|
||
status_label.text = "正在登录,请稍候..."
|
||
status_label.modulate = Color.YELLOW
|
||
|
||
# 如果启用了记住密码,保存登录信息
|
||
if remember_password:
|
||
_save_login_info(user_name, user_password)
|
||
|
||
tcp_network_manager.sendLoginInfo(user_name, user_password)
|
||
|
||
# 更新主游戏数据
|
||
main_game.user_name = user_name
|
||
main_game.user_password = user_password
|
||
|
||
# 5秒后重新启用按钮(如果没有收到响应)
|
||
await get_tree().create_timer(5.0).timeout
|
||
if login_button.disabled:
|
||
login_button.disabled = false
|
||
status_label.text = "登录超时,请重试!"
|
||
status_label.modulate = Color.RED
|
||
|
||
# 处理验证码发送按钮点击
|
||
func _on_send_button_pressed():
|
||
var user_name = username_input.text.strip_edges()
|
||
|
||
if user_name == "":
|
||
status_label.text = "请输入QQ号以接收验证码!"
|
||
status_label.modulate = Color.RED
|
||
return
|
||
|
||
if !is_valid_qq_number(user_name):
|
||
status_label.text = "请输入正确的QQ号码(5-12位数字)!"
|
||
status_label.modulate = Color.RED
|
||
return
|
||
|
||
# 检查网络连接状态
|
||
if !tcp_network_manager.client.is_client_connected():
|
||
status_label.text = "未连接到服务器,正在尝试连接..."
|
||
status_label.modulate = Color.YELLOW
|
||
# 尝试自动连接到服务器
|
||
tcp_network_manager.connect_to_current_server()
|
||
await get_tree().create_timer(2.0).timeout
|
||
|
||
# 再次检查连接状态
|
||
if !tcp_network_manager.client.is_client_connected():
|
||
status_label.text = "连接服务器失败,正在尝试其他服务器..."
|
||
status_label.modulate = Color.YELLOW
|
||
# 等待自动服务器切换完成
|
||
await get_tree().create_timer(3.0).timeout
|
||
|
||
|
||
# 禁用按钮,防止重复点击
|
||
send_button.disabled = true
|
||
|
||
status_label.text = "正在发送验证码,请稍候..."
|
||
status_label.modulate = Color.YELLOW
|
||
|
||
# 发送验证码请求
|
||
tcp_network_manager.sendVerificationCodeRequest(user_name)
|
||
|
||
# 60秒后重新启用按钮(或收到响应后提前启用)
|
||
var timer = 60
|
||
while timer > 0 and send_button.disabled:
|
||
send_button.text = "重新发送(%d)" % timer
|
||
await get_tree().create_timer(1.0).timeout
|
||
timer -= 1
|
||
|
||
if send_button.disabled:
|
||
send_button.disabled = false
|
||
send_button.text = "发送验证码"
|
||
|
||
if status_label.text == "正在发送验证码,请稍候...":
|
||
status_label.text = "验证码发送超时,请重试!"
|
||
status_label.modulate = Color.RED
|
||
|
||
# 处理注册按钮点击
|
||
func _on_register_button_pressed():
|
||
var user_name = username_input.text.strip_edges()
|
||
var user_password = password_input.text.strip_edges()
|
||
var user_password_2 = password_input_2.text.strip_edges()
|
||
var farmname = farmname_input.text.strip_edges()
|
||
var player_name = playername_input.text.strip_edges()
|
||
var verification_code = verificationcode_input.text.strip_edges()
|
||
|
||
# 检查密码格式(只允许数字和字母)
|
||
if not is_valid_password(user_password):
|
||
status_label.text = "密码只能包含数字和字母!"
|
||
status_label.modulate = Color.RED
|
||
return
|
||
|
||
if user_name == "" or user_password == "":
|
||
status_label.text = "用户名或密码不能为空!"
|
||
status_label.modulate = Color.RED
|
||
return
|
||
if farmname == "":
|
||
status_label.text = "农场名称不能为空!"
|
||
status_label.modulate = Color.RED
|
||
return
|
||
if user_password != user_password_2:
|
||
status_label.text = "两次输入的密码不一致!"
|
||
status_label.modulate = Color.RED
|
||
return
|
||
|
||
if !is_valid_qq_number(user_name):
|
||
status_label.text = "请输入正确的QQ号码(5-12位数字)!"
|
||
status_label.modulate = Color.RED
|
||
return
|
||
|
||
if verification_code == "":
|
||
status_label.text = "请输入验证码!"
|
||
status_label.modulate = Color.RED
|
||
return
|
||
|
||
# 检查网络连接状态
|
||
if !tcp_network_manager.client.is_client_connected():
|
||
status_label.text = "未连接到服务器,正在尝试连接..."
|
||
status_label.modulate = Color.YELLOW
|
||
# 尝试自动连接到服务器
|
||
tcp_network_manager.connect_to_current_server()
|
||
await get_tree().create_timer(2.0).timeout
|
||
|
||
# 再次检查连接状态
|
||
if !tcp_network_manager.client.is_client_connected():
|
||
status_label.text = "连接服务器失败,正在尝试其他服务器..."
|
||
status_label.modulate = Color.YELLOW
|
||
# 等待自动服务器切换完成
|
||
await get_tree().create_timer(3.0).timeout
|
||
|
||
|
||
# 禁用按钮,防止重复点击
|
||
register_button.disabled = true
|
||
|
||
status_label.text = "正在注册,请稍候..."
|
||
status_label.modulate = Color.YELLOW
|
||
|
||
# 发送注册请求
|
||
tcp_network_manager.sendRegisterInfo(user_name, user_password, farmname, player_name, verification_code)
|
||
|
||
# 更新主游戏数据
|
||
main_game.user_name = user_name
|
||
main_game.user_password = user_password
|
||
main_game.farmname = farmname
|
||
|
||
# 5秒后重新启用按钮(如果没有收到响应)
|
||
await get_tree().create_timer(5.0).timeout
|
||
if register_button.disabled:
|
||
register_button.disabled = false
|
||
status_label.text = "注册超时,请重试!"
|
||
status_label.modulate = Color.RED
|
||
|
||
# 处理验证码发送响应
|
||
func _on_verification_code_response(success: bool, message: String):
|
||
if success:
|
||
status_label.text = message
|
||
status_label.modulate = Color.GREEN
|
||
else:
|
||
status_label.text = message
|
||
status_label.modulate = Color.RED
|
||
send_button.disabled = false
|
||
send_button.text = "发送验证码"
|
||
|
||
# 处理验证码验证响应
|
||
func _on_verify_code_response(success: bool, message: String):
|
||
if success:
|
||
status_label.text = message
|
||
status_label.modulate = Color.GREEN
|
||
else:
|
||
status_label.text = message
|
||
status_label.modulate = Color.RED
|
||
|
||
# 验证QQ号是否有效
|
||
func is_valid_qq_number(qq_number: String) -> bool:
|
||
# QQ号的标准格式是5到12位的数字
|
||
var qq_regex = RegEx.new()
|
||
var pattern = r"^\d{5,12}$"
|
||
|
||
var error = qq_regex.compile(pattern)
|
||
if error != OK:
|
||
status_label.text = "QQ号验证失败部错误"
|
||
status_label.modulate = Color.RED
|
||
return false
|
||
|
||
return qq_regex.search(qq_number) != null
|
||
|
||
# 添加密码验证函数
|
||
func is_valid_password(password: String) -> bool:
|
||
# 使用正则表达式检查是否只包含数字和字母
|
||
var pattern = r"^[a-zA-Z0-9]+$"
|
||
return password.match(pattern) != null
|
||
|
||
# 处理登录响应
|
||
func _on_login_response_received(success: bool, message: String, user_data: Dictionary):
|
||
# 启用按钮
|
||
login_button.disabled = false
|
||
|
||
if success:
|
||
status_label.text = "登录成功!正在加载游戏..."
|
||
status_label.modulate = Color.GREEN
|
||
|
||
# 保存登录数据到主游戏
|
||
main_game.login_data = user_data.duplicate()
|
||
|
||
# 更新主游戏数据
|
||
main_game.experience = user_data.get("experience", 0)
|
||
main_game.farm_lots = user_data.get("farm_lots", [])
|
||
main_game.level = user_data.get("level", 1)
|
||
main_game.money = user_data.get("money", 0)
|
||
main_game.stamina = user_data.get("体力值", 20)
|
||
main_game.show_farm_name.text = "农场名称:"+user_data.get("farm_name", "")
|
||
main_game.show_player_name.text = "玩家昵称:"+user_data.get("player_name", "")
|
||
farmname_input.text = user_data.get("farm_name", "")
|
||
|
||
# 加载玩家背包数据
|
||
if user_data.has("player_bag"):
|
||
main_game.player_bag = user_data.get("player_bag", [])
|
||
else:
|
||
main_game.player_bag = []
|
||
|
||
main_game.start_game = true
|
||
self.hide()
|
||
|
||
# 确保在更新数据后调用主游戏的 UI 更新函数
|
||
main_game._update_ui()
|
||
main_game._refresh_farm_lots()
|
||
player_bag_panel.update_player_bag_ui()
|
||
|
||
# 调用主游戏的登录成功处理函数
|
||
main_game.handle_login_success(user_data)
|
||
else:
|
||
status_label.text = "登录失败:" + message
|
||
status_label.modulate = Color.RED
|
||
|
||
# 如果登录失败且是密码错误,可以选择清除保存的信息
|
||
if "密码" in message or "password" in message.to_lower():
|
||
print("登录失败,可能是密码错误。如需清除保存的登录信息,请调用_clear_login_info()")
|
||
|
||
# 处理注册响应
|
||
func _on_register_response_received(success: bool, message: String):
|
||
# 启用按钮
|
||
register_button.disabled = false
|
||
|
||
if success:
|
||
status_label.text = "注册成功!请登录游戏"
|
||
status_label.modulate = Color.GREEN
|
||
|
||
# 注册成功后,如果启用了记住密码,保存登录信息
|
||
if remember_password:
|
||
var user_name = username_input.text.strip_edges()
|
||
var user_password = password_input.text.strip_edges()
|
||
_save_login_info(user_name, user_password)
|
||
|
||
# 清除注册相关的输入框
|
||
password_input_2.text = ""
|
||
verificationcode_input.text = ""
|
||
else:
|
||
status_label.text = "注册失败:" + message
|
||
status_label.modulate = Color.RED
|
||
|
||
# 保存登录信息到JSON文件
|
||
func _save_login_info(user_name: String, password: String):
|
||
var login_data = {
|
||
"user_name": user_name,
|
||
"password": password
|
||
}
|
||
|
||
var file = FileAccess.open("user://login.json", FileAccess.WRITE)
|
||
if file:
|
||
var json_string = JSON.stringify(login_data, "\t")
|
||
file.store_string(json_string)
|
||
file.close()
|
||
print("登录信息已保存")
|
||
else:
|
||
print("无法保存登录信息")
|
||
|
||
# 从JSON文件加载登录信息
|
||
func _load_login_info():
|
||
var file = FileAccess.open("user://login.json", FileAccess.READ)
|
||
if file:
|
||
var json_text = file.get_as_text()
|
||
file.close()
|
||
|
||
var json = JSON.new()
|
||
var parse_result = json.parse(json_text)
|
||
if parse_result == OK:
|
||
var login_data = json.get_data()
|
||
if login_data.has("user_name") and login_data.has("password"):
|
||
var saved_username = login_data.get("user_name", "")
|
||
var saved_password = login_data.get("password", "")
|
||
|
||
if saved_username != "" and saved_password != "":
|
||
username_input.text = saved_username
|
||
password_input.text = saved_password
|
||
status_label.text = "已加载保存的登录信息"
|
||
status_label.modulate = Color.CYAN
|
||
print("登录信息已加载:用户名 =", saved_username)
|
||
else:
|
||
status_label.text = "欢迎使用萌芽农场"
|
||
status_label.modulate = Color.WHITE
|
||
print("没有有效的保存登录信息")
|
||
else:
|
||
print("登录信息格式错误")
|
||
else:
|
||
print("登录信息JSON解析错误:", json.get_error_message())
|
||
else:
|
||
# 创建默认的登录信息文件
|
||
_save_login_info("", "")
|
||
status_label.text = "欢迎使用萌芽农场"
|
||
status_label.modulate = Color.WHITE
|
||
print("没有找到保存的登录信息,已创建默认文件")
|
||
|
||
# 清除保存的登录信息
|
||
func _clear_login_info():
|
||
var file = FileAccess.open("user://login.json", FileAccess.WRITE)
|
||
if file:
|
||
var empty_data = {
|
||
"user_name": "",
|
||
"password": ""
|
||
}
|
||
var json_string = JSON.stringify(empty_data, "\t")
|
||
file.store_string(json_string)
|
||
file.close()
|
||
print("登录信息已清除")
|
||
else:
|
||
print("无法清除登录信息")
|
||
|
||
# 切换记住密码选项
|
||
func toggle_remember_password():
|
||
remember_password = !remember_password
|
||
print("记住密码选项:", "开启" if remember_password else "关闭")
|
||
|
||
# 如果关闭了记住密码,清除已保存的信息
|
||
if not remember_password:
|
||
_clear_login_info()
|
||
|
||
# 检查是否有保存的登录信息
|
||
func has_saved_login_info() -> bool:
|
||
var file = FileAccess.open("user://login.json", FileAccess.READ)
|
||
if file:
|
||
var json_text = file.get_as_text()
|
||
file.close()
|
||
|
||
var json = JSON.new()
|
||
var parse_result = json.parse(json_text)
|
||
if parse_result == OK:
|
||
var login_data = json.get_data()
|
||
var user_name = login_data.get("user_name", "")
|
||
var password = login_data.get("password", "")
|
||
return user_name != "" and password != ""
|
||
|
||
return false
|
||
|
||
# 快捷登录(使用保存的登录信息)
|
||
func quick_login():
|
||
if has_saved_login_info():
|
||
var user_name = username_input.text.strip_edges()
|
||
var user_password = password_input.text.strip_edges()
|
||
|
||
if user_name != "" and user_password != "":
|
||
print("执行快捷登录...")
|
||
_on_login_button_pressed()
|
||
else:
|
||
status_label.text = "保存的登录信息不完整"
|
||
status_label.modulate = Color.ORANGE
|
||
else:
|
||
status_label.text = "没有保存的登录信息"
|
||
status_label.modulate = Color.ORANGE
|
||
|
||
# 获取保存的用户名(用于调试或显示)
|
||
func get_saved_username() -> String:
|
||
var file = FileAccess.open("user://login.json", FileAccess.READ)
|
||
if file:
|
||
var json_text = file.get_as_text()
|
||
file.close()
|
||
|
||
var json = JSON.new()
|
||
var parse_result = json.parse(json_text)
|
||
if parse_result == OK:
|
||
var login_data = json.get_data()
|
||
return login_data.get("user_name", "")
|
||
|
||
return ""
|
||
|
||
# 显示版本信息
|
||
func _display_version_info():
|
||
# 在状态标签中显示客户端版本信息
|
||
if status_label.text == "欢迎使用萌芽农场" or status_label.text == "连接状态":
|
||
status_label.text = "萌芽农场 v" + main_game.client_version + " - 欢迎使用"
|
||
status_label.modulate = Color.CYAN
|