RiskOfArena
Free-for-all PvP: enemy-free arenas, item drafts or personal XP, timed level caps, configurable rewards, respawns and score limits. RiskOfOptions support.RiskOfArena
By claytemplar.
A free-for-all PvP mode for Risk of Rain 2. Select Arena after Monsoon, vote for a map, and fight other players without monsters or stage objectives. Build your loadout through item rewards or spend them on personal levels. Features
- Four reward modes: unrestricted Command, item Draft, Random items, or Weighted Essence with configurable rarity chances.
- Configurable rewards: set starting items and rewards per kill, death or timer.
- Personal leveling: choose XP instead of an item, with a level cap that increases over time.
- Map voting: stage previews, a host-selected default map and configurable blacklist.
- Arena maps: no monsters, chests, shrines or teleporters. Void fog is disabled in Void Fields, Void Locus and Planetarium.
- Respawning: return after a timer, after choosing a reward, or both.
- Arena scrapper: trade items for rewards that preserve their rarity in Weighted, Draft and Random modes.
- Match controls: configurable score and time limits, a leaderboard, and Continue Game to raise the target by another 20 kills.
- Host-controlled rules: edit match settings from character selection; clients can view the host’s settings.
- Local preferences: configurable controls, player names and opponent arrows.
- Item support: uses registered item catalogs, including eligible DLC and custom items, with in-game descriptions.
- Solo practice: works in a multiplayer lobby with one player. Settings are available through RiskOfOptions. Arena’s gameplay changes apply only while Arena is selected; vanilla modes retain their normal rules.
All players need the same mod version and required dependencies.
Build status: compiled release candidate for the installed Steam build 25921972, checked on 14 November 2026. The rule tests and game API audit pass. An in-game multiplayer playtest and all-map/PvE regression checks are still pending. See VALIDATION.md in the source download.
Install and play
- Create a Risk of Rain 2 mod-manager profile and install the dependencies listed below.
- Import
claytemplar-RiskOfArena-1.0.12.zipas a local mod. For manual installation, copy itsplugins/ArenaPvP/ArenaPvP.dllinto your profile'sBepInEx/plugins/ArenaPvP/folder. When upgrading, close the game and replace/remove the older Arena installation so only one Arena DLL is enabled. - Everyone, including the host, needs the same RiskOfArena version and matching team/content dependencies. The new R2API Teams dependency includes a preloader patcher, so close and restart the game after importing this update.
- Launch modded, create a lobby and select RiskOfArena after Monsoon. The red-and-blue heads identify the mode.
- Under Map in the right sidebar, inspect the selected map cover and press Map Vote to open voting. Back returns to character selection; F4 also opens the ballot. Press Match settings directly below Map Vote for the gameplay-only rules window. The host edits the actual RiskOfOptions entries there; other players see synchronized host values without edit controls. The two sidebar buttons share a translucent style with anti-aliased borders. Back returns to character selection. The host starts the match normally.
- Configure the host's rules under Settings → Mod Options → RiskOfArena. Reward/combat changes apply to the next new run. 05 Match → Enable Arena scrapper applies live to the host's match; the host's map blacklist applies live in the lobby. Each player's local controls, nametag visibility and automatic menu opening apply immediately on their own screen.
The match status and live leaderboard use the game’s localized HUD font at the bottom of the native right-hand sidebar, below LookingGlass stats when installed. The panel shows the host’s active reward mode, so everyone can confirm whether Command, Draft, Random or Weighted Essence is actually running. F3 still opens the full scoreboard.
The default controls are F2 for rewards, F3 for scores and F4 for the lobby map vote. Double-tap W to close either reward page and keep its reward banked: press, release, press, release. The second release must follow the first within 0.6 seconds. Holding W when a menu opens is ignored and cannot dismiss it; the shortcut requires two fresh complete taps while it is open. A single tap also leaves the menu open. F2 reopens banked rewards. Mod close buttons are labelled Back; item grids retain Back to Essences. Native Command buttons support mouse and the game's UI navigation. The first local player owns the custom UI; split-screen selection is not implemented.
Hover an item or highlight it with keyboard/controller navigation to read its full in-game description, including equipment and modded items with localized descriptions. This works in Command, Draft and Weighted Essence rewards and in the scrapper's item picker, without enabling the game's Inspect setting. Native RoR2 tooltip artwork/font and rich-text formatting are retained, and the tooltip appears above the picker. Missing full-description tokens fall back to the item's normal pickup text.
If a joining player sees Required Mods: com.fireb.arenapvp;1.0.12, their game is not advertising the host's required RiskOfArena version. Both players must enable the release ZIP and its dependencies in the profile they launch, then fully restart. Check the joining player's BepInEx/LogOutput.log for Loading [RiskOfArena 1.0.12], missing dependencies or startup exceptions. See the included MULTIPLAYER_SETUP.md for the complete checklist; installing a source ZIP does not install the playable DLL.
One-person multiplayer lobbies are supported. Host a multiplayer lobby, select RiskOfArena and ready up yourself. Use your map vote or the host default; a second player is not required. The local host remains a participant without a remote client connection, including after the last opponent leaves. Warmup, timed rewards, personal XP/caps, the optional scrapper and respawning keep using the host's normal rules. A time limit can still end a solo match; set duration to 0 for unlimited practice if desired.
Command rewards and personal XP
With Command selection, a reward first opens a native Command-style essence screen:
| Essence | Opens |
|---|---|
| White | Common items |
| Green | Uncommon items |
| Red | Legendary items |
| Lunar | Lunar items |
| Void | Void items across the enabled void tiers |
| Equipment | Droppable equipment from enabled content |
| Boss, if enabled | Boss items |
| DLC Special, if enabled | Other droppable expansion or modded item tiers |
An additional +1 Level / Personal XP tile spends the reward on one actual survivor level instead of a pickup. It becomes unavailable at the current level cap.
Choosing an essence does not spend a reward. Use Back to Essences to change category. Selecting the final item, equipment or level spends exactly one reward. Back banks the reward. Rewards are validated and granted by the host; duplicate, stale, unoffered or capped-level claims are rejected.
The host can select WeightedEssence in 01 Rewards → Item selection. Five 0–100% sliders sit directly below Item selection, in White, Green, Red, Void, Lunar order. They enable when WeightedEssence is selected. Defaults are 60% white, 25% green, 10% red, 3% void, 2% lunar. Set the total to 100 for exact percentages; other totals are normalized automatically. Setting a class to 0% excludes it. The host’s values are captured when starting a new run, independently of Random mode’s tier weights. Each reward rolls one category using those settings. Open that essence to choose any allowed item from it, or choose personal XP. Back never rerolls the reward. Disabled or empty categories are omitted and remaining weights are normalized; equipment, boss and other special tiers are not rolled in this mode. If all five chances are zero, only XP can be offered when enabled and below the cap; otherwise the reward is skipped without blocking respawn.
The host can instead select Draft, which rolls a fixed shortlist for each essence, or Random, which automatically grants weighted random pickups. Going back between essence screens does not reroll a draft. Random selection does not open a picker or offer an XP substitution.
Equipment replaces the active equipment slot. The previous equipment is not dropped, avoiding duplicate equipment farming. Native void corruption and normal item stacking still apply. The pool scans every item and equipment catalog entry, including enabled DLCs and item mods. Hidden/internal and untiered bookkeeping items are excluded. Include restricted pickups, enabled by default, additionally permits visible tiered items that ordinary drop, unlock or world-unique restrictions would omit, plus elite equipment essences. Turning it off restores normal drop restrictions. Configured bans and disabled DLCs always take priority. Scrap is now included by default; the old unedited default ban string is migrated, while custom bans are preserved. LevelBonus and UseAmbientLevel are reserved to protect the personal-level system. Other item and equipment bans are configurable using internal catalog names.
Under 01 Rewards, each event toggle is immediately followed by its own amount: Give starting rewards → Starting rewards, Reward on death → Rewards per death, Reward on kill → Rewards per kill, and Timed rewards → Rewards per timer. Each amount accepts 0–12; defaults are 3 at the start and 1 per event. Existing starting amounts are retained, and the legacy shared event amount initializes each new per-event control. Reward rules apply to the next new run; Continue retains the current run’s rules.
Extra reward for underdog deaths is now an explicit opt-in, off by default. The older automatic underdog option is replaced, preventing an unexpected second reward. Enabling the new option adds one ordinary death reward when at least three kills behind. Turning ordinary death rewards off or setting their amount to zero disables choice gating and uses the configured respawn timer.
Void/out-of-bounds deaths never produce death, kill, underdog or mandatory-choice rewards, irrespective of toggles, amounts and respawn mode. Legitimate knockback kill credit can still affect score. Scheduled timer rewards remain on their shared schedule; falling does not create an extra timer payment. Timed rewards also reach dead players. At most 12 choices can be banked; a required death choice takes priority. A completely empty pool never traps a player behind an impossible death choice.
Reward scrapper
The host can toggle 05 Match → Enable Arena scrapper, on by default. When enabled, Arena provides a scrapper on every map, using native spawn placement with a ground-raycast fallback and retries. Its permanent bright outline and position marker make it findable through walls. It is the exception to Arena's world-interactable cleanup. Turning the option off during a match blocks recycling and removes existing scrappers and their markers for everyone; turning it back on restores a scrapper. Already banked rewards are retained. Clients follow the host's setting regardless of their own saved value, and ordinary vanilla scrappers are unchanged.
Scrap a permanent item stack through the normal scrapper picker to receive one reward per item actually removed, with no scrap pickup or ground item output. Weighted Essence, Draft and Random preserve the exact tier of each removed item: white stays white, green stays green, red stays red, and individual void/custom tiers stay separate. Weighted Essence lets you choose from eligible items of that tier, Draft gives a fixed host-sized shortlist from that tier, and Random automatically grants one random item of that tier. Recycling never rolls a new rarity or converts an item into equipment. Fresh-drop percentages do not affect recycling an existing tier. Command keeps unrestricted choices. Personal XP remains available in choice modes when enabled and below the host's level cap.
Recycled choices save their source tier in the reward bank and display it in the menu. Back, reopening and Continue preserve the tier and shortlist, and the host rejects off-tier item requests. Older ordinary rewards keep their own queue position and are labelled separately. Host bans, enabled DLC/content and tier switches still govern replacements; when no eligible same-tier item exists, the original items are kept. The native batch limit applies, normally up to 10 items per use. A batch is reduced to fit the 12-reward bank; a full bank consumes no items. Temporary/rental items and hidden leveling items cannot be recycled. Native item eligibility and scrapper animations remain in use. Recycling is disabled while the match is finished.
A level cap that grows with time
Players start at level 1. Choosing XP raises only that player's level. Ordinary shared team XP is disabled during Arena.
The host configures the initial cap, the seconds between cap increases, the levels added per increase and an absolute maximum:
cap = min(maximum, initial cap + floor(active match seconds / interval) × increase)
The defaults are a cap of 3, rising by 1 every 60 seconds, up to 30. Warmup does not count. Opening menus does not pause the match or accelerate the cap. Cap growth only unlocks higher levels; it does not automatically grant them.
Map voting
Only while Arena is selected, the native Artifacts section becomes Map, showing the current map cover, name, vote status and a translucent Map Vote button below it. The Karma section is hidden. Switching to another mode restores the original sidebar sections. The vote window opens only from its button or F4; there is no floating vote button or automatic pop-up.
The lobby uses event-driven category registration and caches eligible-map metadata until blacklist, rules, catalog or language changes. The broad object-search fallback stops once the native sections are known, and layout order changes only when needed. This removes avoidable Arena lobby work; FPS improvement has not been measured.
The Arena lobby offers every multiplayer-playable scene in the current catalog, including special realms and maps from enabled DLCs. Menu, cutscene, offline, junk and player-entry-suppressed scenes are excluded. Disabled or unowned expansion maps are omitted through the lobby's expansion rules.
Each connected player has one changeable vote. The host starting the run locks the ballot. With no votes, the host's 07 Maps → Default map is selected; its default is golemplains (Titanic Plains). Press Choose stage, inspect stage images, select one and press Apply. This picker also works from the main menu. An unavailable or blacklisted default falls back to the first eligible map.
The map with the most votes becomes the displayed and launched map. Ties prefer the host default if it is among the tied leaders, then use stable catalog order. This keeps the sidebar cover and launched result consistent. Disconnected players' votes are not counted.
Bazaar Between Time is the only default blacklist entry: bazaar. Press 07 Maps → Blacklisted map names → Choose stages to open stage images and checkboxes. Tick to blacklist, untick to allow, then Apply; Back discards edits. The stage settings show every playable catalog stage, even when its DLC is disabled. Enabled-DLC rules still determine which maps enter the lobby ballot. Existing comma-separated names in the BepInEx configuration file remain supported. If every eligible map is blacklisted, the normal launch button refuses to start until a map is allowed.
Arena world and combat
- Every player and that player's complete summon ownership tree share one dedicated combat team, registered with R2API Teams. Opponents receive distinct teams. Friendly fire is off, so native enemy masks and hit/force filters exclude your own team without item-specific targeting patches. Team assignments replicate through native master/body networking and persist across respawns. Original assignments are restored when leaving the run. Vanilla intentional ability health costs retain their normal behavior.
- Combat-director enemies and ordinary interactable spawn cards are blocked. Preplaced and scripted scene interactables are removed, including chests, shrines, teleporters, pickups and portals. The reward scrapper is preserved and spawned through its own server-only exception. Scene exits and progression missions are suppressed.
- Unowned non-player character bodies are removed. Player-owned summons, including Engineer turrets, remain usable and receive kill attribution through their owner.
- Void Fields, Void Locus and Planetarium have no active void-fog damage or dedicated void-fog overlay in Arena. Their normal environmental lighting is retained.
- Player-occupied vehicles and the Seeker flight-vehicle family are preserved by interactable cleanup, including the brief period before a remote passenger resolves. Ability vehicles are gameplay objects; they are not removed as world loot.
- Each human death produces one host-broadcast announcement:
<victim> was defeated by <killer>.or<victim> died.Native Arena death quotes are suppressed; ordinary PvE announcements are unchanged. - 06 Local controls → Show player nametags toggles overhead names; Show opponent arrows, on by default, independently toggles the small native player position arrows. Both apply immediately on your own screen. Arrows can stay visible with names off. Scoreboard names remain visible, and saved nametag preferences are retained.
- Ground-node and spawn-point positions are used for spawning. Respawns prefer positions farther from living opponents.
- Spawn protection, PvP damage scaling, fall-damage protection, kill healing and an underdog reward are configurable.
- Suicides do not earn kill rewards. An opponent who last damaged a player within ten seconds can receive credit for an environmental death.
- Arena's respawn system replaces vanilla death-revival items and self-revival scheduling. Inventories and purchased levels persist across Arena deaths.
- A time or kill limit finishes the round. Tied top scorers share the result. Damage stops and dead players return. The host can press Back to Lobby to return the whole connected session to character selection, or Continue Game (+20 kills) to keep inventories, purchased levels, scores and banked rewards on the current map. The kill target goes 20 → 40 → 60 and onward. Each continuation grants another configured match duration when a time limit is enabled, so an expired timer cannot immediately end the resumed match. Other clients see that the host controls these actions.
Host settings at a glance
| Setting | Default |
|---|---|
| Pickup selection | Command essence → pickup |
| Starting rewards | 3 |
| Starting / death / kill / timer amounts | 3 / 1 / 1 / 1 |
| Death reward / kill reward / timed reward | On / Off / On |
| Timed reward interval | 30 seconds |
| Draft size | 4 per essence |
| Lunar / void / equipment / boss / special tiers | On / On / On / On / On |
| XP alternative | On |
| Level cap | 3 + 1 every 60 seconds, maximum 30 |
| Respawn | TimerAndChoice, 5 seconds |
| Spawn protection | 3 seconds |
| Warmup | 10 seconds |
| Kill limit / time limit | 20 kills / 10 minutes |
| PvP damage multiplier | 0.5 |
| Healing on kill | 25% of maximum health |
| Extra underdog death reward | Off; opt-in +1 when 3+ kills behind |
| Player nametags | On; each player can toggle locally |
| Opponent arrows | On; independent local toggle |
| Arena reward scrapper | On; host can toggle live |
| Fall damage | Disabled |
| Map blacklist | bazaar |
| Default map before votes | golemplains (Titanic Plains) |
Timer respawns after the delay. AfterChoice respawns after one required death reward and a one-second body-cleanup minimum. TimerAndChoice requires both. Choice-gated rules require one of the configured death rewards when available. Off, zero, impossible or void-prohibited death rewards use the configured timer without inventing a free item. Random rewards use the configured timer instead.
Set the kill limit or duration to 0 to disable that limit. Disable both for endless Arena practice.
Host authority
Match settings contains Rewards, Item pool, Levels, Respawn, Match and Maps only. It contains no controls, keybinds, nametag preferences or other local quality-of-life settings. As host, edit toggles, choice buttons, numeric sliders/fields and item bans; the map buttons open the stage-image selectors. Values save to the same configuration entries used by RiskOfOptions. Gameplay changes apply to the next new match, except the live scrapper toggle and lobby map rules.
As a client, the same button opens a view-only host snapshot, refreshed as the host changes settings. Clients receive no input fields, toggles, sliders or map-edit actions. Hover/highlight rows for descriptions and full values. The read-request protocol carries only player identity and revision; it has no client setting-edit message. Merely opening this view never replaces a client's saved configuration. Personal preferences remain under Settings → Mod Options → RiskOfArena → 06 Local controls.
The host captures reward selection/chances, starting/death/kill/timed amounts, respawn rules, level caps, combat settings and match limits for the run. The host's Arena scrapper toggle is updated live and included in match snapshots. Non-host gameplay config does not override those rules. Only the server creates reward offers, validates/consumes choices, grants items/XP, handles scoring and respawns, and continues/ends the match. Clients render server snapshots and submit requests for validation. Lobby map eligibility/default/blacklist also come from the host. Editing gameplay settings as a client saves preferences for when that player hosts a future game.
Local controls and quality-of-life preferences, including hotkeys, automatic menu opening, nametag visibility and opponent arrows, stay local. They are not included in the host's match settings or network snapshots. Scrapper removal and reward conversion run only on the host. All participants need the same mod/dependency versions.
Vanilla modes
Gameplay hooks check that the current run selected Arena. The ballot and Arena lobby UI check that Arena is selected in the lobby. Scene cleanup modifies instantiated scene objects, never shared scene definitions or prefab assets. Friendly-fire state is restored on run destruction, and reward/vote state is cleared. Selecting Drizzle, Rainstorm or Monsoon leaves the normal game rules in place.
The metadata audit verifies the hook scope guards, but an actual PvE run after an Arena run still belongs in the release playtest checklist.
Dependencies
These versions were checked against their official Thunderstore listings on 13 November 2026. Thunderstore's manifest declares them for installation; third-party DLLs and game assemblies are not bundled in this package.
- BepInExPack 5.4.2122
- RoR2BepInExPack 1.49.0
- HookGenPatcher 1.2.9
- R2API Core 5.3.0
- R2API Difficulty 1.1.2
- R2API Language 1.1.0
- R2API Teams 1.0.3
- Risk Of Options 2.8.6
Weighted category rolls retain the same RNG and captured chances across Continue. No forced-red latch was reproduced in deterministic checks. The startup log records the active host mode and chances; each queued weighted offer logs its source, rolled essence and banked count for diagnosing an actual recurrence.
DLCs are optional. Eligible content is discovered from the running game's catalogs and enabled expansion rules, including the DLC content present in the checked build. Future game patches still require a rebuild/API check and playtest; catalog-driven loading cannot guarantee compatibility with unknown future API changes. Other mods that replace combat teams, respawns or progression should be tested separately.
Build from source
On Windows, with a legitimate game installation and .NET Framework 4.7.2 or newer, run:
.\build.ps1 -GameDirectory 'C:\Program Files (x86)\Steam\steamapps\common\Risk of Rain 2' -RunTests
.\pack.ps1
The script downloads pinned public compiler and mod reference packages into .build/deps, compiles against your local game assemblies and emits dist/ArenaPvP.dll. It does not install anything into the game. A .NET SDK is not needed for this build path. ArenaPvP.csproj is included for IDE use; build.ps1 is the validated build entry point.
manifest.json, README.md, the 256×256 icon.png, the license, changelog and DLL form the Thunderstore ZIP. The release filename includes claytemplar so local import infers your author without changing the standard Thunderstore manifest. This follows the manager’s local import filename convention. Source and validation files are supplied separately.
