⚔ CombatLog
A effective and highly configurable Paper plugin that prevents combat logging and related PvP abuse. Built for competitive servers that need strict and predictable combat behavior.
Core Features
⏱ Combat Timer
- Starts when a player deals or receives damage
- Supports ActionBar or BossBar display
- Fully configurable duration
🚫 Combat Restrictions
While in combat, you can disable:
- Elytra usage (including boost)
- Teleporting
- Mending
- Riptide
- Explosion-based combat abuse (End Crystals / Respawn Anchors)
All restrictions are optional and configurable.
⚠️ Testing? Use a non-OP account! OPs get
combatlog.bypassby default and are never tagged, so the plugin looks like it does nothing. Test with a normal player, or remove the permission from OPs
Smart Combat Triggers
- Player vs Player damage
- Projectile damage (Arrow, Trident, Wither Skull)
- Explosion-based tagging
- Ender Pearl land detection
- Optional combat zone with radius detection
Anti Kill Abuse System
Prevents farming the same victim repeatedly.
- Configurable kill limit
- Configurable time window
- Custom punish commands
- Fully automated
WorldGuard Integration
If WorldGuard is installed:
- Registers custom flag:
allow-combat-entry - Blocks region entry while in combat
- Fully optional integration
No hard dependency required.
💡 Feature Requests
Have an idea for a feature that you think would be useful for many servers and players, not just your own setup?
Feel free to suggest it!
- 💬 Discord: Contact me directly
- 🐙 GitHub: Open an issue with your idea, use case, and any relevant details
Please keep feature requests focused on things that could benefit the wider CombatLog community. This helps prioritize features that are useful for more than just a single server.
All Versions
+ Add Version| Feature | Config |
|---|---|
| Logout punishment modes
none, kill, commands | punishment.logout.mode, punishment.logout.commands || Command whitelist mode |
command-restrictions.mode: whitelist || Allow Ender Pearls while teleporting is disabled |
restrictions.teleporting.allow-enderpearl || Choose who gets tagged on a hit: both, attacker or victim |
triggers.tag-mode || Only start combat below a set health |
triggers.start-below-health |## Fixed
- Untag on kill now only removes the killer's tag if no other opponent is still active
- Dead players are now untagged on death
- Combat players could clip into
allow-combat-entry: denyregions by placing blocks at the barrier - Combat players could enter protected regions via teleports or Ender Pearls
- Players who still end up inside a protected region during combat are pushed back out
- Namespaced commands (
/plugin:command) bypassed the command blacklist - Tag effects no longer flicker on every hit, they get refreshed instead
- Config version
3→4, migrated automatically (backup:config.v3.bak.yml) punishment.kill-on-logout→punishment.logout.mode(truebecomeskill)blocked-commands→command-restrictions.commands- New keys get their comments added on migration
- Untag on kill: the killer is now removed from combat immediately after killing another player. Configurable via
combat-log.triggers.untag-on-kill(default:true)
### Changed
explosions.set-combat-on-explosionmoved fromrestrictionstotriggersin config.yml (more accurate location)- Config version bumped to
3, migration runs automatically on startup
### Notes
- Existing configs are migrated automatically on next server start
- A backup of the previous config is saved as
config.v2.bak.ymlin the plugin folder
### WorldGuard Safe-Zone Barrier
| Change | Details |
|---|---|
| Rework | Barrier now scans block-by-block against the actual region shape instead of a fixed radius around the last movement point. Aligns exactly with the region edge. |
| Live updates | Barrier is recalculated continuously while in combat (every move, throttled to 250ms), not just once after a rejected move. It now shows on approach instead of only after being pushed back. |
| Break/interact protection | Barrier blocks can no longer be broken or interacted with. |
| New config:
view-distance | Controls how far from the border the barrier stays visible. Default: 8. || New config:
height | Controls how many blocks above the player the barrier scan checks. Default: 3. |### Config System
| Change | Details |
|---|---|
|
messages.yml auto-creation | File is now created on first enable if missing. || Config auto-migration |
config.yml is now automatically backed up and migrated when the config version changes, instead of requiring a manual reset. || New accessors |
getCombatManager(), getPluginConfig(), reloadPluginSettings() exposed for cleaner internal access. |### Config Migration Notes
Existing installs will get the new
view-distance and height keys added automatically under combat-log.worldguard.safe-zone-barrier on next startup. A backup of the old config is created automatically.### ✨ **New Features**
- Subcommand system** for
/combatlog:reload,status,untag– better plugin management through commands - Visual WorldGuard safe-zone barrier** with fake blocks – players see a clear visual barrier around safe zones
### 🔧 **Improvements**
- Separate
messages.yml** introduced with full colorization support – easier message customization - Simplified
CombatManager** – cleaner, more maintainable code without unnecessary complexity - Optimized PlaceholderAPI integration**
- Tab-completion** for all subcommands
- Messages now use Adventure Components for better consistency
### ⚠️ **Removed**
- Opponent-tracking simplified (no longer stored in data structures)
### 🐛 **Bugfixes & Cleanup**
- WorldGuard now properly treated as an optional dependency
- Barriers correctly cleared on untag
- Improved timer cleanup on plugin shutdown
- PlaceholderAPI Integration**
%combatlog_in_combat%—true/false%combatlog_time_left%— remaining combat seconds%combatlog_opponent_name%— name of the current opponent%combatlog_opponent_health%— opponent's current HP (00.00format)
PlaceholderAPI is optional — the plugin loads cleanly without it.
- Permission Bypass (
combatlog.bypass)**
combatlog.bypass permission are fully exempt from CombatLog:- Will not be tagged into combat
- Are not subject to any in-combat restrictions (elytra, teleport, commands, etc.)
- Disconnecting while in combat produces no broadcast and no punishment
- Default:
op
- Potion Effects on Combat Tag**
Configure in
config.yml under combat-log.tag-effects:``
yaml
tag-effects:
- type: GLOWING
duration-seconds: 15
amplifier: 0
show-particles: false
`
Supports any valid Bukkit PotionEffectType. The list in the default config includes GLOWING as an example — remove or comment it out if you don't want any effects.
# Improvements
CombatManager now tracks the current opponent per player, enabling opponent-related placeholders to work correctlyPotionEffectType lookup updated to use Registry.EFFECT instead of the deprecated getByName() method (Paper 1.20.3+)
## Dependencies
- PlaceholderAPI: optional (
softdepend`)This release is a pure code refactor. Gameplay behaviour is **identical** to the previous version.
### Package structure
Packages have been renamed to follow Java conventions (lowercase):
| Before | After |
|---|---|
|
...Utils | ...util ||
...Combat | ...combat ||
...Config | ...config ||
...Listener | ...listener |### What changed
CombatManager(new:combatpackage)**- Now fully owns
combatTimers,activeTimersandbossBarsmaps - Listeners no longer touch state directly — all changes go through the public API
PluginConfig(new:configpackage)**- Centralises every
config.getString / getBoolean / getIntcall - Single instance passed to all listeners on startup
- Listener split**
CombatTagListener— damage, projectile, explosion and enderpearl taggingCombatRestrictionListener— elytra, teleport, command block, mending, riptideCombatZoneListener— proximity tagging on joinCombatLogoutListener— disconnect handlingAntiKillAbuse— kill-farming detectionWorldGuardListener— region entry guard (registered only when WorldGuard is present)
CombatLog(main class)**- Reduced to wiring only: config → manager → listeners
registerListeners()is the single place to see which listeners are active
### Migration
No config changes. No permission changes. No command changes.
Simply replace the old jar with the new one and restart.
WorldGuardHook status. As a result, the **region entry restriction during combat now works correctly**.Additionally, blocked commands are now **case-insensitive** (
/TPA, /Tpa, /tpa are treated the same), making the command restriction system more reliable.All settings are now logically grouped (
timer, restrictions, punishment, triggers, etc.), making the plugin easier to configure and extend.The Anti-Kill-Abuse system has also been adapted to the new structure.
> ⚠️ Old configs are **not compatible**. Please replace your existing config.
## New Configuration
<details>
<summary><strong>Click to expand</strong></summary>
``
yml
combat-log:
timer:
duration-seconds: 15
display: actionbar
restrictions:
elytra:
disabled-in-combat: true
teleporting:
disabled-in-combat: false
mending:
disabled-in-combat: true
riptide:
stop: false
cooldown: 10000
explosions:
set-combat-on-explosion: true
punishment:
damage: 5.0
kill-on-logout: false
triggers:
enderpearl:
set-combat-on-land: true
only-if-already-in-combat: false
ignored-worlds:
- "ffa"
blocked-commands:
- "tpa"
combat-zone:
enabled: true
radius: 10
messages:
combat-log: "&c{player} has combat logged!"
elytra-use-denied: "&dYou can't use elytra in combat"
teleporting-denied: "&dYou can't teleport in combat"
blocked-command: "&cYou can't use this command in combat"
region-entry-denied: "&cYou can't enter this region in combat"
timer:
actionbar: "&c{timeLeft}/{maxTime}"
bossbar-title: "&cIn Combat: {timeLeft}s"
anti-kill-abuse:
enabled: true
limits:
max-kills: 5
remove-kill-after-seconds: 60
punish-commands:
- "kick {killer} Kill-Abuse detected!"
- "ban {killer}"
``</details>
### Added
- New configuration options to control combat logging when an Ender Pearl lands.
- Players can now be set into combat when landing an Ender Pearl.
- Option to choose whether this should always happen or only if the player is already in combat.
### Config
```yml
combat-log:
enderpearl:
set-combat-on-land: true
only-if-already-in-combat: false
A new configuration option has been introduced:
```yaml
combat-log:
mending-disabled-in-combat: true
- Prevents **kill farming / griefing** by tracking repeated kills on the same player.
- If a player kills the same victim more than **5 times in 30s**, punishment commands are executed.
### ⚙️ Config
```yaml
anti-kill-abuse:
enabled: true
remove-kill-after: 60
max-kills: 5
punish-commands: # {victim} for victim
- "kick {killer} Kill-Abuse detected!"
New config option:
combat-log.display-mode (actionbar or bossbar)### Combat Zone System
- Added a configurable zone where players are automatically put into combat.
- The range of the combat zone can be adjusted.
- The combat zone can be enabled or disabled as needed.
### Punishment System
- Players can receive damage as a penalty for breaking the rules.
- The amount of damage can be adjusted in the configuration.
Should work on all game versions
by ignoring the PlayerElytraBoostEvent wich shouldn't anyway get triggert

