Skip to main content

Configuration File

ArenaPvP's main configuration lives in mods/HaporeLab_ArenaPvP/config.json. It's created automatically on first launch with sensible defaults.

Reloading Configuration

You can reload the configuration without restarting the server:

/arena reload

This reloads config.json and applies changes to language, rating settings, and other global options. Arena templates (from templates/) and inventory presets (from presets/) are also refreshed — new templates and presets become available for the next match.

Global Settings

KeyTypeDefaultDescription
Versionstring"17"Config format version (managed automatically, do not edit)
Languagestring"en"Plugin language: "en" or "es"
DebugModebooleanfalseEnable debug mode (allows single-player arena testing)
InstancesLimitinteger0Max concurrent arena instances (0 = unlimited)
ArenaWorldPrefixstring"arena_"Prefix for arena world names

Visual Effects

KeyTypeDefaultDescription
ParticleOnDeathbooleantrueShow particles when a player dies in the arena
ParticleIdsstring[]["Teleport", "Lightning:1.5", "MemoryUnlock:1.5"]Particle effect IDs for death effect (format: "ParticleId" or "ParticleId:scale")
ActiveRaycastbooleantrueShow colored particles when looking at another player
ParticleIdRaycastEnemystring"Arena_Raycast_Enemy"Particle when aiming at an enemy
ParticleIdRaycastAllystring"Arena_Raycast_Ally"Particle when aiming at an ally
FriendlyFireOutsideArenabooleantrueEnable or disable friendly fire outside the arena

Rating & Matchmaking

KeyTypeDefaultDescription
MaxRatingDifferenceinteger50Max rating gap for matchmaking (0 = no limit)
MaxRatingDifferenceOverridesobject{}Per-category overrides for MaxRatingDifference (see below)
RatingGainOnWininteger25Rating earned per victory
RatingLossOnDefeatinteger15Rating lost per defeat
AbandonPenaltyEnabledbooleantruePenalize players who leave or disconnect mid-match
AbandonPenaltyRatinginteger25Rating deducted for abandoning or disconnecting
MinRatingAfterPenaltyinteger0Minimum rating floor (rating cannot go below this)
OpenSkillEnabledbooleanfalseEnable the OpenSkill (Weng-Lin) skill-based rating system
OpenSkillRatingScaleinteger40Multiplier for the ordinal value (μ − 3σ) when deriving visible rating
OpenSkillRatingOffsetinteger1000Base offset added after scaling, so new players start at this rating
RatingTiersEnabledbooleantrueWhen enabled, UIs (leaderboard, etc.) display tier names instead of numeric rating. PlaceholderAPI placeholders are always available regardless of this setting
RatingPerTierinteger300Rating points per tier bracket. Controls tier width: with 300 each tier covers 300 points (0–299, 300–599, etc.). The number of tiers equals the length of RatingTierNames
RatingTierNamesstring[](see below)Array of tier names mapped to brackets of RatingPerTier points each. Fewer names is OK — the last name absorbs all higher ratings

MaxRatingDifferenceOverrides

By default, all categories use the global MaxRatingDifference value. You can override the rating gap per category by specifying category codes as keys:

{
"MaxRatingDifference": 50,
"MaxRatingDifferenceOverrides": {
"2-FFA": 100,
"4-T": 30,
"4-TCTO": 75
}
}

In this example:

  • 2-FFA allows a rating gap up to 100 (more relaxed matchmaking for 1v1)
  • 4-T restricts the gap to 30 (tighter matchmaking for 2v2 teams)
  • 4-TCTO allows up to 75
  • All other categories use the global default of 50
tip

This is useful when you want more relaxed matchmaking for less competitive modes (like FFA duels) and stricter matchmaking for competitive team modes.

Reconnection

KeyTypeDefaultDescription
EnableReconnectionSystembooleantrueEnable the reconnection system (allows players to rejoin after disconnect)

Broadcast

KeyTypeDefaultDescription
BroadcastQueuebooleantrueSend a server-wide message when a player joins a queue
BroadcastBlacklistWorldsstring[][]Worlds excluded from receiving the broadcast (supports wildcards)

