BossArena is a Hytale server mod for configurable boss encounters, NPC-based shop access, and per-player boss loot rewards.
- Current project version:
3.0.1
- See
CHANGELOG.mdfor release notes.
https://discord.gg/r5MBWdzWWW
https://github.com/FPSTordah/BossArena
- Server target:
2026.02.19-1a311a592 - Required dependencies: none (runs standalone)
- Optional gameplay integrations:
RPGLeveling(plugin idZuxaw:RPGLeveling) for level override support and HP-scale compatibility on tracked bosses.- Optional currency integrations:
HyMarketPlus(currencyProvider: hymarket, auto-detected inautomode)Ecotale(currencyProvider: ecotale, auto-detected inautomode)EconomySystem(currencyProvider: economysystem, auto-detected inautomode)- If neither optional economy mod is present, BossArena falls back to item currency.
- BossArena auto-detects RPGLeveling at runtime. No extra setup is required.
- Boss HP scaling compatibility is enforced on tracked bosses when RPGLeveling is loaded.
- Boss level override is supported through
bosses.jsonand the Boss editor UI: levelOverride: 0(or blank in UI) = default RPGLeveling behavior.levelOverride: 1+= force that spawn level for the boss.- Level overrides are applied while the boss is tracked and cleaned up when the boss/event ends.
- JJBYosepi - Extensive testing and feedback.
- Sully - Development support and implementation help.
- Configurable bosses with tiering, stat modifiers, and wave/add support.
- Arena-based spawning plus admin spawn controls.
- In-world shop guard NPC using standard entity
Useinteraction (Fby default). - Shop contracts are filtered by a location-specific enabled boss list.
- Persistent boss event notification while tracked boss/add entities are alive.
- Per-player loot chest generation after boss encounter completion.
- Boss event damage chart: when an event ends, eligible players receive a chat summary of the top 10 players by damage dealt (rank, name, damage). No UI window or HUD; players can keep moving while reading it.
- Optional timed boss spawns and proximity-based boss spawns:
- Timed rules auto-spawn bosses in arenas on a schedule.
- Per-boss proximity settings let a boss spawn automatically when a player walks into range of a configured arena, with a configurable per-boss cooldown.
- The same per-boss proximity settings also gate manual
/ba spawnand shop-triggered bosses so they only spawn when a player is in range.
- Loot chest persistence across restarts with state recovery.
- Loot chests are designed for solid ground placement; do not place arenas or loot chests on top of snow blocks, as snow is not treated as stable ground for chest spawning.
- Admin permission:
bossarena.admin
Example:
/lp group admin permission set bossarena.admin true
/lp group default permission set bossarena.admin false
Player shop interaction does not require admin permission.
Primary command namespaces:
/bossarena/ba(alias)
Admin commands (require bossarena.admin):
/bossarena arena create <arenaId>/bossarena arena delete <arenaId>/bossarena arena list/bossarena spawn <bossId> <arenaId|here>/bossarena reload/bossarena config/bossarena shop open/bossarena shop place/bossarena shop delete
Reload targets:
config.jsonshop.jsonbosses.jsonarenas.jsonloot_tables.json
- Shop NPC type defaults to
bossarena_shop_guard(configurable viashop.json.shopNpcId). - Default guard role template uses
Temple_Mithril_Guardappearance, static motion, and proximity greet settings. - Interacting with the guard through
Useopens the BossArena shop page. - Guard interaction is tied to
BossArena_OpenShopNpc. - Shop location is tracked in
shop.json.shops[]with UUID and world position. /ba shop deleteremoves the nearest tracked shop NPC and cleans its savedshops[]entry.- If NPC UUID is stale/missing, delete command falls back to removing the nearest saved shop location entry.
- Tabs:
Bosses,Shop,Arenas. - Bosses tab: edit boss identity, tier, stats, level override, and loot rows.
- Boss Waves overlay: edit
timeLimitMs, wave count, and multi-add rows (npcId,mobsPerWave,everyWave). - Shop tab: shows saved shop locations for current world, nearest first.
- Shop editor: set arena id override, toggle enabled bosses, and edit per-boss contract prices per location.
- Shop editor boss list supports scrolling for large boss lists.
- Arenas tab: inline id/position editing, Loot Radius (arena size, in blocks; loot eligibility distance from arena center), add at player location, and delete.
All runtime customization is stored under mods/BossArena/.
Fields:
bossNamenpcIdtier(uncommon,common,rare,epic,legendary)levelOverride(0= default RPGLeveling behavior,1+= force spawn level when RPGLeveling is installed)amountmodifiers.hpmodifiers.damagemodifiers.sizeperPlayerIncrease.hpperPlayerIncrease.damageperPlayerIncrease.sizeextraMobs.timeLimitMsextraMobs.waves(0none,1..Nfinite,-1infinite-until-boss-death)extraMobs.useRandomSpawnLocations(true|false, defaulttrue)extraMobs.randomSpawnRadius(blocks from boss origin, default15)extraMobs.adds[].npcIdextraMobs.adds[].mobsPerWaveextraMobs.adds[].everyWaveextraMobs.timedProximityEnabled(true|false, enable per-boss proximity behavior)extraMobs.timedProximityArenaId(arena id used as the proximity center; blank = use other spawn context)extraMobs.timedProximityRadius(radius in blocks for proximity checks;<= 0disables proximity)extraMobs.timedProximityCooldownSeconds(cooldown between proximity spawns for this boss in seconds;0uses the plugin default)
Fields per arena:
arenaIdworldNamexyznotificationRadius(blocks; distance within which players see boss event title/subtitle for this arena; 10–500, default100)lootRadius(optional blocks; arena size — when > 0, overrides the boss loot table radius for loot eligibility; distance from arena center within which players get loot; editable in Config GUI Arenas tab as "Loot Radius")
Fields per loot table:
bossNamelootRadiusitems[]
Fields per item:
itemIddropChance(0.0to1.0)minAmountmaxAmount
Managed persistence for active/unclaimed boss loot chests.
Stored chest data includes:
worldxyz- per-player pending loot
- optional expiry deadline
Top-level fields:
currencyProvider(auto,item,hymarket,ecotale,economysystem)currencyItemIdshopNpcIdstrictContractPricing(true|false, disables tier auto-price fallback whentrue)entries[]shops[]
currencyProvider behavior:
auto:HyMarketPlus->EconomySystem-> item currency fallbackhymarket: HyMarket provider onlyecotale: Ecotale provider onlyeconomysystem: EconomySystem provider onlyitem: item currency only
Item currency fallback order:
shop.json.currencyItemIdconfig.json.currencyItemIdconfig.json.fallbackCurrencyItemIdIngredient_Bar_Iron
entries[] fields:
tiersloticonenabledarenaIdbossIdcostdisplayNamedescription
shops[] fields:
uuidnameworldNamexyzarenaIdenabledBossIds[]contractPrices[]
contractPrices[] fields:
bossId(boss name/id for that location contract)cost(integer, clamped to0+)
Notes:
- First-run defaults generate one enabled preview entry per tier.
- Contract visibility for players is filtered by location
enabledBossIds[]and entry tier. - Per-contract pricing priority in location shops:
shops[].contractPrices[](boss-specific, per shop location)entries[]boss-specific cost match- tier auto-price fallback (only when
strictContractPricingisfalse)
Global config fields:
currencyItemIdfallbackCurrencyItemIdnotificationRadius(blocks; fallback when an arena has no per-arena value; 10–500, default100)arenas(legacy)eventBanner(custom event-title banner templates)timedMapMarker(world map marker settings for active timed bosses)timedBossSpawns[](optional timed auto-spawn rules)
eventBanner fields:
activeTitle(title while encounter is active)activeSubtitle(subtitle while encounter is active)victoryTitle(title when encounter is complete)victorySubtitle(subtitle when encounter is complete)
eventBanner placeholders:
$Boss/{Boss}= boss display name$BossUpper/{BossUpper}= boss display name uppercased$BossAlive/{BossAlive}= alive tracked boss count$AddsAlive/{AddsAlive}= alive tracked add count$Context/{Context}= extra context text (wave spawn/despawn info)$ContextLine/{ContextLine}= context plus separator (" | ") when present$Countdown/{Countdown}= remaining timer inMM:SS(blank when no timer)$CountdownLabel/{CountdownLabel}=Time left: MM:SS(blank when no timer)$CountdownLine/{CountdownLine}= countdown label plus separator (" | ") when timer is present$State/{State}=activeorvictory- Legacy aliases still supported:
$ContextPrefix,$CountdownPrefix
timedBossSpawns[] fields:
id(optional label for logs)enabled(true|false)bossId(must matchbosses.jsonboss id/name)arenaId(must matcharenas.jsonarena id)spawnIntervalHoursspawnIntervalMinutespreventDuplicateWhileAlive(truerecommended)despawnAfterHoursdespawnAfterMinutesannounceWorldWide(true|false, server-wide across all worlds)announceCurrentWorld(true|false, players in the boss world only)worldAnnouncementText(supports$Boss,$Arena,$World)
timedMapMarker fields:
enabled(true|false)markerImage(world-map marker icon id, for examplemap_marker.png)nameTemplate(supports placeholders below)- If
libs/map_marker.pngexists, BossArena copies it to world map marker assets and normalizes it to32x32. - Optional: if
libs/map_marker.jsonexists, it is copied alongside the marker image.
timedMapMarker.nameTemplate placeholders:
$Boss/{Boss}$Arena/{Arena}$Tier/{Tier}$TierUpper/{TierUpper}$World/{World}
Timed announcement defaults:
worldAnnouncementText:[$World] $Boss event started at $Arena
Behavior:
- Boss spawns at the arena location on the configured interval.
- If
preventDuplicateWhileAliveis enabled and that boss is still alive in that arena, the next timed spawn is skipped. - If both
despawnAfterHoursanddespawnAfterMinutesare0, the boss is infinite (no timed despawn). - If either despawn value is >
0, the timed boss (and tracked adds) is removed when the timer is reached. - Announcement targeting:
announceWorldWide: truesends to all players on the server.announceCurrentWorld: truesends only to players in the spawned world.- If both are
false, no timed announcement is sent. - If both are
true,announceWorldWideoverrides andannounceCurrentWorldis ignored.
Example:
{
"timedMapMarker": {
"enabled": true,
"markerImage": "map_marker.png",
"nameTemplate": "Timed Boss: $Boss @ $Arena"
},
"eventBanner": {
"activeTitle": "The Shadows Stir: $Boss",
"activeSubtitle": "$ContextLine$CountdownLineBoss: $BossAlive | Adds: $AddsAlive",
"victoryTitle": "Victory Over $Boss",
"victorySubtitle": "All clear in this arena."
},
"timedBossSpawns": [
{
"id": "volcano_hourly",
"enabled": true,
"bossId": "Example Boss",
"arenaId": "volcano_arena",
"spawnIntervalHours": 1,
"spawnIntervalMinutes": 30,
"preventDuplicateWhileAlive": true,
"despawnAfterHours": 0,
"despawnAfterMinutes": 45,
"announceWorldWide": true,
"announceCurrentWorld": false,
"worldAnnouncementText": "[$World] $Boss event started at $Arena"
}
]
}- Event title/banner text is configurable in
config.json.eventBanner. - Notification stays until both boss and tracked adds reach zero.
- Loot chest is queued only after tracked encounter completion.
- Loot is per-player claim data, not globally shared item stacks.
- Unclaimed chest state is persisted and restored on restart.
mvn -q -DskipTests packageOutput:
target/BossArena-3.0.1.jar