1.5.0
Compatibility
Changes
Changelog ā NDPlayerStats v1.5.0
New Features
-
PvE Statistics ā kills and deaths from mobs/animals are now tracked separately
- New stats:
pve_kills,pve_deaths - New placeholders:
%ndplayerstats_pve_kills%,%ndplayerstats_pve_deaths%,%ndplayerstats_all_kills%,%ndplayerstats_all_deaths% %ndplayerstats_kills%now shows only PvP kills%ndplayerstats_all_kills%shows total kills (PvP + PvE)
- New stats:
-
Anti-Kill Abuse Protection (Suggested by finn12) ā prevents kill farming against the same player
- Time-window mode with configurable limits
- Notifications for killer and victim
- Bypass permission:
ndplayerstats.antiabuse.bypass - World restrictions support
-
Leaderboard Titles ā moved to
messages.ymlwith{page},{total},{size}placeholders
Bug Fixes
- General bug fixes and performance improvements
Configuration & Messages
config.ymlā new sectionanti-kill-abuseadded,track-pve-killsoption addedmessages.ymlā new sectionanti-kill-abuseadded, newleaderboard.titleandleaderboard.title-kdwith{page},{total},{size}placeholders
Updating from v1.4.1
Important: Updating from version 1.4.1 requires either:
Deleting old
config.ymlandmessages.yml(plugin will generate new ones with defaults)or
Manually updating both files with new sections
Breaking Change
%ndplayerstats_kills% now shows PvP kills only. Use %ndplayerstats_all_kills% for total kills.
config.yml
# NDPlayerStats Configuration v1.5.0
# Author: Kubass1 - https://kubass.cz/
# ā IMPORTANT: Changing database type requires server restart!
# Edit this file, save it, then restart the server.
# ============================================================
# DATABASE SETTINGS
# ============================================================
database:
# Database type: YAML, MYSQL, or SQLITE
# ā WARNING: Changing this requires server restart!
type: YAML
# SQLite settings (only used when type: SQLITE)
sqlite:
# Name of the SQLite database file
filename: database.db
# MySQL settings (only used when type: MYSQL)
mysql:
# MySQL server address
host: localhost
# MySQL server port
port: 3306
# Name of the database to use
database: mc_server
# Database username
username: root
# Database password
password: ''
# Prefix for all table names (useful for multiple plugins sharing one database)
table-prefix: ndps_
# Enable SSL for MySQL connection
ssl: false
# ============================================================
# UPDATE CHECKER
# ============================================================
# Enable or disable automatic update checking
check-update: true
# ============================================================
# LEADERBOARD SETTINGS
# ============================================================
leaderboard:
# Enable or disable the leaderboard feature
enabled: true
# How many players to show in the leaderboard
size: 10
# How often to auto-update leaderboard cache in seconds (0 = disabled)
update-interval: 60
# Maximum position for placeholders (e.g. %ndplayerstats_kills_100%)
max-position: 100
# Default mode for /leaderboard: "kills" or "kd"
default-mode: kills
# Custom colors for each rank position
colors:
'1': '&6' # #1 - Gold
'2': '&7' # #2 - Silver
'3': '&8' # #3 - Bronze
'4': '&e' # #4 - Yellow
'5': '&e' # #5 - Yellow
'6': '&e' # #6 - Yellow
'7': '&e' # #7 - Yellow
'8': '&e' # #8 - Yellow
'9': '&e' # #9 - Yellow
'10': '&e' # #10 - Yellow
others: '&f' # All other ranks - White
# ============================================================
# RANK SETTINGS
# ============================================================
ranks:
# Enable or disable the ranking system completely
enabled: true
# Show [Unranked] for players with no stats
show-unranked: true
# Text to display for unranked players
unranked-text: Unranked
# Color for unranked text
unranked-color: '&7'
# Maximum rank number to display (ranks above this will show as 999+)
max-display-rank: 999
# Show [999+] for ranks above max-display-rank
show-max-plus: true
# Text for ranks above max-display-rank
max-plus-text: 999+
# Color for max-plus text
max-plus-color: '&8'
# Minimum kills required to get a rank
minimum-kills: 0
# ============================================================
# STATISTICS TRACKING
# ============================================================
stats:
# Track total play time for each player
track-play-time: true
# Track PvP kills separately (kills against players)
track-pvp-kills: true
# Track PvE kills separately (kills against mobs/animals)
track-pve-kills: true
# Track the highest killstreak a player has achieved
track-highest-killstreak: true
# Death tracking settings
death-tracking:
# Enable or disable death tracking completely
enabled: true
# What types of deaths to count
count-pvp-deaths: true # Killed by another player
count-pve-deaths: true # Killed by mobs/animals
count-environmental-deaths: true # Fall damage, fire, lava, etc.
count-void-deaths: true # Falling into the void
count-suicide-deaths: true # Self-inflicted deaths (e.g. /kill)
# World restrictions (empty list = all worlds)
enabled-worlds: []
excluded-worlds: []
# Minimum playtime required before deaths start counting
minimum-playtime-minutes: 0
# ============================================================
# ANTI-KILL ABUSE SETTINGS (TIME-WINDOW MODE)
# ============================================================
anti-kill-abuse:
# Enable or disable anti-kill abuse protection
enabled: true
# Maximum kills allowed within the time window against the same player
# Example: 2 means if 2 kills happen within time-window-seconds, cooldown activates
max-kills-per-victim: 2
# Time window in seconds to check for kills
# Example: 30 means if 2 kills happen within 30 seconds, cooldown activates
time-window-seconds: 30
# How long the cooldown lasts in seconds after abuse is detected
# Example: 60 means after abuse detected, player cannot kill victim for 60 seconds
cooldown-seconds: 60
# Should death be counted when a kill is blocked?
# true = victim gets death, false = victim does NOT get death
count-death-on-abuse: true
# Should the killer receive a message when a kill is blocked?
notify-killer: true
# Should the victim receive a message when a kill is blocked?
notify-victim: true
# Players with this permission will bypass the check
bypass-permission: "ndplayerstats.antiabuse.bypass"
# World restrictions (empty list = all worlds)
enabled-worlds: []
excluded-worlds: []
# ============================================================
# GUI SETTINGS
# ============================================================
gui:
# Title of the statistics GUI
title: '&9{player}''s Statistics'
# GUI size (must be multiple of 9, between 9 and 54)
size: 27
# Items displayed in the GUI
items:
# Kills item
kills:
material: DIAMOND_SWORD
slot: 11
name: '&aKills'
lore:
- '&7Total kills: &f{kills}'
- '&7PvP kills: &f{pvp_kills}'
- '&7PvE kills: &f{pve_kills}'
- '&7Rank: &f{rank}'
# Deaths item
deaths:
material: SKELETON_SKULL
slot: 13
name: '&6Deaths'
lore:
- '&7Total deaths: &f{deaths}'
- '&7PvP deaths: &f{pvp_deaths}'
- '&7PvE deaths: &f{pve_deaths}'
- '&7K/D Ratio: &f{kd}'
# Killstreak item
killstreak:
material: TOTEM_OF_UNDYING
slot: 15
name: '&2Killstreak'
lore:
- '&7Current: &f{killstreak}'
- '&7Highest: &f{highest_killstreak}'
# Player info item (head)
info:
material: PLAYER_HEAD
slot: 4
name: '&e{player}'
lore:
- '&7Click to refresh'
- ''
- '&7Play Time: &f{playtime}'
# ============================================================
# PLACEHOLDERAPI SETTINGS
# ============================================================
placeholderapi:
# Enable or disable PlaceholderAPI support
enabled: true
# Notify OPs when PlaceholderAPI is enabled/disabled
notify-ops: true
# ============================================================
# PERFORMANCE SETTINGS
# ============================================================
performance:
# Cache statistics for better performance
cache-stats: true
# How long to keep cached data in seconds
cache-ttl: 300
# How often to auto-save statistics to disk in seconds
save-interval: 300
# Use asynchronous operations to avoid lag
async-operations: true
# ============================================================
# NOTES
# ============================================================
# š“ SERVER RESTART REQUIRED FOR:
# - Changing database type (YAML/MySQL/SQLite)
# - Changing database connection settings
#
# ā
Can be reloaded with /ndps reload:
# - All other settings including death tracking, ranks,
# leaderboard, GUI, performance, anti-kill-abuse
# - All text messages in messages.yml
messages.yml
# ============================================================
# NDPlayerStats Messages
# All messages can be customized. Use & for color codes.
# Placeholders: {prefix}, {player}, {count}, etc.
# ============================================================
# ============================================================
# PREFIX
# ============================================================
# This prefix is used in all messages that contain {prefix}
prefix: '&8[&6NDStats&8] &r'
# ============================================================
# COMMAND MESSAGES
# ============================================================
# Message shown when a player doesn't have permission
no-permission: '{prefix}&cYou don''t have permission to use this command!'
# Message shown when a command is used by console but requires a player
player-only: '{prefix}&cThis command can only be used by players!'
# Message shown when a player is not found
player-not-found: '{prefix}&cPlayer &e{player} &cnot found!'
# Message shown when a command is used incorrectly
usage: '{prefix}&cUsage: &7{usage}'
# ============================================================
# STATS MESSAGES
# ============================================================
# Message when a player's stats are reset
stats-reset: '{prefix}&aStatistics for &e{player} &ahave been reset!'
# Notification sent to the player when their stats are reset
stats-reset-notify: '&cYour statistics have been reset by an administrator.'
# Broadcast message when all stats are reset
stats-all-reset: '&cAll player statistics have been reset by an administrator.'
# Success message when all stats are reset
stats-all-reset-success: '&aSuccessfully reset statistics for &e{count} &aplayers!'
# Error message when resetting all stats fails
stats-all-reset-error: '&cFailed to reset all statistics: {error}'
# Warning message before resetting all stats
stats-all-reset-warning: '&c&lWARNING: This will reset ALL player statistics!'
# Second warning line
stats-all-reset-warning2: '&cThis action cannot be undone!'
# Confirmation prompt for resetting all stats
stats-all-reset-confirm: '&eType &6/resetstatsall confirm &eto reset all stats'
# Message when resetting all stats using SQL
stats-all-reset-sql: '&eResetting all statistics using SQL...'
# ============================================================
# STATS COMMAND (/stats)
# ============================================================
# Title when viewing your own stats
stats-your-title: '&6&lYour Statistics'
# Title when viewing another player's stats
stats-other-title: '&6&l{player}''s Statistics'
# Separator line
stats-separator: '&7āāāāāāāāāāāāāāāāāāāāāāāāāā'
# Individual stat lines
stats-kills: '&7Kills: &e{kills}'
stats-deaths: '&7Deaths: &e{deaths}'
stats-kd: '&7K/D Ratio: &e{kd}'
stats-killstreak: '&7Killstreak: &e{killstreak}'
stats-rank: '&7Rank: &e{rank}'
stats-playtime: '&7Play Time: &e{playtime}'
# Text for players without a rank
stats-unranked: Unranked (no stats)
# ============================================================
# LEADERBOARD MESSAGES (/leaderboard)
# ============================================================
leaderboard:
# Title of the leaderboard (Kills)
title: '&8&m &r &6&lTop {size} Players (Kills) - Page {page}/{total} &r
&8&m '
# Title of the leaderboard (K/D)
title-kd: '&8&m &r &6&lTop {size} Players (K/D) - Page {page}/{total} &r
&8&m '
# Format for each leaderboard entry
line-format: '&7{rank}. {color}{player} &8- &a{kills} kills'
# Message when leaderboard is disabled
disabled: '{prefix}&cThe leaderboard is currently disabled!'
# Message when no players have stats
no-players: '&7No players with statistics yet!'
# Message showing how many players are displayed
showing-top: '&7Showing top {limit} of {total} players'
# Hint for pagination
page-hint: '&7Use /leaderboard <page> for more'
# ============================================================
# GUI MESSAGES (/statsgui)
# ============================================================
gui:
# Message when opening GUI for another player
opening: '{prefix}&aOpening statistics for &e{player}...'
# Message when refreshing the GUI
refreshed: '&aStatistics refreshed!'
# Message when a player is offline
player-offline: '&cPlayer {player} is not online. Use /stats instead.'
# ============================================================
# ANTI-KILL ABUSE MESSAGES
# ============================================================
anti-kill-abuse:
# Message shown to killer when kill is blocked
# {victim} = name of the victim
killer-message: '{prefix}&cYou have killed {victim} too many times! Kill not counted.'
# Message shown to victim when kill is blocked
# {killer} = name of the killer
# {death} = "counted" or "not counted" (based on count-death-on-abuse config)
victim-message-death-counted: '{prefix}&aKill blocked! You were killed too many
times by {killer}. Death counted.'
victim-message-death-not-counted: '{prefix}&aKill and death blocked! You were killed
too many times by {killer}.'
# ============================================================
# ADMIN COMMAND MESSAGES (/ndps)
# ============================================================
admin:
# Success message after reload
reloaded: '{prefix}&aConfiguration reloaded!'
# Error message during reload
reload-error: '&cError during reload: {error}'
# Help menu
help-header: '&6=== NDPlayerStats Admin ==='
help-reload: '&e/ndps reload &7- Reload config'
help-lookup: '&e/ndps lookup <player> &7- Lookup player stats'
help-info: '&e/ndps info &7- Show plugin info'
help-help: '&e/ndps help &7- Show this help'
help-update: '&e/ndps update &7- Check for updates'
help-note: '&cNote: Database type changes require server restart!'
update-checking: '&eChecking for updates...'
update-failed: '&cFailed to check for updates. Check console for details.'
# Info command
info-header: '&6=== NDPlayerStats Info ==='
info-version: '&eVersion: &f{version}'
info-author: '&eAuthor: &f{author}'
info-database: '&eDatabase: &f{database}'
info-ranks: '&eRanks: &f{ranks}'
info-papi: '&ePlaceholderAPI: &f{papi}'
# Lookup command
lookup-header: '&6=== {player}''s Stats ==='
lookup-uuid: '&eUUID: &f{uuid}'
lookup-kills: '&eKills: &f{kills}'
lookup-deaths: '&eDeaths: &f{deaths}'
lookup-kd: '&eK/D: &f{kd}'
lookup-killstreak: '&eKillstreak: &f{killstreak}'
lookup-playtime: '&ePlay Time: &f{playtime}'
lookup-rank: '&eRank: &f{rank}'
# Unknown command
unknown-command: '&cUnknown command. Use /ndps help'
# Database change warnings
db-change-warning: '&cDatabase type changed from {old} to {new}!'
db-change-restart: '&cDatabase type changes require server restart!'
db-change-using: '&eUsing {current} until server restart.'
# ============================================================
# PLACEHOLDERAPI MESSAGES
# ============================================================
# Message when PlaceholderAPI support is enabled
papi-enabled: '&a[NDStats] PlaceholderAPI support enabled!'
# Example placeholder usage
papi-example: '&7Use %ndplayerstats_kills%, %ndplayerstats_pvp_kills%, %ndplayerstats_pve_kills%'
# ============================================================
# DATABASE CONNECTION ERROR MESSAGES
# ============================================================
# Message when database connection fails
db-failed: '&c[NDStats] Failed to connect to database!'
# Message to check console for details
db-check-console: '&cCheck console for details.'
# Message showing the configured database type
db-config-type: '&eConfig database type: {type}'
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:1ixlThbk:nEkubzLu"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:1ixlThbk:nEkubzLu"
}

