commit ff457e396f31d520c1fe5651fe4da2b568475103 Author: YouHaveTrouble Date: Mon Dec 29 18:35:25 2025 +0100 hardcore ban on death diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4788b4b --- /dev/null +++ b/.gitignore @@ -0,0 +1,113 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +target/ + +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next + +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.flattened-pom.xml + +# Common working directory +run/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c1bd1d1 --- /dev/null +++ b/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + me.youhavetrouble.truedeath + TrueDeath + 1.0-SNAPSHOT + jar + + TrueDeath + + + 21 + UTF-8 + + + + clean package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.3 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + + + + io.papermc.paper + paper-api + 1.21.11-R0.1-SNAPSHOT + provided + + + diff --git a/src/main/java/me/youhavetrouble/truedeath/TrueDeath.java b/src/main/java/me/youhavetrouble/truedeath/TrueDeath.java new file mode 100644 index 0000000..a8fdcda --- /dev/null +++ b/src/main/java/me/youhavetrouble/truedeath/TrueDeath.java @@ -0,0 +1,114 @@ +package me.youhavetrouble.truedeath; + +import com.mojang.brigadier.Command; +import io.papermc.paper.command.brigadier.Commands; +import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; +import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.permissions.Permissible; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Date; + +public final class TrueDeath extends JavaPlugin implements Listener { + + private final Permission trueDeathBypass = new Permission("truedeath.bypass", "Death does not ban players with this permission", PermissionDefault.OP); + private final Permission pluginReloadPermission = new Permission("truedeath.reload", "Allows reloading of the TrueDeath plugin", PermissionDefault.OP); + + private long banTimeSeconds; + private String banMessage; + + @Override + public void onEnable() { + getServer().getPluginManager().addPermission(trueDeathBypass); + reloadConfigValues(); + getServer().getPluginManager().registerEvents(this, this); + LifecycleEventManager<@NotNull Plugin> manager = getLifecycleManager(); + manager.registerEventHandler(LifecycleEvents.COMMANDS, event -> { + final Commands commands = event.registrar(); + commands.register( + Commands.literal("truedeath").then( + Commands.literal("reload") + .requires(css -> { + if (!(css.getExecutor() instanceof Permissible permissible)) return false; + return permissible.hasPermission(pluginReloadPermission); + }) + .executes(css -> { + reloadConfigValues(); + css.getSource().getSender().sendRichMessage("TrueDeath configuration reloaded."); + return Command.SINGLE_SUCCESS; + }) + .build() + ).build() + ); + }); + } + + @Override + public void onDisable() { + // Players are normally kicked after plugins disable, so to avoid missing a death, kick everyone. + Bukkit.getOnlinePlayers() + .forEach(player -> player.kick(Component.translatable("minecraft.server.shutdown"))); + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onPlayerDeath(PlayerDeathEvent event) { + if (event.getPlayer().hasPermission(trueDeathBypass)) return; + Date banFinishDate = banTimeSeconds < 0 ? null : new Date(System.currentTimeMillis() + (banTimeSeconds * 1000)); + event.getPlayer().ban(banMessage, banFinishDate, "[TrueDeath]", true); + } + + public void reloadConfigValues() { + saveDefaultConfig(); + reloadConfig(); + String banTimeString = getConfig().getString("ban-time-seconds", "-1"); + banTimeSeconds = parseBanTime(banTimeString); + banMessage = getConfig().getString("ban-message", "You have been slain. Thank you for playing."); + } + + private long parseBanTime(String string) { + + long multiplier = 1; + + if (string.endsWith("s")) { + string = string.substring(0, string.length() - 1); + } else if (string.endsWith("m")) { + multiplier = 60; + string = string.substring(0, string.length() - 1); + } else if (string.endsWith("h")) { + multiplier = 3600; + string = string.substring(0, string.length() - 1); + } else if (string.endsWith("d")) { + multiplier = 86400; + string = string.substring(0, string.length() - 1); + } else if (string.endsWith("w")) { + multiplier = 604800; + string = string.substring(0, string.length() - 1); + } else if (string.endsWith("M")) { + multiplier = 2592000; + string = string.substring(0, string.length() - 1); + } else if (string.endsWith("y")) { + multiplier = 31536000; + string = string.substring(0, string.length() - 1); + } + long number; + try { + number = Long.parseLong(string); + } catch (NumberFormatException e) { + number = -1; + getSLF4JLogger().warn("Invalid ban time format in the config: \"{}\", defaulting to -1 (permanent ban)", string); + } + + return number * multiplier; + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..0b6e87e --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,2 @@ +ban-message: "You have been slain. Thanks for playing." +ban-time: -1 \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..4973d3c --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,6 @@ +name: TrueDeath +version: '1.0-SNAPSHOT' +main: me.youhavetrouble.truedeath.TrueDeath +api-version: '1.21' +authors: [ YouHaveTrouble ] +website: https://youhavetrouble.me