I've been using this plugin as an API and game clock manager to build other games, adding API features as needed and running hundreds of hours of testing playtime. Only known bugs at the moment is that self-kill messages don't always show up correctly, and score levels seem to be inconsistent.
Current gamemodes: Bodycount - whoever gets X eliminations first
Hourglass - whoever has the most eliminations in X time
Last Man Standing - one life per person, last one alive wins
Custom - Extend the BaseGame class in your own plugin
Custom listenable game Events: PlayerJoinGameEvent - called when a player joins the game and gets added to the Contestants list. Intercept and change the spawn location if your game has a waiting lobby.
CountdownBeginEvent - called when the game is in stasis and has enough players to start (configurable, as low as 1; ignores players in creative). Change the timer ticks to determine how long it counts down.
GameBeginEvent - called when the timer ends and there are still enough players to start. Change the PregameSpawnLocation to set where players will spawn if there aren't enough players and the game goes into stasis.
GameDamageEvent - called when a player is damaged. Primarily for internal use. Cancel this to cancel the base damage event.
PlayerCombatEvent - called when a player is damaged by another player. Intercept to adjust who the attacker is, what the combat timer will be, and more.
PlayerDoubleJumpEvent - called when a player succeeds in double-jumping. This occurs when a player attempts to toggle flight. Once a player has jumped, landing on a block is required before another double-jump is required.
PlayerEliminateEvent - called when a player has been eliminated. In the case of respawning gamemodes, the player can still respawn after 'elimination'.
GameTerminateEvent - called when a game has ended. For different gamemodes, this will be under differing circumstances. A custom gamemode is a good way to change what constitutes a game terminating.
GameWinEvent - called when a game has been terminated, if the win condition set within the gamemode has been met.
I've made a minigame called Wizards, using this plugin as the base and heavily modifying it to allow players to cast spells and compete for survival. You can try it out on my server:
IP - bluebukkitdev.com
Version - 1.21.1
The server is very much WIP, as it's not yet ready for public listing. I've got a few other games I am actively building, and am using the server to get user feedback on my other plugins like Warps.
API updates include BaseGame.getActivePlayers() to get the number of players who should still be in the game. This has not been tested 100%, but is most useful when starting a game to get a list of all players in the game. GameBeginEvent now stores a public reference to the basegame instance as well as a list of players who were in the game when it began.