diff --git a/plugins/xiuxian/config.toml b/plugins/xiuxian/config.toml index 3d702c6..5489300 100644 --- a/plugins/xiuxian/config.toml +++ b/plugins/xiuxian/config.toml @@ -3,7 +3,7 @@ [Xiuxian] enable = true # 指令集合(无需前缀),按核心/经济/信息/社交/门派分类 -command = ["修仙帮助", "积分购石", "积分换灵石", "注册修仙", "我的状态", "闭关", "出关", "聚灵", "排行榜", "修仙签到", "坊市", "购买", "乾坤袋", "突破", "强行突破", "劫掠", "赠与", "赠送", "创建门派", "加入门派", "退出门派"] +command = ["修仙帮助", "积分购石", "积分换灵石", "注册修仙", "我的状态", "闭关", "出关", "聚灵", "排行榜", "修仙签到", "坊市", "购买", "乾坤袋", "使用", "服用", "突破", "强行突破", "劫掠", "赠与", "赠送", "创建门派", "加入门派", "退出门派"] # 用法提示:命令格式错误时的反馈文本 command-format = """ 📜修仙指令: @@ -17,6 +17,8 @@ command-format = """ 坊市 购买 乾坤袋 +使用 物品名 +服用 回气丹 突破 - 需要丹药 强行突破 - 不需要丹药 劫掠 - 抢劫其他门派弟子 @@ -60,7 +62,17 @@ spirit_roots = [ # 坊市商品:名称:类型:价格(价格单位为灵石)。类型用于展示与分类,不影响逻辑。 [Xiuxian.shop] items = [ - "筑基丹:丹药:500", + "筑基丹:丹药:200", + "金元丹:丹药:1000", + "结婴丹:丹药:10000", + "化神丹:丹药:40000", + "合体丹:丹药:200000", + "大乘丹:丹药:1000000", + "渡劫丹:丹药:2000000", + "飞升丹:丹药:10000000", + "洗髓丹:丹药:2000", + "改灵丹:丹药:20000", + "天灵露:丹药:200000", "回气丹:丹药:200", "聚灵符:材料:100" ] diff --git a/plugins/xiuxian/main.py b/plugins/xiuxian/main.py index 48359cf..7e06c40 100644 --- a/plugins/xiuxian/main.py +++ b/plugins/xiuxian/main.py @@ -496,6 +496,8 @@ class XiuxianPlugin(MessagePluginInterface): return await self._cmd_buy(bot, sender, roomid, content) if cmd == "乾坤袋": return await self._cmd_bag(bot, sender, roomid) + if cmd in ("使用", "服用"): + return await self._cmd_use(bot, sender, roomid, content) if cmd == "突破": return await self._cmd_breakthrough(bot, sender, roomid) if cmd == "强行突破": @@ -546,7 +548,7 @@ class XiuxianPlugin(MessagePluginInterface): # if self.revoke: # self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) return False, "命令格式错误" - player = self.redis_db.get_player(sender, roomid or "") + player = self._get_player_with_cache(sender, roomid or "") if player: # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 已注册,无需重复注册", sender) # if self.revoke: @@ -591,6 +593,8 @@ class XiuxianPlugin(MessagePluginInterface): lines.append("注册修仙 道号") lines.append("聚灵 数量") lines.append("购买 物品 数量") + lines.append("使用 物品名") + lines.append("服用 回气丹") lines.append("赠与 目标wxid 数量") lines.append("赠送 目标wxid 物品 数量") lines.append("劫掠 目标wxid") @@ -652,7 +656,7 @@ class XiuxianPlugin(MessagePluginInterface): return True, "积分购石" async def _cmd_status(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: - player = self.redis_db.get_player(sender, roomid or "") + player = self._get_player_with_cache(sender, roomid or "") if not player: # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender) # if self.revoke: @@ -679,7 +683,7 @@ class XiuxianPlugin(MessagePluginInterface): return True, "状态展示" async def _cmd_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: - player = self.redis_db.get_player(sender, roomid or "") + player = self._get_player_with_cache(sender, roomid or "") if not player: # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender) # if self.revoke: @@ -713,7 +717,7 @@ class XiuxianPlugin(MessagePluginInterface): return True, "闭关成功" async def _cmd_finish_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: - player = self.redis_db.get_player(sender, roomid or "") + player = self._get_player_with_cache(sender, roomid or "") if not player: # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender) # if self.revoke: @@ -753,7 +757,7 @@ class XiuxianPlugin(MessagePluginInterface): return True, "出关结算" async def _cmd_gather(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: - player = self.redis_db.get_player(sender, roomid or "") + player = self._get_player_with_cache(sender, roomid or "") if not player: # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender) # if self.revoke: @@ -774,13 +778,18 @@ class XiuxianPlugin(MessagePluginInterface): # self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) return False, "灵石不足" player["spirit_stone"] = stones - qty - player["cultivation_points"] = int(player.get("cultivation_points", 0)) + qty * 10 + base_gain = qty * 10 + bonus = float(player.get("gather_bonus", 0.0)) + gain = int(base_gain * (1.0 + bonus)) + player["cultivation_points"] = int(player.get("cultivation_points", 0)) + gain + if bonus > 0: + player["gather_bonus"] = 0.0 self._save_player(player) # 自动层级提升(不跨瓶颈) self._auto_layer_up(sender, player) self.redis_db.leaderboard_add(sender, float(player["cultivation_points"])) self._rate_set(sender, roomid or "", "聚灵") - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 聚灵成功,消耗灵石{qty},获得修为{qty * 10}", sender) + client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 聚灵成功,消耗灵石{qty},获得修为{gain}", sender) if self.revoke: self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) return True, "聚灵成功" @@ -790,8 +799,11 @@ class XiuxianPlugin(MessagePluginInterface): lines = ["🏆 修为排行榜 Top10"] rank = 1 for uid, score in top: + player = self._get_player_with_cache(uid, roomid or "") + cp = int(player.get("cultivation_points", int(score))) if player else int(score) + nick = (player.get("dao_name") if player else None) or uid mark = "你" if uid == sender else "" - lines.append(f"{rank}. {uid} - {int(score)} {mark}") + lines.append(f"{rank}. {nick} - 修为 {cp} {mark}") rank += 1 client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "\n".join(lines), sender) if self.revoke: @@ -1011,6 +1023,100 @@ class XiuxianPlugin(MessagePluginInterface): self._rate_set(sender, roomid or "", "背包") return True, "背包" + async def _cmd_use(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: + item_name = content.strip() + if not item_name: + return False, "命令格式错误" + player = self._get_player(sender, roomid or "") + if not player: + return False, "未注册" + player = self._check_status_update(player) + inv = player.get("inventory") or {} + qty = int(inv.get(item_name, 0)) + if qty <= 0: + return False, "物品不足" + if item_name == "聚灵符": + inv[item_name] = qty - 1 + player["inventory"] = inv + player["gather_bonus"] = float(player.get("gather_bonus", 0.0)) + 0.2 + if self.xdb: + try: + self.xdb.remove_item(sender, item_name, 1) + except Exception: + pass + self._save_player(player) + self._rate_set(sender, roomid or "", "使用") + client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "✅ 已使用聚灵符,本次聚灵收益提升", sender) + if self.revoke: + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + return True, "使用聚灵符" + if item_name == "回气丹": + status = player.get("status", "Idle") + if status not in ("Unstable_Qi", "Injured"): + return False, "当前状态无需服用" + inv[item_name] = qty - 1 + player["inventory"] = inv + player["status"] = "Idle" + player["status_until"] = None + if self.xdb: + try: + self.xdb.remove_item(sender, item_name, 1) + except Exception: + pass + self._save_player(player) + self._rate_set(sender, roomid or "", "使用") + client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "✅ 已服用回气丹,状态已恢复为空闲", sender) + if self.revoke: + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + return True, "服用回气丹" + # 灵根提升丹药 + upgrade_map = { + "洗髓丹": {"from": "废灵根", "to": "凡灵根", "rate": 0.6, "injured_min": 30}, + "改灵丹": {"from": "凡灵根", "to": "地灵根", "rate": 0.3, "injured_min": 60}, + "天灵露": {"from": "地灵根", "to": "天灵根", "rate": 0.1, "injured_min": 120}, + } + if item_name in upgrade_map: + cur_root = player.get("spirit_root", "凡灵根") + rule = upgrade_map[item_name] + if cur_root != rule["from"]: + return False, "当前灵根不适用" + # 扣减丹药 + inv[item_name] = qty - 1 + player["inventory"] = inv + if self.xdb: + try: + self.xdb.remove_item(sender, item_name, 1) + except Exception: + pass + roll = random.random() + if roll < rule["rate"]: + # 成功,更新灵根与倍率 + target = rule["to"] + player["spirit_root"] = target + mult = 1.0 + for name, m in self.spirit_roots: + if name == target: + mult = m + break + player["spirit_root_mult"] = mult + self._save_player(player) + self._rate_set(sender, roomid or "", "使用") + client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 灵根提升成功,当前灵根:{target}", sender) + if self.revoke: + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + return True, "灵根提升成功" + else: + # 失败,受伤保护 + player["status"] = "Injured" + player["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=rule["injured_min"])) .isoformat() + self._save_player(player) + self._rate_set(sender, roomid or "", "使用") + client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"❌ 灵根提升失败,灵气反噬,受伤{rule['injured_min']}分钟", sender) + if self.revoke: + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + return False, "灵根提升失败" + return False, "不可使用的物品" + async def _cmd_breakthrough(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: player = self._get_player(sender, roomid or "") if not player: