promotional bannermobile promotional banner

Admin instruments: Wave Defense

A versatile PvE and PvP engine featuring wave defense, customizable shops, and three competitive game modes for Minecraft
Back to Files

wavedefense-0.10.0.jar

File namewavedefense-0.10.0.jar
Uploader
Rayman_GCRayman_GC
Uploaded
Oct 4, 2026
Downloads
37
Size
1.5 MB
Mod Loaders
Forge
File ID
9057452
Type
R
Release
Supported game versions
  • 1.20.1

Curse Maven Snippet

Forge

implementation fg.deobf("curse.maven:wave-defense-1492909:9057452")

Learn more about Curse Maven

What's new

Changelog

[0.10.0] - 2026-10-04 — six fixes: point shops, removal, spawns, lobby modes, match shop rules

Network protocol is now 19. Clients and servers on different builds refuse each other at login.

1. A point shop can do everything the global shop can

A shop point used to be a name, a position and a list you could only append to through a separate, thinner screen. The shop editor now treats every point the way it treats the global shop: open its entries in the same item editor, search them, import into it, export it, bulk-add gun-pack weapons to it, delete it. Points are added, renamed, moved and deleted through one packet (ShopLayoutPacket) instead of a whole-location save, so editing a point no longer overwrites everything else an admin changed elsewhere in the meantime. The player's shop names the point it belongs to.

2. Everywhere you can add an item, you can take it away

The item browser, the gun-pack bulk-add screen and the shop editor could add to a shop and not remove from it. Now:

  • the item browser has Remove on every row that is already stocked, and a two-press Remove shown for everything the current search matches;
  • the gun-pack screen has a two-press ✕ N per weapon class. Ammunition goes with the guns that fire it, unless another gun still in the shop fires it too;
  • the shop editor has search, and a two-press Remove shown.

Large removals go by id, 500 to a packet, and are not rate-limited.

Shop entries and points now have ids. Purchases, sales and edits used to name an entry by its position in the list, so removing one entry while a player had the shop open made their next click buy the entry below the one they pressed. Every entry and point carries a stable id, saved with it; a request that names one that has gone is refused with "the shop changed", and the player's screen is refreshed in place. Old saves are given ids on load; duplicate ids (from copy-pasted NBT) are split.

The duplicate check stripped enchantments before comparing, so every enchanted book in the game counted as the same offer and a second one could never be added. It no longer does.

3. Never the same spawn point twice running

Random and Smart Deathmatch spawning drew from every point, so on a small map a player could come back at the same point several times in a row and meet whoever had just killed them there. The point a player arrived at last is left out whenever there is another. Team spawns no longer send everyone on a side to its first point: a player starts where they were entered -- the start position picked in the lobby now actually decides something -- and rotates after that.

Nor on top of somebody. A Deathmatch respawn never lands on a point a living player is standing on (within the point's own spread and a couple of blocks) while a free point exists; Random draws among the free points, Smart takes the free point farthest from every living enemy (it used to try ten at random), and with every point taken the roomiest one is used. The first arrival of a match is where the player was put -- the start picked in the lobby, or the point the arena spread them to on entry -- unless an enemy already stands there; a free-for-all used to re-roll it and could begin with players stacked on one block.

Every PvP arrival goes through one door, PvpRoundManager.placeAtSpawn, so no path can skip the rule.

4. Spawn protection, after a respawn and at the round start

After arriving in a fight other players cannot hurt you for a few seconds. Two settings (editor: PvP common rules; 0 turns either off, at most 60):

  • Protection after respawn (pvpRespawnProtectionSec, default 5) -- coming back from death, immediately or after the respawn delay, walking into a running Deathmatch, or being moved to the other side in the middle of a round;
  • Protection at round start (pvpRoundStartProtectionSec, default 5) -- when a round or a match begins and everyone arrives at once. Sides that start far apart rarely need it.

An arena saved before the split gets its old single value in both. Hitting someone ends it early; the action bar counts it down. It replaces invulnerableTime = 60, vanilla's hurt cooldown, which let the first hit through in full.

A tamed animal's or lit TNT's damage now counts as its owner's, so a wolf can neither bite through the protection nor hit a teammate. And a match is closed in both directions: a player outside a PvP match can no longer hit the players in it.

5. A lobby plays the mode it chose

A lobby could list several modes, and the match that started was always the arena's own. Now the host picks from the modes the arena allows, in a picker that says what each one is and, for a mode the arena is not set up for, what is missing (no spawn points, only one side's spawns for a mode that needs two, no capture points). What the lobby agreed -- the mode, Teams or free-for-all, and its shop rules -- is fixed when the match starts and is what every part of the server reads for that match: rounds, scoring, time limit, HUD, respawns, shop. A walk-in match still plays the arena's own mode.

  • Deathmatch: Teams or free-for-all. Free-for-all has no sides: everyone is on their own, arrivals are spread across all spawn points, and team spawning falls back to random. Set per arena in the editor, or per match in the lobby. Walking into one, the team picker no longer offers side cards -- there are no sides -- but one Enter button, and the arena places you whether or not it balances teams. A latecomer to a running lobby is told the lobby's choice even where the arena's own setting differs.
  • The match waits for the whole table. It used to start on the second arrival, while the rest of the lobby was still being let in.
  • Clearer settings. Guests can open the settings to read them; the screen says who can change what. Once the match is running only "join after start" can still change. The minimum player count cannot go below the arena's own. Kicking needs two presses.
  • A lobby cannot start into an arena where a match is already being played.
  • Deathmatch has its own time limit (dmMatchTimeLimitSec), separate from the round limit of the round-based modes; an arena saved before falls back to its old round limit.
  • The location editor shows each allowed mode's own rules on a tab, and warns about a mode that is allowed but not set up.
  • Choosing where to start. The start button stepped through the side's own points -- "1" or "—" on a map with one point per side, and dead in a free-for-all. It now opens a list of the arena's points, labelled as on the map preview, with their positions and how many at the table chose each; picking one also picks its side. Several players may pick the same point. A free-for-all table can choose too.

