diff --git a/BauSystem_12/src/de/steamwar/bausystem/world/Region_12.java b/BauSystem_12/src/de/steamwar/bausystem/world/Region_12.java index 5170fb2..bfd38c6 100644 --- a/BauSystem_12/src/de/steamwar/bausystem/world/Region_12.java +++ b/BauSystem_12/src/de/steamwar/bausystem/world/Region_12.java @@ -36,7 +36,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.Objects; -public class Region_12 { +class Region_12 { private Region_12(){} static void paste(File file, int x, int y, int z, boolean rotate){ diff --git a/BauSystem_15/src/de/steamwar/bausystem/world/Region_15.java b/BauSystem_15/src/de/steamwar/bausystem/world/Region_15.java index e2998ec..cbec486 100644 --- a/BauSystem_15/src/de/steamwar/bausystem/world/Region_15.java +++ b/BauSystem_15/src/de/steamwar/bausystem/world/Region_15.java @@ -43,7 +43,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.Objects; -public class Region_15 { +class Region_15 { private Region_15(){} static void paste(File file, int x, int y, int z, boolean rotate){ diff --git a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 17e52b1..9a7276b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -29,7 +29,6 @@ import org.bukkit.Bukkit; import org.bukkit.GameRule; import org.bukkit.Material; import org.bukkit.attribute.Attribute; -import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -43,18 +42,13 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitTask; -import java.io.File; -import java.io.IOException; -import java.util.List; import java.util.UUID; import java.util.logging.Level; public class BauSystem extends JavaPlugin implements Listener { private static BauSystem plugin; private static UUID owner; - private static List sections; public static final String PREFIX = "§eBauSystem§8» §7"; - public static final String SECTION_PATH = "/home/minecraft/backbone/server/UserBau/"; private BukkitTask autoShutdown; @@ -62,23 +56,10 @@ public class BauSystem extends JavaPlugin implements Listener { public void onEnable() { plugin = this; - String worldName = Bukkit.getWorlds().get(0).getName(); try { - owner = UUID.fromString(worldName); - sections = ArenaSection.loadFromFile(new File(Bukkit.getWorldContainer().getPath() + '/' + getOwner().toString() + "/sections.yml")); + owner = UUID.fromString(Bukkit.getWorlds().get(0).getName()); } catch (IllegalArgumentException e) { - try { - owner = null; - sections = ArenaSection.loadFromFile(new File(Bukkit.getWorldContainer().getPath() + '/' + worldName + "/sections.yml")); - } catch (IOException | InvalidConfigurationException ex) { - getLogger().log(Level.SEVERE, "owner is no UUID / failed to load sections.yml", e); - Bukkit.shutdown(); - return; - } - } catch (InvalidConfigurationException | IOException e) { - getLogger().log(Level.SEVERE, "Failed to load sections.yml", e); - Bukkit.shutdown(); - return; + owner = null; } try { @@ -143,10 +124,6 @@ public class BauSystem extends JavaPlugin implements Listener { return owner; } - public static List getSections() { - return sections; - } - public static int getOwnerID() { return SteamwarUser.get(getOwner()).getId(); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandProtect.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandProtect.java index b24b8e8..f12afb7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandProtect.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandProtect.java @@ -21,13 +21,17 @@ package de.steamwar.bausystem.commands; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.world.ArenaSection; +import de.steamwar.bausystem.world.Region; import de.steamwar.bausystem.world.Welt; +import de.steamwar.sql.Schematic; +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.logging.Level; + public class CommandProtect implements CommandExecutor { @Override @@ -41,10 +45,23 @@ public class CommandProtect implements CommandExecutor { return false; } - for(ArenaSection section : BauSystem.getSections()){ - if(section.inRegion(player.getLocation()) && section.hasProtection()){ - section.protect(); - player.sendMessage(BauSystem.PREFIX + "§7Boden geschützt"); + for(Region region : Region.getRegions()){ + if(region.inRegion(player.getLocation()) && region.hasProtection()){ + try { + Schematic schem = null; + if(args.length > 0){ + schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); + if(schem == null){ + player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); + return false; + } + } + region.protect(schem); + player.sendMessage(BauSystem.PREFIX + "§7Boden geschützt"); + }catch(Exception e){ + player.sendMessage(BauSystem.PREFIX + "§cFehler beim Schützen der Region"); + Bukkit.getLogger().log(Level.WARNING, "Failed protect", e); + } return false; } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandReset.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandReset.java index 9967c14..3844887 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandReset.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandReset.java @@ -21,7 +21,7 @@ package de.steamwar.bausystem.commands; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.world.ArenaSection; +import de.steamwar.bausystem.world.Region; import de.steamwar.bausystem.world.Welt; import de.steamwar.sql.Schematic; import org.bukkit.Bukkit; @@ -45,8 +45,8 @@ public class CommandReset implements CommandExecutor { return false; } - for(ArenaSection section : BauSystem.getSections()){ - if(section.inRegion(player.getLocation())){ + for(Region region : Region.getRegions()){ + if(region.inRegion(player.getLocation()) && region.hasProtection()){ try { if(args.length > 0){ Schematic schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); @@ -54,9 +54,9 @@ public class CommandReset implements CommandExecutor { player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); return false; } - section.reset(schem); + region.reset(schem); }else{ - section.fastreset(); + region.fastreset(); } player.sendMessage(BauSystem.PREFIX + "§7Region zurückgesetzt"); }catch(Exception e){ diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTestblock.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTestblock.java index cffac99..9d0bc15 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTestblock.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTestblock.java @@ -21,16 +21,16 @@ package de.steamwar.bausystem.commands; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.world.ArenaSection; +import de.steamwar.bausystem.world.Region; import de.steamwar.bausystem.world.Welt; -import de.steamwar.sql.NoClipboardException; import de.steamwar.sql.Schematic; +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.io.IOException; +import java.util.logging.Level; public class CommandTestblock implements CommandExecutor { @@ -45,24 +45,23 @@ public class CommandTestblock implements CommandExecutor { return false; } - for(ArenaSection section : BauSystem.getSections()){ - if(section.inRegion(player.getLocation())){ - if(args.length > 0){ - Schematic schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); - if(schem == null){ - player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); - return false; + for(Region region : Region.getRegions()){ + if(region.inRegion(player.getLocation()) && region.hasProtection()){ + try { + Schematic schem = null; + if(args.length > 0){ + schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); + if(schem == null){ + player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); + return false; + } } - try { - section.getTestblock().reset(schem); - } catch (IOException | NoClipboardException e) { - player.sendMessage(BauSystem.PREFIX + "§cFehler beim Laden der Schematic"); - throw new SecurityException("Failed to load Testblock Schematic", e); - } - }else{ - section.getTestblock().reset(); + region.resetTestblock(schem); + player.sendMessage(BauSystem.PREFIX + "§7Testblock zurückgesetzt"); + }catch(Exception e){ + player.sendMessage(BauSystem.PREFIX + "§cFehler beim Zurücksetzen des Testblocks"); + Bukkit.getLogger().log(Level.WARNING, "Failed testblock", e); } - player.sendMessage(BauSystem.PREFIX + "§7Testblock zurückgesetzt"); return false; } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/ArenaSection.java b/BauSystem_Main/src/de/steamwar/bausystem/world/ArenaSection.java deleted file mode 100644 index f1bdc3d..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/ArenaSection.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - This file is a part of the SteamWar software. - - Copyright (C) 2020 SteamWar.de-Serverteam - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -package de.steamwar.bausystem.world; - -import de.steamwar.bausystem.BauSystem; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -public class ArenaSection extends Region { - - private final Region testblock; - private final String protectSchematic; - - private ArenaSection(ConfigurationSection config) { - super(config); - testblock = new Region(Objects.requireNonNull(config.getConfigurationSection("testblock"))); - protectSchematic = config.getString("protection"); - } - - public Region getTestblock(){ - return testblock; - } - - public static List loadFromFile(File file) throws IOException, InvalidConfigurationException { - YamlConfiguration config = new YamlConfiguration(); - config.load(file); - List list = new ArrayList<>(); - for(String section : config.getKeys(false)) - list.add(new ArenaSection(config.getConfigurationSection(section))); - return list; - } - - public boolean hasProtection(){ - return !protectSchematic.equals(""); - } - - public void protect(){ - File file = new File(BauSystem.SECTION_PATH + protectSchematic); - paste(file, minX + sizeX/2, testblock.minY-1, minZ + sizeZ/2, rotate); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java b/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java index 76af805..5bc4449 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java @@ -20,88 +20,195 @@ package de.steamwar.bausystem.world; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import de.steamwar.bausystem.BauSystem; import de.steamwar.core.Core; import de.steamwar.sql.NoClipboardException; import de.steamwar.sql.Schematic; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.IOException; +import java.util.*; +import java.util.logging.Level; public class Region { - final int sizeX; - private final int sizeY; - final int sizeZ; - final int minX; - final int minY; - final int minZ; + private static final List regions = new ArrayList<>(); - private final String schematic; - final boolean rotate; + static{ + YamlConfiguration config = new YamlConfiguration(); + try { + config.load(new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections.yml")); + } catch (InvalidConfigurationException | IOException e) { + Bukkit.getLogger().log(Level.SEVERE, "Failed to load sections.yml", e); + } - Region(ConfigurationSection config){ - sizeX = config.getInt("sizeX"); - sizeY = config.getInt("sizeY"); - sizeZ = config.getInt("sizeZ"); + ConfigurationSection prototypes = config.getConfigurationSection("prototypes"); + assert prototypes != null; + for(String prototype : prototypes.getKeys(false)){ + new Prototype(Objects.requireNonNull(prototypes.getConfigurationSection(prototype))); + } + + ConfigurationSection regions = config.getConfigurationSection("regions"); + assert regions != null; + for(String region : regions.getKeys(false)){ + new Region(Objects.requireNonNull(regions.getConfigurationSection(region))); + } + } + + public static List getRegions(){ + return regions; + } + + private final int minX; + private final int minY; + private final int minZ; + private final Prototype prototype; + + private Region(ConfigurationSection config){ minX = config.getInt("minX"); minY = config.getInt("minY"); minZ = config.getInt("minZ"); - schematic = config.getString("schematic"); - rotate = config.getBoolean("rotate"); + prototype = Prototype.prototypes.get(config.getString("prototype")); + regions.add(this); } public boolean inRegion(Location l){ - return inRange(l.getX(), minX, sizeX) && inRange(l.getY(), minY, sizeY) && inRange(l.getZ(), minZ, sizeZ); - } - - private boolean inRange(double l, int min, int size){ - return min <= l && l <= min + size; + return prototype.inRegion(this, l); } public void fastreset(){ - File file = new File(BauSystem.SECTION_PATH + schematic); - fastpaste(file, minX + sizeX/2, minY, minZ + sizeZ/2, rotate); - } - - public void reset(){ - File file = new File(BauSystem.SECTION_PATH + schematic); - paste(file, minX + sizeX/2, minY, minZ + sizeZ/2, rotate); + prototype.fastreset(this); } public void reset(Schematic schem) throws IOException, NoClipboardException { - paste(schem.load(), minX + sizeX/2, minY, minZ + sizeZ/2, rotate); + prototype.reset(this, schem); } - static void paste(File file, int x, int y, int z, boolean rotate){ - switch(Core.getVersion()){ - case 15: - Region_15.paste(file, x, y, z, rotate); - break; - default: - Region_12.paste(file, x, y, z, rotate); + public void resetTestblock(Schematic schem) throws IOException, NoClipboardException{ + prototype.resetTestblock(this, schem); + } + + public boolean hasProtection(){ + return prototype.hasProtection(); + } + + public void protect(Schematic schem) throws IOException, NoClipboardException { + prototype.protect(this, schem); + } + + public static class Prototype{ + private static final String SECTION_PATH = "/home/minecraft/backbone/server/UserBau/"; + private static final Map prototypes = new HashMap<>(); + + private final int sizeX; + private final int sizeY; + private final int sizeZ; + + private final int offsetX; + private final int offsetY; + private final int offsetZ; + + private final String schematic; + private final boolean rotate; + + private final Prototype testblock; //nullable + private final String protectSchematic; //nullable + + private Prototype(ConfigurationSection config){ + sizeX = config.getInt("sizeX"); + sizeY = config.getInt("sizeY"); + sizeZ = config.getInt("sizeZ"); + schematic = config.getString("schematic"); + offsetX = config.getInt("offsetX", 0); + offsetY = config.getInt("offsetY", 0); + offsetZ = config.getInt("offsetZ", 0); + rotate = config.getBoolean("rotate", false); + + ConfigurationSection testblockSection = config.getConfigurationSection("testblock"); + testblock = testblockSection != null ? new Prototype(testblockSection) : null; + protectSchematic = config.getString("protection", null); + + if(!config.getName().equals("testblock")) + prototypes.put(config.getName(), this); } - } - private static void fastpaste(File file, int x, int y, int z, boolean rotate){ - switch(Core.getVersion()){ - case 15: - Region_15.fastpaste(file, x, y, z, rotate); - break; - default: - Region_12.paste(file, x, y, z, rotate); + public boolean inRegion(Region region, Location l){ + return inRange(l.getX(), region.minX + offsetX, sizeX + offsetX) && + inRange(l.getY(), region.minY + offsetY, sizeY + offsetY) && + inRange(l.getZ(), region.minZ + offsetZ, sizeZ + offsetZ); } - } - private static void paste(Clipboard clipboard, int x, int y, int z, boolean rotate){ - switch(Core.getVersion()){ - case 15: - Region_15.paste(clipboard, x, y, z, rotate); - break; - default: - Region_12.paste(clipboard, x, y, z, rotate); + public void fastreset(Region region){ + File file = new File(SECTION_PATH + schematic); + int x = region.minX + offsetX + sizeX/2; + int y = region.minY + offsetY; + int z = region.minZ + offsetZ + sizeZ/2; + switch(Core.getVersion()){ + case 12: + Region_12.paste(file, x, y, z, rotate); + break; + case 15: + default: + Region_15.fastpaste(file, x, y, z, rotate); + } + } + + public void reset(Region region, Schematic schem) throws IOException, NoClipboardException { + int x = region.minX + offsetX + sizeX / 2; + int y = region.minY + offsetY; + int z = region.minZ + offsetZ + sizeZ / 2; + if(schem == null) + paste(new File(SECTION_PATH + schematic), x, y, z, rotate); + else + paste(schem.load(), x, y, z, rotate); + } + + public boolean hasProtection(){ + return protectSchematic != null; + } + + public void protect(Region region, Schematic schem) throws IOException, NoClipboardException { + int x = region.minX + offsetX + sizeX / 2; + int y = region.minY + testblock.offsetY - 1; + int z = region.minZ + offsetZ + sizeZ / 2; + if(schem == null) + paste(new File(SECTION_PATH + protectSchematic), x, y, z, rotate); + else + paste(schem.load(), x, y, z, rotate); + } + + public void resetTestblock(Region region, Schematic schem) throws IOException, NoClipboardException { + testblock.reset(region, schem); + } + + private static boolean inRange(double l, int min, int size){ + return min <= l && l <= min + size; + } + + private static void paste(File file, int x, int y, int z, boolean rotate){ //Type of protect + switch(Core.getVersion()){ + case 12: + Region_12.paste(file, x, y, z, rotate); + break; + case 15: + default: + Region_15.paste(file, x, y, z, rotate); + } + } + + private static void paste(Clipboard clipboard, int x, int y, int z, boolean rotate){ + switch(Core.getVersion()){ + case 12: + Region_12.paste(clipboard, x, y, z, rotate); + break; + case 15: + default: + Region_15.paste(clipboard, x, y, z, rotate); + } } } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java index 32b54c1..0719a4f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java @@ -23,23 +23,15 @@ package de.steamwar.bausystem.world; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.core.Core; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BookMeta; - -import java.util.logging.Level; public class RegionListener implements Listener { @@ -53,13 +45,7 @@ public class RegionListener implements Listener { if (Welt.noPermission(p, Permission.worldedit)){ p.sendMessage(BauSystem.PREFIX + "§cDu darfst hier kein WorldEdit benutzen"); e.setCancelled(true); - return; } - - /*if(!CommandFreeze.getInstance().isOn() && !Bukkit.getPluginManager().isPluginEnabled("FastAsyncWorldEdit")){ - CommandFreeze.getInstance().toggle(); - Bukkit.getScheduler().runTaskLater(BauSystem.getPlugin(), CommandFreeze.getInstance()::toggle, 3); - }*/ } @EventHandler(priority = EventPriority.LOWEST) @@ -112,5 +98,4 @@ public class RegionListener implements Listener { event.setLine(i, line); } } - }