From 09f7711fe2e903f1d21b2d82af7fa011aa879e5d Mon Sep 17 00:00:00 2001 From: Lixfel Date: Mon, 9 Dec 2019 12:01:33 +0100 Subject: [PATCH] Schematic Rework --- .../fightsystem/fight/FightTeam_12.java | 46 ++----------------- .../fightsystem/fight/FightTeam_14.java | 40 ++++++++-------- .../fightsystem/fight/FightTeam_8.java | 35 ++++++-------- .../steamwar/fightsystem/fight/FightTeam.java | 31 ++++++++----- 4 files changed, 59 insertions(+), 93 deletions(-) diff --git a/FightSystem_12/src/de/steamwar/fightsystem/fight/FightTeam_12.java b/FightSystem_12/src/de/steamwar/fightsystem/fight/FightTeam_12.java index 71cd313..933e4fd 100644 --- a/FightSystem_12/src/de/steamwar/fightsystem/fight/FightTeam_12.java +++ b/FightSystem_12/src/de/steamwar/fightsystem/fight/FightTeam_12.java @@ -1,25 +1,20 @@ package de.steamwar.fightsystem.fight; -import com.boydti.fawe.FaweAPI; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.bukkit.BukkitWorld; -import com.sk89q.worldedit.math.transform.AffineTransform; import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.world.World; import de.steamwar.fightsystem.Config; -import org.bukkit.Bukkit; +import de.steamwar.sql.NoClipboardException; +import de.steamwar.sql.Schematic; import org.bukkit.ChatColor; import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.scoreboard.Team; -import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.Set; -import java.util.logging.Level; public class FightTeam_12 { private FightTeam_12(){} @@ -50,40 +45,7 @@ public class FightTeam_12 { e.replaceBlocks(region, CONCRETE_POWDER_SET, new BaseBlock(CONCRETE_POWDER.getId(), c.getWoolData())); } - static EditSession pasteSchematic(File file, int pasteX, int pasteY, int pasteZ, boolean rotate){ - com.boydti.fawe.object.schematic.Schematic schem; - Vector paste = new Vector(pasteX, pasteY, pasteZ); - try { - schem = FaweAPI.load(file); - if(schem.getClipboard() == null) - throw new IOException(); - }catch(IOException e){ - Bukkit.getLogger().log(Level.SEVERE, "Failed loading Schematic", e); - return null; - } - - World w = new BukkitWorld(Bukkit.getWorlds().get(0)); - Vector dimensions = schem.getClipboard().getDimensions(); - Vector v; - Vector offset = new Vector(schem.getClipboard().getRegion().getMinimumPoint()).subtract(schem.getClipboard().getOrigin()); - AffineTransform aT = new AffineTransform(); - if(rotate){ - aT = aT.rotateY(180); - v = paste.add(dimensions.getX()/2 + dimensions.getX()%2, 0, dimensions.getZ()/2 + dimensions.getZ()%2).subtract(offset.multiply(-1, 1, -1)).subtract(1, 0, 1); - }else{ - v = paste.subtract(dimensions.getX()/2 - dimensions.getX()%2, 0, dimensions.getZ()/2 - dimensions.getZ()%2).subtract(offset); - } - - if(Config.AlignWater){ - Vector it = schem.getClipboard().getMinimumPoint(); - int depth = 0; - while(!schem.getClipboard().getBlock(it).isAir()){ - depth++; - it = it.setY(it.getY()+1); - } - v = v.add(0, Config.WaterDepth - depth, 0); - } - - return schem.paste(w, v, false, true, aT); + static EditSession pasteSchematic(Schematic schematic, int pasteX, int pasteY, int pasteZ, boolean rotate) throws Schematic.WrongVersionException, IOException, NoClipboardException { + return FightTeam_8.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); } } diff --git a/FightSystem_14/src/de/steamwar/fightsystem/fight/FightTeam_14.java b/FightSystem_14/src/de/steamwar/fightsystem/fight/FightTeam_14.java index 0d06b54..0ad8aa7 100644 --- a/FightSystem_14/src/de/steamwar/fightsystem/fight/FightTeam_14.java +++ b/FightSystem_14/src/de/steamwar/fightsystem/fight/FightTeam_14.java @@ -1,25 +1,28 @@ package de.steamwar.fightsystem.fight; -import com.boydti.fawe.FaweAPI; import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.MaxChangedBlocksException; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.bukkit.BukkitWorld; +import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.transform.AffineTransform; import com.sk89q.worldedit.regions.CuboidRegion; +import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import de.steamwar.fightsystem.Config; +import de.steamwar.sql.NoClipboardException; +import de.steamwar.sql.Schematic; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.DyeColor; import org.bukkit.scoreboard.Team; -import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.Set; -import java.util.logging.Level; class FightTeam_14 { private FightTeam_14(){} @@ -48,22 +51,14 @@ class FightTeam_14 { e.replaceBlocks(region, CONCRETE_POWDER_SET, new BaseBlock(BlockState.get(c.name() + "_CONCRETE_POWDER"))); } - static EditSession pasteSchematic(File file, int pX, int pY, int pZ, boolean rotate){ + static EditSession pasteSchematic(Schematic schematic, int pX, int pY, int pZ, boolean rotate) throws Schematic.WrongVersionException, IOException, NoClipboardException { BlockVector3 paste = BlockVector3.at(pX, pY, pZ); - com.boydti.fawe.object.schematic.Schematic schem; - try { - schem = FaweAPI.load(file); - if(schem.getClipboard() == null) - throw new IOException(); - }catch(IOException e){ - Bukkit.getLogger().log(Level.SEVERE, "Failed loading Schematic", e); - return null; - } + Clipboard clipboard = schematic.load(); World w = new BukkitWorld(Bukkit.getWorlds().get(0)); - BlockVector3 dimensions = schem.getClipboard().getDimensions(); + BlockVector3 dimensions = clipboard.getDimensions(); BlockVector3 v; - BlockVector3 offset = schem.getClipboard().getRegion().getMinimumPoint().subtract(schem.getClipboard().getOrigin()); + BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()); AffineTransform aT = new AffineTransform(); if(rotate){ aT = aT.rotateY(180); @@ -73,15 +68,24 @@ class FightTeam_14 { } if(Config.AlignWater){ - BlockVector3 it = schem.getClipboard().getMinimumPoint(); + BlockVector3 it = clipboard.getMinimumPoint(); int depth = 0; - while(!schem.getClipboard().getBlock(it).getMaterial().isAir()){ + while(!clipboard.getBlock(it).getMaterial().isAir()){ depth++; it = it.add(0, 1, 0); } v = v.add(0, Config.WaterDepth - depth, 0); } - return schem.paste(w, v, false, true, aT); + EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); + ClipboardHolder ch = new ClipboardHolder(clipboard); + ch.setTransform(aT); + try { + ch.createPaste(e).to(v).build(); + } catch (MaxChangedBlocksException ex) { + throw new IOException(ex); + } + e.flushQueue(); + return e; } } diff --git a/FightSystem_8/src/de/steamwar/fightsystem/fight/FightTeam_8.java b/FightSystem_8/src/de/steamwar/fightsystem/fight/FightTeam_8.java index cce899a..bf4705a 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/fight/FightTeam_8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/fight/FightTeam_8.java @@ -3,12 +3,15 @@ package de.steamwar.fightsystem.fight; import com.sk89q.worldedit.*; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.bukkit.BukkitWorld; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.math.transform.AffineTransform; import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.schematic.SchematicFormat; -import com.sk89q.worldedit.world.DataException; +import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.world.World; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.IFightSystem; +import de.steamwar.sql.NoClipboardException; +import de.steamwar.sql.Schematic; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.DyeColor; @@ -20,11 +23,9 @@ import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.scoreboard.NameTagVisibility; import org.bukkit.scoreboard.Team; -import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.Set; -import java.util.logging.Level; class FightTeam_8 { private FightTeam_8(){} @@ -65,23 +66,17 @@ class FightTeam_8 { } } - static EditSession pasteSchematic(File file, int pasteX, int pasteY, int pasteZ, boolean rotate){ + static EditSession pasteSchematic(Schematic schematic, int pasteX, int pasteY, int pasteZ, boolean rotate) throws Schematic.WrongVersionException, IOException, NoClipboardException { Vector paste = new Vector(pasteX, pasteY, pasteZ); - CuboidClipboard clipboard; - - try { - clipboard = SchematicFormat.getFormat(file).load(file); - }catch(IOException | DataException e){ - Bukkit.getLogger().log(Level.SEVERE, "Failed loading Schematic", e); - return null; - } + Clipboard clipboard = schematic.load(); World w = new BukkitWorld(Bukkit.getWorlds().get(0)); - Vector dimensions = clipboard.getSize(); + Vector dimensions = clipboard.getDimensions(); Vector v; - Vector offset = new Vector(clipboard.getOffset()); + Vector offset = new Vector(clipboard.getOrigin()); + AffineTransform aT = new AffineTransform(); if(rotate){ - clipboard.rotate2D(180); + aT.rotateY(180); v = paste.add(dimensions.getX()/2 + dimensions.getX()%2, 0, dimensions.getZ()/2 + dimensions.getZ()%2).subtract(offset.multiply(-1, 1, -1)).subtract(1, 0, 1); }else{ v = paste.subtract(dimensions.getX()/2 - dimensions.getX()%2, 0, dimensions.getZ()/2 - dimensions.getZ()%2).subtract(offset); @@ -100,11 +95,9 @@ class FightTeam_8 { EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); FreezeWorld freezer = new FreezeWorld(); Bukkit.getPluginManager().registerEvents(freezer, IFightSystem.getPlugin()); - try { - clipboard.paste(e, v, false, true); - } catch (MaxChangedBlocksException ex) { - //ignore - } + ClipboardHolder ch = new ClipboardHolder(clipboard, w.getWorldData()); + ch.setTransform(aT); + ch.createPaste(e, w.getWorldData()).to(v).build(); e.flushQueue(); HandlerList.unregisterAll(freezer); return e; diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java index be15e27..e00662b 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -10,8 +10,8 @@ import de.steamwar.fightsystem.utils.FightScoreboard; import de.steamwar.fightsystem.utils.ItemBuilder; import de.steamwar.fightsystem.utils.TechHider; import de.steamwar.inventory.SWItem; +import de.steamwar.sql.NoClipboardException; import de.steamwar.sql.Schematic; -import de.steamwar.sql.SteamwarUser; import javafx.util.Pair; import org.bukkit.*; import org.bukkit.enchantments.Enchantment; @@ -19,7 +19,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.scoreboard.Team; -import java.io.File; +import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -216,17 +216,24 @@ public class FightTeam implements IFightTeam{ } private void pasteSchematic(){ - File file = new File(Config.SchematicDirectory + SteamwarUser.get(schematic.getSchemOwner()).getUUID().toString(), schematic.getSchemName() + ".schematic"); EditSession e; - switch(Core.getVersion()){ - case 8: - e = FightTeam_8.pasteSchematic(file, pasteX, pasteY, pasteZ, rotate); - break; - case 14: - e = FightTeam_14.pasteSchematic(file, pasteX, pasteY, pasteZ, rotate); - break; - default: - e = FightTeam_12.pasteSchematic(file, pasteX, pasteY, pasteZ, rotate); + try { + switch(Core.getVersion()){ + case 8: + e = FightTeam_8.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); + break; + case 14: + e = FightTeam_14.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); + break; + default: + e = FightTeam_12.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); + } + } catch (Schematic.WrongVersionException ex) { + broadcast(FightSystem.PREFIX + "§cDie gewählte Schematic kann nicht in dieser Version geladen werden"); + return; + } catch (IOException | NoClipboardException ex) { + broadcast(FightSystem.PREFIX + "§cFehler beim Pasten der Schematic"); + throw new SecurityException("Error pasting arena in schematic", ex); } replaceTeamColor(e); Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), this::teleportToSpawn,40);