Colour codes on several headers, selected tabs, the shop's balance line, the team picker's rules and the shop-target buttons were silently dropped (a code inside a literal does not reach the components appended to it); they show again.

6. Match shop rules: what may be bought, without changing the shop

Like a server turning snipers off for a round: an admin can now say what may be bought in a match without editing a single entry.

  • Blocked categories -- pistols, rifles, shotguns, SMGs, snipers, launchers, machine guns, ammo, attachments, armour, consumables. An entry filed under the catch-all Weapon or Other is judged by what it actually is (gun-pack type, or vanilla item type), so filing a sniper rifle as Other does not get it past a sniper ban.
  • Price range -- a lowest and a highest buy price; 0 means no bound.
  • Banned entries -- single entries, picked from the shop.

The arena has its own rules (location editor → Shop rules); a lobby can add to them for one match (lobby settings → Shop rules) but never relax them -- the strictest of the two applies. The player's shop greys out what may not be bought and says why. The server refuses the purchase regardless of what the client shows. Selling is never restricted.

Older faults found on the way

These were in the mod before this release; the reviews of the new work turned them up.

  • A PvP death kept nothing. The death handler switched the world's keepInventory rule on for the death event and back off when it returned -- but vanilla drops the inventory after the event, and copies it to the respawned player only if the rule is on at the respawn. So every PvP death (unless the whole server ran keepInventory) scattered the kit on the floor and sent the player back into the fight empty-handed. The kit and experience are now taken off the dying player before vanilla looks and handed back when they respawn.
  • Ninety-three messages showed their raw template, "Wave %d has begun" among them. A translated component understands only %s; every %d in all eight languages is now %s, a lone % is %%, and zero padding is done in code. A test keeps it that way.
  • The Battle Royale border ran twenty times too fast -- its countdowns assumed one call a second and got twenty -- and hurt players outside it on every tick. It runs once a second.
  • A team kill or a self kill with friendly fire on left the victim counted as alive, so a Standard round with them in it could not be won by eliminating their side.
  • A spectator could hold a capture point: a killed player waiting out the round flew onto the enemy's point, where nobody could hit them, and took it.

