Rating & Leaderboards
ArenaPvP includes a built-in rating system that tracks player performance separately for each arena category.
Rating Modes
ArenaPvP supports two rating modes. You can choose one depending on the level of competitiveness you want:
| Mode | Description | Default |
|---|---|---|
| Fixed-Point | Simple +/- system (gain on win, lose on defeat) | ✅ Enabled |
| OpenSkill (Weng-Lin) | Bayesian skill estimation using the Plackett-Luce model | Disabled |
Both modes track ratings per category — your 2-FFA rating is independent of your 4-TDM rating.
Fixed-Point Rating (Default)
The default rating system uses a simple, predictable model:
- Every player starts with a default rating of 1000.
- After each match:
- Winners gain rating points (default: +25).
- Losers lose rating points (default: -15).
- Rating can never go below the configured minimum (default: 0).
OpenSkill Rating (Optional)
When enabled (OpenSkillEnabled: true), ArenaPvP uses the Weng-Lin ranking algorithm (Plackett-Luce model) via the openskill-java library.
Instead of fixed +/- points, each player has two hidden parameters:
| Parameter | Description | Default |
|---|---|---|
| μ (mu) | Estimated skill level | 25.0 |
| σ (sigma) | Uncertainty about the estimate | 8.333 |
After each match, OpenSkill recalculates μ and σ for all participants based on the outcome:
- Winning increases μ and decreases σ (more certain the player is skilled).
- Losing decreases μ and may increase or decrease σ depending on the expected outcome.
- Upsets (lower-rated beats higher-rated) cause larger adjustments.
The visible rating displayed on the leaderboard is derived from these values using the formula:
$$ \text{rating} = \max!\Big(0,;\text{round}\big((\mu - 3\sigma) \times \text{scale} + \text{offset}\big)\Big) $$
With the default scale of 40 and offset of 1000, a new player's visible rating is:
$$ \max!\Big(0,;\text{round}\big((25.0 - 3 \times 8.333) \times 40 + 1000\big)\Big) = 1000 $$
As a player wins matches, their μ increases and σ decreases, causing their visible rating to rise. The system naturally adapts: a player on a winning streak will gain more per match, while established players see smaller adjustments.
Use OpenSkill if you want a more competitive and fair ranking system. It's particularly effective for:
- Servers with a wide range of skill levels
- Game modes where accurate matchmaking matters (e.g. ranked 1v1 duels)
- Reducing rating inflation over time
The fixed-point system is better for casual servers where simpler, more predictable rating changes are preferred.
You can switch between Fixed-Point and OpenSkill at any time. When OpenSkill is enabled, the fixed +/- rating changes (RatingGainOnWin, RatingLossOnDefeat) are still applied first, and then OpenSkill recalculates the rating using μ/σ — effectively overwriting the visible rating with the derived value. Abandon penalties still apply normally in both modes.
Penalties
Leaving a match early or disconnecting during an active arena has consequences:
| Action | Default Penalty |
|---|---|
Abandoning (using /arena leave during a match) or Disconnecting | -25 rating |
Penalties can be enabled/disabled and customized in config.json. Abandon penalties are applied in both rating modes.
Viewing the Leaderboard
Open the leaderboard UI with:
/arena leaderboard
This opens a category selection screen. Choose a category (e.g. 2-FFA) to see the top players ranked by rating, along with their kill/death stats.
You can also use /arena lb, /arena top, or /arena ranking.
Stats Tracked
For each player and category, the following stats are recorded:
| Stat | Description |
|---|---|
| Rating | Current visible rating (fixed-point or derived from OpenSkill) |
| Kills | Total kills in this category |
| Deaths | Total deaths in this category |
| Wins | Total matches won |
| Losses | Total matches lost |
| K/D Ratio | Kill-to-death ratio |
| W/L Ratio | Win-to-loss ratio |
| μ (mu) | Estimated skill (only when OpenSkill is enabled) |
| σ (sigma) | Skill uncertainty (only when OpenSkill is enabled) |
Rating Configuration
These settings in config.json control the rating system:
{
"RatingGainOnWin": 25,
"RatingLossOnDefeat": 15,
"AbandonPenaltyEnabled": true,
"AbandonPenaltyRating": 25,
"MinRatingAfterPenalty": 0,
"MaxRatingDifference": 50,
"MaxRatingDifferenceOverrides": {},
"OpenSkillEnabled": false,
"OpenSkillRatingScale": 40,
"OpenSkillRatingOffset": 1000
}
OpenSkill Settings
| Key | Type | Default | Description |
|---|---|---|---|
OpenSkillEnabled | boolean | false | Enable the Weng-Lin (Plackett-Luce) skill-based rating system |
OpenSkillRatingScale | integer | 40 | Multiplier applied to the ordinal value (μ − 3σ) to produce the visible rating |
OpenSkillRatingOffset | integer | 1000 | Base offset added to the scaled ordinal, so new players start at this rating |
- Higher scale → wider rating spread between players of different skill levels.
- Higher offset → higher starting rating for new players.
- The defaults (scale=40, offset=1000) produce a starting rating of 1000 that can range from 0 to ~2000+ for top players.
Rating Tiers
You can assign visual tier names (e.g. "Bronze", "Silver", "Gold") to rating ranges. This is purely cosmetic — it does not affect matchmaking or any game logic.
When RatingTiersEnabled is true (default), all UIs that display rating — such as the Leaderboard — will show the tier name instead of the numeric value. The column header changes from "Rating" to "Tier" automatically.
When RatingTiersEnabled is false, UIs show the numeric rating as usual.
PlaceholderAPI tier placeholders (%arenapvp_tier_{cat}%, %arenapvp_top_tier_{cat}_{pos}%) are always available regardless of this setting.
How It Works
Each tier covers a bracket of RatingPerTier points (default 300). The first name maps to 0–(RatingPerTier−1), the second to RatingPerTier–(2×RatingPerTier−1), and so on. The last name in the array always absorbs everything above its bracket.
With the default settings (RatingPerTier: 300, 10 names):
| Tier # | Rating Range | Default Name |
|---|---|---|
| 1 | 0 – 299 | Iron |
| 2 | 300 – 599 | Bronze |
| 3 | 600 – 899 | Silver |
| 4 | 900 – 1199 | Gold |
| 5 | 1200 – 1499 | Platinum |
| 6 | 1500 – 1799 | Diamond |
| 7 | 1800 – 2099 | Master |
| 8 | 2100 – 2399 | Grandmaster |
| 9 | 2400 – 2699 | Challenger |
| 10 | 2700+ | Challenger++ |
Configuration
{
"RatingTiersEnabled": true,
"RatingPerTier": 300,
"RatingTierNames": [
"Iron", "Bronze", "Silver", "Gold", "Platinum",
"Diamond", "Master", "Grandmaster", "Challenger", "Challenger++"
]
}
Change RatingPerTier to control the bracket width. For example, with 500 and 5 names:
{
"RatingPerTier": 500,
"RatingTierNames": ["Bronze", "Silver", "Gold", "Diamond", "Champion"]
}
This creates brackets: 0–499 Bronze, 500–999 Silver, 1000–1499 Gold, 1500–1999 Diamond, 2000+ Champion.
You can rename any tier freely. You don't need to provide exactly 10 names — providing fewer works fine:
{
"RatingTierNames": [
"Iron", "Bronze", "Silver",
"Diamond", "Master", "Grandmaster", "Challenger", "Challenger+"
]
}
With 8 names and RatingPerTier: 300, each still covers 300 points (0–299, 300–599, ..., 1800–2099) and everything ≥ 2100 gets the last name (Challenger+).
Placeholders
| Placeholder | Description |
|---|---|
%arenapvp_tier_{cat}% | Player's current tier name in category |
%arenapvp_top_tier_{cat}_{pos}% | Tier name of the player at that leaderboard rank |
Example:
%arenapvp_tier_2-FFA% → "Gold"
%arenapvp_top_tier_2-FFA_1% → "Challenger"
Matchmaking Rating Difference
The MaxRatingDifference setting controls how far apart two players' ratings can be for them to be matched:
- A value of
50means a 1200-rated player can be matched with players between 1150 and 1250. - A value of
0disables rating-based filtering (anyone can be matched with anyone).
Data Storage
Player stats are stored as JSON files in data/leaderboards/ under the mod folder, organized by category. These files are automatically created and updated — no manual management required.