When BroadcastQueue is enabled, every time a player joins a queue, all other online players receive a notification like:

Steve has joined the 1v1 FFA queue.

The player who joined does not receive the broadcast — only the rest of the server. Category codes are automatically formatted into a readable name:

CodeDisplay
2-FFA1v1 FFA
2-T1v1 Team
4-T2v2 Team
4-TDM2v2 Team Deathmatch
6-TCTO3v3 Capture the Orb
4-FFADM4-player FFA Deathmatch

Worlds whose name starts with the configured ArenaWorldPrefix (e.g. arena_) are always excluded — you don't need to add them manually.

BroadcastBlacklistWorlds

Use BroadcastBlacklistWorlds to exclude additional worlds from the broadcast. Two formats are supported:

FormatBehaviourExample
"lobby_vip"Exact match — excludes only the world with that exact nameOnly lobby_vip is excluded
"dungeon_*"Wildcard prefix — excludes every world whose name starts with the prefix before *dungeon_forest, dungeon_cave, etc.
{
"BroadcastQueue": true,
"BroadcastBlacklistWorlds": [
"lobby_staff",
"dungeon_*",
"minigame_*"
]
}

In this example:

  • lobby_staff is excluded by exact name
  • Any world starting with dungeon_ is excluded (e.g. dungeon_forest, dungeon_ice)
  • Any world starting with minigame_ is excluded
  • All arena_* worlds are excluded automatically
tip

This is useful to avoid spamming players who are in unrelated activities like dungeons or mini-games.

Combat Logger

KeyTypeDefaultDescription
CombatLogEnabledbooleantrueEnable the combat logger (penalizes disconnecting during PvP combat)
CombatLogTimeSecondsinteger5Time window in seconds after PvP damage to consider a player "in combat"
CombatLogTimeSecondsOverridesobject{}Per-category overrides for CombatLogTimeSeconds (see below)

CombatLogTimeSecondsOverrides

By default, all categories use the global CombatLogTimeSeconds value. You can override the combat timer per category by specifying category codes as keys:

{
"CombatLogTimeSeconds": 5,
"CombatLogTimeSecondsOverrides": {
"2-FFA": 180,
"4-T": 180,
"2-T": 180
}
}

In this example:

  • 2-FFA (1v1 duels) uses 180 seconds — effectively the entire match duration
  • 4-T (2v2 team) uses 180 seconds — once combat starts, there’s no escape
  • All other categories use the global default of 5 seconds
Why use high values for duels?

In classic modes (FFA, Team) where there are no respawns, a player who disconnects during combat is marked as dead. If the combat timer is too short (e.g. 5 seconds), a player in a Team match could disconnect just after combat ends, reconnect with full health, and gain an unfair advantage.

By setting the combat timer equal to or greater than the match’s TimeLimit, you ensure that once a player enters combat, disconnecting at any point during the match will count as a combat log — no loopholes.

Category Sorting

KeyTypeDefaultDescription
SortCategoryOverridesobject{}Custom display order for arena categories across all UIs

By default, categories are sorted alphabetically. You can override the display order by assigning a numeric priority to each category code — lower numbers appear first.

{
"SortCategoryOverrides": {
"2-FFA": 0,
"4-T": 1,
"4-TDM": 2,
"4-FFA": 3,
"6-TCTO": 4
}
}

In this example:

  • 2-FFA appears first, 4-T second, 4-TDM third, and so on
  • Any category not listed will appear after all overridden categories, in alphabetical order

You don't need to list every category — only the ones you want to prioritize:

{
"SortCategoryOverrides": {
"2-FFA": 0
}
}

This puts 2-FFA first; everything else keeps its default alphabetical order.

Where does this apply?

The sort order is applied everywhere categories are listed:

  • Arena UI (queue selector)
  • Leaderboard (category picker)
  • HyTv (match browser)
  • Map Preferences (template blacklist per category)

Keybinds

KeyTypeDefaultDescription
GameModeKeyOpensArenaUIbooleantrueWhen the gamemode key (O) is pressed outside an arena, open the Arena UI (/arena) instead of changing gamemode