Fixed by the final review

  • Editing a shop entry gave it a new id, so a match ban on it silently stopped applying. An edit now keeps the entry's id.
  • A player who walks into a running Standard, Capture-the-Point or King-of-the-Hill round now watches it as a spectator; they used to stand blind at their spawn, killable, able to shoot.
  • An agreed lobby match no longer starts for a single player (unless the arena's minimum is 1).
  • Escape on the banned-entries list returns to the rules screen instead of closing everything and losing the lobby's edits.
  • A Deathmatch that a map can only play free-for-all is offered and played as free-for-all, instead of being refused for want of a second side; changing the map takes the new arena's Teams/Solo setting; the lobby header warns by the table's choice.
  • The shop rules screen fetches the shop on every open; the shop editor list no longer comes back blank after the shop shrinks; the browser's armed "remove shown" disarms on a target or mod change; the shop key prefers a stocked point in range over a nearer empty one; the point editor's apply button refuses a half-typed position; a gun-pack attachment counts as an attachment for the rules; a pet's hit ends its owner's spawn protection.
  • The shop editor opened from the arena editor no longer sends a stale shop mode on Save and undo another admin's switch; a match ban on an entry that has since been removed is dropped on the server, so the rules screens stop counting bans nobody can see; the armed delete in the shop editor follows the entry, not its row; an import into a point respects the point's cap; a browser row standing for several offers asks before removing them all; removing entries during a running upload takes them out of the upload; the shop key trusts a shop that arrived in the last five seconds instead of downloading it again on every press.
  • Deathmatch spawning, refined: only an enemy makes a point taken (a teammate standing there no longer sends Smart spawning into the enemy base); when every other point has an enemy on it the point the player came from is used rather than landing on someone; at the start of a match nobody pushed off their own start takes another player's; a walk-in to a running match takes Random or Smart like any respawn; a free-for-all arrival goes to the least used point.
  • Lobby starts: a start is remembered by its position, so an admin's edit cannot move a choice onto another point; "anywhere" is shown at once; sides and starts cannot change during the countdown; a table cannot move onto an arena people are playing in; when only one player can get in, they go back out and the table stays open, with the reason; the map preview labels points as they are now and marks your own start.
  • A whole-location save drops bans on entries removed meanwhile; a shop import that reaches the entry cap says so.
  • A member of a gathering lobby is let into the arena by the countdown, not by walking in first (which started a match nobody agreed to), and a lobby cannot start while anyone is inside; a portal arena that winds back now ends its lobby as well.

Fixed by the third review

  • Leaving an arena that lets you keep your own things (the default) undid the wrong things. A PvP arena put back the inventory, health, food and experience you had at the door, so whatever you dropped inside came back a second time and whatever you picked up was erased; a PvE arena put back nothing at all, and you left in the arena's game mode, with the wave's effect, standing where you were. Such an arena now remembers only your place -- position, game mode, effects -- and leaving puts back exactly that.
  • The PvP death kit, hardened: it is taken at the lowest priority and only for a death no other mod cancelled (a revive mod left the player alive and empty); an arena's kit no longer follows a player who left the match while dead out into the world -- their own things come back from the backup instead; kits waiting for a respawn are saved with the other runtime state, so a restart does not lose them, and a single-player world's kits no longer carry into the next world opened.
  • When too few of a lobby's players get into the arena, the ones sent back out are no longer told they surrendered, charged a surrender in their stats, or moved to the surrender exit.
  • Choosing the map a lobby is already on no longer re-applies the arena's Teams/Solo over the table's own choice.
  • A player arriving on a side without a chosen start goes to the side's point fewest teammates use, instead of onto a start a teammate picked.
  • The Battle Royale border starts with the match, not at the first arrival: armed then, it had run down its wait and was shrinking on players frozen at their spawns. It runs only while the match is fought, and a match everyone left no longer hands its shrunken border to the next.
  • A player still on the death screen when a round starts is no longer counted alive; they watch the round out, and their side can be eliminated. (The round could not be won while they lay there.)
  • A team kill pays its author no assist, and always charges the victim's death penalty -- a flag left by an earlier enemy kill waived it.
  • A global shop import reports how many entries the shop actually holds, not how many the file had.
  • "Format error:" in place of five lines -- the export status, the PvP scoreboard's buy-phase and round titles and team wins, and the export list -- which were translated and then formatted a second time.
  • The rename refusals named the old name instead of the one that was refused.
  • The wave trigger editor showed lang keys instead of trigger names and tips, so Ctrl+click to add an AND-trigger never found its trigger; the wave list showed the first seven letters of the key.
  • "Your data was restored" is said only when a player's things actually came back.

Tests

New: ShopPointIdTest, ShopItemIdTest, ShopEntryResolveTest, ShopScreensGuardTest, ShopRemovalTest, ShopRulesTest, MatchModesGuardTest, SpawnRulesTest, LobbyModeRulesTest, LobbyStartTest, LangFormatTest, ReviewRoundThreeTest, ReviewRoundFourTest, ReviewDayTwoTest, ReviewDayThreeTest; ArenaStateTest extended. Each step was also mutation-checked: the tests were run against deliberately broken copies of the code to confirm they fail.

Also in 1.16.5

The 1.16.5 tree is released alongside as 0.1.0: its server logic runs, and it carries the spawn rules, both protection settings, the PvP death kit and the third review's fixes. See its CHANGELOG.md and PORT_STATUS.md.