diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectCommand.java new file mode 100644 index 00000000..7907bdb7 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectCommand.java @@ -0,0 +1,67 @@ +package de.steamwar.bausystem.features.region; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.Permission; +import de.steamwar.bausystem.linkage.LinkageType; +import de.steamwar.bausystem.linkage.Linked; +import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.RegionUtils; +import de.steamwar.bausystem.region.flags.Flag; +import de.steamwar.bausystem.region.flags.flagvalues.ProtectMode; +import de.steamwar.command.SWCommand; +import de.steamwar.sql.Schematic; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.io.IOException; +import java.util.logging.Level; + +@Linked(LinkageType.COMMAND) +public class ProtectCommand extends SWCommand { + + public ProtectCommand() { + super("protect"); + } + + @Register(help = true) + public void genericHelp(Player p, String... args) { + p.sendMessage("§8/§eprotect §8- §7Schütze die Region"); + p.sendMessage("§8/§eprotect §8[§7Schematic§8] §8- §7Schütze die Region mit einer Schematic"); + } + + @Register + public void genericProtectCommand(Player p) { + if (!permissionCheck(p)) return; + Region region = regionCheck(p); + if (region == null) return; + switch (region.getPlain(Flag.PROTECT, ProtectMode.class)) { + case ACTIVE: + region.set(Flag.PROTECT, ProtectMode.INACTIVE); + RegionUtils.actionBar(region, "§cBoden Schutz aufgehoben"); + break; + default: + case INACTIVE: + region.set(Flag.PROTECT, ProtectMode.ACTIVE); + RegionUtils.actionBar(region, "§cBoden Schutz aufgehoben"); + break; + } + } + + private boolean permissionCheck(Player player) { + if (!Permission.hasPermission(player, Permission.WORLDEDIT)) { + player.sendMessage(BauSystem.PREFIX + "§cDu darfst hier nicht den Boden schützen"); + return false; + } + return true; + } + + private Region regionCheck(Player player) { + Region region = Region.getRegion(player.getLocation()); + if (region.getFloorLevel() == 0) { + player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner (M)WG-Region"); + return null; + } + return region; + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectListener.java new file mode 100644 index 00000000..39af48b2 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectListener.java @@ -0,0 +1,27 @@ +package de.steamwar.bausystem.features.region; + +import de.steamwar.bausystem.linkage.LinkageType; +import de.steamwar.bausystem.linkage.Linked; +import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.flags.Flag; +import de.steamwar.bausystem.region.flags.flagvalues.ProtectMode; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityExplodeEvent; + +@Linked(LinkageType.LISTENER) +public class ProtectListener implements Listener { + + @EventHandler + public void onExplode(EntityExplodeEvent event) { + Region region = Region.getRegion(event.getLocation()); + if (region.getFloorLevel() == 0) { + return; + } + if (region.getPlain(Flag.PROTECT, ProtectMode.class) == ProtectMode.INACTIVE) { + return; + } + event.blockList().removeIf(block -> block.getY() < region.getFloorLevel()); + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java b/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java index 81439d6e..a00a0ec3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java @@ -73,6 +73,9 @@ public class Region { private Point minPointBuildExtension; private Point maxPointBuildExtension; + private int floorLevel; + private int waterLevel; + private String linkedRegionName = null; // Nullable private Region linkedRegion = null; // Nullable @@ -136,6 +139,18 @@ public class Region { this.minPointBuildExtension = this.minPointBuild.substract(prototype.getBuild().getExtensionNegativeX(), prototype.getBuild().getExtensionNegativeY(), prototype.getBuild().getExtensionNegativeZ()); this.maxPointBuildExtension = this.maxPointBuild.add(prototype.getBuild().getExtensionPositiveX(), prototype.getBuild().getExtensionPositiveY(), prototype.getBuild().getExtensionPositiveZ()); } + + if (prototype.getFloorOffset() != 0) { + floorLevel = minPoint.getY() + prototype.getFloorOffset(); + } else { + floorLevel = 0; + } + + if (prototype.getWaterOffset() != 0) { + waterLevel = minPoint.getY() + prototype.getWaterOffset(); + } else { + waterLevel = 0; + } } public boolean inRegion(Location location, RegionType regionType, RegionExtensionType regionExtensionType) {