diff --git a/.gradle/8.8/executionHistory/executionHistory.bin b/.gradle/8.8/executionHistory/executionHistory.bin index 76d91ee..b2c5ec4 100644 Binary files a/.gradle/8.8/executionHistory/executionHistory.bin and b/.gradle/8.8/executionHistory/executionHistory.bin differ diff --git a/.gradle/8.8/executionHistory/executionHistory.lock b/.gradle/8.8/executionHistory/executionHistory.lock index 1474f35..7220365 100644 Binary files a/.gradle/8.8/executionHistory/executionHistory.lock and b/.gradle/8.8/executionHistory/executionHistory.lock differ diff --git a/.gradle/8.8/fileHashes/fileHashes.bin b/.gradle/8.8/fileHashes/fileHashes.bin index 2f14c48..d8b56e6 100644 Binary files a/.gradle/8.8/fileHashes/fileHashes.bin and b/.gradle/8.8/fileHashes/fileHashes.bin differ diff --git a/.gradle/8.8/fileHashes/fileHashes.lock b/.gradle/8.8/fileHashes/fileHashes.lock index 019fabc..edf415c 100644 Binary files a/.gradle/8.8/fileHashes/fileHashes.lock and b/.gradle/8.8/fileHashes/fileHashes.lock differ diff --git a/.gradle/8.8/fileHashes/resourceHashesCache.bin b/.gradle/8.8/fileHashes/resourceHashesCache.bin index 8fd1ecd..b9fbb2c 100644 Binary files a/.gradle/8.8/fileHashes/resourceHashesCache.bin and b/.gradle/8.8/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 789de0e..ff1a4e2 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index ee5ef22..525b598 100644 Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/build.gradle b/build.gradle index 27fecba..02e3c16 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } group = 'com.newt-tech' -version = '1.2-BETA' +version = '1.3-BETA' repositories { mavenCentral() diff --git a/build/classes/java/main/CoswayUtil/CoswayUtil.class b/build/classes/java/main/CoswayUtil/CoswayUtil.class index 9479b77..f55f68a 100644 Binary files a/build/classes/java/main/CoswayUtil/CoswayUtil.class and b/build/classes/java/main/CoswayUtil/CoswayUtil.class differ diff --git a/build/libs/CoswayUtil-1.2-BETA.jar b/build/libs/CoswayUtil-1.2-BETA.jar index e9fd12e..5597ae6 100644 Binary files a/build/libs/CoswayUtil-1.2-BETA.jar and b/build/libs/CoswayUtil-1.2-BETA.jar differ diff --git a/build/resources/main/plugin.yml b/build/resources/main/plugin.yml index d4bb5e4..a3509e5 100644 --- a/build/resources/main/plugin.yml +++ b/build/resources/main/plugin.yml @@ -1,5 +1,5 @@ -name: CoswayUtil -version: '1.2-BETA' +CoswayUtilname: CoswayUtil +version: '1.3-BETA' main: CoswayUtil.CoswayUtil description: "utility plugin for Cosway servers, a yescraft network server" api-version: '1.21' diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/CoswayUtil.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/CoswayUtil.class.uniqueId0 index 91171a8..9479b77 100644 Binary files a/build/tmp/compileJava/compileTransaction/stash-dir/CoswayUtil.class.uniqueId0 and b/build/tmp/compileJava/compileTransaction/stash-dir/CoswayUtil.class.uniqueId0 differ diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index f0c61fd..b2b2f9a 100644 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/src/main/java/CoswayUtil/CoswayUtil.java b/src/main/java/CoswayUtil/CoswayUtil.java index 3914289..fc5e2b5 100644 --- a/src/main/java/CoswayUtil/CoswayUtil.java +++ b/src/main/java/CoswayUtil/CoswayUtil.java @@ -1,21 +1,42 @@ package CoswayUtil; -import org.bukkit.Bukkit; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Monster; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; +import org.bukkit.*; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; +import java.util.*; import org.jetbrains.annotations.NotNull; +import java.util.HashMap; +import java.util.Map; + public final class CoswayUtil extends JavaPlugin { @Override public void onEnable() { serverMessage(ColorKey("&aaw sheit here we go again....")); + Bukkit.getPluginManager().registerEvents(new AnchorShield(), this); + } @@ -76,4 +97,124 @@ public final class CoswayUtil extends JavaPlugin { public void serverMessage(String msg) { getServer().broadcastMessage(prefix()+msg); } + + + public class AnchorShield implements Listener { + private final Map activeAnchors = new HashMap<>(); + private final int RING_RADIUS = 15; + private final int FUEL_DECREASE_TIME = 5 * 60 * 20; // 5 minutes in ticks + + public void startDetectionLoop() { + new BukkitRunnable() { + @Override + public void run() { + for (World world : Bukkit.getWorlds()) { + for (Chunk chunk : world.getLoadedChunks()) { + for (BlockState state : chunk.getTileEntities()) { + if (state.getBlock().getType() == Material.RESPAWN_ANCHOR) { + Location anchorLoc = state.getLocation(); + if (isMultiBlock(anchorLoc)) { + manageAnchor(anchorLoc); + } + } + } + } + } + } + }.runTaskTimer(CoswayUtil.this, 0, 100); // Run every 5 seconds + } + + private boolean isMultiBlock(Location loc) { + return loc.getBlock().getType() == Material.RESPAWN_ANCHOR && + loc.clone().add(0, 1, 0).getBlock().getType() == Material.LIGHTNING_ROD && + loc.clone().add(0, 2, 0).getBlock().getType() == Material.NETHERITE_BLOCK; // Assuming Heavy Core + } + + private void manageAnchor(Location loc) { + if (!activeAnchors.containsKey(loc)) { + ArmorStand marker = spawnMarker(loc); + activeAnchors.put(loc, marker); + startFuelTimer(loc); + } + + int fuelLevel = loc.getBlock().getBlockData().getAsString().contains("charges=") ? + Integer.parseInt(loc.getBlock().getBlockData().getAsString().split("charges=")[1].substring(0, 1)) : 0; + + if (fuelLevel > 0) { + createParticleRing(loc); + killHostileMobs(loc); + } + } + + private ArmorStand spawnMarker(Location loc) { + ArmorStand marker = loc.getWorld().spawn(loc.add(0.5, 1, 0.5), ArmorStand.class); + marker.setInvisible(true); + marker.setInvulnerable(true); + marker.setMarker(true); + return marker; + } + + private void createParticleRing(Location loc) { + for (int i = 0; i < 360; i += 10) { + double radians = Math.toRadians(i); + double x = loc.getX() + RING_RADIUS * Math.cos(radians); + double z = loc.getZ() + RING_RADIUS * Math.sin(radians); + Location particleLoc = new Location(loc.getWorld(), x, loc.getY() + 1, z); + loc.getWorld().spawnParticle(Particle.CRIT, particleLoc, 1, new Particle.DustOptions(Color.RED, 1)); + } + } + + private void killHostileMobs(Location loc) { + loc.getWorld().getEntitiesByClass(Monster.class).forEach(mob -> { + if (mob.getLocation().distance(loc) <= RING_RADIUS) { + mob.remove(); + } + }); + } + + private void startFuelTimer(Location loc) { + new BukkitRunnable() { + @Override + public void run() { + if (!activeAnchors.containsKey(loc)) { + cancel(); + return; + } + + Block block = loc.getBlock(); + if (block.getType() != Material.RESPAWN_ANCHOR) { + removeMarker(loc); + cancel(); + return; + } + + int fuelLevel = block.getBlockData().getAsString().contains("charges=") ? + Integer.parseInt(block.getBlockData().getAsString().split("charges=")[1].substring(0, 1)) : 0; + + if (fuelLevel > 0) { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "data merge block " + loc.getBlockX() + " " + loc.getBlockY() + " " + loc.getBlockZ() + " {Charges:" + (fuelLevel - 1) + "}"); + } else { + removeMarker(loc); + cancel(); + } + } + }.runTaskTimer(CoswayUtil.this, FUEL_DECREASE_TIME, FUEL_DECREASE_TIME); + } + + private void removeMarker(Location loc) { + if (activeAnchors.containsKey(loc)) { + activeAnchors.get(loc).remove(); + activeAnchors.remove(loc); + } + } + + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { + Location loc = event.getBlock().getLocation(); + if (activeAnchors.containsKey(loc) || isMultiBlock(loc)) { + removeMarker(loc); + } + } + } + } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d4bb5e4..a3509e5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ -name: CoswayUtil -version: '1.2-BETA' +CoswayUtilname: CoswayUtil +version: '1.3-BETA' main: CoswayUtil.CoswayUtil description: "utility plugin for Cosway servers, a yescraft network server" api-version: '1.21'