**CombatMetrics** is a lightweight, high-performance combat tracking plugin for Paper 1.21+ servers. It accurately detects and displays **Critical Hits** and **Sprint Combo Hits** in real-time using the player's Action Bar. The plugin faithfully replicates vanilla Minecraft's exact combat mechanics, ensuring that every tracked hit matches what would trigger the corresponding subtitle/particle effect in the base game.
| Feature | Description | |---------|-------------| | **Critical Hit Tracking** | Detects vanilla-accurate critical hits using 11 strict conditions | | **Combo Hit Tracking** | Detects sprint knockback hits for combo counting | | **Real-Time Display** | Shows live counters in the Action Bar | | **Auto Reset** | Counters automatically reset after 2 seconds of inactivity | | **Left-Aligned Display** | Text positioned on left side of screen for better visibility | | **Hit Highlighting** | Brief green flash when a hit is registered |
### Persistence Features
| Feature | Description | |---------|-------------| | **Per-Player Toggle** | Each player can enable/disable their display | | **Survives Relog** | Preference saved using PersistentDataContainer | | **Survives Restart** | Settings persist across server restarts | | **No External Storage** | Data stored directly on player entity |
### ⚡ Performance Features
| Feature | Description | |---------|-------------| | **Async Timer Checks** | Reset detection runs on async thread | | **Efficient Data Storage** | ConcurrentHashMap for thread-safe access | | **Minimal Overhead** | Early-return conditions prevent unnecessary processing | | **Lazy Initialization** | Data created only when player attacks | | **Lightweight Task** | Timer runs every 5 ticks (0.25 seconds) |
---
## ☠️ Critical Hit Detection
CombatMetrics uses **vanilla-accurate** detection that matches Minecraft's exact critical hit requirements. A hit is only counted as critical if **ALL** conditions are met:
### Condition Checklist
| # | Condition | Method Used | Explanation | |---|-----------|-------------|-------------| | 1 | **Falling** | `fallDistance > 0.0` | Player must have positive fall distance | | 2 | **Airborne** | `!isOnGround()` | Player cannot be touching the ground | | 3 | **Not Climbing** | `!isClimbing()` | Cannot be on ladder, vine, or scaffolding | | 4 | **Not In Water** | `!isInWater()` | Cannot be submerged in water | | 5 | **Not In Lava** | `!isInLava()` | Cannot be submerged in lava | | 6 | **Not Swimming** | `!isSwimming()` | Cannot be using swimming animation | | 7 | **Not Gliding** | `!isGliding()` | Cannot be flying with Elytra | | 8 | **No Blindness** | `!hasPotionEffect(BLINDNESS)` | Blindness effect blocks crits | | 9 | **No Slow Falling** | `!hasPotionEffect(SLOW_FALLING)` | Slow falling prevents crits | | 10 | **Not Mounted** | `!isInsideVehicle()` | Cannot be riding any entity | | 11 | **Charged Attack** | `getAttackCooldown() > 0.9` | Attack must be 90%+ charged |
### Visual Representation
``` CRITICAL HIT VALIDATION
Player State Check Result ══════════════════════════════════════════
| Element | Color | Style | |---------|-------|-------| | `[` `]` | Dark Gray | Normal | | `☠` | Dark Red | Normal | | `CRITS:` | Red | **Bold** | | Crit Count | White | Normal | | `\|` | Dark Gray | Normal | | `⚔` | Gold | Normal | | `COMBO:` | Yellow | **Bold** | | Combo Count | White | Normal |
### Hit Highlight Effect
When a hit is registered, the corresponding counter briefly highlights:
``` Normal Display: [ ☠ CRITS: 5 | ⚔ COMBO: 3 ] ↑ ↑ White White
After Critical Hit (3 ticks): [ ☠ CRITS: 6 | ⚔ COMBO: 3 ] ↑ GREEN + BOLD
After Combo Hit (3 ticks): [ ☠ CRITS: 6 | ⚔ COMBO: 4 ] ↑ GREEN + BOLD ```
### Left-Alignment Technique
Minecraft's Action Bar centers text by default. To achieve left-alignment:
| Benefit | Description | |---------|-------------| | **No Files** | No YAML/JSON configuration files per player | | **No Database** | No MySQL/SQLite required | | **Automatic** | Saved with player data automatically | | **Reliable** | Survives crashes, restarts, and relogs | | **Lightweight** | Single byte per player |
---
## ⚡ Performance Analysis
### Memory Usage
``` Per Player: ┌────────────────────────────────────┐ │ MetricData Object │ ├────────────────────────────────────┤ │ int critCount = 4 bytes │ │ int comboCount = 4 bytes │ │ long lastCritTime = 8 bytes │ │ long lastComboTime = 8 bytes │ │ boolean needsUpdate = 1 byte │ │ Object overhead ≈ 16 bytes │ ├────────────────────────────────────┤ │ TOTAL ≈ 41 bytes │ └────────────────────────────────────┘
| Task | Frequency | Cost | |------|-----------|------| | Damage Event Handler | Per attack | Very Low (early returns) | | Async Reset Checker | Every 5 ticks | Minimal (simple timestamp comparison) | | Action Bar Update | On hit/reset | Low (Component creation) |
### Optimization Techniques Used
| Technique | Implementation | |-----------|----------------| | **Early Returns** | Check cooldown first before other conditions | | **Async Processing** | Timer checks run off main thread | | **ConcurrentHashMap** | Thread-safe without locks | | **Lazy Loading** | MetricData created on first attack | | **Minimal Allocations** | Reuse patterns where possible | | **Event Priority** | MONITOR priority - runs after other plugins |
| Use Case | Benefit | |----------|---------| | **YouTube/Twitch** | Visual feedback for viewers | | **Tutorials** | Demonstrate critical hit mechanics | | **Challenges** | Create crit-based achievements |
---
## Statistics Tracking
### What Gets Tracked
| Metric | Description | Reset Condition | |--------|-------------|-----------------| | **Crit Count** | Total critical hits in current streak | 2 seconds no crit | | **Combo Count** | Total combo hits in current streak | 2 seconds no combo | | **Last Crit Time** | Timestamp of most recent crit | On reset | | **Last Combo Time** | Timestamp of most recent combo | On reset |
### What Is NOT Tracked
| Not Tracked | Reason | |-------------|--------| | All-time statistics | Would require database storage | | Damage numbers | Beyond plugin scope | | Kill/death counts | Other plugins handle this | | Weapon types | Not relevant to hit detection |
---
## Developer API
### Accessing CombatMetrics
```java // Get plugin instance CombatMetrics plugin = CombatMetrics.getInstance();
// Get the metric manager MetricManager manager = plugin.getMetricManager(); ```
### Reading Player Data
```java // Get current stats MetricData data = manager.getMetricData(player); int crits = data.getCritCount(); int combos = data.getComboCount();
// Check if display is enabled boolean enabled = manager.isDisplayEnabled(player); ```
| Java | Compatible | |------|:----------:| | Java 21 | ✅ Required | | Java 22+ | ✅ Should work | | Java 17 | ❌ Too old for Paper 1.21 |
### Plugin Conflicts
| Plugin Type | Compatibility | |-------------|---------------| | Combat plugins | ✅ Runs on MONITOR priority | | Action bar plugins | ⚠️ May overwrite display | | Anticheat plugins | ✅ No conflicts | | Protection plugins | ✅ Respects cancelled events |
---
## Installation
### Step-by-Step
1. **Download** the `CombatMetrics-1.0.0.jar` file 2. **Stop** your server 3. **Place** the JAR in your `plugins/` folder 4. **Start** your server 5. **Verify** with `/plugins` - should show green
### First-Time Setup
No configuration required! The plugin works out of the box:
- Display is **enabled by default** for all players - Players can toggle with `/metrics toggle` - Settings automatically persist
---
## Changelog
### Version 1.0.0 - Initial release - Critical hit detection (11 conditions) - Combo hit detection (3 conditions) - Action bar display with left-alignment - Auto-reset after 2 seconds - PDC-based persistence - Toggle/status/reset commands - Async timer task - Hit highlight effects
---
## FAQ
**Q: Why doesn't it detect my critical hits?** > A: Ensure your attack is fully charged (90%+) and you're falling without any blocking conditions (water, climbing, slow falling, etc.)
**Q: Can both Crit and Combo trigger on the same hit?** > A: Yes! If you're falling AND sprinting with a charged attack, both counters will increment.
**Q: Does this work in creative mode?** > A: Yes, but attack cooldown is always 1.0 in creative, so timing doesn't matter.
**Q: Will this cause lag?** > A: No. The plugin uses async processing and minimal memory. Tested with 100+ players.
**Q: Can I customize the display colors?** > A: Not in this version. Colors are hardcoded for consistency.
**Q: Does it track hits on all entities?** > A: Only hits on LivingEntity (mobs, players, animals, etc.)