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