Skip to main content

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:

ModeDescriptionDefault
Fixed-PointSimple +/- system (gain on win, lose on defeat)✅ Enabled
OpenSkill (Weng-Lin)Bayesian skill estimation using the Plackett-Luce modelDisabled

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:

ParameterDescriptionDefault
μ (mu)Estimated skill level25.0
σ (sigma)Uncertainty about the estimate8.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.

When to use OpenSkill?

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.

Switching between modes

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:

ActionDefault 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.

Aliases

You can also use /arena lb, /arena top, or /arena ranking.

Stats Tracked

For each player and category, the following stats are recorded:

StatDescription
RatingCurrent visible rating (fixed-point or derived from OpenSkill)
KillsTotal kills in this category
DeathsTotal deaths in this category
WinsTotal matches won
LossesTotal matches lost
K/D RatioKill-to-death ratio
W/L RatioWin-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

KeyTypeDefaultDescription
OpenSkillEnabledbooleanfalseEnable the Weng-Lin (Plackett-Luce) skill-based rating system
OpenSkillRatingScaleinteger40Multiplier applied to the ordinal value (μ − 3σ) to produce the visible rating
OpenSkillRatingOffsetinteger1000Base offset added to the scaled ordinal, so new players start at this rating
Tuning OpenSkill
  • 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 RangeDefault Name
10 – 299Iron
2300 – 599Bronze
3600 – 899Silver
4900 – 1199Gold
51200 – 1499Platinum
61500 – 1799Diamond
71800 – 2099Master
82100 – 2399Grandmaster
92400 – 2699Challenger
102700+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

PlaceholderDescription
%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 50 means a 1200-rated player can be matched with players between 1150 and 1250.
  • A value of 0 disables 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.