From 6e1c295a4d4d0a7da09894036b61417fe3703ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=91=E8=90=8C=E8=8A=BD?= <3205788256@qq.com> Date: Mon, 21 Jul 2025 08:08:54 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"=E7=BB=A7=E7=BB=AD=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E6=95=B0=E6=8D=AE"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 2e696cab8715eeff7b5397ca2b658fe9445f2be0. --- Script/BigPanel/LoginPanel.gd | 656 ++++-- Script/SmallPanel/AccountSettingPanel.gd | 9 +- Server/SMYMongoDBAPI.py | 69 - Server/TCPGameServer.py | 23 +- .../__pycache__/SMYMongoDBAPI.cpython-313.pyc | Bin 34661 -> 33024 bytes .../__pycache__/TCPGameServer.cpython-313.pyc | Bin 357065 -> 356177 bytes .../config/initial_player_data_template.json | 51 +- Server/config/verification_codes.json | 1 - Server/game_saves/2143323382.json | 48 +- Server/game_saves/2804775686.json | 2099 ----------------- Server/migrate_crop_data_to_mongodb.py | 118 - Server/test_crop_data_migration.py | 142 -- server/game_saves/3205788256.json | 69 +- 13 files changed, 483 insertions(+), 2802 deletions(-) delete mode 100644 Server/config/verification_codes.json delete mode 100644 Server/game_saves/2804775686.json delete mode 100644 Server/migrate_crop_data_to_mongodb.py delete mode 100644 Server/test_crop_data_migration.py diff --git a/Script/BigPanel/LoginPanel.gd b/Script/BigPanel/LoginPanel.gd index 3a95826..e8029ff 100644 --- a/Script/BigPanel/LoginPanel.gd +++ b/Script/BigPanel/LoginPanel.gd @@ -110,16 +110,36 @@ func _on_forget_password_button_pressed(): # 处理登录按钮点击 func _on_login_button_pressed(): - var user_name = username_input.text.strip_edges() + password_2.hide() + verification_code.hide() + player_name.hide() + farm_name.hide() + + + + var user_name = username_input.text.strip_edges() # 修剪前后的空格 var user_password = password_input.text.strip_edges() + var farmname = farmname_input.text.strip_edges() - # 验证输入 - if not _validate_login_input(user_name, user_password, status_label): + if user_name == "" or user_password == "": + status_label.text = "用户名或密码不能为空!" + status_label.modulate = Color.RED return - # 检查网络连接 - if not await _ensure_network_connection(status_label): - return + # 检查网络连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label.text = "未连接到服务器,正在尝试连接..." + status_label.modulate = Color.YELLOW + # 尝试自动连接到服务器 + tcp_network_manager_panel.connect_to_current_server() + await get_tree().create_timer(2.0).timeout + + # 再次检查连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label.text = "连接服务器失败,正在尝试其他服务器..." + status_label.modulate = Color.YELLOW + # 等待自动服务器切换完成 + await get_tree().create_timer(3.0).timeout # 禁用按钮,防止重复点击 @@ -149,13 +169,30 @@ func _on_login_button_pressed(): func _on_send_button_pressed(): var user_name = register_username_input.text.strip_edges() - # 验证输入 - if not _validate_qq_input(user_name, status_label_2): + if user_name == "": + status_label_2.text = "请输入QQ号以接收验证码!" + status_label_2.modulate = Color.RED + return + + if !is_valid_qq_number(user_name): + status_label_2.text = "请输入正确的QQ号码(5-12位数字)!" + status_label_2.modulate = Color.RED return - # 检查网络连接 - if not await _ensure_network_connection(status_label_2): - return + # 检查网络连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_2.text = "未连接到服务器,正在尝试连接..." + status_label_2.modulate = Color.YELLOW + # 尝试自动连接到服务器 + tcp_network_manager_panel.connect_to_current_server() + await get_tree().create_timer(2.0).timeout + + # 再次检查连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_2.text = "连接服务器失败,正在尝试其他服务器..." + status_label_2.modulate = Color.YELLOW + # 等待自动服务器切换完成 + await get_tree().create_timer(3.0).timeout # 禁用按钮,防止重复点击 @@ -186,18 +223,55 @@ func _on_send_button_pressed(): func _on_register_button_2_pressed(): var user_name = register_username_input.text.strip_edges() var user_password = password_input_1.text.strip_edges() - var password_confirm = password_input_2.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 farm_name = farmname_input.text.strip_edges() var verification_code = verificationcode_input.text.strip_edges() - # 验证输入 - if not _validate_register_input(user_name, user_password, password_confirm, player_name, farm_name, verification_code, status_label_2): + # 检查密码格式(只允许数字和字母) + if not is_valid_password(user_password): + status_label_2.text = "密码只能包含数字和字母!" + status_label_2.modulate = Color.RED return - # 检查网络连接 - if not await _ensure_network_connection(status_label_2): + if user_name == "" or user_password == "": + status_label_2.text = "用户名或密码不能为空!" + status_label_2.modulate = Color.RED return + if farmname == "": + status_label_2.text = "农场名称不能为空!" + status_label_2.modulate = Color.RED + return + if user_password != user_password_2: + status_label_2.text = "两次输入的密码不一致!" + status_label_2.modulate = Color.RED + return + + if !is_valid_qq_number(user_name): + status_label_2.text = "请输入正确的QQ号码(5-12位数字)!" + status_label_2.modulate = Color.RED + return + + if verification_code == "": + status_label_2.text = "请输入验证码!" + status_label_2.modulate = Color.RED + return + + # 检查网络连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_2.text = "未连接到服务器,正在尝试连接..." + status_label_2.modulate = Color.YELLOW + # 尝试自动连接到服务器 + tcp_network_manager_panel.connect_to_current_server() + await get_tree().create_timer(2.0).timeout + + # 再次检查连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_2.text = "连接服务器失败,正在尝试其他服务器..." + status_label_2.modulate = Color.YELLOW + # 等待自动服务器切换完成 + await get_tree().create_timer(3.0).timeout + # 禁用按钮,防止重复点击 register_button_2.disabled = true @@ -205,8 +279,13 @@ func _on_register_button_2_pressed(): status_label_2.text = "正在注册,请稍候..." status_label_2.modulate = Color.YELLOW - # 发送注册请求 - tcp_network_manager_panel.sendRegisterInfo(user_name, user_password, player_name, farm_name, verification_code) + # 发送注册请求 + tcp_network_manager_panel.sendRegisterInfo(user_name, user_password, farmname, player_name, verification_code) + + # 更新主游戏数据 + main_game.user_name = user_name + main_game.user_password = user_password + # farmname 直接在注册成功后通过UI更新,这里不需要设置 # 5秒后重新启用按钮(如果没有收到响应) await get_tree().create_timer(5.0).timeout @@ -219,13 +298,30 @@ func _on_register_button_2_pressed(): func _on_forget_send_button_pressed(): var user_name = forget_username_input.text.strip_edges() - # 验证输入 - if not _validate_qq_input(user_name, status_label_3): + if user_name == "": + status_label_3.text = "请输入QQ号以接收验证码!" + status_label_3.modulate = Color.RED + return + + if !is_valid_qq_number(user_name): + status_label_3.text = "请输入正确的QQ号码(5-12位数字)!" + status_label_3.modulate = Color.RED return - # 检查网络连接 - if not await _ensure_network_connection(status_label_3): - return + # 检查网络连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_3.text = "未连接到服务器,正在尝试连接..." + status_label_3.modulate = Color.YELLOW + # 尝试自动连接到服务器 + tcp_network_manager_panel.connect_to_current_server() + await get_tree().create_timer(2.0).timeout + + # 再次检查连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_3.text = "连接服务器失败,正在尝试其他服务器..." + status_label_3.modulate = Color.YELLOW + # 等待自动服务器切换完成 + await get_tree().create_timer(3.0).timeout # 禁用按钮,防止重复点击 forget_send_button.disabled = true @@ -257,13 +353,41 @@ func _on_forget_password_confirm_pressed(): var new_password = new_password_input.text.strip_edges() var verification_code = forget_verificationcode_input.text.strip_edges() - # 验证输入 - if not _validate_forget_password_input(user_name, new_password, verification_code, status_label_3): + # 检查密码格式(只允许数字和字母) + if not is_valid_password(new_password): + status_label_3.text = "密码只能包含数字和字母!" + status_label_3.modulate = Color.RED return - # 检查网络连接 - if not await _ensure_network_connection(status_label_3): + if user_name == "" or new_password == "": + status_label_3.text = "用户名或新密码不能为空!" + status_label_3.modulate = Color.RED return + + if !is_valid_qq_number(user_name): + status_label_3.text = "请输入正确的QQ号码(5-12位数字)!" + status_label_3.modulate = Color.RED + return + + if verification_code == "": + status_label_3.text = "请输入验证码!" + status_label_3.modulate = Color.RED + return + + # 检查网络连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_3.text = "未连接到服务器,正在尝试连接..." + status_label_3.modulate = Color.YELLOW + # 尝试自动连接到服务器 + tcp_network_manager_panel.connect_to_current_server() + await get_tree().create_timer(2.0).timeout + + # 再次检查连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_3.text = "连接服务器失败,正在尝试其他服务器..." + status_label_3.modulate = Color.YELLOW + # 等待自动服务器切换完成 + await get_tree().create_timer(3.0).timeout # 禁用按钮,防止重复点击 forget_password_button.disabled = true @@ -283,112 +407,291 @@ func _on_forget_password_confirm_pressed(): # 处理验证码发送响应 func _on_verification_code_response(success: bool, message: String): - _set_status(status_label, message, Color.GREEN if success else Color.RED) - if not success: + 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): - _set_status(status_label, message, Color.GREEN if success else Color.RED) + 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() - if qq_regex.compile(r"^\d{5,12}$") != OK: + 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: - return password.match(r"^[a-zA-Z0-9]+$") != null + # 使用正则表达式检查是否只包含数字和字母 + 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: - _set_status(status_label, "登录成功!正在加载游戏...", Color.GREEN) - _handle_login_success(user_data) + status_label.text = "登录成功!正在加载游戏..." + status_label.modulate = Color.GREEN + + # 保存登录数据到主游戏 + main_game.login_data = user_data.duplicate() + + # 保存剩余点赞次数 + main_game.remaining_likes = user_data.get("今日剩余点赞次数", 10) + + # 更新主游戏数据 + 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 = [] + + # 加载作物仓库数据 + if user_data.has("作物仓库"): + main_game.crop_warehouse = user_data.get("作物仓库", []) + else: + main_game.crop_warehouse = [] + + # 加载道具背包数据 + if user_data.has("道具背包"): + main_game.item_bag = user_data.get("道具背包", []) + else: + main_game.item_bag = [] + + # 加载宠物背包数据 + if user_data.has("宠物背包"): + main_game.pet_bag = user_data.get("宠物背包", []) + else: + main_game.pet_bag = [] + + # 加载巡逻宠物数据 + if user_data.has("巡逻宠物"): + main_game.patrol_pets = user_data.get("巡逻宠物", []) + else: + main_game.patrol_pets = [] + + main_game.start_game = true + self.hide() + + # 确保在更新数据后调用主游戏的 UI 更新函数 + main_game._update_ui() + main_game._refresh_farm_lots() + + player_bag_panel.update_player_bag_ui() + # 更新作物仓库和道具背包UI + crop_warehouse_panel.update_crop_warehouse_ui() + item_bag_panel.update_item_bag_ui() + # 更新宠物背包UI + if pet_bag_panel and pet_bag_panel.has_method("update_pet_bag_ui"): + pet_bag_panel.update_pet_bag_ui() + + # 初始化巡逻宠物 + if main_game.has_method("init_patrol_pets"): + main_game.init_patrol_pets() + + # 调用主游戏的登录成功处理函数 + main_game.handle_login_success(user_data) + + # 初始化游戏设置 + if main_game.game_setting_panel and main_game.game_setting_panel.has_method("refresh_settings"): + main_game.game_setting_panel.refresh_settings() else: - _set_status(status_label, "登录失败:" + message, Color.RED) + 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_2.disabled = false if success: - _set_status(status_label_2, "注册成功!请登录游戏", Color.GREEN) - _handle_register_success() + status_label_2.text = "注册成功!请登录游戏" + status_label_2.modulate = Color.GREEN + + # 注册成功后,如果启用了记住密码,保存登录信息 + if remember_password: + var user_name = register_username_input.text.strip_edges() + var user_password = password_input_1.text.strip_edges() + _save_login_info(user_name, user_password) + + # 清除注册相关的输入框 + password_input_2.text = "" + verificationcode_input.text = "" + + # 切换回登录面板 + register_vbox.hide() + forget_password_vbox.hide() + login_v_box.show() + + # 如果记住密码,自动填充登录信息 + if remember_password: + username_input.text = register_username_input.text + password_input.text = password_input_1.text else: - _set_status(status_label_2, "注册失败:" + message, Color.RED) + status_label_2.text = "注册失败:" + message + status_label_2.modulate = Color.RED # 处理忘记密码响应 func _on_forget_password_response_received(success: bool, message: String): + # 启用按钮 forget_password_button.disabled = false if success: - _set_status(status_label_3, "密码重置成功!请使用新密码登录", Color.GREEN) - _handle_forget_password_success() - else: - _set_status(status_label_3, "密码重置失败:" + message, Color.RED) - -# 登录信息文件操作 -func _save_login_info(user_name: String, password: String): - _write_login_file({"user_name": user_name, "password": password}) - print("登录信息已保存" if user_name != "" else "登录信息已清除") - -func _load_login_info(): - var login_data = _read_login_file() - if login_data: - var saved_username = login_data.get("user_name", "") - var saved_password = login_data.get("password", "") + status_label_3.text = "密码重置成功!请使用新密码登录" + status_label_3.modulate = Color.GREEN - if saved_username != "" and saved_password != "": - username_input.text = saved_username - password_input.text = saved_password - _set_status(status_label, "已加载保存的登录信息", Color.CYAN) - print("登录信息已加载:用户名 =", saved_username) - return + # 保存新的登录信息 + if remember_password: + var user_name = forget_username_input.text.strip_edges() + var new_password = new_password_input.text.strip_edges() + _save_login_info(user_name, new_password) + + # 清除输入框 + forget_verificationcode_input.text = "" + + # 切换回登录面板并自动填充账号信息 + forget_password_vbox.hide() + register_vbox.hide() + login_v_box.show() + + # 自动填充登录信息 + username_input.text = forget_username_input.text + password_input.text = new_password_input.text + + status_label.text = "密码已重置,请登录" + status_label.modulate = Color.GREEN + else: + status_label_3.text = "密码重置失败:" + message + status_label_3.modulate = Color.RED + +# 保存登录信息到JSON文件 +func _save_login_info(user_name: String, password: String): + var login_data = { + "user_name": user_name, + "password": password + } - _set_status(status_label, "欢迎使用萌芽农场", Color.WHITE) - print("没有有效的保存登录信息") - -func _clear_login_info(): - _save_login_info("", "") - -func _write_login_file(data: Dictionary): var file = FileAccess.open("user://login.json", FileAccess.WRITE) if file: - file.store_string(JSON.stringify(data, "\t")) + var json_string = JSON.stringify(login_data, "\t") + file.store_string(json_string) file.close() + print("登录信息已保存") + else: + print("无法保存登录信息") -func _read_login_file() -> Dictionary: +# 从JSON文件加载登录信息 +func _load_login_info(): var file = FileAccess.open("user://login.json", FileAccess.READ) - if not file: - _write_login_file({"user_name": "", "password": ""}) - return {} - - var json_text = file.get_as_text() - file.close() - - var json = JSON.new() - if json.parse(json_text) == OK: - return json.get_data() - return {} + 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 login_data = _read_login_file() - return login_data.get("user_name", "") != "" and login_data.get("password", "") != "" + 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() @@ -398,171 +701,40 @@ func quick_login(): print("执行快捷登录...") _on_login_button_pressed() else: - _set_status(status_label, "保存的登录信息不完整", Color.ORANGE) + status_label.text = "保存的登录信息不完整" + status_label.modulate = Color.ORANGE else: - _set_status(status_label, "没有保存的登录信息", Color.ORANGE) + status_label.text = "没有保存的登录信息" + status_label.modulate = Color.ORANGE +# 获取保存的用户名(用于调试或显示) func get_saved_username() -> String: - return _read_login_file().get("user_name", "") + 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 in ["欢迎使用萌芽农场", "连接状态"]: - _set_status(status_label, "萌芽农场 v" + main_game.client_version + " - 欢迎使用", Color.CYAN) + # 在状态标签中显示客户端版本信息 + if status_label.text == "欢迎使用萌芽农场" or status_label.text == "连接状态": + status_label.text = "萌芽农场 v" + main_game.client_version + " - 欢迎使用" + status_label.modulate = Color.CYAN -# 登录成功处理 -func _handle_login_success(user_data: Dictionary): - # 保存登录数据到主游戏 - main_game.login_data = user_data.duplicate() - main_game.remaining_likes = user_data.get("今日剩余点赞次数", 10) - - # 更新主游戏数据 - 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", "") - - # 加载各种背包数据 - main_game.player_bag = user_data.get("player_bag", []) - main_game.crop_warehouse = user_data.get("作物仓库", []) - main_game.item_bag = user_data.get("道具背包", []) - main_game.pet_bag = user_data.get("宠物背包", []) - main_game.patrol_pets = user_data.get("巡逻宠物", []) - - # 启动游戏并隐藏登录面板 - main_game.start_game = true - self.hide() - - # 更新UI - main_game._update_ui() - main_game._refresh_farm_lots() - player_bag_panel.update_player_bag_ui() - crop_warehouse_panel.update_crop_warehouse_ui() - item_bag_panel.update_item_bag_ui() - - if pet_bag_panel and pet_bag_panel.has_method("update_pet_bag_ui"): - pet_bag_panel.update_pet_bag_ui() - if main_game.has_method("init_patrol_pets"): - main_game.init_patrol_pets() - - main_game.handle_login_success(user_data) - - if main_game.game_setting_panel and main_game.game_setting_panel.has_method("refresh_settings"): - main_game.game_setting_panel.refresh_settings() - -# 注册成功处理 -func _handle_register_success(): - if remember_password: - var user_name = register_username_input.text.strip_edges() - var user_password = password_input_1.text.strip_edges() - _save_login_info(user_name, user_password) - - # 清除注册相关的输入框 - password_input_2.text = "" - verificationcode_input.text = "" - - # 切换回登录面板 - _switch_to_login_panel() - - # 如果记住密码,自动填充登录信息 - if remember_password: - username_input.text = register_username_input.text - password_input.text = password_input_1.text - -# 忘记密码成功处理 -func _handle_forget_password_success(): - if remember_password: - var user_name = forget_username_input.text.strip_edges() - var new_password = new_password_input.text.strip_edges() - _save_login_info(user_name, new_password) - - # 清除输入框 - forget_verificationcode_input.text = "" - - # 切换回登录面板并自动填充账号信息 - _switch_to_login_panel() - username_input.text = forget_username_input.text - password_input.text = new_password_input.text - _set_status(status_label, "密码已重置,请登录", Color.GREEN) - -# 切换到登录面板 -func _switch_to_login_panel(): - register_vbox.hide() - forget_password_vbox.hide() - login_v_box.show() - -# 公共验证函数 -func _validate_login_input(user_name: String, password: String, label: Label) -> bool: - if user_name.is_empty() or password.is_empty(): - _set_status(label, "用户名或密码不能为空!", Color.RED) - return false - return true - -func _validate_register_input(user_name: String, password: String, password_confirm: String, player_name: String, farm_name: String, verification_code: String, label: Label) -> bool: - if user_name.is_empty() or password.is_empty() or password_confirm.is_empty() or player_name.is_empty() or farm_name.is_empty(): - _set_status(label, "所有字段都不能为空!", Color.RED) - return false - if password != password_confirm: - _set_status(label, "两次输入的密码不一致!", Color.RED) - return false - if not is_valid_qq_number(user_name): - _set_status(label, "请输入有效的QQ号(5-12位数字)!", Color.RED) - return false - if not is_valid_password(password): - _set_status(label, "密码只能包含数字和字母!", Color.RED) - return false - if verification_code.is_empty(): - _set_status(label, "验证码不能为空!", Color.RED) - return false - return true - -func _validate_qq_input(user_name: String, label: Label) -> bool: - if user_name.is_empty(): - _set_status(label, "请输入QQ号以接收验证码!", Color.RED) - return false - if not is_valid_qq_number(user_name): - _set_status(label, "请输入正确的QQ号码(5-12位数字)!", Color.RED) - return false - return true - -func _validate_forget_password_input(user_name: String, new_password: String, verification_code: String, label: Label) -> bool: - if user_name.is_empty() or new_password.is_empty(): - _set_status(label, "用户名或新密码不能为空!", Color.RED) - return false - if not is_valid_qq_number(user_name): - _set_status(label, "请输入正确的QQ号码(5-12位数字)!", Color.RED) - return false - if not is_valid_password(new_password): - _set_status(label, "密码只能包含数字和字母!", Color.RED) - return false - if verification_code.is_empty(): - _set_status(label, "请输入验证码!", Color.RED) - return false - return true - -# 公共网络连接检查函数 -func _ensure_network_connection(label: Label) -> bool: - if not tcp_network_manager_panel.client.is_client_connected(): - _set_status(label, "未连接到服务器,正在尝试连接...", Color.YELLOW) - tcp_network_manager_panel.connect_to_current_server() - await get_tree().create_timer(2.0).timeout - - if not tcp_network_manager_panel.client.is_client_connected(): - _set_status(label, "连接服务器失败,正在尝试其他服务器...", Color.YELLOW) - await get_tree().create_timer(3.0).timeout - return false - return true - -# 公共状态设置函数 -func _set_status(label: Label, text: String, color: Color): - label.text = text - label.modulate = color - #面板显示与隐藏切换处理 func _on_visibility_changed(): - GlobalVariables.isZoomDisabled = visible + if visible: + GlobalVariables.isZoomDisabled = true + pass + else: + GlobalVariables.isZoomDisabled = false + pass diff --git a/Script/SmallPanel/AccountSettingPanel.gd b/Script/SmallPanel/AccountSettingPanel.gd index f3d303c..0cf16e3 100644 --- a/Script/SmallPanel/AccountSettingPanel.gd +++ b/Script/SmallPanel/AccountSettingPanel.gd @@ -27,7 +27,6 @@ func _ready() -> void: refresh_button.pressed.connect(_on_refresh_button_pressed) confirm_btn.pressed.connect(_on_confirm_btn_pressed) remove_account_btn.pressed.connect(_on_remove_account_btn_pressed) - visibility_changed.connect(_on_visibility_changed) # 初始显示界面数据 _refresh_player_info() @@ -37,7 +36,7 @@ func _ready() -> void: await get_tree().create_timer(1.0).timeout _request_player_info_from_server() -#面板切换显示时 + func _on_visibility_changed(): if visible: GlobalVariables.isZoomDisabled = true @@ -217,11 +216,11 @@ func handle_account_response(response_data: Dictionary): var updated_data = response_data["updated_data"] if main_game: if updated_data.has("player_name"): - main_game.login_data["player_name"] = updated_data["player_name"] + main_game.data["player_name"] = updated_data["player_name"] if updated_data.has("farm_name"): - main_game.login_data["farm_name"] = updated_data["farm_name"] + main_game.data["farm_name"] = updated_data["farm_name"] if updated_data.has("个人简介"): - main_game.login_data["个人简介"] = updated_data["个人简介"] + main_game.data["个人简介"] = updated_data["个人简介"] if updated_data.has("user_password"): main_game.user_password = updated_data["user_password"] diff --git a/Server/SMYMongoDBAPI.py b/Server/SMYMongoDBAPI.py index fd67611..016baab 100644 --- a/Server/SMYMongoDBAPI.py +++ b/Server/SMYMongoDBAPI.py @@ -589,75 +589,6 @@ class SMYMongoDBAPI: #=====================在线礼包系统====================== - #=====================作物数据系统====================== - def get_crop_data_config(self) -> Optional[Dict[str, Any]]: - """ - 获取作物数据配置 - - Returns: - Dict: 作物数据配置 - """ - try: - collection = self.get_collection("gameconfig") - - # 使用已知的文档ID查找 - object_id = ObjectId("687cfb3d8e77ba00a7414bac") - result = collection.find_one({"_id": object_id}) - - if result: - # 移除MongoDB的_id字段和updated_at字段 - if "_id" in result: - del result["_id"] - if "updated_at" in result: - del result["updated_at"] - - self.logger.info("成功获取作物数据配置") - return result - else: - self.logger.warning("未找到作物数据配置") - return None - - except Exception as e: - self.logger.error(f"获取作物数据配置失败: {e}") - return None - - def update_crop_data_config(self, config_data: Dict[str, Any]) -> bool: - """ - 更新作物数据配置 - - Args: - config_data: 配置数据 - - Returns: - bool: 是否成功 - """ - try: - collection = self.get_collection("gameconfig") - - # 使用已知的文档ID更新 - object_id = ObjectId("687cfb3d8e77ba00a7414bac") - - # 添加更新时间 - update_data = { - "updated_at": datetime.now(), - **config_data - } - - result = collection.replace_one({"_id": object_id}, update_data) - - if result.acknowledged and result.matched_count > 0: - self.logger.info("成功更新作物数据配置") - return True - else: - self.logger.error("更新作物数据配置失败") - return False - - except Exception as e: - self.logger.error(f"更新作物数据配置异常: {e}") - return False - #=====================作物数据系统====================== - - #=====================道具配置系统====================== def get_item_config(self) -> Optional[Dict[str, Any]]: """ diff --git a/Server/TCPGameServer.py b/Server/TCPGameServer.py index b09781a..468dce6 100644 --- a/Server/TCPGameServer.py +++ b/Server/TCPGameServer.py @@ -433,7 +433,7 @@ class TCPGameServer(TCPServer): #加载作物配置数据(优化版本) def _load_crop_data(self): - """加载作物配置数据(带缓存优化,优先从MongoDB加载)""" + """加载作物配置数据(带缓存优化)""" current_time = time.time() # 检查缓存是否有效 @@ -442,26 +442,10 @@ class TCPGameServer(TCPServer): return self.crop_data_cache # 缓存过期或不存在,重新加载 - # 优先尝试从MongoDB加载 - if self.use_mongodb and self.mongo_api: - try: - crop_data = self.mongo_api.get_crop_data_config() - if crop_data: - self.crop_data_cache = crop_data - self.crop_data_cache_time = current_time - self.log('INFO', "成功从MongoDB加载作物数据", 'SERVER') - return self.crop_data_cache - else: - self.log('WARNING', "MongoDB中未找到作物数据,尝试从JSON文件加载", 'SERVER') - except Exception as e: - self.log('ERROR', f"从MongoDB加载作物数据失败: {str(e)},尝试从JSON文件加载", 'SERVER') - - # MongoDB加载失败或不可用,从JSON文件加载 try: with open("config/crop_data.json", 'r', encoding='utf-8') as file: self.crop_data_cache = json.load(file) self.crop_data_cache_time = current_time - self.log('INFO', "成功从JSON文件加载作物数据", 'SERVER') return self.crop_data_cache except Exception as e: self.log('ERROR', f"无法加载作物数据: {str(e)}", 'SERVER') @@ -7949,7 +7933,6 @@ class TCPGameServer(TCPServer): # ================================账户设置处理方法================================ - #处理修改账号信息请求 def _handle_modify_account_info_request(self, client_id, message): """处理修改账号信息请求""" # 检查用户是否已登录 @@ -7978,6 +7961,9 @@ class TCPGameServer(TCPServer): if not new_farm_name: return self._send_modify_account_error(client_id, "农场名称不能为空") + if len(new_password) < 6: + return self._send_modify_account_error(client_id, "密码长度至少6个字符") + if len(new_player_name) > 20: return self._send_modify_account_error(client_id, "玩家昵称不能超过20个字符") @@ -8020,7 +8006,6 @@ class TCPGameServer(TCPServer): self.log('ERROR', f"修改账号信息时出错: {str(e)}", 'ACCOUNT') return self._send_modify_account_error(client_id, "修改账号信息失败,请稍后重试") - #处理删除账号请求 def _handle_delete_account_request(self, client_id, message): """处理删除账号请求""" # 检查用户是否已登录 diff --git a/Server/__pycache__/SMYMongoDBAPI.cpython-313.pyc b/Server/__pycache__/SMYMongoDBAPI.cpython-313.pyc index b96ab357c969da78980228a9b600d381f2116610..6c728ebd0396955c07664367f02fc6abb80dd141 100644 GIT binary patch delta 582 zcmZwCO=uHA6bJBmvzri_Zq;l&q}5=)n#QU{tOz1vE|#JYb&XWIHKs9%o1{sZBvPS5 z5-Jt^Iy_UQDrgZr)KYY?2zuy6l%fX@BE*|eL3)trp`Zxv#H(}oG4tO4J($%Sv{IuT zKNY2om}g*p^8Bl-Pdkd>JRuQMCpuxE5k@s&lD3`K;X1Y0bXnVmaoH90bdrqByl&zq zTCXPRKD}L+b)}zL%x#)q_i3{3$A_}IH6XGXV1fVSy77aoD#6ya?tgu3%Ib!mRwbx~ zSWns;+QC&z?GUdXu>n0!F&r4@zmHy_*f!|I+mR=9oMLR>WxjIk3$@NrLf8zSJpBo< zD`Ll6(Gj?ZQxP9-J~eB7F1oWk9I68q51<-^|q&ko128Fiw2(19U+Bd!n6 z(O;C`)xT2k@LJ3%wJ(}~YsfjHSYq=yH|mE)d^4JY{d`vfBzS=yL&bj2COnzygEM?8 z^_@Z)OU640VK}oJ=CPQ$wC9ewgxwcB5Ihn*7A%-FBqLv9R`FaCyc8_s&g@>;!V}ro zz(>Z`9In>*Gm*Dmi08`5Vnfa*FBaJn#w)eX713}M@;M`)jHQiKDV8YYQ%0J-$3K-g ze8gC_*RpDcuJN1IA&XyJnOpEy5D<7x8ny#tg>&Ux@*rD7`*fc&p@6GNgg+*_aA4Z~ E7ozU3cmMzZ delta 1037 zcmZuvZAep57{2G;yESx5>8z=^{F+Xe-z!DPOe0j9Uso&Pn$CUrk!*I{0!`BdK_L}6 zXpu%(QE8ylYi7YRgXm8XQW35ogq#UNWG|>SzVCUS_kGSsYa6}TO?&_H z^75eYD%xnOQud8|*8|yghNAi?o`Qg*Ak6{Da7Tnb&_$y{`ry9c0IG(Cp{SSfYYB13 zVVs0#xlmrpv%Hsv7U6Cj%X{)Hi8Nv^%*_f{Pzs8RadVYBxDmV(^CPy`+)4=-Nt87J zM(&|f@zV4i1H~E%7v&zM+JnyWVr(Vay&uJ?VRU79RID)1wxy%!L{I5A$KX=uu&dAR z>KaA8X95$q7na+*mK>uVFbki@DLtgSAa zB3mHVxCTdDoi7$U?7N%h+JZ6Rd-v1Dp8oB-C_$@Al~o$8WqN3-D>LYigN_3v|EcFvW`n)PMP%Oig5%D^y4+%Z_v$QxEe@tlEE_v-q;E)@H1CvKNgF_0WMf8rr}dYH5^%59ns24tzoDjcU;frp^h`SI&z(NeIa! y!gr{vRSwqBgVs28vp4YnNfBJjP?!Nwtd=trEA41}&-l-?()OHHoCZK8*8Kx}4{|gB diff --git a/Server/__pycache__/TCPGameServer.cpython-313.pyc b/Server/__pycache__/TCPGameServer.cpython-313.pyc index 02de9658a5f5b7c7b442ad6d2ae564b0dada220c..7f7ee6e1b22952987d8d7d924e0afb3c6c24ba87 100644 GIT binary patch delta 33878 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 Qk6s+OKEb?qlKzAEe@5n+YybcN diff --git a/Server/config/initial_player_data_template.json b/Server/config/initial_player_data_template.json index 74c7810..adc919d 100644 --- a/Server/config/initial_player_data_template.json +++ b/Server/config/initial_player_data_template.json @@ -8,55 +8,8 @@ "user_password": "密码", "last_login_time": "2025年07月20日17时19分16秒", "total_login_time": "0时0分0秒", - "farm_lots": [ - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}, - {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0} - ], + "last_water_reset_date": "2025-06-05", + "farm_lots": [], "player_bag": [], "作物仓库": [], "宠物背包": [], diff --git a/Server/config/verification_codes.json b/Server/config/verification_codes.json deleted file mode 100644 index 9e26dfe..0000000 --- a/Server/config/verification_codes.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/Server/game_saves/2143323382.json b/Server/game_saves/2143323382.json index f3b3e1c..13a83bb 100644 --- a/Server/game_saves/2143323382.json +++ b/Server/game_saves/2143323382.json @@ -1,13 +1,13 @@ { "experience": 455, "level": 36, - "money": 200797690, + "money": 200797815, "farm_name": "柚大青の小农场", "player_name": "柚大青", "user_name": "2143323382", "user_password": "tyh@19900420", - "last_login_time": "2025年07月21日07时50分09秒", - "total_login_time": "6时52分47秒", + "last_login_time": "2025年07月20日22时15分13秒", + "total_login_time": "6时47分9秒", "farm_lots": [ { "crop_type": "", @@ -132,27 +132,35 @@ }, { "crop_type": "杂交树1", - "grow_time": 21600, + "grow_time": 21042, "is_dead": false, "is_diged": true, "is_planted": true, "max_grow_time": 21600, "已浇水": false, - "已施肥": false, + "已施肥": true, "土地等级": 3, + "施肥时间": 1753019866.8176558, + "施肥类型": "农家肥", + "施肥倍数": 2.0, + "施肥持续时间": 1800, "浇水时间": 1753019871.817958 }, { "crop_type": "杂交树2", - "grow_time": 25254, + "grow_time": 21636, "is_dead": false, "is_diged": true, "is_planted": true, "max_grow_time": 25200, "已浇水": false, - "已施肥": false, + "已施肥": true, "土地等级": 3, - "浇水时间": 1753019874.5774846 + "浇水时间": 1753019874.5774846, + "施肥时间": 1753019862.2419734, + "施肥类型": "农家肥", + "施肥倍数": 2.0, + "施肥持续时间": 1800 }, { "crop_type": "", @@ -576,7 +584,7 @@ { "name": "胡萝卜", "quality": "普通", - "count": 2 + "count": 1 }, { "name": "番茄", @@ -672,15 +680,11 @@ "name": "杂交树2", "quality": "传奇", "count": 1 - }, - { - "name": "大豆", - "quality": "普通", - "count": 1 } ], + "last_water_reset_date": "2025-06-05", "注册时间": "2025年05月21日15时00分00秒", - "个人简介": "其实我是一个梨子,真的,不骗你,hhh", + "个人简介": "其实我是一个梨子,真的,不骗你", "作物仓库": [ { "name": "番茄", @@ -991,24 +995,24 @@ "2025年07月13日07时26分04秒": "金币302 经验63 土豆x5 小麦x3" }, "在线礼包": { - "当前日期": "2025-07-21", - "今日在线时长": 0.0, + "当前日期": "2025-07-20", + "今日在线时长": 999999.2718074322, "已领取礼包": [], - "登录时间": 1753055025.953216 + "登录时间": 1753003043.7163484 }, "点赞系统": { "今日剩余点赞次数": 10, - "点赞上次刷新时间": "2025-07-21" + "点赞上次刷新时间": "2025-07-20" }, "新手礼包": { "已领取": true, "领取时间": "2025-07-20 20:21:04" }, "体力系统": { - "当前体力值": 25, + "当前体力值": 24, "最大体力值": 25, - "上次刷新时间": "2025-07-21", - "上次恢复时间": 1753055025.9496412 + "上次刷新时间": "2025-07-20", + "上次恢复时间": 1753018615.8492067 }, "道具背包": [ { diff --git a/Server/game_saves/2804775686.json b/Server/game_saves/2804775686.json deleted file mode 100644 index af56e15..0000000 --- a/Server/game_saves/2804775686.json +++ /dev/null @@ -1,2099 +0,0 @@ -{ - "experience": 877, - "level": 11, - "money": 1231231162929, - "farm_name": "123", - "player_name": "123", - "user_name": "2804775686", - "user_password": "123", - "last_login_time": "2025年07月21日07时55分08秒", - "total_login_time": "0时4分18秒", - "注册时间": "2025年07月20日23时08分10秒", - "个人简介": "我要女朋友", - "farm_lots": [ - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": true, - "is_planted": false, - "max_grow_time": 3, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - }, - { - "crop_type": "", - "grow_time": 0, - "is_dead": false, - "is_diged": false, - "is_planted": false, - "max_grow_time": 5, - "已浇水": false, - "已施肥": false, - "土地等级": 0 - } - ], - "player_bag": [ - { - "name": "辣椒", - "quality": "普通", - "count": 11 - }, - { - "name": "土豆", - "quality": "普通", - "count": 13 - }, - { - "name": "石榴", - "quality": "普通", - "count": 1 - }, - { - "name": "生菜", - "quality": "普通", - "count": 4 - }, - { - "name": "大蒜", - "quality": "普通", - "count": 1 - }, - { - "name": "小麦", - "quality": "普通", - "count": 9 - }, - { - "name": "胡萝卜", - "quality": "普通", - "count": 11 - }, - { - "name": "稻谷", - "quality": "普通", - "count": 4 - }, - { - "name": "龙果", - "quality": "传奇", - "count": 3 - }, - { - "name": "杂交树1", - "quality": "传奇", - "count": 1 - }, - { - "name": "杂交树2", - "quality": "传奇", - "count": 1 - }, - { - "name": "芒果", - "quality": "稀有", - "count": 3 - }, - { - "name": "树莓", - "quality": "优良", - "count": 4 - }, - { - "name": "金橘", - "quality": "史诗", - "count": 1 - }, - { - "name": "茄子", - "quality": "普通", - "count": 5 - }, - { - "name": "橘子", - "quality": "优良", - "count": 1 - }, - { - "name": "番茄", - "quality": "普通", - "count": 2 - }, - { - "name": "野草2", - "quality": "优良", - "count": 3 - }, - { - "name": "芦笋", - "quality": "优良", - "count": 6 - }, - { - "name": "枇杷", - "quality": "优良", - "count": 3 - }, - { - "name": "牵牛花", - "quality": "稀有", - "count": 4 - }, - { - "name": "玉米", - "quality": "优良", - "count": 6 - }, - { - "name": "野草1", - "quality": "优良", - "count": 3 - }, - { - "name": "苹果", - "quality": "优良", - "count": 2 - }, - { - "name": "山楂", - "quality": "优良", - "count": 1 - }, - { - "name": "柠檬", - "quality": "稀有", - "count": 2 - }, - { - "name": "豌豆", - "quality": "普通", - "count": 4 - }, - { - "name": "仙人掌", - "quality": "优良", - "count": 2 - }, - { - "name": "南瓜", - "quality": "优良", - "count": 5 - }, - { - "name": "葫芦", - "quality": "优良", - "count": 5 - }, - { - "name": "摇钱树", - "quality": "传奇", - "count": 1 - }, - { - "name": "大豆", - "quality": "普通", - "count": 3 - }, - { - "name": "梨子", - "quality": "优良", - "count": 3 - }, - { - "name": "山葵", - "quality": "稀有", - "count": 1 - }, - { - "name": "杂草2", - "quality": "普通", - "count": 2 - } - ], - "作物仓库": [], - "宠物背包": [ - { - "场景路径": "res://Scene/Pet/SmallGreen.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的小绿", - "队伍标识": "team1", - "宠物ID": "1753024341725", - "宠物类型": "小绿", - "生日": "2025年7月20日23时12分21秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/SmallBlue.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的小蓝", - "队伍标识": "team1", - "宠物ID": "1753024343029", - "宠物类型": "小蓝", - "生日": "2025年7月20日23时12分23秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/SmallYellow.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的小黄", - "队伍标识": "team1", - "宠物ID": "1753024344253", - "宠物类型": "小黄", - "生日": "2025年7月20日23时12分24秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/SmallOrange.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的小橙", - "队伍标识": "team1", - "宠物ID": "1753024345485", - "宠物类型": "小橙", - "生日": "2025年7月20日23时12分25秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/SmallPink.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的小粉", - "队伍标识": "team1", - "宠物ID": "1753024346767", - "宠物类型": "小粉", - "生日": "2025年7月20日23时12分26秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/RedSlime.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的红史莱姆", - "队伍标识": "team1", - "宠物ID": "1753024348069", - "宠物类型": "红史莱姆", - "生日": "2025年7月20日23时12分28秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/GreenSlime.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的绿史莱姆", - "队伍标识": "team1", - "宠物ID": "1753024349429", - "宠物类型": "绿史莱姆", - "生日": "2025年7月20日23时12分29秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/LittleKnight.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的小骑士", - "队伍标识": "team1", - "宠物ID": "1753024350990", - "宠物类型": "小骑士", - "生日": "2025年7月20日23时12分30秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/BigBeetle.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的大甲虫", - "队伍标识": "team1", - "宠物ID": "1753024354464", - "宠物类型": "大甲虫", - "生日": "2025年7月20日23时12分34秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/SmallBeetle.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的小甲虫", - "队伍标识": "team1", - "宠物ID": "1753024355389", - "宠物类型": "小甲虫", - "生日": "2025年7月20日23时12分35秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/FlyingBird.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的飞鸟", - "队伍标识": "team1", - "宠物ID": "1753024356493", - "宠物类型": "飞鸟", - "生日": "2025年7月20日23时12分36秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 1, - "当前经验": 0, - "最大经验": 100, - "亲密度": 0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 200, - "当前生命值": 200, - "生命恢复速度": 1, - "最大护盾值": 0, - "当前护盾值": 0, - "护盾恢复速度": 0, - "最大护甲值": 100, - "当前护甲值": 100 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 25, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - }, - { - "场景路径": "res://Scene/Pet/SmallDrillBit.tscn", - "基本信息": { - "宠物主人": "2804775686", - "宠物名称": "2804775686的小钻头", - "队伍标识": "team1", - "宠物ID": "1753024357344", - "宠物类型": "小钻头", - "生日": "2025年7月20日23时12分37秒", - "年龄": 0, - "性格": "活泼", - "简介": "", - "爱好": "" - }, - "等级经验": { - "宠物等级": 2, - "当前经验": 30.0, - "最大经验": 120.0, - "亲密度": 68.0, - "最大亲密度": 1000 - }, - "购买信息": { - "能否购买": true, - "购买价格": 1000, - "出售价格": 500 - }, - "生命与防御": { - "最大生命值": 220.00000000000003, - "当前生命值": 220.00000000000003, - "生命恢复速度": 1, - "最大护盾值": 0.0, - "当前护盾值": 0.0, - "护盾恢复速度": 0, - "最大护甲值": 110.00000000000001, - "当前护甲值": 110.00000000000001 - }, - "基础攻击属性": { - "攻击类型": "MELEE", - "基础攻击伤害": 27.500000000000004, - "攻击距离": 100, - "暴击率": 0.1, - "暴击伤害倍数": 1.5, - "生命汲取": 0.1, - "护甲穿透": 0 - }, - "近战攻击": { - "近战额外伤害": 0, - "近战攻击速度": 1 - }, - "远程攻击": { - "远程额外伤害": 0, - "远程攻击速度": 1, - "远程攻击模式": "SINGLE", - "子弹速度": 300 - }, - "散弹攻击": { - "散弹数量": 5, - "散弹扩散角度": 45 - }, - "多发射击": { - "多发射击行数": 2, - "多发射击列数": 3, - "多发射击间距": 30 - }, - "加特林属性": { - "加特林子弹数量": 8, - "加特林射击间隔": 0.1, - "加特林冷却时间": 2 - }, - "穿透属性": { - "穿透数量": 3 - }, - "移动与闪避": { - "移动速度": 100, - "闪避率": 0.05, - "击退力度": 300, - "击退抗性": 0 - }, - "元素属性": { - "元素类型": "NONE", - "元素克制额外伤害": 50 - }, - "特殊属性": { - "控制抗性": 0, - "伤害反弹": 0, - "死亡免疫": false, - "狂暴阈值": 0.3, - "狂暴状态伤害倍数": 1.5 - }, - "特殊机制开关": { - "启用伤害反弹机制": false, - "启用狂暴模式机制": false, - "启用死亡免疫机制": false, - "启用援助召唤机制": false, - "启用死亡重生机制": false - }, - "援助系统": { - "援助触发阈值": 0.2, - "援助召唤数量": 2, - "援助召唤间隔": 5 - }, - "品质系统": { - "宠物品质": "COMMON" - } - } - ], - "巡逻宠物": [ - "1753024350990" - ], - "出战宠物": [ - "1753024357344" - ], - "稻草人配置": { - "已拥有稻草人类型": [ - "稻草人1" - ], - "稻草人展示类型": "", - "稻草人昵称": "稻草人", - "稻草人说的话": { - "第一句话": { - "内容": "第一句话", - "颜色": "52dceeff" - }, - "第二句话": { - "内容": "第二句话", - "颜色": "80d5ffff" - }, - "第三句话": { - "内容": "第三句话", - "颜色": "ac52ffff" - }, - "第四句话": { - "内容": "第四句话", - "颜色": "f881ffff" - } - }, - "稻草人昵称颜色": "b38282ff" - }, - "智慧树配置": { - "距离上一次杀虫时间": 1753004237, - "距离上一次除草时间": 1753004237, - "智慧树显示的话": "", - "等级": 1, - "当前经验值": 0, - "最大经验值": 100, - "最大生命值": 100, - "当前生命值": 100, - "高度": 20, - "上次护理时间": 1753024232 - }, - "签到历史": { - "2025年07月20日23时13分52秒": "金币236 经验84 稻谷x3 小麦x3" - }, - "在线礼包": { - "当前日期": "2025-07-21", - "今日在线时长": 0.0, - "已领取礼包": [], - "登录时间": 1753054985.2239232 - }, - "点赞系统": { - "今日剩余点赞次数": 10, - "点赞上次刷新时间": "2025-07-21" - }, - "新手礼包": { - "已领取": true, - "领取时间": "2025-07-20 23:13:43" - }, - "体力系统": { - "当前体力值": 25, - "最大体力值": 25, - "上次刷新时间": "2025-07-21", - "上次恢复时间": 1753054985.221472 - }, - "道具背包": [ - { - "name": "小额经验卡", - "count": 1 - }, - { - "name": "敦岩图腾", - "count": 1 - }, - { - "name": "烈焰图腾", - "count": 1 - }, - { - "name": "潮汐图腾", - "count": 1 - }, - { - "name": "灵木图腾", - "count": 1 - }, - { - "name": "金刚图腾", - "count": 1 - }, - { - "name": "援军令牌", - "count": 1 - }, - { - "name": "狂暴药水", - "count": 1 - }, - { - "name": "荆棘护甲", - "count": 1 - }, - { - "name": "不死图腾", - "count": 1 - }, - { - "name": "铲子", - "count": 1 - }, - { - "name": "生长素", - "count": 1 - }, - { - "name": "除草剂", - "count": 1 - } - ], - "玩家小卖部": [], - "小卖部格子数": 10, - "游戏设置": { - "背景音乐音量": 1.0, - "天气显示": true - } -} \ No newline at end of file diff --git a/Server/migrate_crop_data_to_mongodb.py b/Server/migrate_crop_data_to_mongodb.py deleted file mode 100644 index 9744aba..0000000 --- a/Server/migrate_crop_data_to_mongodb.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -作物数据MongoDB迁移脚本 -作者: AI Assistant -功能: 将crop_data.json中的数据迁移到MongoDB -""" - -import json -import sys -import os -from SMYMongoDBAPI import SMYMongoDBAPI - -def migrate_crop_data(): - """迁移作物数据到MongoDB""" - print("=== 作物数据MongoDB迁移脚本 ===") - - # 1. 连接MongoDB - print("\n1. 连接MongoDB...") - try: - api = SMYMongoDBAPI("mengyafarm") # 使用正式数据库 - if not api.is_connected(): - print("❌ MongoDB连接失败") - return False - print("✅ MongoDB连接成功") - except Exception as e: - print(f"❌ MongoDB连接异常: {e}") - return False - - # 2. 从JSON文件加载作物数据 - print("\n2. 从JSON文件加载作物数据...") - try: - with open("config/crop_data.json", 'r', encoding='utf-8') as file: - crop_data = json.load(file) - print(f"✅ JSON数据加载成功,包含 {len(crop_data)} 种作物") - except Exception as e: - print(f"❌ 加载JSON文件失败: {e}") - return False - - # 3. 检查MongoDB中是否已有数据 - print("\n3. 检查MongoDB中的现有数据...") - try: - existing_data = api.get_crop_data_config() - if existing_data: - print(f"⚠️ MongoDB中已存在作物数据,包含 {len(existing_data)} 种作物") - choice = input("是否要覆盖现有数据?(y/N): ").strip().lower() - if choice not in ['y', 'yes']: - print("取消迁移") - return False - else: - print("✅ MongoDB中暂无作物数据,可以进行迁移") - except Exception as e: - print(f"❌ 检查MongoDB数据时异常: {e}") - return False - - # 4. 迁移数据到MongoDB - print("\n4. 迁移数据到MongoDB...") - try: - success = api.update_crop_data_config(crop_data) - if success: - print("✅ 作物数据迁移成功") - else: - print("❌ 作物数据迁移失败") - return False - except Exception as e: - print(f"❌ 迁移数据时异常: {e}") - return False - - # 5. 验证迁移结果 - print("\n5. 验证迁移结果...") - try: - migrated_data = api.get_crop_data_config() - if migrated_data and len(migrated_data) == len(crop_data): - print(f"✅ 迁移验证成功,MongoDB中包含 {len(migrated_data)} 种作物") - - # 检查几个关键作物 - test_crops = ["小麦", "胡萝卜", "苹果", "松露"] - print("\n验证关键作物数据:") - for crop_name in test_crops: - if crop_name in crop_data and crop_name in migrated_data: - original = crop_data[crop_name] - migrated = migrated_data[crop_name] - if original == migrated: - print(f"✅ {crop_name}: 数据一致") - else: - print(f"⚠️ {crop_name}: 数据不一致") - else: - print(f"❌ {crop_name}: 数据缺失") - else: - print("❌ 迁移验证失败") - return False - except Exception as e: - print(f"❌ 验证迁移结果时异常: {e}") - return False - - print("\n=== 迁移完成 ===") - print("\n📋 迁移摘要:") - print(f" • 源文件: config/crop_data.json") - print(f" • 目标数据库: mengyafarm") - print(f" • 目标集合: gameconfig") - print(f" • 文档ID: 687cfb3d8e77ba00a7414bac") - print(f" • 迁移作物数量: {len(crop_data)}") - print("\n✅ 作物数据已成功迁移到MongoDB!") - print("\n💡 提示: 服务器现在会优先从MongoDB加载作物数据,如果MongoDB不可用会自动回退到JSON文件。") - - return True - -def main(): - """主函数""" - try: - migrate_crop_data() - except KeyboardInterrupt: - print("\n迁移被用户中断") - except Exception as e: - print(f"迁移过程中发生异常: {e}") - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/Server/test_crop_data_migration.py b/Server/test_crop_data_migration.py deleted file mode 100644 index 77c7839..0000000 --- a/Server/test_crop_data_migration.py +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -作物数据MongoDB迁移测试脚本 -作者: AI Assistant -功能: 测试作物数据从JSON到MongoDB的迁移功能 -""" - -import json -import sys -import os -from SMYMongoDBAPI import SMYMongoDBAPI - -def load_crop_data_from_json(): - """从JSON文件加载作物数据""" - try: - with open("config/crop_data.json", 'r', encoding='utf-8') as file: - return json.load(file) - except Exception as e: - print(f"❌ 加载JSON文件失败: {e}") - return None - -def test_crop_data_migration(): - """测试作物数据迁移""" - print("=== 作物数据MongoDB迁移测试 ===") - - # 1. 连接MongoDB - print("\n1. 连接MongoDB...") - try: - api = SMYMongoDBAPI("test") - if not api.is_connected(): - print("❌ MongoDB连接失败") - return False - print("✅ MongoDB连接成功") - except Exception as e: - print(f"❌ MongoDB连接异常: {e}") - return False - - # 2. 从JSON文件加载作物数据 - print("\n2. 从JSON文件加载作物数据...") - json_data = load_crop_data_from_json() - if not json_data: - print("❌ JSON数据加载失败") - return False - print(f"✅ JSON数据加载成功,包含 {len(json_data)} 种作物") - - # 3. 测试从MongoDB获取作物数据 - print("\n3. 从MongoDB获取作物数据...") - try: - mongo_data = api.get_crop_data_config() - if mongo_data: - print(f"✅ MongoDB数据获取成功,包含 {len(mongo_data)} 种作物") - - # 4. 比较数据一致性 - print("\n4. 比较数据一致性...") - if len(json_data) == len(mongo_data): - print("✅ 作物数量一致") - else: - print(f"⚠️ 作物数量不一致: JSON({len(json_data)}) vs MongoDB({len(mongo_data)})") - - # 检查几个关键作物 - test_crops = ["小麦", "胡萝卜", "苹果", "松露"] - for crop_name in test_crops: - if crop_name in json_data and crop_name in mongo_data: - json_crop = json_data[crop_name] - mongo_crop = mongo_data[crop_name] - if json_crop == mongo_crop: - print(f"✅ {crop_name} 数据一致") - else: - print(f"⚠️ {crop_name} 数据不一致") - print(f" JSON: {json_crop.get('花费', 'N/A')}元, {json_crop.get('生长时间', 'N/A')}秒") - print(f" MongoDB: {mongo_crop.get('花费', 'N/A')}元, {mongo_crop.get('生长时间', 'N/A')}秒") - else: - print(f"❌ {crop_name} 在某个数据源中缺失") - else: - print("❌ MongoDB中未找到作物数据") - - # 5. 如果MongoDB中没有数据,尝试更新 - print("\n5. 尝试更新MongoDB中的作物数据...") - try: - success = api.update_crop_data_config(json_data) - if success: - print("✅ 作物数据更新到MongoDB成功") - - # 再次验证 - print("\n6. 验证更新后的数据...") - updated_data = api.get_crop_data_config() - if updated_data and len(updated_data) == len(json_data): - print("✅ 数据更新验证成功") - else: - print("❌ 数据更新验证失败") - else: - print("❌ 作物数据更新到MongoDB失败") - except Exception as e: - print(f"❌ 更新MongoDB数据时异常: {e}") - - except Exception as e: - print(f"❌ 从MongoDB获取数据时异常: {e}") - return False - - # 7. 测试服务器加载逻辑 - print("\n7. 测试服务器加载逻辑...") - try: - # 模拟服务器的加载逻辑 - from TCPGameServer import TCPGameServer - - # 创建服务器实例(不启动网络服务) - server = TCPGameServer() - - # 测试加载作物数据 - crop_data = server._load_crop_data() - if crop_data and len(crop_data) > 0: - print(f"✅ 服务器成功加载作物数据,包含 {len(crop_data)} 种作物") - - # 测试几个关键作物 - test_crops = ["小麦", "胡萝卜"] - for crop_name in test_crops: - if crop_name in crop_data: - crop = crop_data[crop_name] - print(f"✅ {crop_name}: {crop.get('花费', 'N/A')}元, {crop.get('生长时间', 'N/A')}秒, {crop.get('品质', 'N/A')}") - else: - print(f"❌ 服务器数据中缺少 {crop_name}") - else: - print("❌ 服务器加载作物数据失败") - - except Exception as e: - print(f"❌ 测试服务器加载逻辑时异常: {e}") - - print("\n=== 测试完成 ===") - return True - -def main(): - """主函数""" - try: - test_crop_data_migration() - except KeyboardInterrupt: - print("\n测试被用户中断") - except Exception as e: - print(f"测试过程中发生异常: {e}") - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/server/game_saves/3205788256.json b/server/game_saves/3205788256.json index 68c8d08..84ec0d9 100644 --- a/server/game_saves/3205788256.json +++ b/server/game_saves/3205788256.json @@ -1,44 +1,44 @@ { "farm_lots": [ { - "crop_type": "", - "grow_time": 0, + "crop_type": "小麦", + "grow_time": 300, "is_dead": false, "is_diged": true, - "is_planted": false, + "is_planted": true, "max_grow_time": 300, "已浇水": false, "已施肥": false, "土地等级": 4 }, { - "crop_type": "", - "grow_time": 0, + "crop_type": "小麦", + "grow_time": 300, "is_dead": false, "is_diged": true, - "is_planted": false, + "is_planted": true, "max_grow_time": 300, "已浇水": false, "已施肥": false, "土地等级": 4 }, { - "crop_type": "", - "grow_time": 0, + "crop_type": "小麦", + "grow_time": 300, "is_dead": false, "is_diged": true, - "is_planted": false, + "is_planted": true, "max_grow_time": 300, "已浇水": false, "已施肥": false, "土地等级": 4 }, { - "crop_type": "", - "grow_time": 0, + "crop_type": "小麦", + "grow_time": 300, "is_dead": false, "is_diged": true, - "is_planted": false, + "is_planted": true, "max_grow_time": 300, "已浇水": false, "已施肥": false, @@ -78,11 +78,11 @@ "土地等级": 3 }, { - "crop_type": "", - "grow_time": 0, + "crop_type": "龙果", + "grow_time": 14405, "is_dead": false, "is_diged": true, - "is_planted": false, + "is_planted": true, "max_grow_time": 14400, "已浇水": false, "已施肥": false, @@ -397,11 +397,11 @@ "土地等级": 0 }, { - "crop_type": "", - "grow_time": 0, + "crop_type": "野草2", + "grow_time": 5, "is_dead": false, "is_diged": true, - "is_planted": false, + "is_planted": true, "max_grow_time": 5, "已浇水": false, "已施肥": false, @@ -573,15 +573,17 @@ "count": 8 } ], - "experience": 852, + "experience": 573, "farm_name": "树萌芽の狗窝", - "player_name": "树萌芽2", + "player_name": "树萌芽", "level": 64, - "money": 615197019764, - "last_login_time": "2025年07月21日07时37分38秒", - "total_login_time": "162时52分10秒", + "money": 615197019864, + "last_login_time": "2025年07月19日21时52分29秒", + "total_login_time": "162时47分40秒", "user_name": "3205788256", "user_password": "tyh@19900420", + "last_water_reset_date": "2025-06-06", + "last_check_in_date": "2025-06-01", "session_start_time": 1749878790.288913, "个人简介": "人生啊,就这样吧", "注册时间": "2025年05月21日15时00分00秒", @@ -634,7 +636,7 @@ { "name": "小麦", "quality": "普通", - "count": 34 + "count": 16 }, { "name": "山葵", @@ -695,11 +697,6 @@ "name": "马铃薯", "quality": "普通", "count": 7 - }, - { - "name": "火龙果", - "quality": "稀有", - "count": 1 } ], "道具背包": [ @@ -1100,20 +1097,20 @@ "上次护理时间": 1752051799 }, "体力系统": { - "当前体力值": 25, - "最大体力值": 25, - "上次刷新时间": "2025-07-21", - "上次恢复时间": 1753054658.7901437 + "当前体力值": 20, + "最大体力值": 20, + "上次刷新时间": "2025-07-19", + "上次恢复时间": 1752904756.8787217 }, "点赞系统": { "今日剩余点赞次数": 10, - "点赞上次刷新时间": "2025-07-21" + "点赞上次刷新时间": "2025-07-19" }, "在线礼包": { - "当前日期": "2025-07-21", + "当前日期": "2025-07-19", "今日在线时长": 0.0, "已领取礼包": [], - "登录时间": 1753054658.793094 + "登录时间": 1752904756.8793516 }, "玩家小卖部": [ {