"""装备管理插件 - 装备和卸下物品""" from __future__ import annotations from typing import Optional from PWF.Convention.Runtime.GlobalConfig import ConsoleFrontColor, ProjectConfig from .combat_plugin_base import WPSCombatBase logger: ProjectConfig = ProjectConfig() class WPSCombatEquipment(WPSCombatBase): """装备管理插件""" def is_enable_plugin(self) -> bool: return True def wake_up(self) -> None: super().wake_up() logger.Log( "Info", f"{ConsoleFrontColor.GREEN}WPSCombatEquipment 插件已加载{ConsoleFrontColor.RESET}" ) self.register_plugin("装备") self.register_plugin("equip") self.register_plugin("卸下") self.register_plugin("unequip") async def callback(self, message: str, chat_id: int, user_id: int) -> Optional[str]: """ 处理装备相关命令 命令格式: - 装备 <物品名> - 卸下 <槽位> """ message = self.parse_message_after_at(message).strip() if not message: return await self._send_equipment_overview(chat_id, user_id) tokens = message.split(maxsplit=1) if not tokens: return await self._send_equipment_overview(chat_id, user_id) # 判断是装备还是卸下 # 注意:由于命令已经通过register_plugin匹配,这里tokens[0]可能为空 # 实际命令词已经被消费了 # 如果消息为空,说明只输入了命令词 if not tokens or len(tokens) == 0: return await self.send_markdown_message( self._help_message(), chat_id, user_id ) # tokens[0] 应该是物品名或槽位 target = tokens[0] if len(tokens) > 0 else "" if not target: return await self._send_equipment_overview(chat_id, user_id) if target.lower() in ["帮助", "help"]: return await self.send_markdown_message( self._help_message(), chat_id, user_id ) # 通过检查self被哪个命令触发来判断操作 # 但这里我们无法直接知道,所以通过参数判断 # 如果是槽位名称(weapon/helmet等),则是卸下操作 # 否则尝试装备 # 简化:检查是否包含"卸下"或"unequip" # 由于命令注册了这些词,我们可以假设如果达到这里,就是对应的操作 # 实际上,由于我们注册了"装备"和"卸下"两个命令, # message已经去掉了命令词,只剩参数 # 所以我们需要重新解析原始消息来判断 # 更简单的方法:检查target是否是有效槽位 slot_map = { "weapon": "weapon", "武器": "weapon", "helmet": "helmet", "头盔": "helmet", "armor": "armor", "护甲": "armor", "boots": "boots", "鞋子": "boots", "accessory": "accessory", "饰品": "accessory", } if target.lower() in slot_map: # 卸下操作 return await self._handle_unequip(chat_id, user_id, slot_map[target.lower()]) else: # 装备操作 return await self._handle_equip(chat_id, user_id, target) async def _handle_equip(self, chat_id: int, user_id: int, item_name: str) -> Optional[str]: """处理装备命令""" if not item_name: return await self.send_markdown_message( "❌ 请指定要装备的物品名称\n用法:`装备 <物品名>`", chat_id, user_id ) service = self.service() # 尝试通过名称查找装备item_id from .combat_models import EQUIPMENT_REGISTRY item_id = None for eq_id, eq_def in EQUIPMENT_REGISTRY.items(): if eq_def.name.lower() == item_name.lower() or eq_id.lower() == item_name.lower(): item_id = eq_id break if not item_id: return await self.send_markdown_message( f"❌ 未找到装备:{item_name}", chat_id, user_id ) success, msg = service.equip_item(user_id, item_id) return await self.send_markdown_message(msg, chat_id, user_id) async def _handle_unequip(self, chat_id: int, user_id: int, slot: str) -> Optional[str]: """处理卸下命令""" service = self.service() success, msg = service.unequip_item(user_id, slot) return await self.send_markdown_message(msg, chat_id, user_id) def _help_message(self) -> str: """帮助信息""" return """# ⚔️ 装备管理 **命令格式:** - `装备`:查看当前装备 - `装备 <物品名>`:装备指定物品 - `卸下 <槽位>`:卸下指定槽位的装备 **槽位名称:** - weapon/武器 - helmet/头盔 - armor/护甲 - boots/鞋子 - accessory/饰品 **示例:** - `装备 木剑` - `卸下 weapon` """ async def _send_equipment_overview(self, chat_id: int, user_id: int) -> Optional[str]: """展示当前装备概览""" service = self.service() equipped = service.get_equipped_items(user_id) stats = service.calculate_player_stats(user_id) slot_order = [ ("weapon", "武器"), ("helmet", "头盔"), ("armor", "护甲"), ("boots", "鞋子"), ("accessory", "饰品"), ] lines = [ "# 🛡️ 当前装备情况", f"- 装备强度:`{stats.equipment_strength:.1f}`", "", "**装备栏:**", ] for slot_key, slot_name in slot_order: eq_def = equipped.get(slot_key) if equipped else None if eq_def: attrs = ", ".join([f"{attr}+{value}" for attr, value in eq_def.attributes.items()]) or "无属性加成" tier_label = eq_def.tier.to_markdown_label(eq_def.tier.display_name) lines.append(f"- {slot_name}:{tier_label} {eq_def.name}({attrs})") else: lines.append(f"- {slot_name}:`未装备`") lines.append("\n> 使用 `装备 <物品名>` 可以直接穿戴,`卸下 <槽位>` 可卸下装备") return await self.send_markdown_message("\n".join(lines), chat_id, user_id) __all__ = ["WPSCombatEquipment"]