From 3a0bfd2e0309094fa1b02d429e361e3a712e9dea Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 15 Feb 2024 02:28:58 +0100 Subject: [PATCH] initial commit --- .gitignore | 113 ++++++++++++ pom.xml | 71 ++++++++ .../combatlogger/CombatLoggerPlugin.java | 27 +++ .../tubyoub/combatlogger/CombatManager.java | 161 ++++++++++++++++++ .../Commands/CombatLoggerCommand.java | 139 +++++++++++++++ .../Listeners/CombatListener.java | 41 +++++ src/main/resources/config.yml | 1 + src/main/resources/plugin.yml | 24 +++ 8 files changed, 577 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/de/tubyoub/combatlogger/CombatLoggerPlugin.java create mode 100644 src/main/java/de/tubyoub/combatlogger/CombatManager.java create mode 100644 src/main/java/de/tubyoub/combatlogger/Commands/CombatLoggerCommand.java create mode 100644 src/main/java/de/tubyoub/combatlogger/Listeners/CombatListener.java create mode 100644 src/main/resources/config.yml create mode 100644 src/main/resources/plugin.yml 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..61223c3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + de.tubyoub + CombatLogger + 1.0-SNAPSHOT + jar + + CombatLogging + + + 1.8 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + + com.destroystokyo.paper + paper-api + 1.13-R0.1-SNAPSHOT + provided + + + diff --git a/src/main/java/de/tubyoub/combatlogger/CombatLoggerPlugin.java b/src/main/java/de/tubyoub/combatlogger/CombatLoggerPlugin.java new file mode 100644 index 0000000..069126b --- /dev/null +++ b/src/main/java/de/tubyoub/combatlogger/CombatLoggerPlugin.java @@ -0,0 +1,27 @@ +package de.tubyoub.combatlogger; + +import de.tubyoub.combatlogger.Commands.CombatLoggerCommand; +import de.tubyoub.combatlogger.Listeners.CombatListener; +import org.bukkit.plugin.java.JavaPlugin; + +public class CombatLoggerPlugin extends JavaPlugin { + + private CombatManager combatManager; + + @Override + public void onEnable() { + getConfig().options().copyDefaults(true); + saveConfig(); + + int combatTimeoutInSeconds = getConfig().getInt("combatTimeoutInSeconds"); + + CombatManager combatManager = new CombatManager(this, combatTimeoutInSeconds); + + getServer().getPluginManager().registerEvents(new CombatListener(this, combatTimeoutInSeconds), this); + + getCommand("combatlogger").setExecutor(new CombatLoggerCommand(combatManager,this)); + } + @Override + public void onDisable() { + } +} diff --git a/src/main/java/de/tubyoub/combatlogger/CombatManager.java b/src/main/java/de/tubyoub/combatlogger/CombatManager.java new file mode 100644 index 0000000..3a89bc2 --- /dev/null +++ b/src/main/java/de/tubyoub/combatlogger/CombatManager.java @@ -0,0 +1,161 @@ +package de.tubyoub.combatlogger; + +import org.bukkit.Bukkit; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class CombatManager { + + private Map combatTimers = new HashMap<>(); + private Map lastHitTimes = new HashMap<>(); + private Map combatStatus = new HashMap<>(); + private Map bossBars = new HashMap<>(); + + private int combatTimeoutInSeconds; + private CombatLoggerPlugin plugin; + + public CombatManager(CombatLoggerPlugin plugin, int combatTimeoutInSeconds) { + this.plugin = plugin; + this.combatTimeoutInSeconds = combatTimeoutInSeconds; + + new BukkitRunnable() { + @Override + public void run() { + checkTimers(); + } + }.runTaskTimer(plugin, 20, 20); + } + + public void handlePlayerQuit(Player player) { + UUID playerId = player.getUniqueId(); + + if (combatTimers.containsKey(playerId)) { + long logoutTime = System.currentTimeMillis(); + long lastCombatTime = combatTimers.get(playerId); + if (combatTimers.get(playerId) != null) { + player.sendMessage("You are no longer in combat."); + removeBossBar(player); + } + if (logoutTime - lastCombatTime <= combatTimeoutInSeconds * 1000) { + long remainingTime = (lastCombatTime + combatTimeoutInSeconds * 1000) - logoutTime; + if (remainingTime > 0) { + Bukkit.getScheduler().runTaskLater(plugin, () -> { + Player target = Bukkit.getPlayer(playerId); + if (target != null && target.isOnline()) { + target.setHealth(0); + target.sendMessage("You died because you logged out during combat."); + } + }, remainingTime / 50); + } + } + + combatTimers.remove(playerId); + combatStatus.remove(playerId); + removeBossBar(player); + } +} + + + + public void handlePlayerDeath(Player player) { + combatTimers.remove(player.getUniqueId()); + + combatStatus.remove(player.getUniqueId()); + } + + public void startCombatTimer(Player player) { + UUID playerId = player.getUniqueId(); + combatTimers.put(playerId, System.currentTimeMillis()); + createBossBar(player); +} + + public void stopCombatTimer(Player player) { + UUID playerId = player.getUniqueId(); + combatTimers.remove(playerId); + removeBossBar(player); + } + public void resetCombatTimer(Player player) { + combatTimers.put(player.getUniqueId(), System.currentTimeMillis()); + } + + public void handlePlayerHit(Player player) { + UUID playerId = player.getUniqueId(); + + if (!combatTimers.containsKey(playerId)) { + startCombatTimer(player); + player.sendMessage("You entered combat!"); + } else { + resetCombatTimer(player); + } + } + + public List getPlayersInCombat() { + List playersInCombat = new ArrayList<>(); + for (UUID playerId : combatStatus.keySet()) { + Player player = Bukkit.getPlayer(playerId); + if (player != null && combatStatus.get(playerId) == 1) { + playersInCombat.add(player.getName()); + } + } + return playersInCombat; + } + + private void checkTimers() { + long currentTime = System.currentTimeMillis(); + for (UUID playerId : combatTimers.keySet()) { + long lastCombatTime = combatTimers.get(playerId); + if (combatTimers.get(playerId) != null){ + Player player = plugin.getServer().getPlayer(playerId); + player.sendMessage("You are no longer in combat."); + removeBossBar(player); + } + if (currentTime - lastCombatTime >= combatTimeoutInSeconds * 1000) { + combatTimers.remove(playerId); + combatStatus.remove(playerId); + Player player = plugin.getServer().getPlayer(playerId); + if (player != null) { + player.sendMessage("You are no longer in combat."); + removeBossBar(player); + } + } else { + Player player = plugin.getServer().getPlayer(playerId); + if (player != null) { + BossBar bossBar = bossBars.get(playerId); + if (bossBar != null) { + long timeLeft = lastCombatTime + (combatTimeoutInSeconds * 1000) - currentTime; + double progress = (double) timeLeft / (combatTimeoutInSeconds * 1000); + bossBar.setProgress(progress); + } + } + } + } + } + + + private void createBossBar(Player player) { + UUID playerId = player.getUniqueId(); + BossBar bossBar = Bukkit.createBossBar("Combat Timer", BarColor.RED, BarStyle.SOLID); + bossBar.setProgress(1.0); + bossBar.addPlayer(player); + bossBars.put(playerId, bossBar); + } + + private void removeBossBar(Player player) { + UUID playerId = player.getUniqueId(); + BossBar bossBar = bossBars.get(playerId); + if (bossBar != null) { + bossBar.removeAll(); + bossBars.remove(playerId); + } + } + +} diff --git a/src/main/java/de/tubyoub/combatlogger/Commands/CombatLoggerCommand.java b/src/main/java/de/tubyoub/combatlogger/Commands/CombatLoggerCommand.java new file mode 100644 index 0000000..e87c008 --- /dev/null +++ b/src/main/java/de/tubyoub/combatlogger/Commands/CombatLoggerCommand.java @@ -0,0 +1,139 @@ +package de.tubyoub.combatlogger.Commands; + +import de.tubyoub.combatlogger.CombatManager; +import de.tubyoub.combatlogger.CombatLoggerPlugin; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; + +public class CombatLoggerCommand implements CommandExecutor { + + private CombatManager combatManager; + private CombatLoggerPlugin plugin; + + public CombatLoggerCommand(CombatManager combatManager, CombatLoggerPlugin plugin) { + this.combatManager = combatManager; + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length == 0 || args[0].equalsIgnoreCase("help")) { + sendHelp(sender); + return true; + } + + if (args.length < 1) { + sender.sendMessage("Usage: /" + label + " [player]"); + return true; + } + + if (args[0].equalsIgnoreCase("list")) { + listPlayersInCombat(sender); + return true; + } + + if (args[0].equalsIgnoreCase("setTimer")) { + setCombatTimer(sender, args); + return true; + } + + if (args.length < 2) { + sender.sendMessage("Usage: /" + label + " "); + return true; + } + + Player target = Bukkit.getPlayer(args[1]); + if (target == null || !target.isOnline()) { + sender.sendMessage("Player not found or not online."); + return true; + } + + switch (args[0].toLowerCase()) { + case "start": + startCombat(sender, target); + break; + case "stop": + stopCombat(sender, target); + break; + default: + sender.sendMessage("Invalid command. Usage: /" + label + " [player]"); + break; + } + return true; + } + + private void startCombat(CommandSender sender, Player target) { + if (sender.hasPermission("combatlogger.start")) { + combatManager.handlePlayerHit(target); + sender.sendMessage("Combat started for " + target.getName() + "."); + } else { + sender.sendMessage("You don't have permission to start combat."); + } + } + + private void stopCombat(CommandSender sender, Player target) { + if (sender.hasPermission("combatlogger.stop")) { + combatManager.stopCombatTimer(target); + sender.sendMessage("Combat stopped for " + target.getName() + "."); + } else { + sender.sendMessage("You don't have permission to stop combat."); + } + } + + private void listPlayersInCombat(CommandSender sender) { + if (sender.hasPermission("combatlogger.list")) { + List playersInCombat = combatManager.getPlayersInCombat(); + sender.sendMessage("Players currently in combat:"); + for (String playerName : playersInCombat) { + sender.sendMessage(playerName); + } + } else { + sender.sendMessage("You don't have permission to list players in combat."); + } + } + + private void setCombatTimer(CommandSender sender, String[] args) { + if (!sender.hasPermission("combatlogger.settimer")) { + sender.sendMessage("You don't have permission to set the combat timer."); + return; + } + + if (args.length == 1) { + int currentTimer = plugin.getConfig().getInt("combatTimeoutInSeconds"); + sender.sendMessage("Current combat timer: " + currentTimer + " seconds."); + } else if (args.length == 2) { + try { + int newTimer = Integer.parseInt(args[1]); + if (newTimer <= 0) { + sender.sendMessage("Invalid timer value. Timer must be a positive integer."); + return; + } + plugin.getConfig().set("combatTimeoutInSeconds", newTimer); + plugin.saveConfig(); + sender.sendMessage("Combat timer set to " + newTimer + " seconds."); + } catch (NumberFormatException e) { + sender.sendMessage("Invalid timer value. Timer must be a positive integer."); + } + } else { + sender.sendMessage("Usage: /cl setTimer [seconds]"); + } + } + + private void sendHelp(CommandSender sender) { + if (sender.hasPermission("combatlogger.start") || sender.hasPermission("combatlogger.stop") || sender.hasPermission("combatlogger.list") || sender.hasPermission("combatlogger.settimer")) { + sender.sendMessage("CombatLogger Commands:"); + sender.sendMessage("/cl start - Start combat for the specified player."); + sender.sendMessage("/cl stop - Stop combat for the specified player."); + sender.sendMessage("/cl list - List all players currently in combat."); + sender.sendMessage("/cl setTimer [seconds] - Set the combat timer."); + sender.sendMessage("/cl help - Show this help message."); + } else { + sender.sendMessage("You don't have permission to use any CombatLogger commands."); + } + } +} diff --git a/src/main/java/de/tubyoub/combatlogger/Listeners/CombatListener.java b/src/main/java/de/tubyoub/combatlogger/Listeners/CombatListener.java new file mode 100644 index 0000000..3d01472 --- /dev/null +++ b/src/main/java/de/tubyoub/combatlogger/Listeners/CombatListener.java @@ -0,0 +1,41 @@ +package de.tubyoub.combatlogger.Listeners; + +import de.tubyoub.combatlogger.CombatLoggerPlugin; +import de.tubyoub.combatlogger.CombatManager; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class CombatListener implements Listener { + + private CombatManager combatManager; + + public CombatListener(CombatLoggerPlugin plugin, int combatTimeoutInSeconds) { + this.combatManager = new CombatManager(plugin, combatTimeoutInSeconds); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + combatManager.handlePlayerQuit(player); + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + Player player = event.getEntity(); + combatManager.handlePlayerDeath(player); + } + + @EventHandler + public void onPlayerHit(EntityDamageByEntityEvent event) { + if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) { + Player damager = (Player) event.getDamager(); + Player damaged = (Player) event.getEntity(); + combatManager.handlePlayerHit(damager); + combatManager.handlePlayerHit(damaged); + } + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..8d0acf4 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1 @@ +combatTimeout: 30 \ 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..599946f --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,24 @@ +name: CombatLogger +version: '${project.version}' +author: TubYoub +main: de.tubyoub.combatlogger.CombatLoggerPlugin + +commands: + combatlogger: + description: Main command for CombatLogger plugin + usage: /combatlogger [player] + aliases: [cl] + +permissions: + combatlogger.start: + description: Allows players to start combat for a specific player + default: op + combatlogger.stop: + description: Allows players to stop combat for a specific player + default: op + combatlogger.list: + description: Allows players to list all players currently in combat + default: op + combatlogger.settimer: + description: Allows players to set the combat timer + default: op \ No newline at end of file