Blocked Commands

KeyTypeDefaultDescription
BlockedCommandsInArenastring[]["tp", "home", "spawn", "tpa", "warp", "back"]Command prefixes to block while a player is inside an arena (OP players are exempt)

Each entry is a command prefix (without /). For example, "tp" blocks /tp, /tp player1, etc. Players with OP permissions bypass this restriction.

Permissions

KeyTypeDefaultDescription
DisableGroupPermissionstring[][]Permission groups to disable inside arena (list of group names)

This is useful for disabling certain permission groups' abilities (like creative mode or fly) while players are inside an arena match.

Integrations

Optional mod integrations are grouped under the Integrations key. Each integration only takes effect if the corresponding mod is installed — otherwise, the settings are ignored.

{
"Integrations": {
"MMOSkillTree": {
"FairPlayMode": true
},
"RPGLeveling": {
"ShareExp": true,
"SharePercentage": 50,
"ShareDistance": 1000,
"ShowLvlGroup": true,
"FormatLvlGroup": "Lvl. {0}",
"FairPlayMode": true
}
}
}

MMO Skill Tree

KeyTypeDefaultDescription
FairPlayModebooleantrueSave and reset skills on arena entry, restore on exit — ensures all players compete on equal footing. See MMO Skill Tree

RPG Leveling

KeyTypeDefaultDescription
ShareExpbooleantrueShare XP between group members outside arenas
SharePercentageinteger50Percentage of earned XP shared with nearby group members
ShareDistanceinteger1000Max distance (blocks) for XP sharing
ShowLvlGroupbooleantrueShow player level in the group HUD
FormatLvlGroupstring"Lvl. {0}"Level display format ({0} = level number)
FairPlayModebooleantrueSave and reset level on arena entry, restore on exit — ensures all players compete on equal footing. See RPG Leveling

Complete Example

{
"Version": "18",
"DebugMode": false,
"InstancesLimit": 0,
"Language": "en-US",
"GameModeKeyOpensArenaUI": true,
"ArenaWorldPrefix": "arena_",
"MaxRatingDifference": 50,
"MaxRatingDifferenceOverrides": {},
"RatingGainOnWin": 25,
"RatingLossOnDefeat": 15,
"AbandonPenaltyEnabled": true,
"AbandonPenaltyRating": 25,
"MinRatingAfterPenalty": 0,
"OpenSkillEnabled": false,
"OpenSkillRatingScale": 40,
"OpenSkillRatingOffset": 1000,
"RatingTiersEnabled": true,
"RatingPerTier": 300,
"RatingTierNames": [
"Iron", "Bronze", "Silver", "Gold", "Platinum",
"Diamond", "Master", "Grandmaster", "Challenger", "Challenger+"
],
"MatchHistoryEnabled": true,
"MatchHistoryLimit": 100,
"AssistWindowSeconds": 10,
"EnableReconnectionSystem": true,
"FriendlyFireOutsideArena": false,
"CombatLogEnabled": true,
"CombatLogTimeSeconds": 5,
"CombatLogTimeSecondsOverrides": {},
"ActiveRaycast": true,
"ParticleIdRaycastEnemy": "Arena_Raycast_Enemy",
"ParticleIdRaycastAlly": "Arena_Raycast_Ally",
"ParticleOnDeath": true,
"ParticleIds": [
"Teleport",
"Lightning:1.5",
"MemoryUnlock:1.5"
],
"SortCategoryOverrides": {},
"BroadcastQueue": true,
"BroadcastBlacklistWorlds": [],
"BlockedCommandsInArena": [
"tp",
"home",
"spawn",
"tpa",
"warp",
"back"
],
"DisableGroupPermission": [],
"Integrations": {
"MMOSkillTree": {
"FairPlayMode": true
},
"RPGLeveling": {
"ShareExp": true,
"SharePercentage": 50,
"ShareDistance": 1000,
"ShowLvlGroup": true,
"ShowExpBarGroup": true,
"FormatLvlGroup": "Lvl. {0}",
"FairPlayMode": true
}
}
}
info

Arena templates now managed as individual files: