完成部分服务器数据向MongoDB数据库迁移

This commit is contained in:
2025-07-20 21:05:31 +08:00
parent e466cde9d5
commit ec94e10fda
28 changed files with 2386 additions and 1785 deletions

View File

@@ -1,9 +1,203 @@
extends Panel
#游戏设置面板
# UI组件引用
@onready var background_music_h_slider: HSlider = $Scroll/Panel/BackgroundMusicHSlider
@onready var weather_system_check: CheckButton = $Scroll/Panel/WeatherSystemCheck
@onready var quit_button: Button = $QuitButton
@onready var sure_button: Button = $SureButton
@onready var refresh_button: Button = $RefreshButton
# 引用主游戏和其他组件
@onready var main_game = get_node("/root/main")
@onready var tcp_network_manager_panel: Panel = get_node("/root/main/UI/BigPanel/TCPNetworkManagerPanel")
# 游戏设置数据
var game_settings: Dictionary = {
"背景音乐音量": 1.0,
"天气显示": true
}
# 临时设置数据(用户修改但未确认的设置)
var temp_settings: Dictionary = {}
func _ready() -> void:
self.hide()
pass
# 连接信号
quit_button.pressed.connect(_on_quit_button_pressed)
sure_button.pressed.connect(_on_sure_button_pressed)
refresh_button.pressed.connect(_on_refresh_button_pressed)
# 设置音量滑块范围为0-1
background_music_h_slider.min_value = 0.0
background_music_h_slider.max_value = 1.0
background_music_h_slider.step = 0.01
background_music_h_slider.value_changed.connect(_on_background_music_h_slider_value_changed)
weather_system_check.toggled.connect(_on_weather_system_check_toggled)
# 初始化设置值
_load_settings_from_global()
# 当面板可见性改变时
visibility_changed.connect(_on_visibility_changed)
func _on_visibility_changed():
"""面板可见性改变时的处理"""
if visible:
# 面板显示时,刷新设置值
_load_settings_from_global()
_update_ui_from_settings()
# 禁用缩放功能
GlobalVariables.isZoomDisabled = true
else:
# 面板隐藏时,恢复缩放功能
GlobalVariables.isZoomDisabled = false
func _load_settings_from_global():
"""从全局变量和玩家数据加载设置"""
# 从GlobalVariables加载默认设置
game_settings["背景音乐音量"] = GlobalVariables.BackgroundMusicVolume
game_settings["天气显示"] = not GlobalVariables.DisableWeatherDisplay
# 如果主游戏已登录,尝试从玩家数据加载设置
if main_game and main_game.login_data and main_game.login_data.has("游戏设置"):
var player_settings = main_game.login_data["游戏设置"]
if player_settings.has("背景音乐音量"):
game_settings["背景音乐音量"] = player_settings["背景音乐音量"]
if player_settings.has("天气显示"):
game_settings["天气显示"] = player_settings["天气显示"]
# 初始化临时设置
temp_settings = game_settings.duplicate()
func _update_ui_from_settings():
"""根据设置数据更新UI"""
# 更新音量滑块
background_music_h_slider.value = temp_settings["背景音乐音量"]
# 更新天气显示复选框(注意:复选框表示"关闭天气显示"
weather_system_check.button_pressed = not temp_settings["天气显示"]
func _apply_settings_immediately():
"""立即应用设置(不保存到服务端)"""
# 应用背景音乐音量设置
_apply_music_volume_setting()
# 应用天气显示设置
_apply_weather_display_setting()
func _save_settings_to_server():
"""保存设置到服务端"""
# 更新正式设置
game_settings = temp_settings.duplicate()
# 应用设置
_apply_settings_immediately()
# 如果已登录,保存到玩家数据并同步到服务端
if main_game and main_game.login_data:
main_game.login_data["游戏设置"] = game_settings.duplicate()
# 发送设置到服务端保存
if tcp_network_manager_panel and tcp_network_manager_panel.has_method("is_connected_to_server") and tcp_network_manager_panel.is_connected_to_server():
_send_settings_to_server()
func _apply_music_volume_setting():
"""应用背景音乐音量设置"""
var bgm_player = main_game.get_node_or_null("GameBGMPlayer")
if bgm_player and bgm_player.has_method("set_volume"):
bgm_player.set_volume(temp_settings["背景音乐音量"])
func _apply_weather_display_setting():
"""应用天气显示设置"""
var weather_system = main_game.get_node_or_null("WeatherSystem")
if weather_system and weather_system.has_method("set_weather_display_enabled"):
weather_system.set_weather_display_enabled(temp_settings["天气显示"])
func _send_settings_to_server():
"""发送设置到服务端保存"""
if tcp_network_manager_panel and tcp_network_manager_panel.has_method("send_message"):
var message = {
"type": "save_game_settings",
"settings": game_settings,
"timestamp": Time.get_unix_time_from_system()
}
if tcp_network_manager_panel.send_message(message):
print("游戏设置已发送到服务端保存")
else:
print("发送游戏设置到服务端失败")
func _on_quit_button_pressed() -> void:
"""关闭设置面板"""
self.hide()
pass
func _on_background_music_h_slider_value_changed(value: float) -> void:
"""背景音乐音量滑块值改变"""
temp_settings["背景音乐音量"] = value
# 立即应用音量设置(不保存到服务端)
_apply_music_volume_setting()
# 显示当前音量百分比
var volume_percent = int(value * 100)
func _on_weather_system_check_toggled(toggled_on: bool) -> void:
"""天气系统复选框切换"""
# 复选框表示"关闭天气显示",所以需要取反
temp_settings["天气显示"] = not toggled_on
# 立即应用天气设置(不保存到服务端)
_apply_weather_display_setting()
# 显示提示
var status_text = "已开启" if temp_settings["天气显示"] else "已关闭"
Toast.show("天气显示" + status_text, Color.YELLOW)
#确认修改设置按钮,点击这个才会发送数据到服务端
func _on_sure_button_pressed() -> void:
"""确认修改设置"""
_save_settings_to_server()
Toast.show("设置已保存!", Color.GREEN)
#刷新设置面板,从服务端加载游戏设置数据
func _on_refresh_button_pressed() -> void:
"""刷新设置"""
_load_settings_from_global()
_update_ui_from_settings()
_apply_settings_immediately()
Toast.show("设置已刷新!", Color.CYAN)
# 移除原来的自动保存方法,避免循环调用
func _on_background_music_h_slider_drag_ended(value_changed: bool) -> void:
"""背景音乐音量滑块拖拽结束(保留以兼容场景连接)"""
# 不再自动保存,只显示提示
if value_changed:
var volume_percent = int(background_music_h_slider.value * 100)
# 公共方法,供外部调用
func refresh_settings():
"""刷新设置(从服务端或本地重新加载)"""
_load_settings_from_global()
_update_ui_from_settings()
_apply_settings_immediately()
func get_current_settings() -> Dictionary:
"""获取当前设置"""
return game_settings.duplicate()
func apply_settings_from_server(server_settings: Dictionary):
"""应用从服务端接收到的设置(避免循环调用)"""
if server_settings.has("背景音乐音量"):
game_settings["背景音乐音量"] = server_settings["背景音乐音量"]
temp_settings["背景音乐音量"] = server_settings["背景音乐音量"]
if server_settings.has("天气显示"):
game_settings["天气显示"] = server_settings["天气显示"]
temp_settings["天气显示"] = server_settings["天气显示"]
# 只更新UI不再触发保存
if visible:
_update_ui_from_settings()
_apply_settings_immediately()
print("已应用来自服务端的游戏设置")

