In vanilla crystal PvP, a crystal only breaks once the client's attack packet reaches the server, and a new crystal can only go down once the old one is gone. On a real connection that feels slow next to the local "fast crystal" mods many players use. FasterCrystal does the same on the server, for everyone who has it turned on:
- Fast break: when a player swings at a crystal in reach, the server finds it along their line of sight and breaks it right away, without waiting for a separate attack packet. Crystals younger than 5 ticks are skipped.
- Fast place: right-clicking a crystal while holding one places the next crystal on that same block straight away, as long as the player is actually looking at the obsidian or bedrock under it.
Every player can switch it off for themselves. The plugin also ships PowerGuard, a set of checks for auto-totem, crystal-speed and anchor cheats that alerts staff and runs your punishment commands.
Permissions#
| Permission | Lets a player | Default |
|---|---|---|
donutcrystal.use | Toggle fast crystals for themselves and open records. | OP |
donutcrystal.use.other | Toggle fast crystals for other players. | OP |
donutcrystal.admin | Reload the config. | OP |
powerguard.admin | See PowerGuard alerts. | OP |
Fast crystals work for every player with the toggle on. donutcrystal.use only controls the commands.
Commands#
/fastercrystal, /fastcrystal and /donutcrystal are the same command.
| Command | What it does | Permission |
|---|---|---|
/fastercrystal | Shows the command list. | donutcrystal.use |
/fastercrystal toggle [player] | Turns fast crystals off or on for you, or for another player. | donutcrystal.use, donutcrystal.use.other for others |
/fastercrystal records | Opens a menu of how many crystals each player broke in the last minute. | donutcrystal.use |
/fastercrystal reload | Reloads config.yml. | donutcrystal.admin |
/fastercrystal docs | Sends a clickable link to this page. | None |

Configuration#
plugins/LiteCrystal/config.yml holds your license key, PowerGuard's checks, the fast crystal default and every message. Each player's toggle is saved in player-data/.
Fast crystals#
powerguard:
fastcrystal:
default-values:
fast-crystal: true
disabled-worlds: []fast-crystal is the setting new players start with. Worlds listed in disabled-worlds keep vanilla crystal speed for everyone. The inventory section under it sets the records menu.
PowerGuard#
Each check counts violations. When a player reaches max-violation-count, the check's punish-commands run from the console with %player%. Staff with powerguard.admin get an alert for every violation in the alerts.format style.
| Check | Catches | Default punishment |
|---|---|---|
crystal-cps | More than max-breaks (default 8) crystals broken in time-frame-ms (default 1000). | Kick at 3 violations |
anti-cw | Crystal-placing macros: 5 placements on obsidian with machine-identical timing. The placement is also cancelled. | Kick at 3 violations |
anti-anchor | The same for charging respawn anchors with glowstone. | Kick at 3 violations |
manual-check | Active test that a totem swap is done by hand, waiting wait-ms (default 400). | Kick at 3 violations |
action-a to action-f | Auto-totem patterns: clicks faster than click-interval-threshold-ms, timing too steady to be human, and totem swaps with no inventory open. | Kick at 1 violation |
powerguard:
detection:
crystal-cps:
enabled: true
time-frame-ms: 1000
max-breaks: 8
max-violation-count: 3
punish-commands:
- "kick %player% Excessive crystal breaking detected (Crystal CPS)"The action-* checks are tuned tight. Test them on your server first, and swap kick for a log or staff alert command if you see false kicks.
Every message is under messages, each with its own type and sound.
Update alerts#
Staff with blazez.updates (OPs by default) get one chat message when they join, listing every installed BlazeZ plugin that has an update waiting. It stays off until you set check-for-updates: true in this plugin's license.yml.
Install#
- Install PacketEvents. FasterCrystal doesn't load without it.
- Put the FasterCrystal jar in
plugins/and start the server once. It createsplugins/LiteCrystal/config.yml. - Paste your license key into
license-keyinconfig.yml. Your key is under My Licenses on the BlazeZ portal; licenses linked to your Discord account show up there automatically. If yours is missing, open a License Key ticket in the BlazeZ Discord. - Restart the server.
- After editing the config, run
/fastercrystal reload.
FastRTP can show and switch each player's toggle from its own menus.
Placeholders#
Install PlaceholderAPI. on and off text for the status placeholders comes from placeholders.status-on and placeholders.status-off.
| Placeholder | Returns |
|---|---|
%fastercrystal_enabled% | true or false: the player's toggle. |
%fastercrystal_status% | The toggle as ON or OFF. |
%fastercrystal_active% | true when the toggle is on and the player isn't in a disabled world. |
%fastercrystal_active_status% | The same as ON or OFF. |
%fastercrystal_crystals_broken% | Crystals the player broke in the last minute. |
%fastercrystal_crystal_cps% | Crystals broken in the current crystal-cps time frame. |
%fastercrystal_cps_violations% | The player's crystal-cps violations. |
%fastercrystal_violations% | The player's PowerGuard violations across every check. |
Developer API#
lol.blazez.minecraft.api.FastCrystalAPI reads and changes a player's toggle. The toggle commands go through it too. Every method is safe from any thread.
| Method | Does |
|---|---|
isEnabled(player) | Whether fast crystals are on. false for offline players. |
isLoaded(player) | Whether the player's data is loaded, to tell "off" apart from "offline". |
setEnabled(player, enabled) | Sets and saves the toggle. Returns false for offline players. |
toggle(player) | Flips the toggle and returns the new state. |
Each takes a Player or a UUID.
Every change fires lol.blazez.minecraft.api.event.FastCrystalToggleEvent on the main thread, after the change. It gives getPlayerId(), getPlayer() (null when offline), isEnabled() and wasEnabled(), and can't be cancelled. Add softdepend: [LiteCrystal] to your plugin.yml.