方块宝可梦-排位赛

方块宝可梦-排位赛

为Cobblemon添加排名系统和跨服务器匹配支持。

游戏机制

📊 CobblemonRanked 排位系统文档

常见问题


该模组只需在服务端安装。
客户端安装后,按下 X 键默认会打开图形化 GUI。
💡 为了使用 enableTeamPreview 功能,客户端也需要安装此模组。

🎯 功能概览

  • 内置多语言支持(中文和英文),易于扩展
  • 可配置的战斗竞技场,支持自动传送与返回
  • 可自定义的段位称号和 Elo 分数阈值
  • 支持三种模式:单打、双打和2v2单打
  • Elo 排位系统按模式独立计算
  • 每种模式拥有独立的奖励系统和可自定义的指令
  • 内置赛季系统,支持自动轮换和数据重置
  • 基于 Elo 的匹配队列,可选择按等待时间放宽匹配条件
  • 掉线视为失败,并扣除 Elo 分数
  • 完全 GUI 驱动,支持可点击文本菜单和图形化 GUI
  • 支持跨服务器匹配
  • 当 enableTeamPreview 为 True 时,如果宝可梦数量超过设定限制,将触发选择参战宝可梦的界面。如果没有超过限制,则不会触发该界面。
    例如,如果 singlesPickCountNumber 设为 3:
    玩家 1 有 5 只宝可梦,将触发选择界面,需要选择 3 只参战。
    玩家 2 只有 2 只宝可梦,不会触发选择界面。玩家 1 完成选择后,将直接开始战斗。

🌐 跨服务器匹配(不再维护)

自 v1.2.0+ 可用 — 支持从任何服务器或单人世界连接(需要正版 Minecraft 账号)
跨服务器匹配演示与配置:YouTube
你可以在此下载服务端以搭建自己的服务器。下载

✅ 使用方法

  1. 在配置中启用 enableCrossServer
  2. 修改 cloudServerId,不要与其他服务器重复(默认的 server 可能已被他人使用)
  3. 输入 /rank reload 重新加载配置,或重启服务器
  4. 输入 /rank cross start 连接云服务器

⚠️ 当前限制

  • 仅支持单打模式
  • 某些道具和技能效果可能无法生效
  • 来自同一服务器的玩家不会被匹配在一起

🌐 跨服务器指令

指令 描述 权限
/rank cross start 连接云服务器 OP
/rank cross stop 断开云服务器连接 OP
/rank cross chat 与对手聊天 所有玩家
/rank cross join singles 进入单打匹配队列 所有玩家
/rank cross leave 离开匹配队列 所有玩家
/rank cross battle move [1-4] 战斗中使用招式 所有玩家
/rank cross battle switch [1-6] 切换宝可梦 所有玩家
/rank cross battle forfeit 投降 所有玩家

📌 指令总览

所有指令均以 /rank 开头


🎮 玩家指令

指令 描述
/rank gui 打开主菜单 GUI
/rank gui_top 打开排行榜格式选择 GUI
/rank gui_info 查看你的详细 Elo 统计数据
/rank gui_info_players 分页查看在线玩家列表以查看其排名
/rank gui_myinfo 快速查看自己的排名
/rank gui_queue 打开匹配菜单
/rank gui_info_format <玩家> <模式> GUI 查看另一名玩家的赛季数据
/rank queue join [模式] 加入排位队列
/rank queue leave 离开所有匹配队列
/rank status 显示当前队列状态
/rank info <模式> <赛季> 显示指定模式和赛季的数据
/rank info <玩家> <模式> [赛季] 查看另一名玩家在特定模式和赛季的排名
/rank top 查看默认模式和当前赛季的排行榜
/rank top <模式> [赛季] [页数] [数量] 分页查看指定模式和赛季的排行榜
/rank season 查看当前赛季信息(开始/结束时间、参与情况等)
/rank pokemon_usage <赛季> <页数> 查看宝可梦使用率统计

🛡️ 管理员指令(需要 OP)

指令 描述
/rank gui_reward 打开奖励模式选择 GUI
/rank gui_reset 分页显示在线玩家列表以重置排名
/rank reset <玩家> <模式> 重置玩家在当前赛季和模式的数据
/rank reward <玩家> <模式> <段位> 向玩家发放指定段位的奖励
/rank season end 强制结束当前赛季
/rank reload 重新加载配置文件(语言、段位设置等)
/rank setseasonname <赛季ID> <名称> 设置赛季名称

占位符 API

基础占位符(使用默认模式)

