Dan's Spawn System
0
First released August 13, 2020 · Last updated October 11, 2026
Downloads from this site
67 total
4 latest (v2.2.0)
Allows players to use signs to select a custom spawn in their world.
Usage
Last reported in use 32 days ago
Usage reported by trace — how it works. CI and test servers are excluded.
Verified before release
Version 2.2.0 was started on real servers running Minecraft 1.19.4, 1.21.11, 26.2 and 26.3 before it was published. The jar you download is the exact one that passed. How releases work
Versions
All releases on GitHub2.2.0
For a server running v2.1.0, this release is a drop-in upgrade. Saved spawns load as before and no configuration or permission changes are needed. The difference is in the server log: problems reading or writing spawn data now appear as warnings tagged with the plugin's name, with full error details, instead of untagged console lines. They are easier to spot and filter. On a first start, before any spawn has been saved, you may see a single "Error loading the spawns!" warning, which is expected.
Changes
Logging
- Spawn storage errors are now logged through the plugin logger at WARNING level. Save and load failures include the underlying exception, and messages about missing or unreadable coordinates or world names in spawn files are tagged with the plugin name (#108).
Version
v2.1.0 → 2.2.0 — MINOR. Mechanical floor from comparing the two jars: MINOR.
Judgment: The only operator-facing change is #108: spawn storage errors now go through the plugin's logger at WARNING level, with stack traces, instead of plain stdout. Spawn files are read and written the same way, and no command, config key or permission changed. The StorageService constructor now takes a Plugin instead of a DansSpawnSystem; existing callers still compile, but code built against the old constructor must be recompiled, which is ordinary minor-level API movement. The bundled trace-client update adds an install-ID-file option that this plugin doesn't use, and the reporting-link changes only touch comments and log text, so neither justifies raising the level. I kept the minor floor.
- minor: storage path changed: src/main/java/dansplugins/spawnsystem/services/StorageService.java
<details><summary>Java API changes (informational — nothing depends on this plugin)</summary>
- dansplugins.spawnsystem.services.StorageService: removed/changed public dansplugins.spawnsystem.services.StorageService(dansplugins.spawnsystem.DansSpawnSystem, dansplugins.spawnsystem.data.PersistentData);
- dansplugins.spawnsystem.services.StorageService: added public dansplugins.spawnsystem.services.StorageService(org.bukkit.plugin.Plugin, dansplugins.spawnsystem.data.PersistentData);
- dansplugins.spawnsystem.trace.TraceClient: added public static java.lang.String installIdFromFile(java.io.File);
- dansplugins.spawnsystem.trace.TraceClient$Builder: added public dansplugins.spawnsystem.trace.TraceClient$Builder installIdFile(java.io.File);
</details>
Verification
Verified on a real Spigot server before publication; this release carries the exact jar that was verified.
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.19.4 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.21.11 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 26.2 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 26.3 (11 assertions passed).
- save-compatibility gate run: data written by
v2.1.0was loaded by this release across two restarts with nothing lost (16 assertions passed).
Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.
drafted by Claude on behalf of Daniel Stephenson
2.1.0
For a server running v2.0.0, this is a drop-in upgrade. /resetspawn now also works when typed as /dansspawnsystem:resetspawn, and the plugin has been checked against Minecraft 26.3. Usage reporting changes in two ways when it is on. It creates a random server ID and stores it in plugins/trace/config.yml. It also sends that ID and the plugin version with every event. The ID does not identify any person, account or IP address. No player data is sent. Your existing settings and data files are unchanged, and turning reporting off works exactly as before.
Changes
Commands
/resetspawnnow works the same way when typed in its namespaced form/dansspawnsystem:resetspawn. Before, that form was not handled (#93).
Compatibility
- Checked against Minecraft 26.3, alongside 1.19.4, 1.21.11 and 26.2 (#101).
Usage reporting
- Every event now includes a random server ID, so servers can be counted instead of raw events. The ID is created once and saved as the
server-idline inplugins/trace/config.yml, and all plugins on the server that use this reporting share it. Delete the line to get a new ID. No ID is created or saved while reporting is off (#99). - Every event, including command events, now carries the plugin version (#96).
plugins/trace/config.ymlaccepts an optionaltags:block, and those tags are added to every event from the server. For example, setci: "true"on a test server so its events are left out of real-server figures (#95).- The startup message and the comments in
config.ymlnow mention the server ID (#100).
Version
v2.0.0 → 2.1.0 — MINOR. Mechanical floor from comparing the two jars: PATCH.
Judgment: The mechanical check flagged only signature changes to internal classes (CommandService, EventRegistry, TraceClient). The plugin itself changed in ways that check cannot see. Usage reporting now writes a new random server-id line to plugins/trace/config.yml, sends it and the plugin version on every event, and honours a new optional server-wide tags: block. That is new data written and new behaviour, so the floor rises to minor. Nothing breaks: existing config keys, permissions, data files and command arguments keep their meaning, and the command-routing change only makes the namespaced form /dansspawnsystem:resetspawn work too.
- no interface or storage difference observed between the jars
<details><summary>Java API changes (informational — nothing depends on this plugin)</summary>
- dansplugins.spawnsystem.services.CommandService: removed/changed public boolean interpretCommand(org.bukkit.command.CommandSender, java.lang.String, java.lang.String[]);
- dansplugins.spawnsystem.services.CommandService: removed/changed public dansplugins.spawnsystem.services.CommandService(dansplugins.spawnsystem.data.PersistentData, dansplugins.spawnsystem.utils.UUIDChecker, dansplugins.spawnsystem.DansSpawnSystem);
- dansplugins.spawnsystem.services.CommandService: added public boolean interpretCommand(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String[]);
- dansplugins.spawnsystem.services.CommandService: added public dansplugins.spawnsystem.services.CommandService(dansplugins.spawnsystem.data.PersistentData, dansplugins.spawnsystem.utils.UUIDChecker, org.bukkit.Server);
- dansplugins.spawnsystem.trace.TraceClient: removed/changed public static dansplugins.spawnsystem.trace.TraceClient$Builder builder(java.lang.String, java.lang.String);
- dansplugins.spawnsystem.trace.TraceClient: added public java.lang.String installId();
- dansplugins.spawnsystem.trace.TraceClient: added public static dansplugins.spawnsystem.trace.TraceClient$Builder builder(java.lang.String, java.lang.String, java.lang.String);
- dansplugins.spawnsystem.trace.TraceClient: added public static final java.lang.String VERSION;
- dansplugins.spawnsystem.trace.TraceClient$Builder: added public dansplugins.spawnsystem.trace.TraceClient$Builder installId(java.lang.String);
- dansplugins.spawnsystem.utils.EventRegistry: removed/changed public dansplugins.spawnsystem.utils.EventRegistry(dansplugins.spawnsystem.DansSpawnSystem, dansplugins.spawnsystem.utils.BlockChecker, dansplugins.spawnsystem.data.PersistentData);
- dansplugins.spawnsystem.utils.EventRegistry: added public dansplugins.spawnsystem.utils.EventRegistry(org.bukkit.plugin.Plugin, dansplugins.spawnsystem.utils.BlockChecker, dansplugins.spawnsystem.data.PersistentData);
</details>
Verification
Verified on a real Spigot server before publication; this release carries the exact jar that was verified.
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.19.4 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.21.11 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 26.2 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 26.3 (11 assertions passed).
- save-compatibility gate run: data written by
v2.0.0was loaded by this release across two restarts with nothing lost (16 assertions passed).
Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.
drafted by Claude on behalf of Daniel Stephenson
2.0.0
A server on 1.2.0 upgrading to this release gets a set of long-standing bug fixes to spawn selection, sign detection and /resetspawn, and a new opt-out usage-reporting feature that is enabled by default. The permission nodes declared in plugin.yml have been renamed to the spawnsystem.* names the plugin actually checks, so any grants written against the old dansplugins.* names need updating. The plugin now ships a config.yml, which is created on first start and gains a usage-reporting block on upgraded installations.
Changes
Spawn selection and signs
- A player's chosen spawn is now kept once set; previously every click on a
[Spawn]sign silently overwrote it. Use/resetspawnto pick a new one. (#63) - Spawn signs are only activated by right-clicking; left-clicking or stepping on a pressure plate next to one no longer sets a spawn. (#80)
- A
[Spawn]sign whose coordinates cannot be read now tells the player to see an admin and logs a warning through the plugin logger with the sign's location, instead of failing silently. (#80) - All sign types added after 1.15 (crimson, warped, mangrove, bamboo, cherry, hanging signs) are now recognised as spawn signs. (#74)
- Saved spawns with a 0 on any axis are no longer discarded on load; only missing or unreadable values are skipped. (#74)
Commands
/resetspawnnow tells the console it is player-only, reports when a named player cannot be found instead of claiming success, and only notifies the target if they are online. (#73)
Permissions
- Declared permission nodes are now
spawnsystem.reset.self,spawnsystem.reset.others,spawnsystem.placeSpawnSign,spawnsystem.breakSpawnSignand the newspawnsystem.admin(all default to op), matching the nodes the plugin checks. Thedansplugins.*nodes are no longer declared. (#62)
Usage reporting
- The plugin now sends a small usage event on startup (plugin name and version) and on each command (command name) to
https://trace.danielstephenson.dev. Nothing about players or the server is included; sending happens off the main thread and is dropped if the server cannot be reached. (#81) - A startup log line states whether reporting is on and, if off, why. Reporting can be turned off per plugin with
usage-reporting.enabled: falseinconfig.yml, server-wide withenabled: falseinplugins/trace/config.yml, or via theTRACE_USAGE_REPORTING=off/DO_NOT_TRACK=1environment variables. (#81, #86) - On upgraded servers the
usage-reportingblock is written intoconfig.ymlso the switch is visible on disk; an existing block is left untouched. (#86)
Upgrade notes
- If your permissions plugin grants any
dansplugins.spawnsystem.*,dansplugins.placeSpawnSignordansplugins.breakSpawnSignnodes, change them to thespawnsystem.*names above. - Usage reporting is on by default. To opt out before the first report is sent, set
usage-reporting.enabled: falseinplugins/DansSpawnSystem/config.yml, or createplugins/trace/config.ymlcontainingenabled: false, before starting the server with the new jar. - Players who relied on re-clicking a sign to change their spawn now need to run
/resetspawnfirst.
Version
1.2.0 → 2.0.0 — MAJOR. Mechanical floor from comparing the two jars: MAJOR.
Judgment: The mechanical floor of major stands: every permission node declared in plugin.yml moves from the dansplugins.* prefix to spawnsystem.*, so any permission-plugin grants written against the old names no longer match what is declared. Nothing in the source raises above that, but two behaviour changes are worth surfacing for operators: usage reporting to an external endpoint is now on by default and writes config.yml and plugins/trace/config.yml, and a spawn-selection fix means a player's first sign choice now sticks until reset rather than being overwritten by every click. The remaining changes are bug fixes, tests, CI and repository housekeeping that do not affect the level.
- major: permission removed: dansplugins.breakspawnsign
- major: permission removed: dansplugins.placespawnsign
- major: permission removed: dansplugins.spawnsystem.reset.others
- major: permission removed: dansplugins.spawnsystem.reset.self
- minor: permission added: spawnsystem.admin
- minor: permission added: spawnsystem.breakspawnsign
- minor: permission added: spawnsystem.placespawnsign
- minor: permission added: spawnsystem.reset.others
- minor: permission added: spawnsystem.reset.self
- minor: default config key added: usage-reporting.enabled
- minor: default config key added: usage-reporting.endpoint
- minor: default config key added: usage-reporting.key
- minor: storage path changed: src/main/java/dansplugins/spawnsystem/data/PersistentData.java
- minor: storage path changed: src/main/java/dansplugins/spawnsystem/services/StorageService.java
<details><summary>Java API changes (informational — nothing depends on this plugin)</summary>
- public class added: dansplugins.spawnsystem.config.ConfigManager
- public class added: dansplugins.spawnsystem.trace.TraceClient
- public class added: dansplugins.spawnsystem.trace.TraceClient$Builder
- dansplugins.spawnsystem.commands.ResetSpawnCommand: removed/changed public dansplugins.spawnsystem.commands.ResetSpawnCommand(dansplugins.spawnsystem.data.PersistentData, dansplugins.spawnsystem.utils.UUIDChecker, dansplugins.spawnsystem.DansSpawnSystem);
- dansplugins.spawnsystem.commands.ResetSpawnCommand: added public dansplugins.spawnsystem.commands.ResetSpawnCommand(dansplugins.spawnsystem.data.PersistentData, dansplugins.spawnsystem.utils.UUIDChecker, org.bukkit.Server);
- dansplugins.spawnsystem.listeners.PlayerInteractListener: removed/changed public dansplugins.spawnsystem.listeners.PlayerInteractListener(dansplugins.spawnsystem.utils.BlockChecker, dansplugins.spawnsystem.data.PersistentData);
- dansplugins.spawnsystem.listeners.PlayerInteractListener: added public dansplugins.spawnsystem.listeners.PlayerInteractListener(dansplugins.spawnsystem.utils.BlockChecker, dansplugins.spawnsystem.data.PersistentData, java.util.logging.Logger);
- dansplugins.spawnsystem.listeners.PlayerRespawnListener: removed/changed public dansplugins.spawnsystem.listeners.PlayerRespawnListener(dansplugins.spawnsystem.data.PersistentData, dansplugins.spawnsystem.DansSpawnSystem);
- dansplugins.spawnsystem.listeners.PlayerRespawnListener: added public dansplugins.spawnsystem.listeners.PlayerRespawnListener(dansplugins.spawnsystem.data.PersistentData, org.bukkit.plugin.Plugin);
</details>
Verification
Booted twice on a real Spigot server before publication — boot gate run (10 assertions passed). This release carries the exact jar that was verified.
Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.
drafted by Claude on behalf of Daniel Stephenson
Snapshot release marking Dans-Spawn-System's move to an AI-first development approach.
Day-to-day feature work, grooming, review and maintenance now run through AI agents working directly against this repository, with the maintainers setting direction and approving what lands. The version bump marks that change in how the project is built — it is not a compatibility break. Behaviour, configuration and stored data are unchanged, and existing installations can upgrade in place.
This is a dated snapshot, not a finished release. It follows the precedent set by Medieval
Factions' 6.0.0-SNAPSHOT-7-25-2026: the AI-first line has not yet been verified in live operation,
and the snapshot designation stays until it has.
Version changes
pom.xml:1.2-SNAPSHOT→2.0.0-SNAPSHOT-8-8-2026
Opened as https://github.com/Dans-Plugins/Dans-Spawn-System/pull/65.
Drafted by Claude on behalf of Daniel Stephenson.
What's Changed
- Moved away from the Singleton pattern. by @dmccoystephenson in https://github.com/Dans-Plugins/Dans-Spawn-System/pull/58
Full Changelog: https://github.com/Dans-Plugins/Dans-Spawn-System/compare/v1.1...1.2.0
Changes in Dan's Spawn System v1.1
- Refactored the structure of the plugin to be more consistent with my other plugins.
- Implemented the Singleton pattern instead of passing references everywhere.
- Integrated the plugin with bStats.
- Refactored the plugin to use an EventRegistry class.
- Abstracted out the Reset Spawn command into its own command class.
- Put all of the permissions of the plugin in the plugin.yml file and designated which ones should be default.
- Abstracted out the functionality of the Utility Subsystem into other classes.
- If a player has a bed spawn, they will no longer get teleported to their custom spawn upon death.
- Made sure that the plugin worked on 1.17.
Dan's Spawn System v1.0 allows you to
- Place a spawn selection sign if you have permission.
- Break a spawn selection sign if you have permission.
- Use a spawn selection sign to select your spawn.
- Reset your spawn with /resetspawn if you have permission.
- Reset someone else's spawn with /resetspawn (player) if you have permission.
In addition, it also
- Teleports players upon respawn to their custom spawn location.
- Provides saving/loading for custom spawn points.
Related plugins
Allows operators to control who has access to the nether.
Tracks the activity of players.
Identifies accounts that have used the same IP address.
Renders Medieval Factions claims on BlueMap's web map. Originally written by Kilz.
Something wrong, or something missing?
Bugs go to the plugin's issue tracker, where they can actually be fixed and tracked. Ideas for new behaviour go to the Dev Portal, where the community can upvote them.
