Your friends tell you to spin up a new SMP for the summer. One friend can't help themself and rushes to beat the dragon immediately. Everyone loses motivation and the SMP ends up DYING...
Sound familiar?
Then Cooperative End Access is for you!
Cooperative End Access is a Paper plugin for survival multiplayer servers (SMPs) on Minecraft 1.21 to 26.1.2. It is intended for friend groups that want to restrict the End for one last fight together without an immersion-breaking server restart to toggle allow-end.
The plugin accomplishes this goal by restricting the number of Eyes of Ender that each player can place in a stronghold Ender Portal structure and requiring all players to be present before the portal can open.
plugins/ directory.You should ideally add this at the very start of your SMP. This plugin does not currently provides tools to locate or close existing Ender Portals or retroactively track existing Eyes of Ender.
An End Portal structure can no longer be filled by a single player. Each player has a limited number of Eyes of Ender (set by max_eyes_per_player) that they can place in a standard 5x5 End Portal structure.
Filling all 12 End Portal frames will not immediately open the End Portal like in vanilla. Placing a single Eye of Ender in a structure marks that player as a "contributor" to that particular Portal. All contributors to a particular End Portal must also be present in the portal room for the portal to open. If a contributor were to leave the portal room, the portal will close.
Players may also remove their own Eyes of Ender that they placed into a frame. Removing an eye while a portal is open will close it.
Once the Ender Dragon is defeated for the first time, End Portals will revert to their vanilla functionality.
On a technical level...
find ./plugins -maxdepth 1 -type f -name 'CooperativeEndAccess-*.jar' -deleteOn a social level...
Below is the default config.yml. It exhaustively documents all configuration parameters that this plugin accepts.
# Maximum eyes one player can contribute to a single portal structure
# Automatically clamps to range between 0 and 12 (though why would you pick 0??)
max_eyes_per_player: 3
# Distance semantics:
# - Distances below 0 (e.g. -1) are treated as unlimited range, ignoring dimension.
# In other words, presence in server is enough to trigger the effects.
# - All distances are 3D Euclidean distance from the portal center.
# Maximum distance (in blocks) committed players may be from the portal for it to remain open
activation_radius: 16.0
# Maximum distance (in blocks) a committed player may be from the portal to receive action bar updates
action_bar_radius: 60.0
# For sound keys, see Paper's documentation
# or visit the Minecraft Wiki.
# For types of sources, use the "Technical name" on the Minecraft Wiki's Sound page.
# Volume is clamped to 0.0f at minimum and pitch is clamped to [0.5f, 2.0f] (which are limitations imposed by vanilla Java Edition).
# See the Minecraft Wiki's /playsound page for more details.
sounds:
# Sound played when the End Portal is created
portal_open:
key: "minecraft:block.end_portal.spawn"
source: "block"
volume: 1.0
pitch: 1.0
# Sound played when the End Portal collapses
portal_close:
key: "minecraft:block.beacon.deactivate"
source: "block"
volume: 1.0
pitch: 0.5
# Sound played when a player enters the activation_radius
player_enter:
key: "minecraft:block.amethyst_block.chime"
source: "player"
volume: 1.0
pitch: 1.0
# Sound played when a player leaves the activation_radius
player_leave:
key: "minecraft:block.amethyst_block.break"
source: "player"
volume: 1.0
pitch: 0.5
# Uses MiniMessage format. See Paper's documentation
messages:
# Personal chat message error when player tries to place more eyes than max_eyes_per_player
max_eyes_error: "<red>You have already contributed your share to this portal!"
# Personal chat message warning when player removes an eye
rescind_warning: "<yellow>You took your eye back. The portal state may collapse."
# Personal chat message warning when player tries to remove another player's eye
# Placeholder: <name> - The player who owns the eye (e.g. "Megumin").
non_owner_rescind_warning: "<red>This eye was placed by <name>. You cannot remove it."
# Personal chat message notice when player places an eye
committed_notice: "<green>You are now committed to this portal."
# Server-broadcasted chat notice once the dragon has been defeated for the first time.
dragon_defeat_notice: "<gold>The Dragon has fallen. End Portals are now stabilized permanently!"
# Action bar text shown while a committed player is in the End
# Placeholder: <name> - A committed player present in the End (e.g. "Sumi"), chosen implicitly by eye insertion order.
stabilized_action_bar: "<bold><light_purple>✔ Stabilized by <name>"
# Action bar shown when a portal is open
active_action_bar: "<bold><green>✔ Portal Active"
# Action bar shown when a portal is awaiting all committed players to be present before opening
# Placeholder: <names> - comma-delimited list of committed player names missing (e.g. "Notch, Elaina, Mizuhara")
waiting_action_bar: "<gold>Waiting for: <white><names>"
You can also find this file in ./src/main/resources/config.yml.
Report issues with my spaghetti code through the issue tracker on the plugin's GitHub repository.
If you wrote the code for it, I'll happily accept a pull request for it if I feel like it doesn't bloat the scope of this plugin.
By submitting a contribution to this repository, you agree that your contribution is licensed under the same license as this repository, as published in the LICENSE file.

Softly restrict the End with vanilla-ish gameplay mechanics that make sure your SMP's dragon fight is always a group activity!