优化层级计算逻辑

This commit is contained in:
liuwei
2025-11-19 09:13:32 +08:00
parent 3fbca21e1a
commit 89d7b9f25c

View File

@@ -268,8 +268,8 @@ class XiuxianPlugin(MessagePluginInterface):
try:
name, mult = item.split(":")
self.spirit_roots.append((name, float(mult)))
except Exception:
pass
except Exception as e:
self.LOG.warning(f"解析灵根配置失败: {item}, 错误: {e}")
lb_cfg = cfg.get("leaderboard", {})
leaderboard_key = lb_cfg.get("key", "xiuxian:zset:leaderboard:cultivation")
@@ -284,8 +284,8 @@ class XiuxianPlugin(MessagePluginInterface):
try:
n, t, p = s.split(":")
self.shop_items.append({"name": n, "type": t, "price": int(p)})
except Exception:
pass
except Exception as e:
self.LOG.warning(f"解析商品配置失败: {s}, 错误: {e}")
pts_cfg = cfg.get("points_exchange", {})
self.point_to_stone_rate = int(pts_cfg.get("point_to_stone_rate", 10))
@@ -305,8 +305,8 @@ class XiuxianPlugin(MessagePluginInterface):
try:
n, v = s.split(":")
self.realm_score_map[n] = int(v)
except Exception:
pass
except Exception as e:
self.LOG.warning(f"解析境界分值配置失败: {s}, 错误: {e}")
layer_up_cfg = self._config.get("Xiuxian", {}).get("layer_up", {})
self.layer_threshold_map = {}
@@ -314,8 +314,8 @@ class XiuxianPlugin(MessagePluginInterface):
try:
n, v = s.split(":")
self.layer_threshold_map[n] = int(v)
except Exception:
pass
except Exception as e:
self.LOG.warning(f"解析层级阈值配置失败: {s}, 错误: {e}")
# 解析突破阶段配置
stage_cfg = self._config.get("Xiuxian", {}).get("breakthrough_stages", {})
@@ -330,8 +330,8 @@ class XiuxianPlugin(MessagePluginInterface):
"rate": float(rate),
"target": target
}
except Exception:
pass
except Exception as e:
self.LOG.warning(f"解析突破阶段配置失败: {p}, 错误: {e}")
self.LOG.info(f"[{self.name}] 插件初始化完成,指令:{self._commands}")
return True
@@ -487,8 +487,8 @@ class XiuxianPlugin(MessagePluginInterface):
if self.xdb:
try:
self.xdb.create_player(player)
except Exception:
pass
except Exception as e:
logger.warning(f"创建玩家数据库记录失败: {e}, user_id={sender}")
self._save_player(player)
self._rate_set(sender, "注册修仙")
# 初始化境界排行榜分值
@@ -727,19 +727,35 @@ class XiuxianPlugin(MessagePluginInterface):
fields[k] = player[k]
try:
self.xdb.update_player_fields(player.get("user_id"), fields)
except Exception:
pass
except Exception as e:
logger.warning(f"更新玩家字段失败: {e}, user_id={player.get('user_id')}")
self.redis_db.save_player(player)
def _get_player_with_cache(self, user_id: str, group_id: str) -> Optional[Dict[str, Any]]:
"""从缓存或数据库获取玩家数据,并补充缺失字段"""
p = self.redis_db.get_player(user_id, group_id)
if p:
return p
if self.xdb:
dbp = self.xdb.get_player(user_id)
if dbp and dbp.get("group_id", "") == group_id:
dbp.setdefault("spirit_root_mult", 1.0)
dbp.setdefault("inventory", {})
# 补充spirit_root_mult根据spirit_root名称查找对应的倍率
if "spirit_root_mult" not in dbp:
spirit_root_name = dbp.get("spirit_root", "凡灵根")
mult = 1.0
for name, m in self.spirit_roots:
if name == spirit_root_name:
mult = m
break
dbp["spirit_root_mult"] = mult
# 补充inventory从数据库读取背包数据
if "inventory" not in dbp:
try:
items = self.xdb.get_inventory(user_id)
dbp["inventory"] = {item["name"]: item["quantity"] for item in items}
except Exception as e:
logger.warning(f"读取背包数据失败: {e}")
dbp["inventory"] = {}
self.redis_db.save_player(dbp)
return dbp
return None
@@ -921,17 +937,40 @@ class XiuxianPlugin(MessagePluginInterface):
return False, "未注册"
player = self._check_status_update(player)
points = int(player.get("cultivation_points", 0))
inv = player.get("inventory") or {}
# 优化:从数据库读取最新的背包数据,确保数据准确性
pill_item_count = 0
if self.xdb:
try:
items = self.xdb.get_inventory(sender)
for item in items:
if item["name"] == self.bt_pill_item:
pill_item_count = item["quantity"]
break
except Exception as e:
logger.warning(f"读取背包数据失败: {e}, user_id={sender}")
# 降级到使用内存中的inventory
inv = player.get("inventory") or {}
pill_item_count = inv.get(self.bt_pill_item, 0)
else:
inv = player.get("inventory") or {}
pill_item_count = inv.get(self.bt_pill_item, 0)
# 读取当前瓶颈配置
cur_realm = player.get("realm", "炼气1层")
prefix, layer = self._parse_realm(cur_realm)
stage_key = f"{prefix}10层"
stage_conf = self.break_config.get(stage_key)
if not stage_conf:
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "当前境界未到瓶颈或未配置突破路径", sender)
# 优化:检查是否真的达到10层
if layer is None or layer < 10:
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"当前境界为{cur_realm},需达到{prefix}10层才能突破", sender)
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, "未到瓶颈"
stage_key = f"{prefix}10层"
stage_conf = self.break_config.get(stage_key)
if not stage_conf:
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, 5)
return False, "未配置突破"
pill_conf = stage_conf.get("pill")
if not pill_conf:
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "丹药路径未配置", sender)
@@ -943,12 +982,14 @@ 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, "修为不足"
if inv.get(self.bt_pill_item, 0) <= 0:
if pill_item_count <= 0:
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"缺少丹药:{self.bt_pill_item}", sender)
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, "缺少丹药"
inv[self.bt_pill_item] = inv.get(self.bt_pill_item, 0) - 1
# 更新内存中的inventory用于缓存
inv = player.get("inventory") or {}
inv[self.bt_pill_item] = pill_item_count - 1
player["inventory"] = inv
player["cultivation_points"] = points - pill_conf["cost"]
if self.xdb:
@@ -956,8 +997,8 @@ class XiuxianPlugin(MessagePluginInterface):
self.xdb.remove_item(sender, self.bt_pill_item, 1)
self.xdb.update_player_fields(sender, {"cultivation_points": player["cultivation_points"]})
self.redis_db.invalidate_player(sender, player.get("group_id", ""))
except Exception:
pass
except Exception as e:
logger.warning(f"突破时更新数据库失败: {e}, user_id={sender}")
roll = random.random()
if roll < pill_conf["rate"]:
# 成功,更新境界并排行榜
@@ -989,13 +1030,19 @@ class XiuxianPlugin(MessagePluginInterface):
# 读取当前瓶颈配置
cur_realm = player.get("realm", "炼气1层")
prefix, layer = self._parse_realm(cur_realm)
stage_key = f"{prefix}10层"
stage_conf = self.break_config.get(stage_key)
if not stage_conf:
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "当前境界未到瓶颈或未配置突破路径", sender)
# 优化:检查是否真的达到10层
if layer is None or layer < 10:
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"当前境界为{cur_realm},需达到{prefix}10层才能强行突破", sender)
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, "未到瓶颈"
stage_key = f"{prefix}10层"
stage_conf = self.break_config.get(stage_key)
if not stage_conf:
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, 5)
return False, "未配置突破"
hard_conf = stage_conf.get("hard")
if not hard_conf:
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "强行路径未配置", sender)
@@ -1012,8 +1059,8 @@ class XiuxianPlugin(MessagePluginInterface):
try:
self.xdb.update_player_fields(sender, {"cultivation_points": player["cultivation_points"]})
self.redis_db.invalidate_player(sender, player.get("group_id", ""))
except Exception:
pass
except Exception as e:
logger.warning(f"强行突破时更新数据库失败: {e}, user_id={sender}")
roll = random.random()
if roll < hard_conf["rate"]:
self._set_realm(sender, player, hard_conf["target"])