View File

@@ -23,8 +23,10 @@ corner_radius_bottom_left = 10
corner_detail = 20
[node name="GameSettingPanel" type="Panel"]
offset_right = 1398.0
offset_bottom = 720.0
offset_left = 151.0
offset_top = 74.0
offset_right = 1549.0
offset_bottom = 794.0
scale = Vector2(0.8, 0.8)
theme_override_styles/panel = SubResource("StyleBoxFlat_0c52c")
script = ExtResource("1_0c52c")
@@ -78,18 +80,84 @@ layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Label" type="Label" parent="Scroll/Panel"]
[node name="BackgroundMusicLabel" type="Label" parent="Scroll/Panel"]
layout_mode = 2
offset_right = 210.0
offset_bottom = 42.0
theme_override_font_sizes/font_size = 30
offset_left = -1.52588e-05
offset_right = 245.0
offset_bottom = 49.0
theme_override_font_sizes/font_size = 35
text = "背景音乐音量:"
[node name="HSlider" type="HSlider" parent="Scroll/Panel"]
layout_mode = 0
offset_left = 210.0
offset_top = 15.0
offset_right = 573.0
offset_bottom = 31.0
[node name="BackgroundMusicHSlider" type="HSlider" parent="Scroll/Panel"]
layout_mode = 2
offset_left = 245.0
offset_right = 574.0
offset_bottom = 49.0
size_flags_horizontal = 3
size_flags_vertical = 1
[connection signal="pressed" from="QuitButton" to="." method="_on_quit_button_pressed"]
[node name="WeatherSystemLabel" type="Label" parent="Scroll/Panel"]
layout_mode = 2
offset_left = -0.249969
offset_top = 48.75
offset_right = 209.75
offset_bottom = 97.75
theme_override_font_sizes/font_size = 35
text = "关闭天气显示:"
[node name="WeatherSystemCheck" type="CheckButton" parent="Scroll/Panel"]
layout_mode = 2
offset_left = 244.75
offset_top = 48.75
offset_right = 288.75
offset_bottom = 72.75
scale = Vector2(2, 2)
theme_override_font_sizes/font_size = 100
[node name="HBox" type="HBoxContainer" parent="Scroll/Panel"]
visible = false
layout_mode = 0
offset_top = 97.0
offset_right = 853.0
offset_bottom = 154.0
[node name="ChangeServer" type="Label" parent="Scroll/Panel/HBox"]
layout_mode = 2
theme_override_font_sizes/font_size = 35
text = "切换服务器"
[node name="IPInput" type="LineEdit" parent="Scroll/Panel/HBox"]
custom_minimum_size = Vector2(400, 0)
layout_mode = 2
theme_override_font_sizes/font_size = 35
placeholder_text = "请输入服务器IP地址"
[node name="PortInput" type="LineEdit" parent="Scroll/Panel/HBox"]
layout_mode = 2
theme_override_font_sizes/font_size = 35
placeholder_text = "端口"
alignment = 1
[node name="ChangeButton" type="Button" parent="Scroll/Panel/HBox"]
custom_minimum_size = Vector2(120, 0)
layout_mode = 2
theme_override_font_sizes/font_size = 35
text = "切换"
[node name="SureButton" type="Button" parent="."]
layout_mode = 0
offset_left = 647.5
offset_top = 635.0
offset_right = 815.5
offset_bottom = 698.0
theme_override_font_sizes/font_size = 40
text = "确认修改"
[node name="RefreshButton" type="Button" parent="."]
layout_mode = 0
offset_left = 27.5001
offset_top = 25.0001
offset_right = 195.5
offset_bottom = 88.0001
theme_override_font_sizes/font_size = 40
text = "刷新"

