โก Elemental Dragon Plugin
๐ Quick Start (5 Minutes)
Step 1: Install Plugin
# Download the latest JAR from releases
# Place in your Paper server's plugins directory
cp ElementalDragon-1.1.0.jar /path/to/your/paper-server/plugins/
# Restart your Paper 1.21.8+ server
java -Xms2G -Xmx2G -jar paper-1.21.8-latest.jar nogui
Step 2: Use Lightning Ability
# Give yourself a Dragon Egg
/give @p minecraft:dragon_egg
# Move to offhand (press F key)
# Strike with lightning!
/lightning 1
# Watch the magic happen! โก
Step 3: Get Your First Fragment
# Operators can give ingredients to players to craft fragments
/ed give <player> ingredients fire
# Operators can give fragments to players
/ed give <player> equipment fire
# Or show the recipe to craft them (requires Heavy Core)
/craft heavy_core
/craft fire
Step 4: Use Fragment Abilities
# Once you have a fragment, you can equip it by:
# a) hold on main hand and "right-click" to equip
# b) or use command:
/fire equip
# Use abilities
/fire 1 # Dragon's Wrath (fireball attack)
/fire 2 # Infernal Dominion (fire ring)
# Check status
/fire status
# Get help
/fire help
๐ Command Reference
๐ฎ Player Commands
Players can use these commands to manage and activate their fragments.
Fragment Commands
# Burning Fragment (Fire Element)
/fire equip # Equip Burning Fragment
/fire 1 # Dragon's Wrath (fireball attack, 40s cooldown)
/fire 2 # Infernal Dominion (area fire, 60s cooldown)
/fire status # Show fragment status and cooldowns
/fire help # Show available commands
# Agility Fragment (Wind Element)
/agile equip # Equip Agility Fragment
/agile 1 # Draconic Surge (speed boost, 30s cooldown)
/agile 2 # Wing Burst (levitation jump, 45s cooldown)
/agile status # Show fragment status and cooldowns
/agile help # Show available commands
# Immortal Fragment (Earth Element)
/immortal equip # Equip Immortal Fragment
/immortal 1 # Draconic Reflex (damage reduction, 90s cooldown)
/immortal 2 # Essence Rebirth (death protection, 5min cooldown)
/immortal status # Show fragment status and cooldowns
/immortal help # Show available commands
# Corrupted Core (Void Element)
/corrupt equip # Equip Corrupted Core
/corrupt 1 # Dread Gaze (blindness & slow, 60s cooldown)
/corrupt 2 # Life Devourer (health steal, 90s cooldown)
/corrupt status # Show fragment status and cooldowns
/corrupt help # Show available commands
Lightning Command (Legacy)
/lightning 1 # Core lightning ability (60s cooldown)
Utility Commands
/craft <recipe> # View crafting recipes
/chronicle <cmd> # Access lore and achievements
/withdrawability # Withdraw equipped fragment abilities
Fragment Ability Management:
The /withdrawability command removes your fragment's abilities while keeping the fragment item:
- Deactivates all passive bonuses (Fire Resistance, Speed, etc.)
- Cancels active abilities (Life Devourer, Draconic Reflex, etc.)
- Clears active states (including READY TO STRIKE for Dread Gaze)
- Fragment remains in your inventory for quick re-equip
Using /clear (Vanilla Minecraft Command):
When you use the vanilla /clear command to remove all inventory items:
- All fragment abilities are unequipped
- All passive bonuses are removed
- All active abilities are canceled
- Cooldowns are preserved (spam prevention - see below)
Enhanced /craft Command Features:
The /craft command dynamically generates recipe displays from the actual crafting system (single source of truth):
# View all available recipes
/craft heavy_core # Show Heavy Core crafting recipe
/craft fire # Show Burning Fragment recipe
/craft agile # Show Agility Fragment recipe
/craft immortal # Show Immortal Fragment recipe
/craft corrupt # Show Corrupted Core recipe
Architecture Benefits:
- โ
Auto-generated displays: Recipe text generated from actual
CraftingManagerrecipes - โ Always accurate: Single source ensures displays match reality
- โ DRY principle: Zero duplicate recipe definitions
- โ Easy maintenance: Recipe changes only need one update location
๐ Operator Commands
Operators have access to administrative functions for managing fragments, cooldowns, and player abilities.
Give Items
# Give crafting ingredients
/ed give <player> ingredients <element>
/ed give @p ingredients fire # Give materials to craft Burning Fragment
/ed give @p ingredients agile # Give materials to craft Agility Fragment
# Give crafted equipment
/ed give <player> equipment <element>
/ed give @p equipment fire # Give Burning Fragment directly
/ed give @a equipment immortal # Give Immortal Fragment to all players
Supported Elements: fire, agile, immortal, corrupt
Player Information
# View individual player info
/ed info player <player>
/ed info player @p # Current player
/ed info player Steve # Specific player
# List all players
/ed info list # Shows all online players with fragment status
Cooldown Management
# Set individual player cooldown
/ed setcooldown <player> <element> <ability> <seconds>
/ed setcooldown @p fire 1 5 # Fire ability 1: 5s cooldown
/ed setcooldown Steve agile 2 30 # Steve's agile ability 2: 30s
# Clear player cooldowns
/ed clearcooldown <player> [element]
/ed clearcooldown @p # Clear all cooldowns
/ed clearcooldown @p fire # Clear fire cooldowns only
# Get player cooldowns
/ed getcooldown <player>
/ed getcooldown @p # View current player's cooldowns
/ed getcooldown Steve # View Steve's cooldowns
Elements: lightning, fire, agile, immortal, corrupt
Abilities: 1 or 2 (each element has 2 abilities)
Global Cooldown Configuration
# Set default cooldown for an ability (affects all players)
/ed setglobalcooldown <element> <ability> <seconds>
/ed setglobalcooldown fire 1 10 # Fire ability 1: 10s default
/ed setglobalcooldown agile 2 60 # Agile ability 2: 60s default
# Disable cooldowns (clears all active cooldowns)
/ed setglobalcooldown fire 1 0 # Disables fire ability 1 cooldown
/ed setglobalcooldown lightning 1 0 # Disables lightning cooldown
# View all global cooldown settings
/ed getglobalcooldown
How Global Cooldowns Work:
- Each ability has a default cooldown (e.g., Fire ability 1 = 40s)
- Operators can override defaults with
/ed setglobalcooldown - When players use abilities, the global cooldown is applied
- Individual player cooldowns can be managed with
/ed setcooldown
Cooldown Adjustment Mechanics:
When you change a global cooldown, the system intelligently adjusts active player cooldowns using the MIN formula: min(current_remaining, new_max)
Increasing cooldown: Players with time remaining get capped at new maximum (fair to all)
- Example: Player has 30s left, you set 20s โ Player gets 20s (capped fairly)
- Example: Player has 10s left, you set 20s โ Player keeps 10s (no penalty)
Decreasing cooldown: Uses same MIN formula for consistency
- Example: Player has 60s left, you set 30s โ Player gets 30s (capped)
- Example: Player has 20s left, you set 30s โ Player keeps 20s
Disabling cooldown (0 seconds): Clears ALL active cooldowns for that ability
- Example:
/ed setglobalcooldown fire 1 0โ All players can use fire ability 1 immediately - Useful for: Events, testing, emergency cooldown resets
- Example:
Real-World Examples:
# Speed up cooldowns during server event
/ed setglobalcooldown fire 1 10 # Faster fire attacks for everyone
# Restore normal cooldowns after event (players capped fairly)
/ed setglobalcooldown fire 1 40 # Players with < 40s keep their time
# Emergency cooldown clear for server issues
/ed setglobalcooldown lightning 1 0 # Instant clear for all players
/ed setglobalcooldown lightning 1 60 # Re-enable with normal cooldown
Player References
All commands support these player selectors:
@p- Nearest player (usually yourself)@s- Command sender (yourself)@a- All online playersPlayerName- Specific player by username
๐ Elemental Fragments System
The Elemental Dragon plugin features 4 complete elemental fragments, each with unique abilities, passive bonuses, and visual themes.
๐ฅ Burning Fragment (Fire Element)
Material: Blaze Powder (red/orange visual)
Theme Color: Red
Permission: elementaldragon.fragment.burning
Abilities:
Dragon's Wrath (
/fire 1): Launch explosive fireball (40s cooldown)- Damage: 4 hearts on impact
- Explosion power: 2.0 blocks radius
- Fire spread: Ignites targets
- Aliases:
wrath,dragons-wrath
Infernal Dominion (
/fire 2): Create fire ring around player (60s cooldown)- Radius: 8 blocks
- Duration: 5 seconds
- Damage: 1 heart per tick to enemies in range
- Aliases:
dominion,infernal-dominion
Passive Bonus: Fire Resistance when equipped
๐จ Agility Fragment (Wind Element)
Material: Feather (light/swift visual)
Theme Color: Aqua
Permission: elementaldragon.fragment.agility
Abilities:
Draconic Surge (
/agile 1): Speed II + Jump II boost (30s cooldown)- Speed: Level II for 10 seconds
- Jump Boost: Level II for 10 seconds
- Aliases:
surge,draconic-surge
Wing Burst (
/agile 2): Vertical launch with fall protection (45s cooldown)- Vertical force: 1.5 blocks/tick
- Levitation: 2 seconds
- Slow Falling: 3 seconds (prevents fall damage)
- Aliases:
burst,wing-burst
Passive Bonus: Permanent Speed I when equipped
๐ก๏ธ Immortal Fragment (Earth Element)
Material: Totem of Undying (golden/life visual)
Theme Color: Green
Permission: elementaldragon.fragment.immortal
Abilities:
Draconic Reflex (
/immortal 1): 75% damage reduction + reflection (90s cooldown)- Damage reduction: 75% for 5 seconds
- Reflection: 25% melee damage reflected
- Aliases:
reflex,draconic-reflex
Essence Rebirth (
/immortal 2): Enhanced respawn benefits (5min cooldown)- Diamond armor piece: Random piece on respawn
- Full hunger: 20 food level
- Arrows: 32 arrows if bow in inventory
- Aliases:
rebirth,essence-rebirth
Passive Bonus: 25% knockback reduction + 2 hearts when equipped
๐ Corrupted Core (Void Element)
Material: Nether Star (dark/powerful visual)
Theme Color: Dark Purple
Permission: elementaldragon.fragment.corrupted
Abilities:
Dread Gaze (
/corrupt 1): Blind nearby enemies (60s cooldown)- Radius: 10 blocks
- Effect: Blindness II for 5 seconds
- Targets: All hostile mobs in range
- Aliases:
gaze,dread-gaze
Life Devourer (
/corrupt 2): Drain health from enemies (90s cooldown)- Range: 8 blocks
- Duration: 8 seconds
- Health steal: 50% of damage dealt
- Drain rate: 0.5 hearts per tick
- Aliases:
devourer,life-devourer
Passive Bonus: Night Vision + invisible to creepers
โ๏ธ Cooldown System
How It Works
The Elemental Dragon plugin features a sophisticated global cooldown system that balances powerful abilities with fair gameplay.
Default Cooldowns
Each fragment ability has a carefully balanced default cooldown:
| Element | Ability 1 | Ability 2 |
|---|---|---|
| Lightning | 60s | - |
| Fire | 40s | 60s |
| Wind (Agility) | 30s | 45s |
| Earth (Immortal) | 90s | 300s (5min) |
| Void (Corrupted) | 60s | 90s |
Cooldown Persistence
- โ Survives logout/login: Prevents bypassing cooldowns
- โ Survives server restart: Cooldowns persist across restarts
- โ Survives fragment unequip/equip: Spam prevention - cannot reset cooldowns by dropping and re-equipping
- โ
Survives
/clearcommand: Clearing inventory doesn't reset cooldowns - โ Cleared on death: Fair respawn mechanics
- โ Independent of items: Dropping fragment doesn't reset cooldown
- โ Global configuration: Operators can override defaults
โ ๏ธ Spam Prevention: Cooldowns intentionally persist when you unequip/equip fragments. This prevents players from bypassing cooldowns by quickly dropping and re-equipping fragments. You must wait for the full cooldown duration even if you re-equip the fragment.
Cooldown Adjustment Behavior
When operators modify global cooldowns, the plugin intelligently manages active player cooldowns to ensure fairness:
The MIN Formula: min(current_remaining, new_max)
This ensures fair cooldown management:
- Shorter new cooldown: Players are capped at the new maximum (prevents unfair advantage)
- Longer new cooldown: Players keep their current cooldown (no retroactive penalty)
- Disabled (0 seconds): All active cooldowns for that ability are immediately cleared
Example Scenarios:
| Scenario | Player's Current | New Global | Result | Reason |
|---|---|---|---|---|
| Speed up cooldowns | 60s remaining | 30s | 30s | Capped to new max (fair) |
| Slow down cooldowns | 20s remaining | 60s | 20s | Keep current (no penalty) |
| Disable cooldowns | 45s remaining | 0s | 0s | Cleared immediately |
| Re-enable after disable | 0s (cleared) | 60s | 0s | Can use immediately |
This design prevents abuse while maintaining fairness for players already on cooldown.
Operator Cooldown Control
Operators can customize cooldowns server-wide or per-player:
# Change default cooldown for everyone
/ed setglobalcooldown fire 1 10 # Fire ability 1 now 10s for all
# Override specific player's cooldown
/ed setcooldown Steve fire 1 120 # Steve's fire ability 1: 120s
# View all global settings
/ed getglobalcooldown
# Clear a player's cooldowns
/ed clearcooldown Steve # Clear all Steve's cooldowns
/ed clearcooldown Steve fire # Clear only Steve's fire cooldowns
๐ฏ Perfect For These Server Types
๐ฎ PvP Servers
- Balanced combat with cooldown-based abilities
- Strategic fragment selection and timing
- Fair gameplay without spam potential
๐ฐ RPG Servers
- Elemental magic system with 4 distinct classes
- Quest rewards involving fragment collection
- Lore system for immersive storytelling
๐๏ธ Survival Servers
- Unique abilities enhance PvE gameplay
- Fragment crafting adds progression goals
- Strategic choices in fragment selection
๐ Mini-Game Servers
- Fragment-based game modes
- Competitive ability-focused events
- Custom challenges with unique mechanics
๐ ๏ธ Development & Installation
System Requirements
- Minecraft: Java Edition 1.21.8+
- Server Software: Paper 1.21.8-R0.1+
- Java: Version 21 or higher
- Memory: Minimum 2GB RAM recommended
Developer Setup
Required Software:
- Docker Desktop - Download
- Java 21+ - OpenJDK or Oracle JDK
- Gradle - Gradle (or use included gradlew wrapper)
- Git - Git
Quick Start for Developers:
# 1. Clone repository
git clone https://github.com/cavarest/elemental-dragon.git
cd elemental-dragon
# 2. Build plugin JAR
./build.sh
# 3. Start server with plugin
./start-server.sh --rebuild
# 4. Connect and test
# Server: localhost:25565
# Username: posiflow (automatically configured as operator)
# RCON: localhost:25575 (password: dragon123)
# 5. Stop server
./stop-server.sh
Running Tests
The project includes comprehensive unit tests to ensure code quality and reliability.
# Run all tests
./gradlew test
# Run tests with coverage report
./gradlew test jacocoTestReport
# Run specific test class
./gradlew test --tests "*AchievementTest*"
# Run tests for a package
./gradlew test --tests "org.cavarest.elementaldragon.unit.fragment.*"
# Clean and run tests (force re-run)
./gradlew clean test
# Run tests in continuous mode (watches for changes)
./gradlew test --continuous
View Test Results:
- HTML Test Report:
build/reports/tests/test/index.html - Coverage Report:
build/reports/jacoco/test/html/index.html
Open in browser:
open build/reports/tests/test/index.html
open build/reports/jacoco/test/html/index.html
Current Test Coverage:
- Total Tests: 741 (all passing โ )
- Overall Coverage: 29%
- High Coverage Areas: command.util (100%), command.base (100%), Achievement (91%)
Docker Development Setup
This project uses Docker for development and testing. The setup includes:
Base Image: itzg/minecraft-server:java21 - Official PaperMC server with Java 21
Key Docker Features:
- Offline-mode operator setup: Automatic UUID generation for offline players
- Plugin hot-reloading: JAR copied to
/image/plugins/for easy updates - Persisted server data:
server-data/volume for world and config files - RCON access: Enabled on port 25575 for remote administration
Offline-Mode Operator Configuration:
The server runs in offline mode (ONLINE_MODE=false) for development. In offline mode, Minecraft clients generate UUIDs differently than online mode:
- Online mode: UUIDs fetched from Mojang's authentication servers
- Offline mode: UUIDs generated from MD5 hash of
"OfflinePlayer:username"
How OPS Setup Works:
Environment Variable (
OFFLINE_OPS): Comma-separated list of usernames who should be operators# In .env file or docker-compose.yml OFFLINE_OPS=posiflow,player2,admin3Entrypoint Script (
entrypoint.sh): Runs BEFORE the main/startscript- Reads
OFFLINE_OPSenvironment variable - Generates correct offline-mode UUIDs for each username
- Creates
/data/ops.jsonwith proper format
- Reads
UUID Generation Algorithm:
# Matches Minecraft's offline-mode UUID (version 3) hash = MD5("OfflinePlayer:username") UUID = version3_format(hash) # xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxxSkip mc-image-helper: Setting
EXISTING_OPS_FILE=SKIPprevents the base image from overwriting ops.json
Example for "posiflow":
# Generated UUID: 763be461-6d24-3e4b-9e74-6ead0315f2bf
# Format: 763be461-6d24-3e4b-9e74-6ead0315f2bf
# ^^^^^^^^ ^^^^ ^ ^^^^ ^^^^^^^^^^^^
# part1 part2 part3 part4 part5
# โ
# "3" = version 3 UUID (replaces first char)
Docker Configuration Files:
- Dockerfile: Builds image with plugin JAR and entrypoint script
- docker-compose.yml: Configures environment variables and volumes
- entrypoint.sh: Generates offline-mode UUIDs and creates ops.json
- .env: Local development configuration (OFFLINE_OPS, memory, etc.)
Adding More Operators:
# Option 1: Edit .env file
OFFLINE_OPS=posiflow,player2,admin3
# Option 2: Set in docker-compose.yml
environment:
- OFFLINE_OPS=${OFFLINE_OPS:-posiflow,player2,admin3}
# Option 3: Pass via command line
OFFLINE_OPS="newplayer" docker-compose up
Common Docker Commands:
# Start server (rebuild image)
./start-server.sh --rebuild
# Start server (use cached image - faster)
./start-server.sh
# View server logs
docker logs -f papermc-elementaldragon
# Stop server
./stop-server.sh
# Access server console (interactive)
docker attach papermc-elementaldragon
# Press Ctrl+P, Ctrl+Q to detach without stopping
# Execute commands inside container
docker exec -it papermc-elementaldragon rcon-cli
> op list
> list
Server Management Options
The start-server.sh script supports several options for different development workflows:
| Option | Description |
|---|---|
-r, --rebuild |
Rebuild Docker image and restart server (preserves server data) |
-c, --clean |
Clean build (Gradle clean + fresh Docker image + delete all data) |
-w, --wipe-world |
Clear world data only (preserves configs, plugins, player data) |
-b, --blocking |
Start in blocking mode (logs shown directly, Ctrl+C to stop) |
-h, --help |
Show help message with all options |
Common Use Cases:
# Normal development start (fastest - uses cached Docker layers)
./start-server.sh
# Quick restart with rebuilt image (preserves world and configs)
./start-server.sh -r
# Fresh world for testing (preserves server configuration)
./start-server.sh -w
# Complete reset (new world, new configs, rebuild everything)
./start-server.sh -c
# Testing with visible logs
./start-server.sh -w -b
# Full reset with visible logs
./start-server.sh -c -b
# Fresh world with rebuild, logs shown
./start-server.sh -r -w -b
Option Details:
-r, --rebuild (Rebuild Mode)
- Rebuilds Docker image with latest plugin JAR
- Deletes all Docker volumes and server data
- Forces fresh container startup
- Use after code changes to ensure latest plugin is loaded
-c, --clean (Clean Mode)
- Runs Gradle clean build
- Deletes all Docker volumes and server data
- Forces complete Docker image rebuild
- Use when Docker cache might be stale or corrupted
-w, --wipe-world (World Wipe Mode)
- Removes only world directories:
world/,world_nether/,world_the_end/ - Removes
session.lockfile - Preserves: Server configs, plugins, player data, OP settings
- Use for quick world reset during testing without full reconfiguration
-b, --blocking (Blocking Mode)
- Starts server in foreground with logs visible
- Shows server output directly in terminal
- Press Ctrl+C to stop server
- Use for debugging or monitoring server startup
Combining Options:
Options can be combined for different scenarios:
-c -w: Full reset (world already cleared by-c, skip redundant wipe)-r -w: Rebuild image + fresh world-w -b: Fresh world + visible logs-c -b: Full reset + visible logs
Port Conflict Detection:
The script automatically detects and stops containers using ports 25565/25575. The detection checks actual port bindings, not container names, so it won't incorrectly stop containers with similar names that use different ports.
If you have other PaperMC servers running on different ports (e.g., ports 35115/35125), they will not be affected.
Troubleshooting OPS Issues:
If you cannot login as operator:
Check entrypoint logs:
docker logs papermc-elementaldragon | grep "Elemental Dragon Offline Ops"Verify ops.json was created:
docker exec papermc-elementaldragon cat /data/ops.jsonCheck your username matches OFFLINE_OPS exactly:
# Case-sensitive! "Posiflow" != "posiflow"Verify offline-mode UUID generation:
# Test UUID generation locally echo -n "OfflinePlayer:posiflow" | md5sum # Should match: 763be461-6d24-3e4b-9e74-6ead0315f2bf
Why This Approach?
- โ Reproducible: Same UUID every time for the same username
- โ Offline-friendly: No internet connection required
- โ Development-ready: Works with any username without Mojang API
- โ Container-native: All setup done in entrypoint, no manual steps
๐๏ธ Architecture Highlights
Phase 6: True Object-Oriented Design + Post-Completion Fixes
The Elemental Dragon plugin demonstrates professional software architecture with continuous improvements:
Single Source of Truth Pattern
- โ Fragment classes own ALL their metadata
- โ Commands query Fragment dynamically (zero duplication)
- โ Items query Fragment for visual properties
- โ Auto-generated help, tab completion, status displays
- โ
NEW: Crafting recipes auto-generate displays (DRY
/craftcommand)
Code Quality Metrics
- 62% code reduction through architectural improvements (673 lines eliminated)
- Zero duplication across commands, items, and recipes
- Compiler-enforced completeness via interfaces
- 206 tests passing with comprehensive coverage
- Intelligent cooldown management with MIN formula and clear-on-disable
Design Patterns Applied
- Single Source of Truth: Fragments own their data, CraftingManager owns recipes
- Template Method: AbstractFragment provides structure
- Dependency Injection: Commands inject Fragment instances
- Strategy Pattern: Interchangeable Fragment implementations
- Command Pattern: Subcommand registry for admin functions
- Introspection Pattern: Runtime recipe querying for
/craftcommand
Recent Improvements (Phase 6 Post-Completion)
DRY /craft Command:
- Before: Recipes hardcoded in 2 places (CraftingManager + CraftCommand)
- After: Single source of truth with runtime introspection via
RecipeDataclass - Impact: Recipe changes now require updating only 1 location
Intelligent Cooldown Adjustment:
- Formula:
min(current_remaining, new_max)ensures fairness - Prevents unfair advantages when cooldowns decrease
- No retroactive penalties when cooldowns increase
- Clear-on-disable: Setting cooldown to 0 clears all active player cooldowns
Lightning Global Cooldown Support:
- Lightning ability now respects global cooldown settings
/ed setglobalcooldown lightning 1 <seconds>works correctly- Integration with
AbilityManagerfor unified cooldown system - Consistent behavior across all element types
๐ Complete Documentation
๐ฎ User Documentation
- Complete User Guide - Features and usage
- Installation Guide - Setup instructions
๐ง Administrator Documentation
- Commands Reference - All admin commands
- Testing Guide - Testing procedures
- Docker Guide - Container deployment
๐ป Developer Documentation
- Architecture - System design
- Testing - Test framework
๐ฏ Why This Plugin Will Transform Your Server
๐ฏ Player Engagement
- 4 Unique Elements: Fire, Wind, Earth, Void with distinct abilities
- Skill-Based: Requires timing, positioning, and strategy
- Visual Spectacle: Unique particles and effects for each element
- Strategic Depth: Fragment selection and cooldown management
๐ Server Benefits
- Balanced Gameplay: Carefully tuned cooldowns prevent spam
- Performance: Optimized for Paper 1.21.8+ with minimal impact
- Stability: 197 passing tests ensure reliability
- Extensibility: Clean architecture makes customization easy
๐ Competitive Advantage
- Unique System: Elemental fragments set your server apart
- Player Retention: 8+ unique abilities keep gameplay fresh
- Fair Balance: Global cooldown system prevents abuse
- Content Rich: Lore, achievements, and progression systems
๐ Troubleshooting
Common Issues & Solutions
Plugin Not Loading
# Check Java version (must be 21+)
java -version
# Verify JAR location
ls plugins/ElementalDragon*.jar
# Check server logs
tail -f logs/latest.log | grep -i elementaldragon
Command Not Working
# Check permissions
/lp user <player> permission check elementaldragon.fragment.burning
# Verify fragment equipped
/fire status
# Check command registration
/help fire
Cooldown Issues
# View player cooldowns
/ed getcooldown <player>
# View global settings
/ed getglobalcooldown
# Clear stuck cooldown
/ed clearcooldown <player>
๐ Architecture & Testing
Testing Framework
- ๐งช 749 Unit Tests: Complete coverage with JUnit and Mockito
- ๐ง Integration Tests: End-to-end YAML-driven scenarios
- ๐ณ Docker Support: Containerized development environment
- โ CI/CD: Automated testing on every commit
- ๐ 29% Coverage: Focus on testable business logic (Bukkit API limits integration testing)
Code Quality
- SOLID Principles: Applied throughout codebase
- Design Patterns: Professional architecture patterns
- Zero Duplication: DRY principle strictly enforced
- Type Safety: Compile-time validation
๐ Support & Community
Getting Help
- GitHub Issues: Report bugs or request features
- Documentation: Comprehensive guides in
/docsdirectory - Community: Connect with other server administrators
Contributing
- Bug Reports: Help us improve by reporting issues
- Feature Requests: Suggest new abilities or improvements
- Code Contributions: Submit pull requests
๐ License & Credits
License: MIT License - Free for personal and commercial use
Author: The Cavarest project Version: 1.1.0 Minecraft Version: 1.21.8+ Paper API: 1.21.8-R0.1-SNAPSHOT
โญ Star this project if you love Elemental Dragon! โญ
Transform your server today with Elemental Dragon! โก