Skip to main content

Creating Your Arena Class

Creating a Custom Arena Class

The first step in creating a custom gamemode is creating the Arena class for your game. To do this, simply create a new class and extend the Arena class.

package org.battleplugins.arena.example;

import org.battleplugins.arena.Arena;

public class MyArena extends Arena {

}

And to register it, simply run the following in your onEnable method inside your plugin:

BattleArenaApi.get().registerArena(this, "MyArena", MyArena.class, MyArena::new);

Using your Custom Arena

Now that the Arena is registered, you can now reference it from your <arena>.yml. For the sake of this tutorial, we will be copying the standard arena.yml and using it as a base going forward.

Inside of plugins/BattleArena/arenas, simply copy the arena.yml and call it myarena.yml. Change the name to Arena and add a new field: mode: MyArena (see the full myarena.yml at the bottom of this page).

On its own, this will not do much as no game logic has been designed yet. However, this will serve as a foundation for the rest of the tutorial.

Full myarena.yml

name: MyArena
mode: MyArena
type: Match
team-options:
  named-teams: false
  team-size: 1
  team-amount: 2
  team-selection: none
modules:
  - arena-restoration
  - classes
  - duels
  - scoreboards
lives:
  enabled: false
victory-conditions:
  teams-alive:
    amount: 1
  time-limit:
    time-limit: 5m
events:
  on-join:
    - store{types=all}
    - change-gamemode{gamemode=adventure}
    - flight{enabled=false}
    - teleport{location=waitroom}
  on-spectate:
    - store{types=all}
    - change-gamemode{gamemode=spectator}
    - flight{enabled=true}
    - teleport{location=spectator}
  on-leave:
    - clear-effects
    - restore{types=all}
    - remove-scoreboard
  on-death:
    - clear-inventory
    - respawn
    - delay{ticks=1}
    - teleport{location=waitroom}
options:
  - block-break{enabled=false}
  - block-place{enabled=false}
  - block-interact{enabled=false}
  - damage-entities{option=never}
  - keep-inventory{enabled=true}
  - keep-experience{enabled=true}
  - class-equip-only-selects{enabled=true}
initial-phase: waiting
phases:
  waiting:
    allow-join: true
    next-phase: countdown
    options:
      - damage-players{option=never}
      - class-equipping{enabled=true}
    events:
      on-start:
        - apply-scoreboard{scoreboard=waiting}
      on-join:
        - apply-scoreboard{scoreboard=waiting}
  countdown:
    allow-join: false
    allow-spectate: true
    revert-phase: true
    next-phase: ingame
    countdown-time: 5s
    options:
      - damage-players{option=never}
      - class-equipping{enabled=true}
    events:
      on-start:
        - apply-scoreboard{scoreboard=countdown}
  ingame:
    allow-join: false
    allow-spectate: true
    next-phase: victory
    options:
      - damage-players{option=other_team}
    events:
      on-start:
        - equip-class{class=warrior}
        - teleport{location=team_spawn}
        - give-effects{effects=[speed{duration=300;amplifier=1}]}
        - play-sound{sound=block.note_block.pling;pitch=2;volume=1}
        - apply-scoreboard{scoreboard=ingame-list}
  victory:
    allow-join: false
    allow-spectate: false
    next-phase: waiting
    duration: 5s
    events:
      on-complete:
        - leave
        - restore-arena
        - remove-scoreboard
      on-victory:
        - send-message{message=<green>Congrats, you won!</green>}
        - play-sound{sound=entity.player.levelup;pitch=1;volume=1}
      on-lose:
        - send-message{message=<red>Sorry, you lost!</red>}
        - play-sound{sound=block.anvil.place;pitch=0;volume=1}
      on-draw:
        - send-message{message=<yellow>It's a draw!</yellow>}
        - play-sound{sound=block.beacon.deactivate;pitch=0;volume=1}