Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<Block> getProtectedBlocks(List<Block> blocks) {
List<Block> protectedBlocks = new ArrayList<>();
for (Block block : blocks) {
if (MovecraftWorldGuard.getInstance().getWGUtils().isProtectedFromBreak(block)) {
protectedBlocks.add(block);
}
}
return protectedBlocks;
}
}
Original file line number Diff line number Diff line change
@@ -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()));
}
}
Original file line number Diff line number Diff line change
@@ -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()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -405,4 +410,41 @@ private Set<MovecraftLocation> 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;
}
}