优化层级计算逻辑
This commit is contained in:
@@ -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"])
|
||||
|
||||
Reference in New Issue
Block a user