EG/plugins/user/matchmaking_system/rules/rule_manager.py
2025-12-12 16:16:15 +08:00

633 lines
22 KiB
Python

"""
匹配规则管理器模块
管理匹配规则和参数
"""
import time
from typing import Dict, Any, List, Optional
class RuleManager:
"""
匹配规则管理器
管理匹配规则和参数
"""
def __init__(self, plugin):
"""
初始化匹配规则管理器
Args:
plugin: 匹配系统插件实例
"""
self.plugin = plugin
self.enabled = False
self.initialized = False
# 规则配置
self.rule_config = {
"default_rules": {
"min_players": 2,
"max_players": 8,
"skill_range": 100,
"max_wait_time": 120.0,
"region_matching": True,
"platform_matching": True,
"language_matching": True
},
"game_mode_rules": {}, # 不同游戏模式的规则
"custom_rules": {}, # 自定义规则
"enable_rule_validation": True,
"enable_dynamic_rules": True
}
# 规则状态
self.rule_state = {
"active_rules": "default",
"total_rules": 1, # 默认规则
"custom_rules_count": 0,
"rules_modified": 0
}
# 规则统计
self.rule_stats = {
"rules_applied": 0,
"rules_violated": 0,
"rule_errors": 0
}
# 回调函数
self.rule_callbacks = {
"rule_applied": [],
"rule_violated": [],
"rule_updated": [],
"rule_error": []
}
# 时间戳记录
self.last_rule_application = 0.0
self.last_stats_reset = 0.0
print("✓ 匹配规则管理器已创建")
def initialize(self) -> bool:
"""
初始化匹配规则管理器
Returns:
是否初始化成功
"""
try:
print("正在初始化匹配规则管理器...")
self.initialized = True
print("✓ 匹配规则管理器初始化完成")
return True
except Exception as e:
print(f"✗ 匹配规则管理器初始化失败: {e}")
self.rule_stats["rule_errors"] += 1
import traceback
traceback.print_exc()
return False
def enable(self) -> bool:
"""
启用匹配规则管理器
Returns:
是否启用成功
"""
try:
if not self.initialized:
print("✗ 匹配规则管理器未初始化")
return False
self.enabled = True
print("✓ 匹配规则管理器已启用")
return True
except Exception as e:
print(f"✗ 匹配规则管理器启用失败: {e}")
self.rule_stats["rule_errors"] += 1
import traceback
traceback.print_exc()
return False
def disable(self):
"""禁用匹配规则管理器"""
try:
self.enabled = False
print("✓ 匹配规则管理器已禁用")
except Exception as e:
print(f"✗ 匹配规则管理器禁用失败: {e}")
self.rule_stats["rule_errors"] += 1
import traceback
traceback.print_exc()
def finalize(self):
"""清理匹配规则管理器资源"""
try:
# 禁用匹配规则管理器
if self.enabled:
self.disable()
# 清理回调
self.rule_callbacks.clear()
self.initialized = False
print("✓ 匹配规则管理器资源已清理")
except Exception as e:
print(f"✗ 匹配规则管理器资源清理失败: {e}")
import traceback
traceback.print_exc()
def update(self, dt: float):
"""
更新匹配规则管理器状态
Args:
dt: 时间增量(秒)
"""
try:
if not self.enabled:
return
self.last_rule_application = time.time()
except Exception as e:
print(f"✗ 匹配规则管理器更新失败: {e}")
self.rule_stats["rule_errors"] += 1
import traceback
traceback.print_exc()
def apply_rules(self, players: List[Dict[str, Any]], game_mode: str = "default") -> bool:
"""
应用匹配规则
Args:
players: 玩家列表
game_mode: 游戏模式
Returns:
是否符合规则
"""
try:
if not self.enabled:
return True # 如果未启用,跳过规则检查
self.rule_stats["rules_applied"] += 1
# 获取适用的规则
rules = self.get_active_rules(game_mode)
# 检查玩家数量
min_players = rules.get("min_players", 2)
max_players = rules.get("max_players", 8)
if len(players) < min_players:
print(f"✗ 玩家数量不足: {len(players)} < {min_players}")
self.rule_stats["rules_violated"] += 1
# 触发规则违反回调
self._trigger_rule_callback("rule_violated", {
"rule": "min_players",
"required": min_players,
"actual": len(players),
"timestamp": time.time()
})
return False
if len(players) > max_players:
print(f"✗ 玩家数量超限: {len(players)} > {max_players}")
self.rule_stats["rules_violated"] += 1
# 触发规则违反回调
self._trigger_rule_callback("rule_violated", {
"rule": "max_players",
"required": max_players,
"actual": len(players),
"timestamp": time.time()
})
return False
# 检查技能范围
if rules.get("skill_range") is not None:
skill_range = rules["skill_range"]
skills = [p.get("skill_level", 0) for p in players]
min_skill = min(skills)
max_skill = max(skills)
if max_skill - min_skill > skill_range:
print(f"✗ 技能范围超限: {max_skill - min_skill} > {skill_range}")
self.rule_stats["rules_violated"] += 1
# 触发规则违反回调
self._trigger_rule_callback("rule_violated", {
"rule": "skill_range",
"required": skill_range,
"actual": max_skill - min_skill,
"timestamp": time.time()
})
return False
# 检查区域匹配
if rules.get("region_matching", False):
regions = [p.get("region", "global") for p in players]
if len(set(regions)) > 1:
print(f"✗ 区域不匹配: {set(regions)}")
self.rule_stats["rules_violated"] += 1
# 触发规则违反回调
self._trigger_rule_callback("rule_violated", {
"rule": "region_matching",
"regions": list(set(regions)),
"timestamp": time.time()
})
return False
# 检查平台匹配
if rules.get("platform_matching", False):
platforms = [p.get("platform", "pc") for p in players]
if len(set(platforms)) > 1:
print(f"✗ 平台不匹配: {set(platforms)}")
self.rule_stats["rules_violated"] += 1
# 触发规则违反回调
self._trigger_rule_callback("rule_violated", {
"rule": "platform_matching",
"platforms": list(set(platforms)),
"timestamp": time.time()
})
return False
# 检查语言匹配
if rules.get("language_matching", False):
languages = [p.get("language", "en") for p in players]
if len(set(languages)) > 1:
print(f"✗ 语言不匹配: {set(languages)}")
self.rule_stats["rules_violated"] += 1
# 触发规则违反回调
self._trigger_rule_callback("rule_violated", {
"rule": "language_matching",
"languages": list(set(languages)),
"timestamp": time.time()
})
return False
# 触发规则应用回调
self._trigger_rule_callback("rule_applied", {
"players": len(players),
"game_mode": game_mode,
"rules": rules,
"timestamp": time.time()
})
print(f"✓ 规则检查通过: {len(players)}名玩家, 游戏模式: {game_mode}")
return True
except Exception as e:
print(f"✗ 规则应用失败: {e}")
self.rule_stats["rule_errors"] += 1
return False
def get_active_rules(self, game_mode: str = "default") -> Dict[str, Any]:
"""
获取活动规则
Args:
game_mode: 游戏模式
Returns:
规则字典
"""
try:
# 检查是否有特定游戏模式的规则
if game_mode in self.rule_config["game_mode_rules"]:
return self.rule_config["game_mode_rules"][game_mode]
# 检查是否有自定义规则
if self.rule_state["active_rules"] in self.rule_config["custom_rules"]:
return self.rule_config["custom_rules"][self.rule_state["active_rules"]]
# 返回默认规则
return self.rule_config["default_rules"]
except Exception as e:
print(f"✗ 获取活动规则失败: {e}")
self.rule_stats["rule_errors"] += 1
return self.rule_config["default_rules"]
def set_active_rules(self, rule_set_name: str) -> bool:
"""
设置活动规则集
Args:
rule_set_name: 规则集名称
Returns:
是否设置成功
"""
try:
# 验证规则集存在
if (rule_set_name != "default" and
rule_set_name not in self.rule_config["custom_rules"] and
rule_set_name not in self.rule_config["game_mode_rules"]):
print(f"✗ 规则集不存在: {rule_set_name}")
return False
self.rule_state["active_rules"] = rule_set_name
# 触发规则更新回调
self._trigger_rule_callback("rule_updated", {
"rule_set": rule_set_name,
"timestamp": time.time()
})
print(f"✓ 活动规则集已设置为: {rule_set_name}")
return True
except Exception as e:
print(f"✗ 活动规则集设置失败: {e}")
self.rule_stats["rule_errors"] += 1
return False
def add_custom_rule_set(self, rule_set_name: str, rules: Dict[str, Any]) -> bool:
"""
添加自定义规则集
Args:
rule_set_name: 规则集名称
rules: 规则字典
Returns:
是否添加成功
"""
try:
if not self.enabled:
return False
# 验证规则
if self.rule_config["enable_rule_validation"]:
if not self._validate_rules(rules):
print(f"✗ 规则验证失败: {rule_set_name}")
self.rule_stats["rule_errors"] += 1
return False
self.rule_config["custom_rules"][rule_set_name] = rules
self.rule_state["custom_rules_count"] = len(self.rule_config["custom_rules"])
self.rule_state["total_rules"] += 1
self.rule_state["rules_modified"] += 1
print(f"✓ 自定义规则集已添加: {rule_set_name}")
return True
except Exception as e:
print(f"✗ 自定义规则集添加失败: {e}")
self.rule_stats["rule_errors"] += 1
return False
def remove_custom_rule_set(self, rule_set_name: str) -> bool:
"""
移除自定义规则集
Args:
rule_set_name: 规则集名称
Returns:
是否移除成功
"""
try:
if rule_set_name in self.rule_config["custom_rules"]:
del self.rule_config["custom_rules"][rule_set_name]
self.rule_state["custom_rules_count"] = len(self.rule_config["custom_rules"])
self.rule_state["total_rules"] -= 1
self.rule_state["rules_modified"] += 1
# 如果删除的是活动规则集,切换回默认规则
if self.rule_state["active_rules"] == rule_set_name:
self.rule_state["active_rules"] = "default"
print(f"✓ 自定义规则集已移除: {rule_set_name}")
return True
else:
print(f"✗ 自定义规则集不存在: {rule_set_name}")
return False
except Exception as e:
print(f"✗ 自定义规则集移除失败: {e}")
self.rule_stats["rule_errors"] += 1
return False
def _validate_rules(self, rules: Dict[str, Any]) -> bool:
"""
验证规则
Args:
rules: 规则字典
Returns:
是否验证通过
"""
try:
# 检查基本规则参数
if "min_players" in rules:
if not isinstance(rules["min_players"], int) or rules["min_players"] < 1:
return False
if "max_players" in rules:
if not isinstance(rules["max_players"], int) or rules["max_players"] < 1:
return False
if "min_players" in rules and "max_players" in rules:
if rules["min_players"] > rules["max_players"]:
return False
if "skill_range" in rules:
if not isinstance(rules["skill_range"], (int, float)) or rules["skill_range"] < 0:
return False
if "max_wait_time" in rules:
if not isinstance(rules["max_wait_time"], (int, float)) or rules["max_wait_time"] < 0:
return False
return True
except Exception as e:
print(f"✗ 规则验证失败: {e}")
self.rule_stats["rule_errors"] += 1
return False
def add_game_mode_rules(self, game_mode: str, rules: Dict[str, Any]) -> bool:
"""
添加游戏模式规则
Args:
game_mode: 游戏模式
rules: 规则字典
Returns:
是否添加成功
"""
try:
if not self.enabled:
return False
# 验证规则
if self.rule_config["enable_rule_validation"]:
if not self._validate_rules(rules):
print(f"✗ 游戏模式规则验证失败: {game_mode}")
self.rule_stats["rule_errors"] += 1
return False
self.rule_config["game_mode_rules"][game_mode] = rules
self.rule_state["total_rules"] += 1
self.rule_state["rules_modified"] += 1
print(f"✓ 游戏模式规则已添加: {game_mode}")
return True
except Exception as e:
print(f"✗ 游戏模式规则添加失败: {e}")
self.rule_stats["rule_errors"] += 1
return False
def remove_game_mode_rules(self, game_mode: str) -> bool:
"""
移除游戏模式规则
Args:
game_mode: 游戏模式
Returns:
是否移除成功
"""
try:
if game_mode in self.rule_config["game_mode_rules"]:
del self.rule_config["game_mode_rules"][game_mode]
self.rule_state["total_rules"] -= 1
self.rule_state["rules_modified"] += 1
print(f"✓ 游戏模式规则已移除: {game_mode}")
return True
else:
print(f"✗ 游戏模式规则不存在: {game_mode}")
return False
except Exception as e:
print(f"✗ 游戏模式规则移除失败: {e}")
self.rule_stats["rule_errors"] += 1
return False
def get_rule_stats(self) -> Dict[str, Any]:
"""
获取规则统计信息
Returns:
规则统计字典
"""
return {
"state": self.rule_state.copy(),
"stats": self.rule_stats.copy(),
"config": self.rule_config.copy()
}
def reset_stats(self):
"""重置规则统计信息"""
try:
self.rule_stats = {
"rules_applied": 0,
"rules_violated": 0,
"rule_errors": 0
}
print("✓ 规则统计信息已重置")
except Exception as e:
print(f"✗ 规则统计信息重置失败: {e}")
def set_rule_config(self, config: Dict[str, Any]) -> bool:
"""
设置规则配置
Args:
config: 规则配置字典
Returns:
是否设置成功
"""
try:
self.rule_config.update(config)
print(f"✓ 规则配置已更新: {self.rule_config}")
return True
except Exception as e:
print(f"✗ 规则配置设置失败: {e}")
return False
def get_rule_config(self) -> Dict[str, Any]:
"""
获取规则配置
Returns:
规则配置字典
"""
return self.rule_config.copy()
def _trigger_rule_callback(self, callback_type: str, data: Dict[str, Any]):
"""
触发规则回调
Args:
callback_type: 回调类型
data: 回调数据
"""
try:
if callback_type in self.rule_callbacks:
for callback in self.rule_callbacks[callback_type]:
try:
callback(data)
except Exception as e:
print(f"✗ 规则回调执行失败: {callback_type} - {e}")
except Exception as e:
print(f"✗ 规则回调触发失败: {e}")
def register_rule_callback(self, callback_type: str, callback: callable):
"""
注册规则回调
Args:
callback_type: 回调类型
callback: 回调函数
"""
try:
if callback_type in self.rule_callbacks:
self.rule_callbacks[callback_type].append(callback)
print(f"✓ 规则回调已注册: {callback_type}")
else:
print(f"✗ 无效的回调类型: {callback_type}")
except Exception as e:
print(f"✗ 规则回调注册失败: {e}")
def unregister_rule_callback(self, callback_type: str, callback: callable):
"""
注销规则回调
Args:
callback_type: 回调类型
callback: 回调函数
"""
try:
if callback_type in self.rule_callbacks:
if callback in self.rule_callbacks[callback_type]:
self.rule_callbacks[callback_type].remove(callback)
print(f"✓ 规则回调已注销: {callback_type}")
else:
print(f"✗ 无效的回调类型: {callback_type}")
except Exception as e:
print(f"✗ 规则回调注销失败: {e}")