Files
NewWPSBot/Plugins/WPSCombatSystem/combat_plugin_equipment.py
2025-11-12 22:58:36 +08:00

231 lines
8.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""装备管理插件 - 装备和卸下物品"""
from __future__ import annotations
from typing import Optional, Sequence
from PWF.Convention.Runtime.GlobalConfig import ConsoleFrontColor, ProjectConfig
from Plugins.WPSAPI import GuideEntry
from .combat_plugin_base import WPSCombatBase
logger: ProjectConfig = ProjectConfig()
class WPSCombatEquipment(WPSCombatBase):
"""装备管理插件"""
def get_guide_subtitle(self) -> str:
return "穿戴与卸下战斗装备"
def collect_command_entries(self) -> Sequence[GuideEntry]:
return (
GuideEntry(
title="装备",
identifier="装备 [物品名|ID]",
description="穿戴指定装备,或不带参数时查看当前装备。",
metadata={"别名": "equip"},
icon="🛡️",
details=[
{"type": "list", "items": ["名称与 ID 均可匹配装备库条目。", "若未携带该装备会提示不足。"]},
],
),
GuideEntry(
title="卸下",
identifier="卸下 <槽位>",
description="卸下指定槽位weapon/helmet/armor/boots/accessory的装备。",
metadata={"别名": "unequip"},
icon="🧤",
),
)
def collect_guide_entries(self) -> Sequence[GuideEntry]:
return (
{
"title": "槽位说明",
"description": "支持 weapon/helmet/armor/boots/accessory 五个槽位。",
},
{
"title": "属性加成",
"description": "装备属性直接影响战斗与冒险计算,可在 `战斗属性` 指令中查看综合加成。",
},
)
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"]