
PerformanceAnalyzer
PerformanceAnalyzer gives you clear visibility into how your server is performing live and over time. With database-backed statistics, an in-game GUI, optional Discord alerts, and a helper-level AntiCheat/X-Ray module, it’s a handy toolkit for anyone.
[2.3.4] - 2026-05-07
Fixed
- Redstone False Positives in Performance Drop Analyzer: Removed 26 non-performance-impacting blocks (buttons, pressure plates, lecterns, daylight detectors, tripwire, levers, targets) from
isRedstoneComponent(). These blocks appear in naturally generated structures (villages, temples) and caused massive false positives through sampling extrapolation - Redstone Sampling Extrapolation: Added minimum threshold (≥3 components found) before extrapolating redstone counts. Previously, a single naturally-generated button was multiplied by ×64, producing false "problematic redstone" reports
- Wrong Coordinates in Problematic Chunk Reports: Chunk coordinates are now displayed alongside block coordinates (
[Chunk X,Z | Blocks ~X,Z]) for easier in-game navigation - NullPointerException in PerformanceDropAnalyzer:
worldInfo.get("name").equals(...)replaced withObjects.equals()to prevent NPE when world name is null - Swallowed Exceptions in Chunk Analysis: ChunkSnapshot and synchronous chunk analysis errors are now logged at
FINElevel instead of being silently ignored - Unbounded Database Queue (OOM Risk):
DatabaseManager.logAsync()now enforces a maximum queue size of 10,000 entries. PreventsOutOfMemoryErrorwhen the database is unavailable for extended periods - Excessive Block Checks in MovementChecker:
isNearLiquid()reduced from 27 block checks (3×3×3 cube) to 7 checks (current block + 6 adjacent faces), reducing CPU load perPlayerMoveEventby ~74% - Duplicated Alert Cooldown Constants:
AlertManagerandMovementAlertManagernow use the centralizedConstants.ALERT_COOLDOWN_MSinstead of defining their own identical values - Silent Config Parsing Failures: Invalid alert categories in
AlertPreferenceManagernow log a warning instead of being silently skipped - Thread-Safety in WorldStatsManager: Trend history lists now use
Collections.synchronizedList()to prevent concurrent modification issues
Added
Constants.DB_MAX_QUEUE_SIZE— centralized maximum queue size for database log entries
- Redstone False Positives in Performance Drop Analyzer: Removed 26 non-performance-impacting blocks (buttons, pressure plates, lecterns, daylight detectors, tripwire, levers, targets) from
[2.3.3] - 2026-04-12
Fixed
- Sneaking/Swimming/Climbing False Positives: These movement types are now skipped entirely by the speed checker.
- Silk Touch Ores Not Recognized as Self-Placed: The player-placed block check now applies to ALL worlds, not just restricted worlds. Previously, silk-touching an ore block, placing it in your base, and breaking it would count toward XRay detection
- Y-Level Pattern Analysis Removed: Completely removed the Y-Level analysis feature. Mining at optimal Y-levels is normal gameplay (anyone can Google "best Y level for diamonds") and produced false positives
Removed
analyzeYLevelPattern(),trackYLevel(),getOptimalYRange()methods from XRayDetectorplayerOreYLevelstracking map from XRayDetectorxray_ylevel_high/medium/lowconfig entries and validationXRAY_YLEVELviolation type
[2.3.2] - 2026-04-11
Fixed
- Race Condition in AlertManager: Cooldown check now uses atomic
compareAndSet()instead of separateget()/set(), preventing duplicate alerts under concurrent access - Race Condition in TickSampler: Tick sampling now uses
idx.getAndUpdate()for atomic index read-modify-write, preventing data corruption in the nanos array - Connection Pool Leak in DatabaseManager:
shutdown()now uses try-finally to ensureHikariDataSource.close()is always called, even ifflushBatchSafe()throws an exception - NullPointerException in GUIs: Added null-checks for
getItemMeta()in all GUI classes (PerformanceGUI, AntiCheatGUI, LagAnalysisGUI, PerformanceDropsGUI) — follows the safe pattern already used in ConfigGUI - Thread-Safety in ViolationTracker:
resetViolations(UUID, ViolationType)now usescomputeIfPresent()to prevent race condition where the PlayerViolations object could be removed betweenget()andcounts.remove() - MovementChecker Violation Reset Too Aggressive: Consecutive violation counters now only reset when speed is significantly below threshold (70%), preventing a single valid move from immediately washing out violations
- XRay Y-Level Thresholds Too Aggressive: Default thresholds raised from 75%/65%/55% to 85%/75%/65% to reduce false positives from legitimate caving
- UpdateChecker Missing Field Validation: Now checks for
version_numberfield existence in Modrinth API response before accessing it - Inconsistent Activity Weights:
PlayerActivityTracker.getTotalActivity()now uses centralizedConstants.ACTIVITY_WEIGHT_*values instead of hardcoded numbers
Added
- Configurable XRay Y-Level Thresholds (
config.yml)anticheat.xray_ylevel_high(default: 0.85) — percentage for maximum suspicionanticheat.xray_ylevel_medium(default: 0.75) — percentage for moderate suspicionanticheat.xray_ylevel_low(default: 0.65) — percentage for low suspicion- Config validation ensures values are 0.0-1.0 and properly ordered (low < medium < high)
- Auto-migration adds defaults for existing configs
Changed
XRayDetector.analyzeYLevelPattern()reads thresholds from config instead of using hardcoded values
- Race Condition in AlertManager: Cooldown check now uses atomic
[2.3.1] - 2026-04-10
Added
- Silent Mode / Streamer Mode (
/perfsilent)- Toggle all alerts on/off:
/perfsilent - Toggle per category:
/perfsilent xray,/perfsilent movement,/perfsilent performance - Reset all preferences at once:
/perfsilent reset - View current status:
/perfsilent list - Persistent across server restarts (saved in
config.ymlunderalerts.silent_players) - Aliases:
/ps,/silent - Full tab-completion support
- Bilingual: German & English language strings
- Toggle all alerts on/off:
- AntiCheat DB Cleanup Commands
/movealerts clear <player> --db— deletes movement violation entries from the database/xrayalerts clear <player> --db— deletes XRay detection entries from the database- Without
--db: only clears in-memory alerts (as before), now shows a hint about the--dboption - Tab-completion for
--dbflag
- Teleport Immunity for Movement Checks
- New
PlayerTeleportEventlistener prevents false positives from legitimate teleports (/tp,/home, ender pearls, etc.) - 1-second grace period after any teleport where movement checks are skipped
lastLocationsreset to teleport destination to prevent follow-up false positives- Consecutive violation counters reset on teleport
- New
Fixed
- Version Inconsistency: pom.xml, plugin.yml, and main class now use the same version dynamically via
getDescription().getVersion()instead of hardcoded strings - Race Condition in AsyncConfigSaver:
pendingSavechanged fromvolatile booleantoAtomicBooleanwith proper atomic check-and-set operations, preventing lost config saves under concurrent requests - NullPointerException in PerformanceDropAnalyzer: Added null-checks for
Player.getWorld()andPlayer.getLocation()during world unload scenarios - Memory Leak in AlertManager: Added periodic cleanup task (every 5 minutes) for stale
lastAlertTimesentries that were never removed - AntiCheat False Positives: Improved lag compensation from linear to square-root scaling (200ms ping = +10%, 500ms = +20%, 1000ms = +30%), reducing false positives for high-ping players without allowing extreme speeds
Changed
- All three alert systems (
AlertManager,XRayAlertManager,MovementAlertManager) now respect per-player alert preferences before sending chat notifications - Config auto-migration adds
alerts.silent_playersfor new installations
- Silent Mode / Streamer Mode (
[2.3.0] - 2026-02-22
Added
- Lag Compensation for Movement Checks
- Player ping considered in speed calculations (+10% per 100ms above 100ms)
- Reduces false-positives for high-ping players
- Knockback/Damage Immunity Detection
- 2-second immunity window after explosions and entity attacks
- Prevents false-positives from legitimate knockback
- Y-Level Analysis for XRay Detection
- Tracks mining height for all ores
- Optimal Y-level ranges based on Minecraft 1.21
- New detection method:
XRAY_YLEVEL - Detects suspicious pattern: 75%+ mining at optimal height
- Async Chunk Analysis
- Uses
ChunkSnapshotfor thread-safe analysis - Parallel processing with
CompletableFuture - 90% less main-thread load during performance drop analysis
- Timeout protection maintained
- Uses
- Auto-Cleanup for Database
- Automatic retention policy (default: 30 days)
- Runs daily (1h after startup, then every 24h)
- Configurable:
database.retention_days(set to 0 to disable)
- GUI Auto-Refresh System
- Performance data updates every 3 seconds
- Only active for open GUIs (no overhead)
- Automatic cleanup on GUI close
- Configurable:
gui.auto_refresh
- Trend Analysis for World Stats
- Historical tracking (up to 288 snapshots = 24h @ 5min intervals)
- Trend direction:
INCREASING,DECREASING,STABLE - Change rate calculation (entities/hour)
- Methods:
recordSnapshot(),analyzeTrend(),analyzeTrendsForAllWorlds()
- REST API for External Monitoring
- 4 JSON endpoints:
/api/health,/api/metrics,/api/worlds,/api/trends - API key authentication (
Authorization: Bearer) - Perfect for Grafana/Prometheus dashboards
- Config:
api.enabled,api.port,api.key
- 4 JSON endpoints:
- Automatic Entity Cleaner
- Smart entity management to prevent lag
- Priority-based removal (items → projectiles → monsters → animals)
- Protection for named entities, tamed animals, villagers
- Boss mob blacklist (Ender Dragon, Wither, Warden)
- Per-world and per-chunk limits
- Dry-run mode for safe testing
- Config:
entity_cleaner.*
Changed
- Movement Checker (
MovementChecker.java)- Added environmental checks (slime blocks, bubble columns)
- 2x vertical speed allowance near slime blocks/bubble columns
- Enhanced cleanup method to include new tracking maps
- XRay Detector (
XRayDetector.java)- Added Y-level tracking for pattern analysis
- New method:
analyzeYLevelPattern() - New method:
getOptimalYRange()with Minecraft 1.21 spawn data - Enhanced
checkSuspiciousPattern()with Y-level analysis
- Performance Drop Analyzer (
PerformanceDropAnalyzer.java)- Replaced synchronous chunk analysis with async processing
- Added
analyzeChunkAsync()method using ChunkSnapshot - Legacy
analyzeChunk()kept as fallback - Improved error handling for async operations
- Database Manager (
DatabaseManager.java)- Added auto-cleanup task for retention management
- Enhanced shutdown procedure to cancel cleanup task
- World Stats Manager (
WorldStatsManager.java)- Added trend tracking infrastructure
- New records:
WorldStatsSnapshot,TrendAnalysis - Multiple helper methods for trend calculation
- Performance GUI (
PerformanceGUI.java)- Added auto-refresh system with task management
- New
InventoryCloseEventhandler for cleanup - New method:
shutdown()for proper cleanup
- Plugin Config (
PluginConfig.java)- Added 10 new config methods for features
- Auto-migration for all new config entries
Fixed
- Memory leaks from incomplete cleanup (movement checker, XRay detector)
- False-positives in movement detection from knockback
- False-positives in movement detection from environmental effects
- Main-thread bottleneck in chunk analysis
Performance
- 90% reduction in main-thread load during performance drop analysis
- Reduced false-positive alerts (less CPU overhead)
- More efficient memory usage with automatic cleanup
Security
- REST API authentication with API keys
- SSRF protection in Discord webhook validation (from v2.2.0)
- SQL injection prevention (from v2.2.0)
- Lag Compensation for Movement Checks
[2.2.0] - 2026-01-05
🏗️ Major Release - Stability & Performance Update
This release focuses on security hardening, graceful degradation, performance optimizations, and critical bug fixes to ensure stable operation on production servers.
🔐 Security Hardening
SQL Injection Prevention
- Type-Safe Database Queries
- New
TimeUnitenum for SQL time unit operations - Replaces dangerous string concatenation in
DatabaseManager - Prevents SQL injection attacks via time-based queries
- Enum values:
SECOND,MINUTE,HOUR,DAY - Each value provides safe SQL name via
getSqlNameUpper()
- New
SSRF Protection
- Discord Webhook URL Validation
- Protocol validation: HTTPS-only (HTTP rejected)
- Domain whitelist: Only
discord.comanddiscordapp.comallowed - Path validation: Must start with
/api/webhooks/ - Prevents Server-Side Request Forgery attacks
- Logs validation failures for security monitoring
Memory Leak Prevention
- Size Limits on All Maps
XRayDetector.playerPlacedBlocks- Max size: 10,000 entriesXRayDetector.playerOreMines- NEW: Max size: 5,000 playersXRayDetector.playerStoneMines- NEW: Max size: 5,000 playersMovementChecker.moveCounter- Periodic reset at threshold- Automatic cleanup routines prevent unbounded growth
- Warning logs when size limits are hit
- Debug logging shows cleanup statistics and map sizes
💾 Graceful Degradation
FallbackLogger System
- Automatic Database Failover
- Queue-based async file writing (
ConcurrentLinkedQueue) - CSV format:
timestamp | type | value | description - Detects 3 consecutive database failures
- Switches to file logging automatically
- Configurable flush threshold (default: 100 entries)
- File rotation and management
- Fallback file path:
plugins/PerformanceAnalyzer/fallback.log
- Queue-based async file writing (
Database Availability Monitoring
- Failure Detection
isDatabaseAvailable()method for health checks- Consecutive failure counter
- Automatic recovery detection (resets to DB logging)
- Logs critical warnings when switching modes
Configuration
fallback_logging: enabled: true file: "plugins/PerformanceAnalyzer/fallback.log"⚡ Performance & Reliability
AsyncConfigSaver (CRITICAL FIX)
- Thread-Safe Config Operations
- FIXED: Now uses Bukkit Scheduler instead of ForkJoinPool
- CRITICAL:
saveConfig()runs on main thread (Bukkit requirement) - Previously used
CompletableFuture.runAsync()which caused ConcurrentModificationException - Uses
CompletableFuturefor async pattern - Atomic boolean flags prevent concurrent saves
saveAsync()schedules on main thread viarunTask()saveSyncOnShutdown()ensures data persistence on server stop- Error handling with exception logging and stack traces
- Prevents thread-safety violations and data corruption
Performance Optimizations
-
Event Sampling - Movement checks reduced by ~90%
- Only every 10th PlayerMoveEvent processed
- OR significant distance (>2 blocks) always checked
- Counter reset at 1000 to prevent overflow
- Minimal detection accuracy loss
-
Database Indexing
- Indexes on
timestampcolumn for time-range queries - Indexes on
typecolumn for metric filtering - Significantly faster query performance
- Auto-created during database initialization
- Indexes on
Constants Class
- Centralized Configuration
- 255 lines of well-organized constants
- Categories: Database, Discord, Movement, XRay, Performance, Vehicle Speeds
- No more magic numbers scattered throughout codebase
- Easy to tune and maintain
- All values documented with comments
🏗️ Architecture Improvements
CommandRegistry System
- Modular Command Registration
- Replaces 112-line monster method in
PerformanceAnalyzer - Separate methods for each category:
registerPerformanceCommands()- /perfstatus, /perfhistory, /perfreloadregisterAnalysisCommands()- /worldstats, /entitystats, /chunkstats, /perfdropsregisterGUICommands()- /perfguiregisterAntiCheatCommands()- /acwhitelist, /xrayalerts, /movealerts, /xrayores
- Easy to extend with new commands
- Clean separation of concerns
- AntiCheat commands dynamically registered when module enabled
- Replaces 112-line monster method in
ConfigMigrator Class
- Extracted Migration Logic
- Separate class for config version upgrades
- Version-by-version migration (v0 → v1 → v2 → ... → v5)
- Only runs when
config_version < Constants.CONFIG_VERSION - Returns boolean if changes were made
- Cleaner
PluginConfigclass (separation of concerns) - Easy to add new migrations
Public API
- PerformanceAPI Interface
double getCurrentTPS()- Get current server TPSdouble getCurrentMSPT()- Get current MSPTboolean isPlayerSuspicious(UUID playerUUID)- Check if player flagged- Enables third-party plugin integration
- Future: Additional methods for detailed performance data
🐛 Critical Bug Fixes
DatabaseManager Exception Handling
- FIXED: Added missing stack traces to SQL exceptions
- IMPROVED: Now logs failed SQL statements for debugging
- ADDED: JavaDoc documentation for
run()method - Better error messages for database initialization failures
- Prevents silent failures during schema creation
XRayDetector Map Size Enforcement
- FIXED: Unbounded memory growth in
playerOreMinesandplayerStoneMines - ADDED: Hard limit of 5,000 player entries per map
- IMPROVED: Cleanup task now removes empty
playerStoneMinesentries - Warning logs when size limit is exceeded
- Debug output shows current map sizes
Config.yml Language Consistency
- FIXED: All comments now in English (was mixed German/English)
- Consistent with multi-language support design
- User-facing messages still use language files (en.yml/de.yml)
- Better for international plugin distribution
🔧 Code Quality Improvements
- Consistent Error Handling - All exceptions logged with stack traces
- English Logging - All console logs in English (user-facing messages use i18n)
- Null Safety - Extensive null checks before operations
- Improved Documentation - JavaDoc added to critical methods
- Code Comments - All config comments translated to English
📦 New Files Created
util/Constants.java- Centralized constantscommands/CommandRegistry.java- Modular command registrationconfig/ConfigMigrator.java- Config migration logicconfig/AsyncConfigSaver.java- Async config savesdb/FallbackLogger.java- Fallback file loggingdb/TimeUnit.java- SQL-safe time unitsapi/PerformanceAPI.java- Public API interface
🔧 Modified Files
PerformanceAnalyzer.java- CommandRegistry integration, version update to 2.2.0DatabaseManager.java- CRITICAL FIX: Stack traces, SQL logging, FallbackLogger, TimeUnit enum, failure detectionAsyncConfigSaver.java- CRITICAL FIX: Thread-safety with Bukkit SchedulerPluginConfig.java- AsyncConfigSaver, ConfigMigrator, fallback config methodsDiscordWebhook.java- URL validation, SSRF protectionMovementChecker.java- Constants usage, event samplingXRayDetector.java- CRITICAL FIX: Size limits (5000 players), improved cleanup, memory leak preventionConstants.java- NEW:XRAY_MAX_PLAYER_ENTRIESconstantconfig.yml- FIXED: All comments translated to Englishpom.xml- Version 2.2.0
⚠️ Breaking Changes
None - This release is fully backward compatible with v2.1.0.
- All new features have sensible defaults
- Existing configs auto-migrate
- No database schema changes
- No API changes to existing methods
📊 Configuration Changes
New Config Sections:
# Graceful Degradation fallback_logging: enabled: true file: "plugins/PerformanceAnalyzer/fallback.log"Auto-Migration:
- Config auto-migrates from v5 to v5 (no version bump needed)
- New
fallback_loggingsection added automatically - Existing settings preserved
🔄 Migration Guide (from v2.1.0)
- Backup - Backup your
plugins/PerformanceAnalyzer/folder - Stop Server - Stop your server
- Replace JAR - Replace old JAR with
PerformanceAnalyzer-2.2.0.jar - Start Server - Start your server
- Auto-Migration - Config auto-updates (check console for "Config migrated")
- Verify - Run
/perfstatusto ensure plugin loaded correctly
Optional Post-Migration:
- Review fallback logging settings in
config.yml - Check
fallback.logfile (created only on database failure)
📈 Performance Impact
- CPU Usage: Reduced ~90% for movement checks (event sampling)
- Memory Usage: Lower (cleanup routines, size limits)
- Disk I/O: Reduced (async config saves, fallback only on failure)
- Database Load: Reduced (batching, indexing)
- Startup Time: Unchanged
🐛 Known Issues
None - All known issues from v2.1.0 have been resolved, including:
- ✅ AsyncConfigSaver thread-safety violation (ConcurrentModificationException)
- ✅ DatabaseManager silent failures (missing stack traces)
- ✅ XRayDetector unbounded memory growth (5000+ players)
- ✅ Config.yml mixed language comments (now all English)
- Type-Safe Database Queries
v2.0.0 (18.02.2025) - Major Release
Why Version 2.0? This release fundamentally transforms PerformanceAnalyzer from a simple monitoring tool into an intelligent lag diagnosis system. With 4 new classes, a completely redesigned GUI, and groundbreaking lag source detection, this is more than just new features—it's a new generation of the plugin.
Major New Features:
-
🎯 Lag Source Detection - Automatically identifies what's causing lag
- Player Activity Tracking - Monitors player actions (blocks, movements, commands, interactions)
- Plugin Performance Analysis - Identifies suspect plugins by event listeners and task count
- Integrated with Performance Drops - Lag sources are shown in
/perfdropsreports - Shows top 5 most active players during performance drops
- Shows top 5 suspect plugins with risk scores
- Weighted activity scoring (breaking blocks = higher weight than walking)
- Detects "heavy" plugins (WorldEdit, FAWE, CoreProtect, etc.)
-
🚨 Restricted World Zones - Instant alerts for specific worlds
- Configure worlds as "restricted zones" for mining monitoring
- Option to monitor specific ores or all ores in restricted worlds
- Instant alerts when players mine ores in restricted zones (no threshold needed)
- Perfect for protecting areas or catching suspicious behavior
- New config:
anticheat.restricted_worldsandanticheat.restricted_world_ores - Logs to database with type
anticheat_restricted_zone
Critical Bugfixes:
- ✅ Fixed missing imports in
PerformanceAnalyzer.java(Player, UUID) - ✅ Fixed MySQL incompatibility -
AUTOINCREMENTvsAUTO_INCREMENT - ✅ Fixed MySQL datetime syntax - All time-based queries now work with MySQL
getRecentMspt()- FixedgetAverageByType()- FixedcountPerformanceSpikes()- FixedcleanOldData()- Fixed
- ✅ Plugin now fully compatible with both SQLite AND MySQL
Improvements:
- 🔧 Configurable Performance Thresholds - All lag detection thresholds are now customizable
- Chunk thresholds: tile entities, redstone, entities (warning/critical)
- World health thresholds: entity warning/critical levels
- Plugin risk score interpretation: low/medium/high boundaries
- Prevents false positives on servers with different hardware
- Config includes recommendations for standard/powerful/weak servers
- Allows fine-tuning based on your specific server needs
- Movement detection now properly distinguishes between walking and sprinting
- XRay detector properly handles ore blocks (not items)
- Better null-safety in configuration migration
- Improved performance drop reports with lag source attribution
- Version compatibility updated: Paper 1.21.x (all 1.21 versions)
🔥 Performance Optimizations:
- Movement Sampling - PlayerMove events only processed every 10th occurrence or >2 blocks distance (~90% reduction)
- Chunk Analysis Timeout - Configurable timeout (default 5s) prevents long-running chunk scans
- Self-Monitoring - Plugin measures and warns about its own performance impact
- Config Options - All lag analysis features can be disabled independently
- Memory Cleanup - Automatic cleanup on player quit prevents memory leaks
- New Config Section:
lag_analysiswithplayer_tracking,plugin_analysis,chunk_analysis_timeout_ms
🎨 GUI Improvements:
- 🆕 Lag-Analyse GUI Page - Interactive page showing active players and suspect plugins
- Top 5 most active players with detailed breakdown
- Top 5 suspect plugins with risk scores
- Refresh and clear data buttons
- Config-aware (shows warnings if features disabled)
- 🆕 Performance Drops GUI Page - Browse and click drops for detailed reports
- Visual list of 21 recent drops
- Color-coded by severity (Red/Orange/Yellow)
- Click any drop for full report in chat
- Shows lag source previews
- Expanded Main GUI - Now 2 rows of features instead of 1
- Database Info button
- World Stats quick-link
- Better organization
- Multi-page Navigation - Consistent back buttons between pages
New Classes:
PlayerActivityTracker- Monitors player actions in real-time (with sampling)PluginTimingsAnalyzer- Analyzes plugin performance impactLagAnalysisGUI- GUI page for lag source inspectionPerformanceDropsGUI- GUI page for drop history browsing
-
v1.2.6 (Current)
New Features:
- Performance Drop Analysis (
/perfdrops) - Automatic detection and detailed analysis of performance drops- Automatically detects TPS drops (>5 TPS or below threshold)
- Automatically detects MSPT spikes (>30ms or above threshold)
- Records detailed server state at time of drop (chunks, entities, players, memory)
- Shows top entity types per world during the drop
- Displays all player locations during the drop
- Stores last 20 drops for analysis
- Logs drops to database for historical tracking
- Detailed reports help quickly identify lag causes
- Configurable XRay Stone-to-Ore Ratio - The ore-to-stone ratio threshold is now adjustable in config
- New config option:
anticheat.xray_stone_ore_ratio(default: 0.10) - Allows fine-tuning of XRay detection sensitivity
- Alert messages now show the configured threshold
- New config option:
Improvements:
- Performance monitoring is now more proactive with automatic drop detection
- XRay detection is more flexible with configurable ratio threshold
- Better debugging capabilities for lag investigation
- Performance Drop Analysis (
v1.2.5
New Features:
- Per-World Statistics (
/worldstats) - Comprehensive per-world analysis- Entity counts, player counts, loaded chunks
- Tile entity tracking
- Entity density per chunk
- Top entity types breakdown
- Entity hotspots detection
- Entity Analysis (
/entitystats) - Server-wide entity distribution analysis- Category breakdown (Hostile, Passive, Items, Vehicles, etc.)
- Top entity types
- Hotspot detection with severity levels (Warning/Critical)
- Per-world health status
- Chunk Tracking (
/chunkstats) - Chunk loading monitoring- Load/unload event tracking
- Force-loaded chunk monitoring
- New chunk generation counting
- Problematic chunk detection (high entity/tile count)
- Chunk thrashing detection (frequent load/unload cycles)
- Per-World Statistics (
v1.2.4
New Features:
- Spark Integration - Full integration with the Spark profiler plugin
- Accurate TPS from Spark (10s, 1m, 5m windows)
- Precise MSPT measurements (avg, p95, max)
- CPU usage monitoring (system and process)
- Automatic fallback if Spark not installed
- Movement Type Detection - AntiCheat now detects what type of movement the player is using
- Walking, Sprinting, Sneaking, Swimming, Climbing
- Vehicle detection: Horses, Pigs, Striders, Boats, Minecarts
- Flight modes: Elytra, Riptide, Creative Flight
- Movement Alerts Command (
/movealerts) - Bundled alerts for Speed/Fly/Teleport violations - Configurable Speed Thresholds - Set thresholds for walk, sprint, fly, vertical, teleport
- Consecutive Violation System - Reduces false positives by requiring multiple violations
- TPS Drop Threshold - Configurable threshold for TPS drop warnings
Improvements:
/perfstatusnow shows enhanced data when Spark is available- Movement checks now automatically bypass legitimate movement types (vehicles, elytra, etc.)
- Speed potion effects are now considered in speed calculations
- Soul Speed enchantment bonus is accounted for on soul sand/soil
- Movement alerts bundled like XRay alerts (less chat spam)
- Discord notifications for movement violations
- Spark Integration - Full integration with the Spark profiler plugin
Changelog
v1.2.3
New Features:
- Multi-Language Support - Full English and German translations
- Language Files - Customizable
en.ymlandde.ymlinlang/folder - Hot-Reload Language - Change language via config and
/perfreload - AntiCheat Hot-Reload - Enable/disable AntiCheat via
/perfreloadwithout restart
Improvements:
- All user-facing messages now use the language system
- Config automatically migrates with new
languagesetting - Cleaner code structure with centralized translations
PerformanceAnalyzer v1.2.2 (Paper 1.21.4-1.21.10 / Java 21)
A comprehensive performance monitoring plugin for Minecraft Paper servers with database logging, alert system, interactive GUI, and AntiCheat functionality.
Features
Performance Monitoring
- TPS Tracking: Approximate ticks per second
- MSPT Analysis: Average, P95 percentile, and historical data
- Heap Monitoring: Memory usage in percent
- Thread-Safe Sampling: Reliable data collection without race conditions
Database Support
- SQLite (Default): No external DB required, perfect for small servers
- MySQL: For larger servers with centralized database
- HikariCP Connection Pooling: Optimal performance
- Async Batch Writes: No performance impact from DB writes
- Historical Queries: Retrieve performance data over time ranges
Alert System
- Automatic Notifications when thresholds are exceeded
- Admin Notifications: In-game messages + console logs
- Cooldown System: Prevents alert spam (5 minutes per type)
- Alert types:
- High MSPT (> 50ms)
- TPS drops (< 19 TPS)
- Heap usage (> 80%)
- Packet flood (> 1000 packets/tick)
ProtocolLib Integration
- Packet Analysis: Counts received/sent packets
- Flood Detection: Warns on unusually high packet load
- DB Logging: Stores packet statistics for analysis
- 1.21.x Compatible: Automatically filters only supported packet types
AntiCheat Module (BETA)
- Movement Checks: Detects impossible movements
- Fly Detection: Checks for illegal vertical movement
- Speed Detection: Detects too fast horizontal movement
- XRay Detection: Analyzes mining patterns for rare ores
- Frequency analysis (too many ores in short time)
- Ore/stone ratio (unnaturally high ore percentage)
- Rare ore tracking (diamonds, emeralds, ancient debris)
- Per-ore thresholds: Different thresholds for each ore type
- Ore exclusions: Exclude specific ores from detection
- Bundled alerts: Only one summary in chat, details via command
- Coordinates & World: Shows where mining occurred (Multiverse compatible)
- Whitelist System: Exclude players and LuckPerms groups
- Violation Tracking: Counts violations per player
- Admin Alerts: Notifies admins of suspicious behavior
NOTE: The AntiCheat module is experimental and may produce false positives. For production servers, we recommend specialized plugins like Matrix, Vulcan, or Spartan.
Interactive GUI System
- Performance Dashboard: Live TPS, MSPT, and heap usage with updates
- Config GUI: Toggle all settings (AntiCheat, XRay, Discord, packets)
- AntiCheat GUI: Status overview, whitelist info, XRay settings
- All options changeable via GUI or command
- Intuitive operation with colored items
Discord Webhook Integration
- Automatic Notifications for critical events
- Color-coded Embeds for different alert types
- Configurable Alerts: Choose which events to report
- XRay Alerts: Suspicious players reported to Discord
- Async HTTP Requests: No performance impact
- Simple setup via config
LuckPerms Integration
- Group-based Whitelist for AntiCheat
- Automatic group detection
- Primary & inherited groups are considered
Commands
/perfstatusShows live performance data:
- TPS (approximate)
- MSPT (average and P95)
- Heap usage in percent
- Title warning on high load (for players)
Permission:
performance.status(Default: true)/perfhistory [minutes]Shows historical performance data as ASCII sparkline:
- MSPT history from database (real data!)
- Live statistics
- DB average over selected time range
- Number of performance spikes
- Optional: Specify time range in minutes (Default: 60)
Permission:
performance.history(Default: true)Examples:
/perfhistory- Last 60 minutes/perfhistory 180- Last 3 hours/perfhistory 1440- Last 24 hours
/perfguiOpens the interactive performance GUI:
- Performance dashboard with live data
- Change config settings with clicks
- AntiCheat status and whitelist
- Reload button for config
Permission:
performance.gui(Default: true)/perfreloadReloads the plugin configuration without server restart:
- Config file is re-read
- All settings are updated
- XRay ore exclusions are reloaded
- No interruption of operation
Permission:
performance.admin(Default: op)/acwhitelist(Alias:/acwl)Manages the AntiCheat whitelist:
/acwhitelist add <player>- Add player to whitelist/acwhitelist add group:<groupname>- Add LuckPerms group/acwhitelist remove <player>- Remove player from whitelist/acwhitelist remove group:<groupname>- Remove group/acwhitelist list- Show all whitelisted players/groups
Permission:
performance.anticheat.manage(Default: op)Examples:
# Individual players /acwhitelist add Notch /acwhitelist remove Notch # LuckPerms groups /acwhitelist add group:admin /acwhitelist add group:moderator /acwhitelist remove group:builder # Show list /acwhitelist list/xrayalerts(Alias:/xra)Shows and manages XRay suspicion alerts:
/xrayalerts- Show all suspicious players/xrayalerts <player>- Details for a player (incl. which ores were mined)/xrayalerts clear <player>- Clear alerts for a player/xrayalerts clearall- Clear all alerts
Permission:
performance.admin(Default: op)How it works:
- Alerts are collected and bundled
- Only one summary appears in chat per player (every 5 min)
- Details via
/xrayalerts <player>(also shows exactly which ores were mined) - Alerts are automatically deleted after 30 minutes
- Suspicious players are also reported to Discord (incl. ore breakdown)
/xrayores(Alias:/xro)Manages XRay ore exclusions:
/xrayores list- Show excluded ores/xrayores available- Show all available ores/xrayores add <ore>- Exclude ore from XRay detection/xrayores remove <ore>- Track ore again
Permission:
performance.anticheat.manage(Default: op)Examples:
# Exclude coal and iron /xrayores add COAL_ORE /xrayores add IRON_ORE # Show available ores /xrayores available # Track ore again /xrayores remove COAL_OREConfiguration
database: type: sqlite # or 'mysql' sqlite_file: "plugins/PerformanceAnalyzer/perf.db" performance: log_interval_seconds: 60 # Logging interval packet_analysis: true # ProtocolLib hook anticheat_enabled: false # AntiCheat module (BETA, default: off) debug_mode: false # Debug output in console anticheat: xray_detection: true # XRay detection xray_timewindow_seconds: 60 # Time window ops_bypass: false # Should OPs bypass AntiCheat? (default: false) xray_excluded_ores: [] # Exclude ores, e.g. ["COAL_ORE", "IRON_ORE"] xray_thresholds: # Per-ore thresholds coal: 20 iron: 15 copper: 15 gold: 10 redstone: 10 lapis: 8 diamond: 6 emerald: 4 ancient_debris: 3 whitelist_players: [] # Player UUIDs whitelist_groups: [] # LuckPerms groups thresholds: mspt: 50.0 # MSPT warning threshold heap_usage_percent: 80.0 # Heap warning threshold packet_flood_per_tick: 1000.0 # Packet flood threshold discord: enabled: false # Discord notifications webhook_url: "" # Discord Webhook URL alert_types: # Which alerts to send? high_mspt: true tps_drop: true high_heap: true packet_flood: true anticheat: true # XRay alertsXRay Ore Exclusions
You can exclude specific ores from XRay detection:
anticheat: xray_excluded_ores: - COAL_ORE # Exclude coal - IRON_ORE # Exclude iron - COPPER_ORE # Exclude copperAvailable ores:
COAL_ORE,IRON_ORE,COPPER_ORE,GOLD_ORE,REDSTONE_ORE,LAPIS_ORE,DIAMOND_ORE,EMERALD_ORE,ANCIENT_DEBRISDeepslate variants (e.g.
DEEPSLATE_DIAMOND_ORE) are automatically excluded as well.Per-Ore Thresholds
Each ore type has its own threshold. When a player mines more than the threshold amount within the time window, an alert is triggered:
anticheat: xray_thresholds: coal: 20 # Common - high threshold iron: 15 copper: 15 gold: 10 redstone: 10 lapis: 8 diamond: 6 # Rare - low threshold emerald: 4 ancient_debris: 3 # Very rare - very low thresholdPermissions
Permission Description Default performance.statusUse /perfstatustrue performance.historyUse /perfhistorytrue performance.guiUse /perfguitrue performance.admin/perfreload,/xrayalerts, alert notificationsop performance.anticheat.bypassBypass all AntiCheat checks false performance.anticheat.manageUse /acwhitelist,/xrayoresop Optional Dependencies
ProtocolLib (recommended)
- Enables packet analysis and flood detection
- Download: https://www.spigotmc.org/resources/protocollib.1997/
LuckPerms (recommended)
- Enables group-based AntiCheat whitelist
- Automatic group detection for players
- Download: https://luckperms.net/
spark (planned)
- Future integration for detailed profiling
- Download: https://spark.lucko.me/
Technical Details
- Java 21 required
- Paper 1.21.4-1.21.10 compatible
- Thread-safe implementation
- Minimal performance overhead
- Async DB operations
- Maven Shade Plugin for dependency shading
Changelog
v1.2.2 (Current)
New Features:
- Per-Ore Thresholds - Each ore has its own threshold (Ancient Debris: 3, Diamond: 6, Coal: 20, etc.)
- Coordinates in XRay Alerts - Shows world, position, and mining area (Multiverse compatible)
- Debug Mode - Console logs only when
debug_modeenabled in config.yml - OPs Bypass Option - Configurable whether OPs should bypass AntiCheat checks
Improvements:
- MySQL driver as
provided- Server operator must supply the driver - Clear error message when MySQL configured but driver missing
- Dynamic User-Agent in Discord Webhook (shows current plugin version)
- AntiCheat disabled by default (must be consciously enabled)
- Less console spam through debug mode
Bugfixes:
- TPS drop alerts are now correctly sent to Discord
- XRay commands work even when AntiCheat is disabled (shows helpful message)
v1.2.1
New Features:
- XRay Alert System (
/xrayalerts) - Bundled alerts with command overview - XRay Ore Exclusions (
/xrayores) - Exclude ores via command - XRay Ore Breakdown - Shows exactly which ores were mined
- XRay Discord Integration - Suspicious players reported to Discord
- Config Migration - New config entries are automatically added
Improvements:
- ProtocolLib 1.21.x compatibility (no more warnings)
- GUI completely overhauled and fixed
- Bundled chat notifications (less spam)
- Extended config options for XRay
- Ore breakdown in alerts and Discord messages
Bugfixes:
- GUI event handlers now work correctly
- ProtocolLib filters only supported packet types
- Thread-safety improvements in XRayDetector
- Config is automatically updated on plugin updates
v1.2.0
New Features:
- Interactive GUI System (
/perfgui) with dashboard, config, and AntiCheat overview - XRay Detection with three detection methods (frequency, ratio, rare ores)
- Discord Webhook Integration for automatic notifications
- LuckPerms Integration for group-based AntiCheat whitelist
- Whitelist System with
/acwhitelistcommand (players + groups) - Reload Command (
/perfreload) for config updates without restart - Tab Completion for all commands
Improvements:
- Alert system with Discord integration
- Config options changeable via GUI
- Extended AntiCheat config
- All settings live-reloadable
v1.1.0
Fixed:
- Fake data in AsciiSparkline replaced with real DB data
- Thread-safety issues in TickSampler
- ProtocolLib hook fully implemented
- Old duplicate classes removed
New:
- Alert system with admin notifications
- AntiCheat module for basic cheat detection
- DB query methods for historical analysis
- Automatic DB logging for all metrics
- Packet flood detection
- Performance spike counter
- Extended config options
Future Features (TODO)
- Web dashboard for live monitoring
- Grafana/Prometheus export
- Per-world performance stats
- Chunk loading tracking
- Entity density analysis
- Spark integration for profiling
-
Discord webhook for alerts(Implemented) - Database cleanup command