View File

@@ -2,7 +2,7 @@ extends Control
#各种面板
@onready var game_about_panel: Panel = $GameAboutPanel
@onready var game_update_panel: Panel = $GameUpdatePanel
@onready var game_setting_panel: Panel = $GameSettingPanel
#@onready var game_setting_panel: Panel = $GameSettingPanel
@onready var game_version_label: Label = $GUI/GameVersionLabel
@@ -23,7 +23,7 @@ func _on_start_game_button_pressed() -> void:
#游戏设置
func _on_game_setting_button_pressed() -> void:
game_setting_panel.show()
#game_setting_panel.show()
pass
#游戏更新

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=12 format=3 uid="uid://bypjb28h4ntdr"]
[gd_scene load_steps=11 format=3 uid="uid://bypjb28h4ntdr"]
[ext_resource type="Script" uid="uid://badqjgdfhg7vt" path="res://GUI/MainMenuPanel.gd" id="1_wpehy"]
[ext_resource type="Texture2D" uid="uid://ddcmrh50o1y0q" path="res://assets/菜单UI/背景1.webp" id="2_eghpk"]
@@ -7,7 +7,6 @@
[ext_resource type="Texture2D" uid="uid://dgdootc5bny5q" path="res://assets/菜单UI/QQ群.webp" id="4_eghpk"]
[ext_resource type="Script" uid="uid://kj7v1uxk2i6h" path="res://GUI/GameUpdatePanel.gd" id="4_fys16"]
[ext_resource type="Texture2D" uid="uid://ccav04woielxa" path="res://assets/菜单UI/柚小青装饰品.webp" id="5_6jmhb"]
[ext_resource type="PackedScene" uid="uid://dos15dmc1b6bt" path="res://GUI/GameSettingPanel.tscn" id="6_eghpk"]
[ext_resource type="Script" uid="uid://ciwjx67wjubdy" path="res://GUI/CheckUpdatePanel.gd" id="9_6jmhb"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_eghpk"]
@@ -129,6 +128,7 @@ theme_override_font_sizes/font_size = 40
text = "开始游戏"
[node name="GameSettingButton" type="Button" parent="VBox"]
visible = false
custom_minimum_size = Vector2(168, 63)
layout_mode = 2
size_flags_horizontal = 4
@@ -140,7 +140,7 @@ custom_minimum_size = Vector2(168, 63)
layout_mode = 2
size_flags_horizontal = 4
theme_override_font_sizes/font_size = 40
text = "游戏更新"
text = "更新"
[node name="GameAboutButton" type="Button" parent="VBox"]
custom_minimum_size = Vector2(168, 63)
@@ -156,14 +156,6 @@ size_flags_horizontal = 4
theme_override_font_sizes/font_size = 40
text = "退出游戏"
[node name="GameSettingPanel" parent="." instance=ExtResource("6_eghpk")]
visible = false
layout_mode = 0
offset_left = 138.0
offset_top = 80.0
offset_right = 1536.0
offset_bottom = 800.0
[node name="GameAboutPanel" type="Panel" parent="."]
visible = false
layout_mode = 0