占位符 描述
%cobblemon_ranked:elo% ELO 分数
%cobblemon_ranked:rank_title% 段位称号
%cobblemon_ranked:win_rate% 胜率
%cobblemon_ranked:wins% 胜利次数
%cobblemon_ranked:losses% 失败次数
%cobblemon_ranked:total_games% 总比赛场数
%cobblemon_ranked:streak% 当前连胜
%cobblemon_ranked:best_streak% 最佳连胜纪录
%cobblemon_ranked:flee_count% 逃跑/退出次数
%cobblemon_ranked:rank% 当前排名(例如,#1)

赛季相关占位符

占位符 描述
%cobblemon_ranked:season_name% 赛季名称
%cobblemon_ranked:season_id% 赛季 ID
%cobblemon_ranked:season_days_left% 赛季剩余天数
%cobblemon_ranked:season_time_left% 格式化后的剩余时间

段位进度占位符

占位符 描述
%cobblemon_ranked:next_rank_elo% 下一段位所需的 ELO 分数
%cobblemon_ranked:next_rank_name% 下一段位名称

队列状态占位符

占位符 描述
%cobblemon_ranked:queue_status% 当前队列状态

模式支持(指定战斗模式)

支持三种战斗模式:singles、doubles、2v2singles

用法:在占位符中添加 _模式

占位符 描述
%cobblemon_ranked:elo_singles% 单打 ELO 分数
%cobblemon_ranked:elo_doubles% 双打 ELO 分数
%cobblemon_ranked:elo_2v2singles% 2v2 单打 ELO 分数
%cobblemon_ranked:rank_title_singles% 单打段位称号
%cobblemon_ranked:rank_title_doubles% 双打段位称号
%cobblemon_ranked:win_rate_singles% 单打胜率
%cobblemon_ranked:win_rate_doubles% 双打胜率
%cobblemon_ranked:wins_singles% 单打胜利次数
%cobblemon_ranked:wins_doubles% 双打胜利次数
%cobblemon_ranked:rank_singles% 单打排名
%cobblemon_ranked:rank_doubles% 双打排名
%cobblemon_ranked:next_rank_elo_singles% 单打下一段位所需 ELO
%cobblemon_ranked:next_rank_name_singles% 单打下一段位名称

注意: 赛季相关占位符(season_name、season_id、season_days_left、season_time_left)和 queue_status 不支持模式参数,因为它们与特定模式无关。


⚙️ 配置文件参考(cobblemon_ranked.json)

点击展开完整配置参考(含行内注释)
{
  "defaultLang": "en",                     // 默认语言:'en' 或 'zh'
  "defaultFormat": "singles",              // 默认战斗模式
  "minTeamSize": 1,                        // 每队最少宝可梦数量
  "maxTeamSize": 6,                        // 每队最多宝可梦数量
  "allowDuplicateItems": false,            // 允许队伍中重复携带相同道具
  "enableTeamPreview": true,               // 启用队伍预览和选择(携带 6 选 3/4)
  "teamSelectionTime": 90,                 // 队伍选择允许时间(秒)
  "turnActionTimeoutSeconds": 90,          // 每回合选择行动允许时间(秒,0 = 禁用)
  "singlesPickCount": 3,                   // 单打选择宝可梦数量(通常为 3)
  "doublesPickCount": 4,                   // 双打选择宝可梦数量(通常为 4)
  "maxEloDiff": 200,                       // 匹配时最大 Elo 差距
  "maxQueueTime": 300,                     // 最大等待时间(秒),超过后放宽 Elo 规则
  "maxEloMultiplier": 3.0,                 // Elo 差距放宽的最大倍数
  "seasonDuration": 30,                    // 赛季持续时间(天)
  "initialElo": 1000,                      // 赛季初的 Elo 分数
  "eloKFactor": 32,                        // Elo K 系数(影响 Elo 变化幅度)
  "minElo": 0,                             // Elo 最低下限
  "loserProtectionRate": 1.0,              // 败者保护系数(0.0 到 1.0)。败者最多扣除(胜者得分 * 保护系数)。1.0 = 无保护
  "bannedPokemon": ["Mewtwo", "Arceus"],   // 禁用宝可梦列表(例如,传说宝可梦)
  "restrictedPokemon": ["Mew", "Celebi"],  // 限制宝可梦列表
  "maxRestrictedCount": 2,                 // 队伍中允许的限制宝可梦最大数量
  "bannedHeldItems": ["cobblemon:leftovers"], // 禁用宝可梦携带道具
  "bannedCarriedItems": ["cobblemon:leftovers"], // 禁用玩家背包中的道具
  "bannedMoves": ["leechseed"],            // 禁用招式
  "bannedNatures": ["cobblemon:naughty"],  // 禁用性格
  "bannedAbilities": [],                   // 禁用特性
  "bannedGenders": ["MALE"],               // 禁用性别
  "bannedShiny": false,                    // 禁用闪光宝可梦参与战斗
  "allowedFormats": ["singles", "doubles", "2v2singles"], // 支持的战斗模式
  "maxLevel": 0,                           // 宝可梦最高等级(0 = 无限制)
  "allowDuplicateSpecies": false,          // 是否允许重复的宝可梦种类
  "enableCustomLevel": false,              // 启用强制修改宝可梦等级
  "customBattleLevel": 50,                 // 强制修改后的宝可梦等级
  "preventBlockBreaking": true,            // 防止玩家在排位战斗中破坏方块
  "restorePokemonHpAfterBattle": true,     // 战斗结束后恢复宝可梦 HP
  "battleArenas": [                        // 竞技场列表(战斗传送位置)
    {
      "world": "minecraft:overworld",
      "playerPositions": [
        { "x": 0.0, "y": 70.0, "z": 0.0 },
        { "x": 10.0, "y": 70.0, "z": 0.0 }
      ]
    },
    {
      "world": "minecraft:overworld",
      "playerPositions": [
        { "x": 100.0, "y": 65.0, "z": 100.0 },
        { "x": 110.0, "y": 65.0, "z": 100.0 }
      ]
    }
  ],
  "victoryRewards": [                      // 胜利奖励配置(每次胜利后执行)
    "give {player} minecraft:experience_bottle 5",
    "give {player} minecraft:emerald 1"
  ],
  "rankRewards": {                         // 按模式划分的段位奖励(基于指令)
    "singles": {
      "Bronze": ["give {player} minecraft:apple 5"],
      "Silver": ["give {player} minecraft:golden_apple 3"],
      "Gold": ["give {player} minecraft:diamond 2", "give {player} minecraft:emerald 5"],
      "Platinum": ["give {player} minecraft:diamond_block 1", "effect give {player} minecraft:strength 3600 1"],
      "Diamond": ["give {player} minecraft:netherite_ingot 1", "give {player} minecraft:elytra 1"],
      "Master": ["give {player} minecraft:netherite_block 2", "give {player} minecraft:totem_of_undying 1", "effect give {player} minecraft:resistance 7200 2"]
    },
    "doubles": {
      "Bronze": ["give {player} minecraft:bread 5"],
      "Silver": ["give {player} minecraft:gold_nugget 10"],
      "Gold": ["give {player} minecraft:emerald 1"],
      "Platinum": ["give {player} minecraft:golden_apple 1"],
      "Diamond": ["give {player} minecraft:totem_of_undying 1"],
      "Master": ["give {player} minecraft:netherite_ingot 2"]
    },
    "2v2singles": {
      "Bronze": ["give {player} minecraft:bread 5"],
      "Silver": ["give {player} minecraft:gold_nugget 10"],
      "Gold": ["give {player} minecraft:emerald 1"],
      "Platinum": ["give {player} minecraft:golden_apple 1"],
      "Diamond": ["give {player} minecraft:totem_of_undying 1"],
      "Master": ["give {player} minecraft:netherite_ingot 2"]
    }
  },
  "rankTitles": {                          // Elo 阈值 → 段位名称
    "3500": "Master",
    "3000": "Diamond",
    "2500": "Platinum",
    "2000": "Gold",
    "1500": "Silver",
    "0": "Bronze"
  },
  "rankRequirements": {              // 每个段位奖励所需的最低胜率要求(0.0 ~ 1.0)
    "Bronze": 0.0,
    "Silver": 0.3,
    "Gold": 0.3,
    "Platinum": 0.3,
    "Diamond": 0.3,
    "Master": 0.3
  },
  "enableCrossServer": true,       // 启用跨服务器匹配
  "cloudServerId": "server",       // 此服务器的云服务器 ID(不能与他人重复)
  "cloudToken": "",                // 云服务器认证令牌(公共云服务器留空)
  "cloudApiUrl": "http://139.196.103.55:8000",  // 云 API 地址(IP 或域名均可)
  "cloudWebSocketUrl": "ws://139.196.103.55:8000/ws/" // 云 WebSocket 地址(IP 或域名均可)
}
点击展开 `database.json`
{
	// 数据库类型:'sqlite' 或 'mysql'
	"databaseType": "sqlite",
	// SQLite 数据库文件路径(相对于配置文件夹)
	"sqliteFile": "ranked.db",
	// MySQL 配置
	"mysql": {
		// MySQL 主机地址
		"host": "localhost",
		// MySQL 端口
		"port": 3306,
		// MySQL 数据库名称
		"database": "cobblemon_ranked",
		// MySQL 用户名
		"username": "root",
		// MySQL 密码
		"password": "",
		// MySQL 连接池大小
		"poolSize": 10,
		// MySQL 连接超时时间(毫秒)
		"connectionTimeout": 5000,
		// 其他 MySQL 连接参数
		"parameters": "useSSL=false&serverTimezone=UTC&characterEncoding=utf8"
	}
}