diff --git a/build.gradle.kts b/build.gradle.kts index 43548fc..5b020ec 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,7 +29,7 @@ dependencies { group = "net.countercraft.movecraft.worldguard" version = "1.0.0_beta-5" description = "Movecraft-WorldGuard" -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java.toolchain.languageVersion = JavaLanguageVersion.of(21) tasks.jar { archiveBaseName.set("Movecraft-WorldGuard") diff --git a/src/main/java/net/countercraft/movecraft/worldguard/CustomFlags.java b/src/main/java/net/countercraft/movecraft/worldguard/CustomFlags.java index 179004e..7c074c8 100644 --- a/src/main/java/net/countercraft/movecraft/worldguard/CustomFlags.java +++ b/src/main/java/net/countercraft/movecraft/worldguard/CustomFlags.java @@ -13,6 +13,7 @@ public class CustomFlags { public static final StateFlag ALLOW_CRAFT_SINK = new StateFlag("allow-craft-sink", false); public static final StateFlag ALLOW_CRAFT_TRANSLATE = new StateFlag("allow-craft-translate", false); public static final StateFlag ALLOW_CRAFT_REPAIR = new StateFlag("allow-craft-repair", false); + public static final StateFlag ALLOW_CRAFT_COMBAT = new StateFlag("allow-craft-combat", false); public static void register() { try { @@ -23,6 +24,7 @@ public static void register() { registry.register(ALLOW_CRAFT_SINK); registry.register(ALLOW_CRAFT_TRANSLATE); registry.register(ALLOW_CRAFT_REPAIR); + registry.register(ALLOW_CRAFT_COMBAT); } catch (Exception e) { MovecraftWorldGuard.getInstance().getLogger().log( diff --git a/src/main/java/net/countercraft/movecraft/worldguard/MovecraftWorldGuard.java b/src/main/java/net/countercraft/movecraft/worldguard/MovecraftWorldGuard.java index e81c901..d0c287e 100644 --- a/src/main/java/net/countercraft/movecraft/worldguard/MovecraftWorldGuard.java +++ b/src/main/java/net/countercraft/movecraft/worldguard/MovecraftWorldGuard.java @@ -71,7 +71,9 @@ public void onEnable() { getServer().getPluginManager().registerEvents(new CraftRotateListener(), this); getServer().getPluginManager().registerEvents(new CraftSinkListener(), this); getServer().getPluginManager().registerEvents(new CraftTranslateListener(), this); + getServer().getPluginManager().registerEvents(new FireSpreadListener(), this); getServer().getPluginManager().registerEvents(new ExplosionListener(), this); + getServer().getPluginManager().registerEvents(new ProjectileHitListener(), this); } public WorldGuardUtils getWGUtils() { diff --git a/src/main/java/net/countercraft/movecraft/worldguard/listener/ExplosionListener.java b/src/main/java/net/countercraft/movecraft/worldguard/listener/ExplosionListener.java index e883b8f..be0799e 100644 --- a/src/main/java/net/countercraft/movecraft/worldguard/listener/ExplosionListener.java +++ b/src/main/java/net/countercraft/movecraft/worldguard/listener/ExplosionListener.java @@ -1,10 +1,30 @@ package net.countercraft.movecraft.worldguard.listener; import com.sk89q.worldguard.protection.flags.Flags; +import com.sk89q.worldguard.protection.flags.StateFlag; +import net.countercraft.movecraft.MovecraftLocation; +import net.countercraft.movecraft.craft.Craft; +import net.countercraft.movecraft.craft.CraftManager; import net.countercraft.movecraft.events.ExplosionEvent; +import net.countercraft.movecraft.util.MathUtils; +import net.countercraft.movecraft.worldguard.CustomFlags; import net.countercraft.movecraft.worldguard.MovecraftWorldGuard; +import net.countercraft.movecraft.worldguard.utils.WorldGuardUtils; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockExplodeEvent; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.jetbrains.annotations.NotNull; + +import javax.swing.text.html.parser.Entity; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Set; public class ExplosionListener implements Listener { @EventHandler @@ -22,4 +42,24 @@ public void onExplosion(ExplosionEvent e) { break; } } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onEntityExplosion(EntityExplodeEvent e) { + e.blockList().removeAll(getProtectedBlocks(e.blockList())); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onTorpedoExplosion(BlockExplodeEvent e) { + e.blockList().removeAll(getProtectedBlocks(e.blockList())); + } + + private List getProtectedBlocks(List blocks) { + List protectedBlocks = new ArrayList<>(); + for (Block block : blocks) { + if (MovecraftWorldGuard.getInstance().getWGUtils().isProtectedFromBreak(block)) { + protectedBlocks.add(block); + } + } + return protectedBlocks; + } } diff --git a/src/main/java/net/countercraft/movecraft/worldguard/listener/FireSpreadListener.java b/src/main/java/net/countercraft/movecraft/worldguard/listener/FireSpreadListener.java new file mode 100644 index 0000000..1119c0d --- /dev/null +++ b/src/main/java/net/countercraft/movecraft/worldguard/listener/FireSpreadListener.java @@ -0,0 +1,26 @@ +package net.countercraft.movecraft.worldguard.listener; + +import net.countercraft.movecraft.MovecraftLocation; +import net.countercraft.movecraft.craft.Craft; +import net.countercraft.movecraft.craft.CraftManager; +import net.countercraft.movecraft.util.MathUtils; +import net.countercraft.movecraft.worldguard.CustomFlags; +import net.countercraft.movecraft.worldguard.MovecraftWorldGuard; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.block.BlockSpreadEvent; + +public class FireSpreadListener implements Listener { + @EventHandler + public void onIgnite(BlockIgniteEvent event) { + event.setCancelled(MovecraftWorldGuard.getInstance().getWGUtils().isProtectedFromBreak(event.getBlock())); + } + + @EventHandler + public void onBurn(BlockBurnEvent event) { + event.setCancelled(MovecraftWorldGuard.getInstance().getWGUtils().isProtectedFromBreak(event.getBlock())); + } +} diff --git a/src/main/java/net/countercraft/movecraft/worldguard/listener/ProjectileHitListener.java b/src/main/java/net/countercraft/movecraft/worldguard/listener/ProjectileHitListener.java new file mode 100644 index 0000000..524c2ce --- /dev/null +++ b/src/main/java/net/countercraft/movecraft/worldguard/listener/ProjectileHitListener.java @@ -0,0 +1,16 @@ +package net.countercraft.movecraft.worldguard.listener; + +import net.countercraft.movecraft.worldguard.MovecraftWorldGuard; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.ProjectileHitEvent; + +public class ProjectileHitListener implements Listener { + @EventHandler + public void onProjectileHit(ProjectileHitEvent event) { + if (event.getHitBlock() == null) { + return; + } + event.setCancelled(MovecraftWorldGuard.getInstance().getWGUtils().isProtectedFromBreak(event.getHitBlock())); + } +} diff --git a/src/main/java/net/countercraft/movecraft/worldguard/utils/WorldGuardUtils.java b/src/main/java/net/countercraft/movecraft/worldguard/utils/WorldGuardUtils.java index b57a3c1..437c898 100644 --- a/src/main/java/net/countercraft/movecraft/worldguard/utils/WorldGuardUtils.java +++ b/src/main/java/net/countercraft/movecraft/worldguard/utils/WorldGuardUtils.java @@ -14,13 +14,18 @@ import com.sk89q.worldguard.protection.regions.RegionQuery; import net.countercraft.movecraft.MovecraftLocation; import net.countercraft.movecraft.craft.Craft; +import net.countercraft.movecraft.craft.CraftManager; import net.countercraft.movecraft.exception.EmptyHitBoxException; +import net.countercraft.movecraft.util.MathUtils; import net.countercraft.movecraft.util.Pair; import net.countercraft.movecraft.util.hitboxes.HitBox; +import net.countercraft.movecraft.worldguard.CustomFlags; +import net.countercraft.movecraft.worldguard.MovecraftWorldGuard; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.World; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; @@ -405,4 +410,41 @@ private Set getHitboxCorners(@NotNull HitBox hitbox) throws E } return corners; } + + /** + * @param block Block to check + * @return A boolean that determines if the block is protected from breaking. + */ + @NotNull + public boolean isProtectedFromBreak(Block block) { + MovecraftLocation loc = MathUtils.bukkit2MovecraftLoc(block.getLocation()); + Craft craft = MathUtils.fastNearestCraftToLoc( + CraftManager.getInstance().getCraftsInWorld(block.getWorld()), + block.getLocation() + ); + switch (MovecraftWorldGuard.getInstance().getWGUtils().getState( + null, block.getLocation(), CustomFlags.ALLOW_CRAFT_COMBAT)) { + case ALLOW: + // Protect the area outside the craft + if (craft == null) { + return true; + } + if (!craft.getHitBox().contains(loc)) { + return true; + } + break; + case DENY: + // Protect the block if fire occurs inside craft + if (craft == null) { + break; + } + if (craft.getHitBox().contains(loc)) { + return true; + } + break; + default: + break; + } + return false; + } }