extends Panel # 这是道具背包面板,用来显示玩家获得的道具 # 道具背包格子容器 @onready var bag_grid: GridContainer = $ScrollContainer/Bag_Grid @onready var quit_button : Button = $QuitButton @onready var refresh_button : Button = $RefreshButton # 预添加常用的面板 @onready var main_game = get_node("/root/main") @onready var lucky_draw_panel: LuckyDrawPanel = $'../LuckyDrawPanel' @onready var daily_check_in_panel: DailyCheckInPanel = $'../DailyCheckInPanel' @onready var tcp_network_manager_panel: Panel = $'../TCPNetworkManagerPanel' @onready var item_store_panel: Panel = $'../ItemStorePanel' @onready var player_bag_panel: Panel = $'../PlayerBagPanel' @onready var crop_warehouse_panel: Panel = $'../CropWarehousePanel' @onready var crop_store_panel: Panel = $'../CropStorePanel' @onready var player_ranking_panel: Panel = $'../PlayerRankingPanel' @onready var login_panel: PanelContainer = $'../LoginPanel' # 道具使用状态 var selected_item_name: String = "" var selected_item_button: Button = null var is_item_selected: bool = false # 宠物使用道具模式 var is_pet_item_mode: bool = false var current_pet_data: Dictionary = {} # 准备函数 func _ready(): # 连接可见性改变信号 visibility_changed.connect(_on_visibility_changed) # 隐藏面板(初始默认隐藏) self.hide() # 异步更新道具背包UI func _update_item_bag_ui_async(): # 清空道具背包格子 for child in bag_grid.get_children(): child.queue_free() # 等待一帧确保子节点被清理 await get_tree().process_frame # 为背包中的每个道具创建按钮 for item_data in main_game.item_bag: var item_name = item_data["name"] var item_count = item_data["count"] # 创建道具按钮 var button = _create_item_button(item_name) # 更新按钮文本显示数量 button.text = str(item_name + "\n数量:" + str(item_count)) # 根据是否处于访问模式连接不同的事件 if main_game.is_visiting_mode: # 访问模式下,点击道具只显示信息,不能使用 button.pressed.connect(func(): _on_visit_item_selected(item_name, item_count)) else: # 正常模式下,连接道具选择事件 button.pressed.connect(func(): _on_item_selected(item_name, item_count, button)) bag_grid.add_child(button) # 初始化道具背包 func init_item_bag(): # 清空道具背包格子 for child in bag_grid.get_children(): child.queue_free() # 显示背包中的道具 update_item_bag_ui() # 更新道具背包UI(同步版本,用于刷新按钮) func update_item_bag_ui(): # 清空道具背包格子 for child in bag_grid.get_children(): child.queue_free() # 获取过滤后的道具列表 var filtered_items = _get_filtered_items() # 为背包中的每个道具创建按钮 for item_data in filtered_items: var item_name = item_data["name"] var item_count = item_data["count"] # 创建道具按钮 var button = _create_item_button(item_name) # 更新按钮文本显示数量 button.text = str(item_name + "\n数量:" + str(item_count)) # 根据模式连接不同的事件 if main_game.is_visiting_mode: # 访问模式下,点击道具只显示信息,不能使用 button.pressed.connect(func(): _on_visit_item_selected(item_name, item_count)) elif is_pet_item_mode: # 宠物使用道具模式下,连接宠物道具选择事件 button.pressed.connect(func(): _on_pet_item_selected(item_name, item_count)) else: # 正常模式下,连接道具选择事件 button.pressed.connect(func(): _on_item_selected(item_name, item_count, button)) bag_grid.add_child(button) # 创建道具按钮 func _create_item_button(item_name: String) -> Button: # 使用绿色按钮作为道具按钮的默认样式 var button = main_game.item_button.duplicate() # 确保按钮可见并可点击 button.visible = true button.disabled = false button.focus_mode = Control.FOCUS_ALL # 设置按钮文本 button.text = item_name # 添加工具提示,从item_config.json获取道具信息 var item_config = _load_item_config() if item_config and item_config.has(item_name): var item_info = item_config[item_name] var description = item_info.get("描述", "暂无描述") var cost = item_info.get("花费", 0) button.tooltip_text = str( "道具: " + item_name + "\n" + "价格: " + str(cost) + "元\n" + "描述: " + description + "\n" + "点击选择道具,然后对地块使用" ) else: button.tooltip_text = str("道具: " + item_name + "\n描述: 暂无信息") # 如果按钮有标题标签,设置标题 if button.has_node("Title"): button.get_node("Title").text = "道具" button.get_node("Title").modulate = Color.CYAN # 道具标题使用青色 # 更新按钮的道具图片 _update_button_item_image(button, item_name) return button # 从主游戏脚本获取道具配置数据 func _load_item_config() -> Dictionary: # 从主游戏脚本的全局变量获取道具配置数据 if main_game.item_config_data.size() > 0: return main_game.item_config_data else: print("道具背包:主游戏脚本中没有道具配置数据") return {} # 设置宠物使用道具模式 func set_pet_item_mode(enabled: bool, pet_data: Dictionary = {}): is_pet_item_mode = enabled current_pet_data = pet_data # 刷新UI以应用新的模式 update_item_bag_ui() # 获取过滤后的道具列表 func _get_filtered_items() -> Array: var filtered_items = [] for item_data in main_game.item_bag: var item_name = item_data["name"] # 如果是宠物使用道具模式,只显示宠物道具 if is_pet_item_mode: if _is_pet_item(item_name): filtered_items.append(item_data) else: # 正常模式显示所有道具 filtered_items.append(item_data) return filtered_items # 检查是否为宠物道具 func _is_pet_item(item_name: String) -> bool: var item_config = _load_item_config() if item_config and item_config.has(item_name): var item_info = item_config[item_name] var item_type = item_info.get("类型", "") return item_type == "宠物道具" return false # 正常模式下的道具点击处理 - 选择道具 func _on_item_selected(item_name: String, item_count: int, button: Button): # 检查道具是否可以使用 if not _is_item_usable(item_name): # 显示道具信息 _show_item_info(item_name, item_count) return # 检查是否为农场道具(直接使用类型) if _is_farm_item(item_name): # 农场道具直接使用,显示确认对话框 _show_farm_item_confirmation_dialog(item_name, item_count) return # 取消之前选择的道具 if selected_item_button and selected_item_button != button: _deselect_item() if selected_item_name == item_name: # 如果点击的是已选择的道具,取消选择 _deselect_item() Toast.show("已取消选择道具", Color.YELLOW, 2.0, 1.0) else: # 选择新道具 _select_item(item_name, button) #点击后关闭玩家道具面板 _on_quit_button_pressed() Toast.show("已选择 " + item_name + ",点击地块使用道具", Color.CYAN, 3.0, 1.0) # 选择道具 func _select_item(item_name: String, button: Button): selected_item_name = item_name selected_item_button = button is_item_selected = true # 设置全局选择状态 main_game.selected_item_name = item_name main_game.is_item_selected = true # 更改按钮样式表示选中 if button.has_node("Title"): button.get_node("Title").modulate = Color.YELLOW # 选中时使用黄色 # 取消选择道具 func _deselect_item(): selected_item_name = "" is_item_selected = false # 清除全局选择状态 main_game.selected_item_name = "" main_game.is_item_selected = false # 恢复按钮样式 if selected_item_button and selected_item_button.has_node("Title"): selected_item_button.get_node("Title").modulate = Color.CYAN selected_item_button = null # 检查道具是否可以使用 func _is_item_usable(item_name: String) -> bool: # 根据道具类型判断是否可以使用 match item_name: "农家肥", "金坷垃", "生长素": return true # 施肥道具 "水壶", "水桶": return true # 浇水道具 "铲子","除草剂": return true # 铲除道具 "精准采集锄", "时运锄": return true # 采集道具 "小额经验卡", "小额金币卡": return true # 农场道具(直接使用) "杀虫剂": return false # 其他道具(暂不实现) _: return false # 检查道具是否为农场道具(直接使用类型) func _is_farm_item(item_name: String) -> bool: var item_config = _load_item_config() if item_config and item_config.has(item_name): var item_info = item_config[item_name] var item_type = item_info.get("类型", "") return item_type == "农场道具" return false # 显示道具信息 func _show_item_info(item_name: String, item_count: int): var info_text = "" var item_config = _load_item_config() if item_config and item_config.has(item_name): var item_info = item_config[item_name] var description = item_info.get("描述", "暂无描述") var cost = item_info.get("花费", 0) info_text = item_name + " (数量: " + str(item_count) + ")\n" info_text += "价格: " + str(cost) + "元\n" info_text += "描述: " + description if not _is_item_usable(item_name): info_text += "\n注意: 此道具功能暂未实现" else: info_text = item_name + " (数量: " + str(item_count) + ")\n描述: 暂无信息" Toast.show(info_text, Color.CYAN, 3.0, 1.0) # 访问模式下的道具点击处理 func _on_visit_item_selected(item_name: String, item_count: int): # 显示道具信息 _show_item_info(item_name, item_count) # 宠物使用道具模式下的道具选择处理 func _on_pet_item_selected(item_name: String, item_count: int): # 显示确认对话框 _show_pet_item_confirmation_dialog(item_name, item_count) # 显示农场道具确认对话框 func _show_farm_item_confirmation_dialog(item_name: String, item_count: int): # 获取道具信息 var item_config = _load_item_config() var item_description = "未知效果" if item_config and item_config.has(item_name): var item_info = item_config[item_name] item_description = item_info.get("描述", "未知效果") var confirmation_text = str( "确定要使用道具 " + item_name + " 吗?\n\n" + "道具效果:" + item_description + "\n\n" + "使用后道具数量将减少1个" ) # 使用自定义的AcceptDialog var dialog = preload("res://Script/Dialog/AcceptDialog.gd").new() # 添加到场景(这会触发_ready函数) add_child(dialog) # 在_ready执行后设置内容 dialog.set_dialog_title("确认使用道具") dialog.set_dialog_content(confirmation_text) dialog.set_ok_text("确认使用") dialog.set_cancel_text("取消") # 连接信号 dialog.confirmed.connect(_on_confirm_farm_item_use.bind(item_name, dialog)) dialog.canceled.connect(_on_cancel_farm_item_use.bind(dialog)) # 显示对话框 dialog.popup_centered() # 确认使用农场道具 func _on_confirm_farm_item_use(item_name: String, dialog: AcceptDialog): _send_farm_item_use_request(item_name) dialog.queue_free() self.hide() # 取消使用农场道具 func _on_cancel_farm_item_use(dialog: AcceptDialog): dialog.queue_free() # 发送农场道具使用请求 func _send_farm_item_use_request(item_name: String): var message = { "type": "use_farm_item", "item_name": item_name } # 发送请求 tcp_network_manager_panel.send_message(message) Toast.show("正在使用道具...", Color.BLUE, 2.0, 1.0) # 显示宠物使用道具确认对话框 func _show_pet_item_confirmation_dialog(item_name: String, item_count: int): if current_pet_data.is_empty(): Toast.show("宠物数据丢失,请重新选择宠物", Color.RED, 2.0, 1.0) return var pet_name = current_pet_data.get("基本信息", {}).get("宠物名称", "未知宠物") var pet_id = current_pet_data.get("基本信息", {}).get("宠物ID", "") # 获取道具信息 var item_config = _load_item_config() var item_description = "未知效果" if item_config and item_config.has(item_name): var item_info = item_config[item_name] item_description = item_info.get("描述", "未知效果") var confirmation_text = str( "确定要对宠物 " + pet_name + " 使用道具 " + item_name + " 吗?\n\n" + "道具效果:" + item_description + "\n\n" + "使用后道具数量将减少1个" ) # 使用自定义的AcceptDialog var dialog = preload("res://Script/Dialog/AcceptDialog.gd").new() # 添加到场景(这会触发_ready函数) add_child(dialog) # 在_ready执行后设置内容 dialog.set_dialog_title("确认使用道具") dialog.set_dialog_content(confirmation_text) dialog.set_ok_text("确认使用") dialog.set_cancel_text("取消") # 连接信号 dialog.confirmed.connect(_on_confirm_pet_item_use.bind(item_name, pet_id, dialog)) dialog.canceled.connect(_on_cancel_pet_item_use.bind(dialog)) # 显示对话框 dialog.popup_centered() # 确认使用宠物道具 func _on_confirm_pet_item_use(item_name: String, pet_id: String, dialog: AcceptDialog): _send_pet_item_use_request(item_name, pet_id) dialog.queue_free() self.hide() # 取消使用宠物道具 func _on_cancel_pet_item_use(dialog: AcceptDialog): dialog.queue_free() self.hide() # 发送宠物使用道具请求 func _send_pet_item_use_request(item_name: String, pet_id: String): var message = { "type": "use_pet_item", "item_name": item_name, "pet_id": pet_id } # 发送请求 tcp_network_manager_panel.send_message(message) # 退出宠物使用道具模式 _exit_pet_item_mode() Toast.show("正在使用道具...", Color.BLUE, 2.0, 1.0) # 退出宠物使用道具模式 func _exit_pet_item_mode(): is_pet_item_mode = false current_pet_data = {} # 刷新UI update_item_bag_ui() # 更新按钮的道具图片 func _update_button_item_image(button: Button, item_name: String): # 检查按钮是否有CropImage节点 var item_image = button.get_node_or_null("CropImage") if not item_image: return # 从配置文件获取道具图片路径 var item_config = _load_item_config() var texture = null if item_config and item_config.has(item_name): var item_info = item_config[item_name] var image_path = item_info.get("道具图片", "") if image_path != "" and ResourceLoader.exists(image_path): # 尝试加载道具图片 texture = load(image_path) if texture: pass else: print("加载道具图片失败:", item_name, " -> ", image_path) else: print("道具图片路径无效或不存在:", item_name, " -> ", image_path) # 如果没有找到道具图片,尝试使用默认道具图片 if not texture: var default_item_path = "res://assets/道具图片/默认道具.webp" if ResourceLoader.exists(default_item_path): texture = load(default_item_path) if texture: print("使用默认道具图片:", item_name) # 设置图片 if texture: # CropImage是Sprite2D,直接设置texture属性 item_image.texture = texture item_image.visible = true else: # 如果没有图片,隐藏图片节点 item_image.visible = false #=========================面板通用处理========================= # 关闭道具背包面板 func _on_quit_button_pressed() -> void: # 如果是宠物使用道具模式,退出该模式 if is_pet_item_mode: _exit_pet_item_mode() self.hide() #手动刷新道具背包面板 func _on_refresh_button_pressed() -> void: # 刷新道具背包UI update_item_bag_ui() Toast.show("道具背包已刷新", Color.GREEN, 2.0, 1.0) #面板显示与隐藏切换处理 func _on_visibility_changed(): if visible: GlobalVariables.isZoomDisabled = true # 面板显示时自动刷新数据 update_item_bag_ui() pass else: GlobalVariables.isZoomDisabled = false pass #=========================面板通用处理========================= # 获取当前选择的道具名称 func get_selected_item_name() -> String: return selected_item_name # 检查是否有道具被选择 func is_item_currently_selected() -> bool: return is_item_selected