Files
NewWPSBot/Plugins/WPSCombatSystem/combat_plugin_equipment.py
2025-11-13 21:10:57 +08:00

344 lines
11 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 WPSCombatUnequipment(WPSCombatBase):
"""卸下战斗装备插件"""
def get_guide_subtitle(self) -> str:
return "卸下战斗装备"
def collect_command_entries(self) -> Sequence[GuideEntry]:
return (
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}WPSCombatUnequipment 插件已加载{ConsoleFrontColor.RESET}"
)
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)
# 如果消息为空,说明只输入了命令词
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
)
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.send_markdown_message(
self._help_message(),
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)
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 均可匹配装备库条目。", "若未携带该装备会提示不足。"]},
],
),
)
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")
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)
# 如果消息为空,说明只输入了命令词
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
)
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)
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", "WPSCombatUnequipment"]