ModsJava
ExploitShield
ExploitShield Anti-Grief & Exploit/Crash Protection! ExploitShield [ FREE ] – Advanced Exploit & Crash Protection Protect your Minecraft server from…
⬇ Download on SpigotExploitShield Anti-Grief & Exploit/Crash Protection!
ExploitShield [FREE] – Advanced Exploit & Crash Protection
Protect your Minecraft server from duplication glitches, crash exploits, and malicious packets — fully automatic.
Requires ProtocolLib 5.4.0+, Java 17+, and PacketEvents 2.13.0+.
ExploitShield has reached a mature and stable stage of development. The current feature set is considered complete, and ongoing updates will focus on security improvements, performance optimizations, compatibility with new Minecraft versions, and critical bug fixes. As new duplication methods, crash exploits, or security vulnerabilities are discovered, ExploitShield will continue to receive updates to provide protection against them.
ExploitShield is a high-performance anti-exploit plugin designed to stop common and advanced exploits.
This plugin is built as a high-end anti-duplication engine, not a basic fix.
ExploitShield is designed to mitigate a wide range of known duplication exploits through behavioral analysis, packet validation, rate limiting, and server-side consistency checks.
While no anti-exploit solution can guarantee complete protection against every emerging exploit, ExploitShield focuses on reducing exploitability while maintaining gameplay stability and low false positives.
Key Features
✅ Duplication Protection
✅ Behavioral & Packet Analysis (Hamster Engine)
✅ TabComplete Protection
Our goal is to block exploits and suspicious packets in order to prevent server crashes and malicious abuse.
Because of this, in some cases legitimate players may experience minor inconvenience due to the strict protection system.
Critical packets are now inspected before Bukkit-level processing, preventing malformed or malicious data from reaching internal server handlers.
In the latest version, ExploitShield introduces enhanced protection mechanisms for newly discovered exploits and duplication methods. By leveraging ProtocolLib and PacketEvents, the plugin now actively monitors and neutralizes suspicious actions at the packet level, ensuring robust defense against emerging threats without affecting normal gameplay.
Previously, certain NBT payloads were processed internally by the server before plugins could intercept them, making some crashes and exploits unavoidable. In this update, ExploitShield can intercept and analyze NBT data at the source, before it is processed by the server, thanks to ProtocolLib and PacketEvents integration. This ensures maximum protection against malicious items, payloads, and NBT-based crashes.
Tested under real-world multiplayer environments with packet-heavy activity, automation systems, and exploit simulation scenarios.
Why ExploitShield?
✔ Free
✔ Research-driven protection architecture
✔ Packet-level exploit mitigation
✔ Stability-focused design philosophy
✔ Continuous security improvements
✔ Real exploit research
✔ Actively maintained
✔ Designed with professional anti-cheat architecture principles
✔ Concurrent use of ProtocolLib and PacketEvents
✔ ExploitShield is designed to mitigate a wide range of known duplication exploits using behavioral analysis, packet validation, rate limiting, and server-side consistency checks.
✔ Designed for survival redstone-heavy servers
✔ No interference with legitimate farms
✔ Tested with 30+ redstone machines
Extensive Testing & Stability
ExploitShield has been extensively tested across Minecraft versions 1.17 through 1.21, including real-world scenarios involving malicious clients, exploit tools, and attack simulations.
All tests were conducted in Strict mode using ProtocolLib and PacketEvents API, ensuring that the plugin handles packet-level exploits and advanced abuse cases reliably.
During these tests, the plugin demonstrated high detection accuracy and stability, successfully blocking abusive behavior without causing false positives for legitimate players.
All protections are designed with strict validation, rate-based analysis, and safe thresholds, ensuring strong security while preserving normal gameplay.
Tested Against Modern Cheat Clients
ExploitShield has been stress-tested in real-world multiplayer environments against some of the most widely used modified Minecraft clients.
During controlled testing scenarios, the plugin successfully prevented crash attempts, exploit packets, and malicious payload behaviors without server instability or critical false positives.
✔ Meteor Client
✔ Xynis Client
✔ FDP Client
✔ BetterCraft
✔ SmogProf Client
No successful crash, packet-based exploit, or instability was observed under Strict Mode configurations.
⚠ Note: Results may vary depending on server configuration, enabled modules, and strictness settings.
https://www.youtube.com/watch?v=4sPViKDsYtc
Works on Folia, Spigot, and Paper servers. ✅
INSTALLATION
1. Download and install ProtocolLib
2. Download and install PacketEvents
3. Place ExploitShield.jar into your plugins folder
4. Restart your server
5. Your server is now protected and ready to go.
bStats (Anonymous Usage Statistics)
ExploitShield uses bStats to collect anonymous usage statistics. This helps measure plugin adoption and prioritize future improvements.
The collected information may include:
bStats page:
https://bstats.org/plugin/bukkit/EZExploitFixer/28681
PERMISSIONS/COMMANDS
/exploitshield (Display Command List)
/exploitshield reload (Reload Config)
/exploitshield status (Display Plugin Status)
/exploitshield fixlist (Show Fix List)
/exploitshield debug (Debug)
/exploitshield gui (Display GUI)
/exploitshield profile <Player Name> (Display exploit profile)
exploitshield.use
exploitshield.reload
exploitshield.read.alert
exploitshield.alert.*
exploitshield.joininfo
DISCORD SUPPORT
https://discord.gg/xhV6FPfe92
WE NEED YOU
We need your support to be able to provide bigger updates and grow with your support, so please leave a comment if you see a bug or like the plugin
How does it work against packets?
Download Now To Protect Your Server !
ExploitShield [FREE] – Advanced Exploit & Crash Protection
Protect your Minecraft server from duplication glitches, crash exploits, and malicious packets — fully automatic.
Requires ProtocolLib 5.4.0+, Java 17+, and PacketEvents 2.13.0+.
ExploitShield has reached a mature and stable stage of development. The current feature set is considered complete, and ongoing updates will focus on security improvements, performance optimizations, compatibility with new Minecraft versions, and critical bug fixes. As new duplication methods, crash exploits, or security vulnerabilities are discovered, ExploitShield will continue to receive updates to provide protection against them.
ExploitShield is a high-performance anti-exploit plugin designed to stop common and advanced exploits.
This plugin is built as a high-end anti-duplication engine, not a basic fix.
ExploitShield is designed to mitigate a wide range of known duplication exploits through behavioral analysis, packet validation, rate limiting, and server-side consistency checks.
While no anti-exploit solution can guarantee complete protection against every emerging exploit, ExploitShield focuses on reducing exploitability while maintaining gameplay stability and low false positives.
Key Features
✅ Duplication Protection
- Offline Dupe
- Dupe Chain Tracking
- Item Signature Tracking
- Creative Inventory Dupe
- General Inventory Dupe
- Minecart Dupe
- Chunk Burst Detection
- Piston Extend / Retract
- Piston Rate Limiting
- Piston Chain Abuse Detection
- Sticky Piston + TNT Dupe
- Slime Block Dupe
- Hopper + Container Dupe
- Automatic Exploit Neutralization (Eviscerate)
- Async Logging + Cleanup
- Item salvage exploits
- Chunk Teleport Duplication
- Boat & ArmorStand Duplication
- Block Update Duplication
- Container / Furnace / Brewing Stand Duplication
- Vehicle Duplication (Boat / Minecart)
- Llama Duplication
- Donkey Duplication
- Horse Duplication
- Mule Duplication
- Multi-Player Simultaneous Duplication Detection
- Malformed packet filtering
- Sign & book crash prevention
- Oversized / invalid item & NBT data protection
- Creative inventory abuse detection
- Advanced Chat, Rename & Payload Validation
- Tab Exception
- Ender Pearl glitch prevention
- Nether roof & glide exploit fixes
- Suspicious movement tracking (configurable)
- Block Placement Pace limiter
- Lava placement per chunk limiter
- Entity Spam limits (per chunk & per player/sec)
- Ghost item detection
- No-swing attack prevention
- Multi-hit attack prevention
- Real-time exploit notifications
- Color-coded severity levels
- Fully configurable events
- Monitor your server even while offline
- Async-Safe Packet Architecture & Performance Optimized
Core systems are designed with asynchronous-safe processing and optimized packet pipelines, reducing main-thread pressure and ensuring stable TPS even under high player load and packet-heavy environments.
- Ban IP / Ban
- Kick
- Cancel
- Configurable thresholds & VL system
- /exploitshield → Show command list
- /exploitshield reload → Reload configuration
- /exploitshield status → Display plugin status
- /exploitshield fixlist → Show detected exploit fixes
- /exploitshield debug → Debug mode
- /exploitshield gui → Open GUI panel
- /exploitshield profile <player> → View player exploit profile
- Player Join Info → Sends player name, client brand & version to exploitshield.joininfo holders
- Granular enable/disable options
- Clean and readable config.yml
- Configurable Safe defaults (plug & play)
✅ Behavioral & Packet Analysis (Hamster Engine)
- Real-time behavioral monitoring for suspicious player actions
- Detects bot-like consistency & unnatural action frequency
- Tracks Violation Levels (VL) with automatic decay for normal behavior
- Alerts server staff on threshold violations (configurable)
- Custom Netty handler injected per player to prevent packet flooding
- Detects and blocks burst packets & abnormal rates
- Automatic connection closure on extreme violations
- Safe cleanup on player quit to prevent memory leaks
- Monitors critical client packets: USE_ENTITY, CLICK_WINDOW, FLYING
- Behavioral analysis without directly cancelling packets
- Cancels packets only when critical thresholds are exceeded
- Retrieves player channels reliably across server versions
- Pipeline manipulation without crashes or version conflicts
- Advanced packet validation system
- Chat message overflow protection
- Illegal character detection
- Book exploit prevention (page count, page size, total size)
- Creative inventory exploit checks
- ClickWindow carried-item validation
- Display-name & lore overflow protection
- PersistentDataContainer abuse detection
- Invalid item amount detection
- Malformed packet handling & automatic cancellation
- Violation tracking & adaptive punishment system
- PacketRateLimiter upgraded with SmartCounter for dynamic limits
- Limits now scale based on player ping to reduce false positives
- New packet types monitored: FLYING, LOOK, BLOCK_PLACE, BLOCK_DIG
- Burst detection added for short spikes
- Automatic cleanup for stale counters to prevent memory leaks
- UTF-8 overflow detection
- PDC abuse detection
- enchants / attributes / flags protection
- lore / name / book validation
- serialized metadata analysis
✅ TabComplete Protection
- Tab spam cooldown system
- TabComplete crash protection (oversized packets)
- Control character filtering
- Unicode spam detection
- Malformed TabComplete structure validation
- Packet-level TabComplete inspection via PacketEvents
- BadPackets A -> N
- Payload size limits
- Empty payload validation
- Plugin channel validation
- Plugin channel format validation
- Invalid channel character detection
- Strict UTF-8 validation for REGISTER / UNREGISTER packets
- REGISTER / UNREGISTER packet validation
- REGISTER channel total length validation
- Brand payload protection
- BungeeCord payload protection
- Blocks invalid player coordinates
- Detects and blocks NaN values
- Detects and blocks Infinite values
- Prevents extreme coordinate overflow crashes
- Detects invalid yaw/pitch values
- Blocks NaN and Infinite rotations
- Prevents abnormal rotation values from reaching the server
- Detects illegal Creative Inventory packets
- Automatically kicks players attempting to send Creative packets while not in Creative mode
- Validates PICK_ITEM slot values
- Blocks invalid slot packets
- Automatically removes malicious clients sending illegal slot IDs
- Validates CLIENT_SETTINGS view distance values
- Prevents invalid view distance packets
Our goal is to block exploits and suspicious packets in order to prevent server crashes and malicious abuse.
Because of this, in some cases legitimate players may experience minor inconvenience due to the strict protection system.
Critical packets are now inspected before Bukkit-level processing, preventing malformed or malicious data from reaching internal server handlers.
In the latest version, ExploitShield introduces enhanced protection mechanisms for newly discovered exploits and duplication methods. By leveraging ProtocolLib and PacketEvents, the plugin now actively monitors and neutralizes suspicious actions at the packet level, ensuring robust defense against emerging threats without affecting normal gameplay.
Previously, certain NBT payloads were processed internally by the server before plugins could intercept them, making some crashes and exploits unavoidable. In this update, ExploitShield can intercept and analyze NBT data at the source, before it is processed by the server, thanks to ProtocolLib and PacketEvents integration. This ensures maximum protection against malicious items, payloads, and NBT-based crashes.
Tested under real-world multiplayer environments with packet-heavy activity, automation systems, and exploit simulation scenarios.
Why ExploitShield?
✔ Free
✔ Research-driven protection architecture
✔ Packet-level exploit mitigation
✔ Stability-focused design philosophy
✔ Continuous security improvements
✔ Real exploit research
✔ Actively maintained
✔ Designed with professional anti-cheat architecture principles
✔ Concurrent use of ProtocolLib and PacketEvents
✔ ExploitShield is designed to mitigate a wide range of known duplication exploits using behavioral analysis, packet validation, rate limiting, and server-side consistency checks.
✔ Designed for survival redstone-heavy servers
✔ No interference with legitimate farms
✔ Tested with 30+ redstone machines
Extensive Testing & Stability
ExploitShield has been extensively tested across Minecraft versions 1.17 through 1.21, including real-world scenarios involving malicious clients, exploit tools, and attack simulations.
All tests were conducted in Strict mode using ProtocolLib and PacketEvents API, ensuring that the plugin handles packet-level exploits and advanced abuse cases reliably.
During these tests, the plugin demonstrated high detection accuracy and stability, successfully blocking abusive behavior without causing false positives for legitimate players.
All protections are designed with strict validation, rate-based analysis, and safe thresholds, ensuring strong security while preserving normal gameplay.
Tested Against Modern Cheat Clients
ExploitShield has been stress-tested in real-world multiplayer environments against some of the most widely used modified Minecraft clients.
During controlled testing scenarios, the plugin successfully prevented crash attempts, exploit packets, and malicious payload behaviors without server instability or critical false positives.
✔ Meteor Client
✔ Xynis Client
✔ FDP Client
✔ BetterCraft
✔ SmogProf Client
No successful crash, packet-based exploit, or instability was observed under Strict Mode configurations.
⚠ Note: Results may vary depending on server configuration, enabled modules, and strictness settings.
https://www.youtube.com/watch?v=4sPViKDsYtc
Works on Folia, Spigot, and Paper servers. ✅
Spoiler: ️ Anti-Exploit Protection Preview
INSTALLATION
1. Download and install ProtocolLib
2. Download and install PacketEvents
3. Place ExploitShield.jar into your plugins folder
4. Restart your server
5. Your server is now protected and ready to go.
bStats (Anonymous Usage Statistics)
ExploitShield uses bStats to collect anonymous usage statistics. This helps measure plugin adoption and prioritize future improvements.
The collected information may include:
- Minecraft server version
- Java version
- Operating system
- Plugin version
- Number of online players
- Number of servers using the plugin
- Server IP address
- Player usernames
- Player chat or personal data
- World data or server files
- Configuration contents
- Any sensitive information
bStats page:
https://bstats.org/plugin/bukkit/EZExploitFixer/28681
PERMISSIONS/COMMANDS
/exploitshield (Display Command List)
/exploitshield reload (Reload Config)
/exploitshield status (Display Plugin Status)
/exploitshield fixlist (Show Fix List)
/exploitshield debug (Debug)
/exploitshield gui (Display GUI)
/exploitshield profile <Player Name> (Display exploit profile)
exploitshield.use
exploitshield.reload
exploitshield.read.alert
exploitshield.alert.*
exploitshield.joininfo
DISCORD SUPPORT
https://discord.gg/xhV6FPfe92
WE NEED YOU
We need your support to be able to provide bigger updates and grow with your support, so please leave a comment if you see a bug or like the plugin
How does it work against packets?
Download Now To Protect Your Server !
Spoiler: Main Class
package its.rango.exploitshield ;
import com.github.retrooper.packetevents.PacketEvents ;
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder ;
import its.rango.exploitshield.alert.AlertManager ;
import its.rango.exploitshield.alert.AlertToggleManager ;
import its.rango.exploitshield.alert.Violation ;
import its.rango.exploitshield.commands.Commands ;
import its.rango.exploitshield.commands.ESCommand ;
import its.rango.exploitshield.gui.GUIManager ;
import its.rango.exploitshield.listeners.* ;
import its.rango.exploitshield.listeners.dupes.ContainerEntityChunkDuplicationListener ;
import its.rango.exploitshield.listeners.dupes.InventoryTracker ;
import its.rango.exploitshield.listeners.dupes.PlayerDuplicationListener ;
import its.rango.exploitshield.metrics.MetricsLoader ;
import its.rango.exploitshield.metrics.MetricsManager ;
import its.rango.exploitshield.netty.NettyCleanupListener ;
import its.rango.exploitshield.netty.NettyInjectListener ;
import its.rango.exploitshield.packet.* ;
import its.rango.exploitshield.packet.badpackets.* ;
import its.rango.exploitshield.packet.hamster.HamsterEngine ;
import its.rango.exploitshield.packet.hamster.HamsterPacketListener ;
import its.rango.exploitshield.packet.hamster.HamsterValidationListener ;
import its.rango.exploitshield.packet.InvalidRotationCrash ;
import its.rango.exploitshield.profile.PlayerProfileManager ;
import its.rango.exploitshield.profile.ProfileStorage ;
import its.rango.exploitshield.utils.* ;
import org.bukkit.Bukkit ;
import org.bukkit.ChatColor ;
import org.bukkit.command.PluginCommand ;
import org.bukkit.entity.Player ;
import org.bukkit.event.HandlerList ;
import org.bukkit.plugin.java.JavaPlugin ;
import java.io.File ;
import java.io.FileWriter ;
import java.io.IOException ;
import java.util.Date ;
public class ExploitShield extends JavaPlugin {
private static ExploitShield instance ;
private UpdateChecker updateChecker ;
private BookCrashListener bookListener ;
private Violation violationManager ;
private boolean protocolLibAvailable ;
private boolean packetEventsAvailable ;
@Override
public void onLoad ( ) {
printLoadBanner ( ) ;
protocolLibAvailable =
Bukkit. getPluginManager ( ). getPlugin ( "ProtocolLib" ) != null ;
packetEventsAvailable =
Bukkit. getPluginManager ( ). getPlugin ( "packetevents" ) != null ;
getLogger ( ). info ( "ProtocolLib: " + protocolLibAvailable ) ;
getLogger ( ). info ( "PacketEvents: " + packetEventsAvailable ) ;
}
private PlayerDuplicationListener dupeListener ;
@Override
public void onEnable ( ) {
printStartupBanner ( "Starting up" ) ;
long before = System. currentTimeMillis ( ) ;
if ( !protocolLibAvailable ) {
getLogger ( ). severe ( "ProtocolLib is required but not found!" ) ;
getLogger ( ). severe ( "Disabling ExploitShield..." ) ;
getServer ( ). getPluginManager ( ). disablePlugin ( this ) ;
return ;
}
if ( !packetEventsAvailable ) {
getLogger ( ). severe ( "PacketEvents is required but not found!" ) ;
getLogger ( ). severe ( "Disabling ExploitShield..." ) ;
getServer ( ). getPluginManager ( ). disablePlugin ( this ) ;
return ;
}
instance = this ;
initViolationManager ( ) ;
handleLanguageConfig ( ) ;
reloadConfig ( ) ;
ReloadUtil. reloadConfig ( this ) ;
ProfileStorage. init ( ) ;
initProtocolLib ( ) ;
initPacketEvents ( ) ;
initCrashSystem ( ) ;
initListeners ( ) ;
registerBadPacketListeners ( ) ;
initCommands ( ) ;
preloadOnlineProfiles ( ) ;
initUpdateChecker ( ) ;
initMetrics ( ) ;
dupeListener = new PlayerDuplicationListener ( this ) ;
getServer ( ). getPluginManager ( ). registerEvents (dupeListener, this ) ;
dupeListener. startCleanupTask ( ) ;
printEnabledBanner ( ) ;
long time = System. currentTimeMillis ( ) - before ;
logConsole ( "Plugin enabled in " + time + "ms" ) ;
}
@Override
public void onDisable ( ) {
PacketEvents. getAPI ( ). terminate ( ) ;
PlayerProfileManager. shutdown ( ) ;
HamsterEngine. clearAll ( ) ;
if (dupeListener != null ) {
dupeListener. stopCleanupTask ( ) ;
HandlerList. unregisterAll (dupeListener ) ;
}
printShutdownBanner ( ) ;
}
private void initViolationManager ( ) {
this. violationManager = Violation. getInstance ( this ) ;
this. violationManager. loadConfig ( ) ;
}
private void initPacketEvents ( ) {
if ( !packetEventsAvailable ) {
getLogger ( ). warning ( "PacketEvents not installed - skipping packet features" ) ;
return ;
}
try {
PacketEvents. setAPI (SpigotPacketEventsBuilder. build ( this ) ) ;
PacketEvents. getAPI ( ). load ( ) ;
PacketEvents. getAPI ( ). init ( ) ;
getLogger ( ). info ( "PacketEvents enabled" ) ;
} catch ( Exception e ) {
getLogger ( ). severe ( "PacketEvents failed: " + e. getMessage ( ) ) ;
}
}
private void initCrashSystem ( ) {
if ( !packetEventsAvailable ) {
getLogger ( ). warning ( "Crash system disabled (PacketEvents not ready)" ) ;
return ;
}
CrashPacket. init ( ) ;
Bukkit. getPluginManager ( ). registerEvents ( new CrashPacket ( ), this ) ;
TabCompleteGuard. init ( ) ;
//manager.registerListener(new AALog());
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new ClickWindowListener ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new ViewDistance ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new PickItemListener ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new Creative ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new InvalidPositionCrash ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new InvalidRotationCrash ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new PayloadProtector ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new JoinPacketListener ( ) ) ;
// Hamster Engine Listeners
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new HamsterPacketListener ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new HamsterValidationListener ( ) ) ;
}
private void initCommands ( ) {
PluginCommand main = getCommand ( "exploitshield" ) ;
if (main != null ) {
Commands executor = new Commands ( ) ;
main. setExecutor (executor ) ;
main. setTabCompleter (executor ) ;
}
PluginCommand es = getCommand ( "es" ) ;
if (es != null ) {
ESCommand executor = new ESCommand ( ) ;
es. setExecutor (executor ) ;
es. setTabCompleter (executor ) ;
}
}
private void initListeners ( ) {
bookListener = new BookCrashListener ( ) ;
Bukkit. getPluginManager ( ). registerEvents (bookListener, this ) ;
registerOtherListeners ( ) ;
}
private void initProtocolLib ( ) {
if ( !protocolLibAvailable ) return ;
try {
PacketManager. init ( ) ;
StrictNBTInterceptor. init ( ) ;
getLogger ( ). info ( "ProtocolLib enabled" ) ;
logConsole ( "ProtocolLib packet protection ENABLED" ) ;
logConsole ( "ProtocolLib Protection ENABLED" ) ;
logConsole ( "Strict NBT Interceptor ENABLED" ) ;
} catch ( Exception e ) {
getLogger ( ). warning ( "ProtocolLib init failed: " + e. getMessage ( ) ) ;
}
}
private void initUpdateChecker ( ) {
updateChecker = new UpdateChecker ( this ) ;
updateChecker. check ( ) ;
Bukkit. getPluginManager ( ). registerEvents (
new UpdateJoinListener ( this, updateChecker ),
this
) ;
}
private void initMetrics ( ) {
MetricsLoader. init ( this ) ;
MetricsManager. loadFromConfig ( ) ;
}
private void preloadOnlineProfiles ( ) {
for (Player p : Bukkit. getOnlinePlayers ( ) ) {
PlayerProfileManager. getProfile (p. getUniqueId ( ) ) ;
}
}
private void registerBadPacketListeners ( ) {
var manager = PacketEvents. getAPI ( ). getEventManager ( ) ;
manager. registerListener ( new BadPacketA ( ) ) ;
manager. registerListener ( new BadPacketB ( ) ) ;
manager. registerListener ( new BadPacketC ( ) ) ;
manager. registerListener ( new BadPacketD ( ) ) ;
manager. registerListener ( new BadPacketE ( ) ) ;
manager. registerListener ( new BadPacketF ( ) ) ;
manager. registerListener ( new BadPacketG ( ) ) ;
manager. registerListener ( new BadPacketH ( ) ) ;
manager. registerListener ( new BadPacketI ( ) ) ;
BadPacketJ badPacketJ = new BadPacketJ ( ) ;
manager. registerListener (badPacketJ ) ;
Bukkit. getPluginManager ( ). registerEvents (badPacketJ, this ) ;
manager. registerListener ( new BadPacketK ( ) ) ;
manager. registerListener ( new BadPacketL ( ) ) ;
manager. registerListener ( new BadPacketM ( ) ) ;
manager. registerListener ( new BadPacketN ( ) ) ;
}
private void registerOtherListeners ( ) {
Bukkit. getPluginManager ( ). registerEvents ( new PistonDuplicationListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new InventoryMoveListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ExplosionListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new EnderPearlListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ItemSalvageListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new SignCrashListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new PacketRateLimiter ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new GriefLavaListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new PlayerPaceListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new EntitySpamListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new GUIManager ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ClientIntegrity ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new CommandCrashListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new NettyInjectListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new NettyCleanupListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ContainerEntityChunkDuplicationListener ( this ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new PlayerJoinProfileListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ItemNBTListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ClickWindowListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new InventoryTracker ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new AlertManager ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new AlertToggleManager ( ), this ) ;
}
private void handleLanguageConfig ( ) {
getDataFolder ( ). mkdirs ( ) ;
File configFile = new File (getDataFolder ( ), "config.yml" ) ;
if ( !configFile. exists ( ) ) {
String lang = getConfig ( ). getString ( "language", "en" ). toLowerCase ( ) ;
String resource = lang. equals ( "fa" )
? "config_fa.yml"
: "config_en.yml" ;
FileUtil. copyResourceToDataFolder ( this, resource, "config.yml" ) ;
}
reloadConfig ( ) ;
ConfigUtil. reload ( this ) ;
}
private void printLoadBanner ( ) {
logBanner ( "Loading...", ChatColor. DARK_GREEN ) ;
}
private void printStartupBanner ( String state ) {
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. GOLD + "[ExploitShield] " + ChatColor. DARK_GREEN + state ) ;
}
private void printEnabledBanner ( ) {
logBanner ( "Enabled!", ChatColor. GREEN ) ;
}
private void printShutdownBanner ( ) {
logBanner ( "Disabled! ", ChatColor. DARK_RED ) ;
}
private void logBanner ( String status, ChatColor statusColor ) {
getServer ( ). getConsoleSender ( ). sendMessage ( "" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=======================================" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " ExploitShield " + statusColor + " " + status + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " Version: " + ChatColor. RED + getDescription ( ). getVersion ( ) + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " Depend: " + ChatColor. RED + getDescription ( ). getDepend ( ) + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " Lead Dev: " + ChatColor. RED + "Its_Rango " + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " Co Devs: " + ChatColor. RED + "S_S_God, Smilelectern_YT" + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=======================================" ) ;
getServer ( ). getConsoleSender ( ). sendMessage ( "" ) ;
}
private void logConsole ( String msg ) {
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. GOLD + "[ExploitShield] " + ChatColor. GREEN + msg ) ;
}
public static ExploitShield getInstance ( ) {
return instance ;
}
public Violation getViolationManager ( ) {
return violationManager ;
}
public String color ( String str ) {
return ChatColor. translateAlternateColorCodes ( '&', str ) ;
}
private void logError ( String title, Throwable t ) {
File logDir = new File (getDataFolder ( ), "logs" ) ;
if ( !logDir. exists ( ) ) logDir. mkdirs ( ) ;
File logFile = new File (logDir, "error.log" ) ;
try ( FileWriter writer = new FileWriter (logFile, true ) ) {
writer. write ( "[" + new Date ( ) + "] " + title + "\n" ) ;
writer. write (t. toString ( ) + "\n" ) ;
for (StackTraceElement element : t. getStackTrace ( ) ) {
writer. write ( " at " + element + "\n" ) ;
}
writer. write ( "\n" ) ;
} catch ( IOException e ) {
getLogger ( ). severe ( "Error writing to error log: " + e. getMessage ( ) ) ;
}
}
}
Code (Java):
package its.rango.exploitshield ;
import com.github.retrooper.packetevents.PacketEvents ;
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder ;
import its.rango.exploitshield.alert.AlertManager ;
import its.rango.exploitshield.alert.AlertToggleManager ;
import its.rango.exploitshield.alert.Violation ;
import its.rango.exploitshield.commands.Commands ;
import its.rango.exploitshield.commands.ESCommand ;
import its.rango.exploitshield.gui.GUIManager ;
import its.rango.exploitshield.listeners.* ;
import its.rango.exploitshield.listeners.dupes.ContainerEntityChunkDuplicationListener ;
import its.rango.exploitshield.listeners.dupes.InventoryTracker ;
import its.rango.exploitshield.listeners.dupes.PlayerDuplicationListener ;
import its.rango.exploitshield.metrics.MetricsLoader ;
import its.rango.exploitshield.metrics.MetricsManager ;
import its.rango.exploitshield.netty.NettyCleanupListener ;
import its.rango.exploitshield.netty.NettyInjectListener ;
import its.rango.exploitshield.packet.* ;
import its.rango.exploitshield.packet.badpackets.* ;
import its.rango.exploitshield.packet.hamster.HamsterEngine ;
import its.rango.exploitshield.packet.hamster.HamsterPacketListener ;
import its.rango.exploitshield.packet.hamster.HamsterValidationListener ;
import its.rango.exploitshield.packet.InvalidRotationCrash ;
import its.rango.exploitshield.profile.PlayerProfileManager ;
import its.rango.exploitshield.profile.ProfileStorage ;
import its.rango.exploitshield.utils.* ;
import org.bukkit.Bukkit ;
import org.bukkit.ChatColor ;
import org.bukkit.command.PluginCommand ;
import org.bukkit.entity.Player ;
import org.bukkit.event.HandlerList ;
import org.bukkit.plugin.java.JavaPlugin ;
import java.io.File ;
import java.io.FileWriter ;
import java.io.IOException ;
import java.util.Date ;
public class ExploitShield extends JavaPlugin {
private static ExploitShield instance ;
private UpdateChecker updateChecker ;
private BookCrashListener bookListener ;
private Violation violationManager ;
private boolean protocolLibAvailable ;
private boolean packetEventsAvailable ;
@Override
public void onLoad ( ) {
printLoadBanner ( ) ;
protocolLibAvailable =
Bukkit. getPluginManager ( ). getPlugin ( "ProtocolLib" ) != null ;
packetEventsAvailable =
Bukkit. getPluginManager ( ). getPlugin ( "packetevents" ) != null ;
getLogger ( ). info ( "ProtocolLib: " + protocolLibAvailable ) ;
getLogger ( ). info ( "PacketEvents: " + packetEventsAvailable ) ;
}
private PlayerDuplicationListener dupeListener ;
@Override
public void onEnable ( ) {
printStartupBanner ( "Starting up" ) ;
long before = System. currentTimeMillis ( ) ;
if ( !protocolLibAvailable ) {
getLogger ( ). severe ( "ProtocolLib is required but not found!" ) ;
getLogger ( ). severe ( "Disabling ExploitShield..." ) ;
getServer ( ). getPluginManager ( ). disablePlugin ( this ) ;
return ;
}
if ( !packetEventsAvailable ) {
getLogger ( ). severe ( "PacketEvents is required but not found!" ) ;
getLogger ( ). severe ( "Disabling ExploitShield..." ) ;
getServer ( ). getPluginManager ( ). disablePlugin ( this ) ;
return ;
}
instance = this ;
initViolationManager ( ) ;
handleLanguageConfig ( ) ;
reloadConfig ( ) ;
ReloadUtil. reloadConfig ( this ) ;
ProfileStorage. init ( ) ;
initProtocolLib ( ) ;
initPacketEvents ( ) ;
initCrashSystem ( ) ;
initListeners ( ) ;
registerBadPacketListeners ( ) ;
initCommands ( ) ;
preloadOnlineProfiles ( ) ;
initUpdateChecker ( ) ;
initMetrics ( ) ;
dupeListener = new PlayerDuplicationListener ( this ) ;
getServer ( ). getPluginManager ( ). registerEvents (dupeListener, this ) ;
dupeListener. startCleanupTask ( ) ;
printEnabledBanner ( ) ;
long time = System. currentTimeMillis ( ) - before ;
logConsole ( "Plugin enabled in " + time + "ms" ) ;
}
@Override
public void onDisable ( ) {
PacketEvents. getAPI ( ). terminate ( ) ;
PlayerProfileManager. shutdown ( ) ;
HamsterEngine. clearAll ( ) ;
if (dupeListener != null ) {
dupeListener. stopCleanupTask ( ) ;
HandlerList. unregisterAll (dupeListener ) ;
}
printShutdownBanner ( ) ;
}
private void initViolationManager ( ) {
this. violationManager = Violation. getInstance ( this ) ;
this. violationManager. loadConfig ( ) ;
}
private void initPacketEvents ( ) {
if ( !packetEventsAvailable ) {
getLogger ( ). warning ( "PacketEvents not installed - skipping packet features" ) ;
return ;
}
try {
PacketEvents. setAPI (SpigotPacketEventsBuilder. build ( this ) ) ;
PacketEvents. getAPI ( ). load ( ) ;
PacketEvents. getAPI ( ). init ( ) ;
getLogger ( ). info ( "PacketEvents enabled" ) ;
} catch ( Exception e ) {
getLogger ( ). severe ( "PacketEvents failed: " + e. getMessage ( ) ) ;
}
}
private void initCrashSystem ( ) {
if ( !packetEventsAvailable ) {
getLogger ( ). warning ( "Crash system disabled (PacketEvents not ready)" ) ;
return ;
}
CrashPacket. init ( ) ;
Bukkit. getPluginManager ( ). registerEvents ( new CrashPacket ( ), this ) ;
TabCompleteGuard. init ( ) ;
//manager.registerListener(new AALog());
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new ClickWindowListener ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new ViewDistance ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new PickItemListener ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new Creative ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new InvalidPositionCrash ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new InvalidRotationCrash ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new PayloadProtector ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new JoinPacketListener ( ) ) ;
// Hamster Engine Listeners
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new HamsterPacketListener ( ) ) ;
PacketEvents. getAPI ( ). getEventManager ( ). registerListener ( new HamsterValidationListener ( ) ) ;
}
private void initCommands ( ) {
PluginCommand main = getCommand ( "exploitshield" ) ;
if (main != null ) {
Commands executor = new Commands ( ) ;
main. setExecutor (executor ) ;
main. setTabCompleter (executor ) ;
}
PluginCommand es = getCommand ( "es" ) ;
if (es != null ) {
ESCommand executor = new ESCommand ( ) ;
es. setExecutor (executor ) ;
es. setTabCompleter (executor ) ;
}
}
private void initListeners ( ) {
bookListener = new BookCrashListener ( ) ;
Bukkit. getPluginManager ( ). registerEvents (bookListener, this ) ;
registerOtherListeners ( ) ;
}
private void initProtocolLib ( ) {
if ( !protocolLibAvailable ) return ;
try {
PacketManager. init ( ) ;
StrictNBTInterceptor. init ( ) ;
getLogger ( ). info ( "ProtocolLib enabled" ) ;
logConsole ( "ProtocolLib packet protection ENABLED" ) ;
logConsole ( "ProtocolLib Protection ENABLED" ) ;
logConsole ( "Strict NBT Interceptor ENABLED" ) ;
} catch ( Exception e ) {
getLogger ( ). warning ( "ProtocolLib init failed: " + e. getMessage ( ) ) ;
}
}
private void initUpdateChecker ( ) {
updateChecker = new UpdateChecker ( this ) ;
updateChecker. check ( ) ;
Bukkit. getPluginManager ( ). registerEvents (
new UpdateJoinListener ( this, updateChecker ),
this
) ;
}
private void initMetrics ( ) {
MetricsLoader. init ( this ) ;
MetricsManager. loadFromConfig ( ) ;
}
private void preloadOnlineProfiles ( ) {
for (Player p : Bukkit. getOnlinePlayers ( ) ) {
PlayerProfileManager. getProfile (p. getUniqueId ( ) ) ;
}
}
private void registerBadPacketListeners ( ) {
var manager = PacketEvents. getAPI ( ). getEventManager ( ) ;
manager. registerListener ( new BadPacketA ( ) ) ;
manager. registerListener ( new BadPacketB ( ) ) ;
manager. registerListener ( new BadPacketC ( ) ) ;
manager. registerListener ( new BadPacketD ( ) ) ;
manager. registerListener ( new BadPacketE ( ) ) ;
manager. registerListener ( new BadPacketF ( ) ) ;
manager. registerListener ( new BadPacketG ( ) ) ;
manager. registerListener ( new BadPacketH ( ) ) ;
manager. registerListener ( new BadPacketI ( ) ) ;
BadPacketJ badPacketJ = new BadPacketJ ( ) ;
manager. registerListener (badPacketJ ) ;
Bukkit. getPluginManager ( ). registerEvents (badPacketJ, this ) ;
manager. registerListener ( new BadPacketK ( ) ) ;
manager. registerListener ( new BadPacketL ( ) ) ;
manager. registerListener ( new BadPacketM ( ) ) ;
manager. registerListener ( new BadPacketN ( ) ) ;
}
private void registerOtherListeners ( ) {
Bukkit. getPluginManager ( ). registerEvents ( new PistonDuplicationListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new InventoryMoveListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ExplosionListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new EnderPearlListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ItemSalvageListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new SignCrashListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new PacketRateLimiter ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new GriefLavaListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new PlayerPaceListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new EntitySpamListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new GUIManager ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ClientIntegrity ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new CommandCrashListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new NettyInjectListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new NettyCleanupListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ContainerEntityChunkDuplicationListener ( this ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new PlayerJoinProfileListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ItemNBTListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new ClickWindowListener ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new InventoryTracker ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new AlertManager ( ), this ) ;
Bukkit. getPluginManager ( ). registerEvents ( new AlertToggleManager ( ), this ) ;
}
private void handleLanguageConfig ( ) {
getDataFolder ( ). mkdirs ( ) ;
File configFile = new File (getDataFolder ( ), "config.yml" ) ;
if ( !configFile. exists ( ) ) {
String lang = getConfig ( ). getString ( "language", "en" ). toLowerCase ( ) ;
String resource = lang. equals ( "fa" )
? "config_fa.yml"
: "config_en.yml" ;
FileUtil. copyResourceToDataFolder ( this, resource, "config.yml" ) ;
}
reloadConfig ( ) ;
ConfigUtil. reload ( this ) ;
}
private void printLoadBanner ( ) {
logBanner ( "Loading...", ChatColor. DARK_GREEN ) ;
}
private void printStartupBanner ( String state ) {
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. GOLD + "[ExploitShield] " + ChatColor. DARK_GREEN + state ) ;
}
private void printEnabledBanner ( ) {
logBanner ( "Enabled!", ChatColor. GREEN ) ;
}
private void printShutdownBanner ( ) {
logBanner ( "Disabled! ", ChatColor. DARK_RED ) ;
}
private void logBanner ( String status, ChatColor statusColor ) {
getServer ( ). getConsoleSender ( ). sendMessage ( "" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=======================================" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " ExploitShield " + statusColor + " " + status + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " Version: " + ChatColor. RED + getDescription ( ). getVersion ( ) + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " Depend: " + ChatColor. RED + getDescription ( ). getDepend ( ) + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " Lead Dev: " + ChatColor. RED + "Its_Rango " + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=" + ChatColor. GOLD + " Co Devs: " + ChatColor. RED + "S_S_God, Smilelectern_YT" + ChatColor. DARK_GRAY + " =" ) ;
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. DARK_GRAY + "=======================================" ) ;
getServer ( ). getConsoleSender ( ). sendMessage ( "" ) ;
}
private void logConsole ( String msg ) {
getServer ( ). getConsoleSender ( ). sendMessage (ChatColor. GOLD + "[ExploitShield] " + ChatColor. GREEN + msg ) ;
}
public static ExploitShield getInstance ( ) {
return instance ;
}
public Violation getViolationManager ( ) {
return violationManager ;
}
public String color ( String str ) {
return ChatColor. translateAlternateColorCodes ( '&', str ) ;
}
private void logError ( String title, Throwable t ) {
File logDir = new File (getDataFolder ( ), "logs" ) ;
if ( !logDir. exists ( ) ) logDir. mkdirs ( ) ;
File logFile = new File (logDir, "error.log" ) ;
try ( FileWriter writer = new FileWriter (logFile, true ) ) {
writer. write ( "[" + new Date ( ) + "] " + title + "\n" ) ;
writer. write (t. toString ( ) + "\n" ) ;
for (StackTraceElement element : t. getStackTrace ( ) ) {
writer. write ( " at " + element + "\n" ) ;
}
writer. write ( "\n" ) ;
} catch ( IOException e ) {
getLogger ( ). severe ( "Error writing to error log: " + e. getMessage ( ) ) ;
}
}
}
Spoiler: Config
# ==================================================
# ExploitShield
# Advanced Anti-Exploit
# Lead Dev: Its_Rango
# Co Devs: S_S_God, Smilelectern_YT
# ==================================================
language : en # en - fa
# --------------------------------------------------
# JOIN INFO
# --------------------------------------------------
join-info :
# Placeholders: {player}, {brand}, {version}
message : "&6ExploitShield &7» &a{player}&f joined using &a{brand}&f version &a{version}"
# --------------------------------------------------
# Alert System
# --------------------------------------------------
alerts:
enabled : true
on : "&7[&6&lExploitShield&7] &7» &aAlerts enabled."
off : "&7[&6&lExploitShield&7] &7» &cAlerts disabled."
discord:
enabled : false
webhook : "PUT_YOUR_WEBHOOK_URL_HERE"
# --------------------------------------------------
# Debug
# --------------------------------------------------
debug:
level : 0
# 0 = off
# 1 = basic
# 2 = verbose (high TPS cost)
# --------------------------------------------------
# Anti Dupe
# --------------------------------------------------
anti-dupe:
container-entity-chunk:
enabled : true
# Core dupe detection engine (heavy but accurate)
# May cause false positives on laggy servers
prediction:
enabled : true
correlation:
enabled : true
rollback:
enabled : true
window_ms : 5000
max_blocks : 50
# WARNING: can revert legitimate actions during lag spikes
tick_simulation:
enabled : true
profiling:
enabled : true
chunk_context:
enabled : true
confidence:
threshold : 0.75
# Higher = safer but less strict
# Lower = stricter but more false positives
tick_lag:
max_ms : 500
container_furnace_dupe:
enabled : true
entity_dupe:
enabled : true
chunk_teleport_dupe:
enabled : true
piston_dupe:
enabled : true
window_ms : 2500
rate_limit : 12
chain_limit : 7
tnt_radius : 2
player_radius : 144
log_to_file : true
player-dupe:
offline:
window_ms : 1500
chain:
window_ms : 3000
limit : 5
item:
repeat : 5
creative:
enabled : true
extra_stack : 16
inventory:
general : true
reincarnation :
# Reincarnation detection (entity death respawn with same items)
# WARNING: May false positive on normal gameplay
# Recommended: false for production servers
check : false
boundary :
# Chunk boundary abuse detection
# WARNING: May false positive when players legitimately move items
# Recommended: false for production servers
check : false
violation_limit : 5
vehicle:
enabled : true
chunk:
window_ms : 3000
rate : 10
spam:
window_ms : 3000
threshold : 15
cooldown_ms : 30000
snapshot:
ttl_seconds : 600
history:
ttl_seconds : 10
similarity:
threshold : 0.95
min_items : 10
equip:
rate_limit_ms : 150
equip_slots :
- 39
- 40
# Kick on dupe detection
kick : false
# --------------------------------------------------
# Bypass Worlds
# --------------------------------------------------
bypass_worlds:
world : false
world_nether : false
world_the_end : false
# --------------------------------------------------
# Book Crash
# --------------------------------------------------
book:
enabled : true
MAX_PAGE : 100
MAX_CHARS_PER_PAGE : 1023 # Max chars per page in java is 1023
MAX_TOTAL_CHARS : 102300 # 100*1023
MAX_COLOR_CODES_PER_PAGE : 25
MAX_JSON_DEPTH : 8
MAX_ARRAY_DEPTH : 8
MAX_EXTRA_COUNT : 32
MAX_UNICODE_CHARS : 30
# --------------------------------------------------
# Click Window
# --------------------------------------------------
click-window:
enabled : true
max-packets : 80
interval-ms : 900
max-rule-break : 4
auto-kick-on-limit : false
# 80 CLICK_WINDOW packets per 900ms (0.9s)
# Used to detect inventory click spam / packet abuse
# WARNING: lowering interval too much may cause false positives on lag
# --------------------------------------------------
# Client Integrity
# --------------------------------------------------
client-integrity:
ghost-item : enable
no-swing-attack : false # Set this to false if your server is PvP-focused.
multi-hit : false # Set this to false if your server is PvP-focused.
# --------------------------------------------------
# Command Crash
# --------------------------------------------------
command:
enabled : true
max-length : 256
max-args : 128
# --------------------------------------------------
# Ender Pearl Glitch
# --------------------------------------------------
ender-pearl:
enabled : true
limit-y : 256
max-distance : 80
# --------------------------------------------------
# Entity Spam
# --------------------------------------------------
entity-spam:
enabled : true
# Prevents entity-based lag/crash exploits (TPS protection system)
entities:
dropped_item : true
experience_orb : true
armor_stand : true
minecart : true
boat : true
# Detect every non-player entity
all_non_player : false
limits :
# Maximum entity spawns per player in one second
per_player_per_second : 25
# Maximum entity spawns inside one chunk during the window
per_chunk : 50
chunk :
# Time window for chunk spawn detection (ms)
window_ms : 1000
vl :
# Kick after reaching this violation level
max : 6
# Every X seconds VL decreases by 1
decay_seconds : 10
action :
# First violation
first : ALERT
# Repeated violations before max VL
repeated : CANCEL
# Action when max VL is reached
strict : KICK
# --------------------------------------------------
# Explosion
# --------------------------------------------------
explosion:
bed-explosion-dupe : true
# --------------------------------------------------
# Global Messages
# --------------------------------------------------
messages :
# You cannot change messages prefix!
no_permission : "&6&lExploitShield &7» &cYou do not have permission to do this."
reloading : "&a&lReloading..."
reloaded : "&a&lReloaded."
# --------------------------------------------------
# Grief
# --------------------------------------------------
grief:
pace:
enabled : true
max_blocks_per_second : 100 # What is your server need ?
message : "You are placing blocks too fast!"
message_cooldown : 5000 # Anti Spam For Messages Sending
lava:
enabled : true
max_sources_per_chunk : 100 # What is your server need ?
allow_flow : true
message : "Only 100 lava sources are allowed per chunk!"
message_cooldown : 5000 # Anti Spam For Messages Sending
# --------------------------------------------------
# Hamster Engine
# --------------------------------------------------
hamster:
enabled : true
vl_threshold : 5
debug : false
# --------------------------------------------------
# Inventory
# --------------------------------------------------
inventory:
abuse-detection : true
max-clicks : 55
window-click : 900
# Detects abnormal inventory clicking speed
# Keep aligned with click-window settings to avoid mismatch detection
# --------------------------------------------------
# Item NBT
# --------------------------------------------------
item-nbt:
enabled : true
cooldown-ms : 30
max-nbt-size : 9000
max-name-length : 96
max-lore-lines : 20
max-lore-length : 124
max-enchants : 16
max-enchant-level : 10
max-attributes : 16
max-item-flags : 16
max-pdc-keys : 32
max-stack-size : 127
# --------------------------------------------------
# Item Salvage
# --------------------------------------------------
item-salvage:
enabled : true
# --------------------------------------------------
# Netty
# --------------------------------------------------
netty:
enabled : true
max_packet_bytes : 100000
close_on_violation : true
# --------------------------------------------------
# Packet Filter
# --------------------------------------------------
packet-filter:
enabled : true
action : KICK # KICK/CANCEL/ALERT
# --------------------------------------------------
# Payload Protector
# --------------------------------------------------
payload:
max-size : 8192
max-channel-length : 128
max-register-channels : 128
max-brand-size : 256
max-bungeecord-size : 2048
max-register-total-length : 2048
# --------------------------------------------------
# Punishment
# --------------------------------------------------
punishments:
piston_dupe:
warn:
threshold : 3
action : WARN
message : "&e⚠ Stop abusing piston mechanics!"
kick:
threshold : 5
action : KICK
message : "&e⚠ You were kicked for piston exploit."
ban:
threshold : 8
action : COMMAND
command : "ban %player% Piston exploit abuse"
entity_spam:
warn:
threshold : 6
action : WARN
message : "&e⚠ Stop spawning entities!"
cooldown : 5000
repeatable : true
kick:
threshold : 10
action : KICK
message : "&e⚠ You were kicked for entity spam."
cooldown : 60000
repeatable : false
# --------------------------------------------------
# Sign Crash
# --------------------------------------------------
sign:
enabled : true
max-line-length : 80
max-total-length : 320 # 80 * 4
max-color-codes : 20
max-repeat : 20
# --------------------------------------------------
# Spam Crash
# --------------------------------------------------
spam-crasher:
enabled : true
# Prevents chat/command flood exploits that can crash clients or server
message-cooldown : 0.09
command-cooldown : 0.09
message-spam-message : "&cYou are sending messages too fast!"
command-spam-message : "&cYou are sending commands too fast!"
# --------------------------------------------------
# Strict NBT Interceptor
# --------------------------------------------------
strict-nbt:
enabled : true
# Blocks malformed or oversized NBT payloads (item/chat/book exploits)
max_book_pages : 100
max_book_page_size : 2048
max_total_book_size : 32748
max_chat_length : 512
max_item_nbt_size : 8192
max_item_amount : 127
max_pdc_keys : 32
# --------------------------------------------------
# Tab Completer
# --------------------------------------------------
tab-completer:
enabled : true
# Prevents tab-complete crash
MAX_TAB_LENGTH_CRITICAL : 400
MAX_TAB_LENGTH_WARN : 350
Code (YAML):
# ==================================================
# ExploitShield
# Advanced Anti-Exploit
# Lead Dev: Its_Rango
# Co Devs: S_S_God, Smilelectern_YT
# ==================================================
language : en # en - fa
# --------------------------------------------------
# JOIN INFO
# --------------------------------------------------
join-info :
# Placeholders: {player}, {brand}, {version}
message : "&6ExploitShield &7» &a{player}&f joined using &a{brand}&f version &a{version}"
# --------------------------------------------------
# Alert System
# --------------------------------------------------
alerts:
enabled : true
on : "&7[&6&lExploitShield&7] &7» &aAlerts enabled."
off : "&7[&6&lExploitShield&7] &7» &cAlerts disabled."
discord:
enabled : false
webhook : "PUT_YOUR_WEBHOOK_URL_HERE"
# --------------------------------------------------
# Debug
# --------------------------------------------------
debug:
level : 0
# 0 = off
# 1 = basic
# 2 = verbose (high TPS cost)
# --------------------------------------------------
# Anti Dupe
# --------------------------------------------------
anti-dupe:
container-entity-chunk:
enabled : true
# Core dupe detection engine (heavy but accurate)
# May cause false positives on laggy servers
prediction:
enabled : true
correlation:
enabled : true
rollback:
enabled : true
window_ms : 5000
max_blocks : 50
# WARNING: can revert legitimate actions during lag spikes
tick_simulation:
enabled : true
profiling:
enabled : true
chunk_context:
enabled : true
confidence:
threshold : 0.75
# Higher = safer but less strict
# Lower = stricter but more false positives
tick_lag:
max_ms : 500
container_furnace_dupe:
enabled : true
entity_dupe:
enabled : true
chunk_teleport_dupe:
enabled : true
piston_dupe:
enabled : true
window_ms : 2500
rate_limit : 12
chain_limit : 7
tnt_radius : 2
player_radius : 144
log_to_file : true
player-dupe:
offline:
window_ms : 1500
chain:
window_ms : 3000
limit : 5
item:
repeat : 5
creative:
enabled : true
extra_stack : 16
inventory:
general : true
reincarnation :
# Reincarnation detection (entity death respawn with same items)
# WARNING: May false positive on normal gameplay
# Recommended: false for production servers
check : false
boundary :
# Chunk boundary abuse detection
# WARNING: May false positive when players legitimately move items
# Recommended: false for production servers
check : false
violation_limit : 5
vehicle:
enabled : true
chunk:
window_ms : 3000
rate : 10
spam:
window_ms : 3000
threshold : 15
cooldown_ms : 30000
snapshot:
ttl_seconds : 600
history:
ttl_seconds : 10
similarity:
threshold : 0.95
min_items : 10
equip:
rate_limit_ms : 150
equip_slots :
- 39
- 40
# Kick on dupe detection
kick : false
# --------------------------------------------------
# Bypass Worlds
# --------------------------------------------------
bypass_worlds:
world : false
world_nether : false
world_the_end : false
# --------------------------------------------------
# Book Crash
# --------------------------------------------------
book:
enabled : true
MAX_PAGE : 100
MAX_CHARS_PER_PAGE : 1023 # Max chars per page in java is 1023
MAX_TOTAL_CHARS : 102300 # 100*1023
MAX_COLOR_CODES_PER_PAGE : 25
MAX_JSON_DEPTH : 8
MAX_ARRAY_DEPTH : 8
MAX_EXTRA_COUNT : 32
MAX_UNICODE_CHARS : 30
# --------------------------------------------------
# Click Window
# --------------------------------------------------
click-window:
enabled : true
max-packets : 80
interval-ms : 900
max-rule-break : 4
auto-kick-on-limit : false
# 80 CLICK_WINDOW packets per 900ms (0.9s)
# Used to detect inventory click spam / packet abuse
# WARNING: lowering interval too much may cause false positives on lag
# --------------------------------------------------
# Client Integrity
# --------------------------------------------------
client-integrity:
ghost-item : enable
no-swing-attack : false # Set this to false if your server is PvP-focused.
multi-hit : false # Set this to false if your server is PvP-focused.
# --------------------------------------------------
# Command Crash
# --------------------------------------------------
command:
enabled : true
max-length : 256
max-args : 128
# --------------------------------------------------
# Ender Pearl Glitch
# --------------------------------------------------
ender-pearl:
enabled : true
limit-y : 256
max-distance : 80
# --------------------------------------------------
# Entity Spam
# --------------------------------------------------
entity-spam:
enabled : true
# Prevents entity-based lag/crash exploits (TPS protection system)
entities:
dropped_item : true
experience_orb : true
armor_stand : true
minecart : true
boat : true
# Detect every non-player entity
all_non_player : false
limits :
# Maximum entity spawns per player in one second
per_player_per_second : 25
# Maximum entity spawns inside one chunk during the window
per_chunk : 50
chunk :
# Time window for chunk spawn detection (ms)
window_ms : 1000
vl :
# Kick after reaching this violation level
max : 6
# Every X seconds VL decreases by 1
decay_seconds : 10
action :
# First violation
first : ALERT
# Repeated violations before max VL
repeated : CANCEL
# Action when max VL is reached
strict : KICK
# --------------------------------------------------
# Explosion
# --------------------------------------------------
explosion:
bed-explosion-dupe : true
# --------------------------------------------------
# Global Messages
# --------------------------------------------------
messages :
# You cannot change messages prefix!
no_permission : "&6&lExploitShield &7» &cYou do not have permission to do this."
reloading : "&a&lReloading..."
reloaded : "&a&lReloaded."
# --------------------------------------------------
# Grief
# --------------------------------------------------
grief:
pace:
enabled : true
max_blocks_per_second : 100 # What is your server need ?
message : "You are placing blocks too fast!"
message_cooldown : 5000 # Anti Spam For Messages Sending
lava:
enabled : true
max_sources_per_chunk : 100 # What is your server need ?
allow_flow : true
message : "Only 100 lava sources are allowed per chunk!"
message_cooldown : 5000 # Anti Spam For Messages Sending
# --------------------------------------------------
# Hamster Engine
# --------------------------------------------------
hamster:
enabled : true
vl_threshold : 5
debug : false
# --------------------------------------------------
# Inventory
# --------------------------------------------------
inventory:
abuse-detection : true
max-clicks : 55
window-click : 900
# Detects abnormal inventory clicking speed
# Keep aligned with click-window settings to avoid mismatch detection
# --------------------------------------------------
# Item NBT
# --------------------------------------------------
item-nbt:
enabled : true
cooldown-ms : 30
max-nbt-size : 9000
max-name-length : 96
max-lore-lines : 20
max-lore-length : 124
max-enchants : 16
max-enchant-level : 10
max-attributes : 16
max-item-flags : 16
max-pdc-keys : 32
max-stack-size : 127
# --------------------------------------------------
# Item Salvage
# --------------------------------------------------
item-salvage:
enabled : true
# --------------------------------------------------
# Netty
# --------------------------------------------------
netty:
enabled : true
max_packet_bytes : 100000
close_on_violation : true
# --------------------------------------------------
# Packet Filter
# --------------------------------------------------
packet-filter:
enabled : true
action : KICK # KICK/CANCEL/ALERT
# --------------------------------------------------
# Payload Protector
# --------------------------------------------------
payload:
max-size : 8192
max-channel-length : 128
max-register-channels : 128
max-brand-size : 256
max-bungeecord-size : 2048
max-register-total-length : 2048
# --------------------------------------------------
# Punishment
# --------------------------------------------------
punishments:
piston_dupe:
warn:
threshold : 3
action : WARN
message : "&e⚠ Stop abusing piston mechanics!"
kick:
threshold : 5
action : KICK
message : "&e⚠ You were kicked for piston exploit."
ban:
threshold : 8
action : COMMAND
command : "ban %player% Piston exploit abuse"
entity_spam:
warn:
threshold : 6
action : WARN
message : "&e⚠ Stop spawning entities!"
cooldown : 5000
repeatable : true
kick:
threshold : 10
action : KICK
message : "&e⚠ You were kicked for entity spam."
cooldown : 60000
repeatable : false
# --------------------------------------------------
# Sign Crash
# --------------------------------------------------
sign:
enabled : true
max-line-length : 80
max-total-length : 320 # 80 * 4
max-color-codes : 20
max-repeat : 20
# --------------------------------------------------
# Spam Crash
# --------------------------------------------------
spam-crasher:
enabled : true
# Prevents chat/command flood exploits that can crash clients or server
message-cooldown : 0.09
command-cooldown : 0.09
message-spam-message : "&cYou are sending messages too fast!"
command-spam-message : "&cYou are sending commands too fast!"
# --------------------------------------------------
# Strict NBT Interceptor
# --------------------------------------------------
strict-nbt:
enabled : true
# Blocks malformed or oversized NBT payloads (item/chat/book exploits)
max_book_pages : 100
max_book_page_size : 2048
max_total_book_size : 32748
max_chat_length : 512
max_item_nbt_size : 8192
max_item_amount : 127
max_pdc_keys : 32
# --------------------------------------------------
# Tab Completer
# --------------------------------------------------
tab-completer:
enabled : true
# Prevents tab-complete crash
MAX_TAB_LENGTH_CRITICAL : 400
MAX_TAB_LENGTH_WARN : 350
Quick facts
- Edition: Minecraft Java
- File type: .jar
- Minecraft versions listed: 1.17, 1.18, 1.19
- How to install: Install the matching mod loader (Forge, Fabric or NeoForge) for your Minecraft version. → Download the .jar. → Put it in the .minecraft/mods folder and launch that loader profile.
- Where to get it: Opens on Spigot — not every file is mirrored on our own servers.
Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.
ExploitShield is a free Minecraft Java mod. Compatible with Minecraft 1.17, 1.18, 1.19, 1.20 and newer. Downloaded 2,855 times (via Spigot). Download it and open it directly in the game.