From eae23123c8d61a269687e34d3f144d0ba989d822 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 31 Aug 2021 17:01:45 +0200 Subject: [PATCH 1/5] Worldedit refactoring Signed-off-by: Lixfel --- .../fightsystem/utils/WorldeditWrapper12.java | 38 +----- .../fightsystem/utils/WorldeditWrapper14.java | 108 ++++++++---------- .../fightsystem/utils/WorldeditWrapper8.java | 107 ++++++++--------- .../de/steamwar/fightsystem/FightSystem.java | 6 +- .../de/steamwar/fightsystem/fight/Fight.java | 4 + .../fightsystem/fight/FightSchematic.java | 103 +++++++---------- .../steamwar/fightsystem/fight/FightTeam.java | 6 +- .../fightsystem/listener/PrepareSchem.java | 13 +-- .../fightsystem/utils/WorldeditWrapper.java | 5 +- 9 files changed, 151 insertions(+), 239 deletions(-) diff --git a/FightSystem_12/src/de/steamwar/fightsystem/utils/WorldeditWrapper12.java b/FightSystem_12/src/de/steamwar/fightsystem/utils/WorldeditWrapper12.java index 25be503..7dd977b 100644 --- a/FightSystem_12/src/de/steamwar/fightsystem/utils/WorldeditWrapper12.java +++ b/FightSystem_12/src/de/steamwar/fightsystem/utils/WorldeditWrapper12.java @@ -19,44 +19,14 @@ package de.steamwar.fightsystem.utils; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.extent.clipboard.Clipboard; -import org.bukkit.DyeColor; import org.bukkit.Material; +@SuppressWarnings("deprecation") public class WorldeditWrapper12 extends WorldeditWrapper8 { - @SuppressWarnings("deprecation") - private static final int COLOR_TO_REPLACE = DyeColor.PINK.getWoolData(); - - @SuppressWarnings("deprecation") - private static final BaseBlock CONCRETE = new BaseBlock(Material.CONCRETE.getId(), COLOR_TO_REPLACE); - @SuppressWarnings("deprecation") - private static final BaseBlock CONCRETE_POWDER = new BaseBlock(Material.CONCRETE_POWDER.getId(), COLOR_TO_REPLACE); - - @SuppressWarnings("deprecation") - @Override - public void replaceTeamColor(Clipboard clipboard, DyeColor c) throws WorldEditException { - super.replaceTeamColor(clipboard, c); - - Vector minimum = clipboard.getRegion().getMinimumPoint(); - BaseBlock concrete = new BaseBlock(CONCRETE.getId(), c.getWoolData()); - BaseBlock concretePowder = new BaseBlock(CONCRETE_POWDER.getId(), c.getWoolData()); - - for(int x = 0; x < clipboard.getDimensions().getX(); x++){ - for(int y = 0; y < clipboard.getDimensions().getY(); y++){ - for(int z = 0; z < clipboard.getDimensions().getZ(); z++){ - Vector pos = minimum.add(x, y, z); - BaseBlock block = clipboard.getBlock(pos); - if(block.equals(CONCRETE)){ - clipboard.setBlock(pos, concrete); - }else if(block.equals(CONCRETE_POWDER)){ - clipboard.setBlock(pos, concretePowder); - } - } - } - } + static { + colorBlocks.add(new BaseBlock(Material.CONCRETE.getId(), COLOR_TO_REPLACE)); + colorBlocks.add(new BaseBlock(Material.CONCRETE_POWDER.getId(), COLOR_TO_REPLACE)); } } diff --git a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java index aa19d25..6b2ae67 100644 --- a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java +++ b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java @@ -23,6 +23,7 @@ import com.sk89q.jnbt.NBTInputStream; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; @@ -43,55 +44,44 @@ import de.steamwar.fightsystem.FightSystem; import de.steamwar.sql.Schematic; import org.bukkit.Bukkit; import org.bukkit.DyeColor; +import org.bukkit.Location; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import java.util.zip.GZIPInputStream; public class WorldeditWrapper14 implements WorldeditWrapper.IWorldeditWrapper { - private static final BaseBlock WOOL = Objects.requireNonNull(BlockTypes.PINK_WOOL).getDefaultState().toBaseBlock(); - private static final BaseBlock CLAY = Objects.requireNonNull(BlockTypes.PINK_TERRACOTTA).getDefaultState().toBaseBlock(); - private static final BaseBlock GLASS = Objects.requireNonNull(BlockTypes.PINK_STAINED_GLASS).getDefaultState().toBaseBlock(); - private static final BaseBlock GLASS_PANE = Objects.requireNonNull(BlockTypes.PINK_STAINED_GLASS_PANE).getDefaultState().toBaseBlock(); - private static final BaseBlock CONCRETE = Objects.requireNonNull(BlockTypes.PINK_CONCRETE).getDefaultState().toBaseBlock(); - private static final BaseBlock CONCRETE_POWDER = Objects.requireNonNull(BlockTypes.PINK_CONCRETE_POWDER).getDefaultState().toBaseBlock(); - private static final BaseBlock CARPET = Objects.requireNonNull(BlockTypes.PINK_CARPET).getDefaultState().toBaseBlock(); + private static final Map colorBlocks = new HashMap<>(); + + static { + colorBlocks.put(Objects.requireNonNull(BlockTypes.PINK_WOOL).getDefaultState().toBaseBlock(), "_wool"); + colorBlocks.put(Objects.requireNonNull(BlockTypes.PINK_TERRACOTTA).getDefaultState().toBaseBlock(), "_terracotta"); + colorBlocks.put(Objects.requireNonNull(BlockTypes.PINK_STAINED_GLASS).getDefaultState().toBaseBlock(), "_stained_glass"); + colorBlocks.put(Objects.requireNonNull(BlockTypes.PINK_STAINED_GLASS_PANE).getDefaultState().toBaseBlock(), "_stained_glass_pane"); + colorBlocks.put(Objects.requireNonNull(BlockTypes.PINK_CONCRETE).getDefaultState().toBaseBlock(), "_concrete"); + colorBlocks.put(Objects.requireNonNull(BlockTypes.PINK_CONCRETE_POWDER).getDefaultState().toBaseBlock(), "_concrete_powder"); + colorBlocks.put(Objects.requireNonNull(BlockTypes.PINK_CARPET).getDefaultState().toBaseBlock(), "_carpet"); + } @Override public void replaceTeamColor(Clipboard clipboard, DyeColor c) throws WorldEditException { BlockVector3 minimum = clipboard.getRegion().getMinimumPoint(); - BaseBlock wool = Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + "_wool")).getDefaultState().toBaseBlock(); - BaseBlock clay = Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + "_terracotta")).getDefaultState().toBaseBlock(); - BaseBlock glass = Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + "_stained_glass")).getDefaultState().toBaseBlock(); - BaseBlock glassPane = Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + "_stained_glass_pane")).getDefaultState().toBaseBlock(); - BaseBlock carpet = Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + "_carpet")).getDefaultState().toBaseBlock(); - BaseBlock concrete = Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + "_concrete")).getDefaultState().toBaseBlock(); - BaseBlock concretePowder = Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + "_concrete_powder")).getDefaultState().toBaseBlock(); + Map replaceMap = new HashMap<>(); + colorBlocks.forEach((base, postfix) -> replaceMap.put(base, Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + postfix)).getDefaultState().toBaseBlock())); for(int x = 0; x < clipboard.getDimensions().getX(); x++){ for(int y = 0; y < clipboard.getDimensions().getY(); y++){ for(int z = 0; z < clipboard.getDimensions().getZ(); z++){ BlockVector3 pos = minimum.add(x, y, z); - BaseBlock block = clipboard.getFullBlock(pos); - if(block.equals(WOOL)){ - clipboard.setBlock(pos, wool); - }else if(block.equals(CLAY)){ - clipboard.setBlock(pos, clay); - }else if(block.equals(GLASS)){ - clipboard.setBlock(pos, glass); - }else if(block.equals(GLASS_PANE)){ - clipboard.setBlock(pos, glassPane); - }else if(block.equals(CARPET)){ - clipboard.setBlock(pos, carpet); - }else if(block.equals(CONCRETE)){ - clipboard.setBlock(pos, concrete); - }else if(block.equals(CONCRETE_POWDER)){ - clipboard.setBlock(pos, concretePowder); - } + BaseBlock replacement = replaceMap.get(clipboard.getFullBlock(pos)); + if(replacement != null) + clipboard.setBlock(pos, replacement); } } } @@ -99,22 +89,18 @@ public class WorldeditWrapper14 implements WorldeditWrapper.IWorldeditWrapper { @Override public void pasteSchematic(Clipboard clipboard, Region region, boolean rotate) { - BlockVector3 paste = BlockVector3.at(region.centerX(), region.getMinY(), region.centerZ()); - - World w = new BukkitWorld(Bukkit.getWorlds().get(0)); + AffineTransform aT = new AffineTransform().rotateY(rotate ? 180 : 0); BlockVector3 dimensions = clipboard.getDimensions(); - BlockVector3 v; - BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()); - AffineTransform aT = new AffineTransform(); + BlockVector3 v = BlockVector3.at(region.centerX(), region.getMinY(), region.centerZ()); 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); + v = v.add(dimensions.getX()/2 + dimensions.getX()%2, 0, dimensions.getZ()/2 + dimensions.getZ()%2).subtract(1, 0, 1); }else{ - v = paste.subtract(dimensions.getX()/2, 0, dimensions.getZ()/2).subtract(offset); + v = v.subtract(dimensions.getX()/2, 0, dimensions.getZ()/2); } + v = v.subtract(aT.apply(clipboardOffset(clipboard).toVector3()).toBlockPoint()); if(Config.WaterDepth != 0){ - BlockVector3 it = clipboard.getMinimumPoint(); + BlockVector3 it = clipboard.getMinimumPoint().add(0, 0, 1); int depth = 0; while(!clipboard.getBlock(it).getBlockType().getMaterial().isAir()){ depth++; @@ -123,24 +109,24 @@ public class WorldeditWrapper14 implements WorldeditWrapper.IWorldeditWrapper { v = v.add(0, Config.WaterDepth - depth, 0); } - EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); - ClipboardHolder ch = new ClipboardHolder(clipboard); - ch.setTransform(aT); - Operations.completeBlindly(ch.createPaste(e).to(v).build()); - e.flushSession(); + pasteClipboard(Bukkit.getWorlds().get(0), clipboard, aT, v, false); } @Override - public void pasteChar(Clipboard character, int charOffset, int length, int x, int y, int z, AffineTransform aT) { - BlockVector3 offset = character.getRegion().getMinimumPoint().subtract(character.getOrigin()); - BlockVector3 v = BlockVector3.ZERO.subtract(- charOffset + length / 2, 0, 0).subtract(offset); - v = aT.apply(v.toVector3()).toBlockPoint(); - v = v.add(x, y, z); + public void pasteChar(Clipboard character, Location pos, int xOffset, AffineTransform aT) { + BlockVector3 v = aT.apply(BlockVector3.at(xOffset, 0, 0).subtract(clipboardOffset(character)).toVector3()).toBlockPoint(); + pasteClipboard(pos.getWorld(), character, aT, v.add(BukkitAdapter.asBlockVector(pos)), true); + } - EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1); - ClipboardHolder ch = new ClipboardHolder(character); + private BlockVector3 clipboardOffset(Clipboard clipboard) { + return clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()); + } + + private void pasteClipboard(org.bukkit.World world, Clipboard clipboard, AffineTransform aT, BlockVector3 pos, boolean ignoreAir) { + EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(world), -1); + ClipboardHolder ch = new ClipboardHolder(clipboard); ch.setTransform(aT); - Operations.completeBlindly(ch.createPaste(e).to(v).ignoreAirBlocks(true).build()); + Operations.completeBlindly(ch.createPaste(e).to(pos).ignoreAirBlocks(ignoreAir).build()); e.flushSession(); } @@ -150,21 +136,17 @@ public class WorldeditWrapper14 implements WorldeditWrapper.IWorldeditWrapper { } @Override - public void saveSchem(Schematic schem, Region region, int minY) { + public void saveSchem(Schematic schem, Region region, int minY) throws WorldEditException { World w = new BukkitWorld(Bukkit.getWorlds().get(0)); BlockVector3 min = BlockVector3.at(region.getMinX(), minY, region.getMinZ()); CuboidRegion cuboidRegion = new CuboidRegion(w, min, BlockVector3.at(region.getMaxX(), region.getMaxY(), region.getMaxZ())); BlockArrayClipboard clipboard = new BlockArrayClipboard(cuboidRegion); - EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); - ForwardExtentCopy forwardExtentCopy = new ForwardExtentCopy(editSession, cuboidRegion, clipboard, min); + ForwardExtentCopy forwardExtentCopy = new ForwardExtentCopy( + WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1), cuboidRegion, clipboard, min + ); forwardExtentCopy.setCopyingEntities(false); - - try{ - Operations.complete(forwardExtentCopy); - }catch(WorldEditException e){ - throw new IllegalStateException(e); - } + Operations.complete(forwardExtentCopy); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { @@ -172,7 +154,7 @@ public class WorldeditWrapper14 implements WorldeditWrapper.IWorldeditWrapper { writer.write(clipboard); writer.close(); } catch (IOException e) { - throw new IllegalStateException(e); + throw new SecurityException(e); } schem.saveFromBytes(outputStream.toByteArray(), true); diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java index d12b387..f3c17e3 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java @@ -42,56 +42,46 @@ import de.steamwar.fightsystem.FightSystem; import de.steamwar.sql.Schematic; import org.bukkit.Bukkit; import org.bukkit.DyeColor; +import org.bukkit.Location; import org.bukkit.Material; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import java.util.zip.GZIPInputStream; +@SuppressWarnings("deprecation") public class WorldeditWrapper8 implements WorldeditWrapper.IWorldeditWrapper { - @SuppressWarnings("deprecation") - private static final int COLOR_TO_REPLACE = DyeColor.PINK.getWoolData(); + protected static final int COLOR_TO_REPLACE = DyeColor.PINK.getWoolData(); + protected static final Set colorBlocks = new HashSet<>(); - @SuppressWarnings("deprecation") - private static final BaseBlock WOOL = new BaseBlock(Material.WOOL.getId(), COLOR_TO_REPLACE); - @SuppressWarnings("deprecation") - private static final BaseBlock GLASS = new BaseBlock(Material.STAINED_GLASS.getId(), COLOR_TO_REPLACE); - @SuppressWarnings("deprecation") - private static final BaseBlock CLAY = new BaseBlock(Material.CLAY.getId(), COLOR_TO_REPLACE); - @SuppressWarnings("deprecation") - private static final BaseBlock GLASS_PANE = new BaseBlock(Material.STAINED_GLASS_PANE.getId(), COLOR_TO_REPLACE); - @SuppressWarnings("deprecation") - private static final BaseBlock CARPET = new BaseBlock(Material.CARPET.getId(), COLOR_TO_REPLACE); + static { + colorBlocks.add(new BaseBlock(Material.WOOL.getId(), COLOR_TO_REPLACE)); + colorBlocks.add(new BaseBlock(Material.STAINED_GLASS.getId(), COLOR_TO_REPLACE)); + colorBlocks.add(new BaseBlock(Material.CLAY.getId(), COLOR_TO_REPLACE)); + colorBlocks.add(new BaseBlock(Material.STAINED_GLASS_PANE.getId(), COLOR_TO_REPLACE)); + colorBlocks.add(new BaseBlock(Material.CARPET.getId(), COLOR_TO_REPLACE)); + } - @SuppressWarnings("deprecation") @Override public void replaceTeamColor(Clipboard clipboard, DyeColor c) throws WorldEditException { Vector minimum = clipboard.getRegion().getMinimumPoint(); - BaseBlock wool = new BaseBlock(WOOL.getId(), c.getWoolData()); - BaseBlock clay = new BaseBlock(CLAY.getId(), c.getWoolData()); - BaseBlock glass = new BaseBlock(GLASS.getId(), c.getWoolData()); - BaseBlock glassPane = new BaseBlock(GLASS_PANE.getId(), c.getWoolData()); - BaseBlock carpet = new BaseBlock(CARPET.getId(), c.getWoolData()); + Map replaceMap = new HashMap<>(); + colorBlocks.forEach(base -> replaceMap.put(base, new BaseBlock(base.getId(), c.getWoolData()))); for(int x = 0; x < clipboard.getDimensions().getX(); x++){ for(int y = 0; y < clipboard.getDimensions().getY(); y++){ for(int z = 0; z < clipboard.getDimensions().getZ(); z++){ Vector pos = minimum.add(x, y, z); - BaseBlock block = clipboard.getBlock(pos); - if(block.equals(WOOL)){ - clipboard.setBlock(pos, wool); - }else if(block.equals(CLAY)){ - clipboard.setBlock(pos, clay); - }else if(block.equals(GLASS)){ - clipboard.setBlock(pos, glass); - }else if(block.equals(GLASS_PANE)){ - clipboard.setBlock(pos, glassPane); - }else if(block.equals(CARPET)){ - clipboard.setBlock(pos, carpet); - } + BaseBlock replacement = replaceMap.get(clipboard.getBlock(pos)); + if(replacement != null) + clipboard.setBlock(pos, replacement); } } } @@ -99,47 +89,45 @@ public class WorldeditWrapper8 implements WorldeditWrapper.IWorldeditWrapper { @Override public void pasteSchematic(Clipboard clipboard, Region region, boolean rotate) { - World w = new BukkitWorld(Bukkit.getWorlds().get(0)); + AffineTransform aT = new AffineTransform().rotateY(rotate ? 180 : 0); Vector dimensions = clipboard.getDimensions(); Vector v = new Vector(region.centerX(), region.getMinY(), region.centerZ()); - Vector offset = clipboard.getMinimumPoint().subtract(clipboard.getOrigin()); - AffineTransform aT = new AffineTransform(); if(rotate){ - aT = aT.rotateY(180); - v = v.add(dimensions.getX()/2 + dimensions.getX()%2, 0, dimensions.getZ()/2 + dimensions.getZ()%2).subtract(offset.multiply(-1, 1, -1)).subtract(1, 0, 1); + v = v.add(dimensions.getX()/2 + dimensions.getX()%2, 0, dimensions.getZ()/2 + dimensions.getZ()%2).subtract(1, 0, 1); }else{ - v = v.subtract(dimensions.getX()/2 - dimensions.getX()%2, 0, dimensions.getZ()/2 - dimensions.getZ()%2).subtract(offset); + v = v.subtract(dimensions.getX()/2 - dimensions.getX()%2, 0, dimensions.getZ()/2 - dimensions.getZ()%2); } + v = v.subtract(aT.apply(clipboardOffset(clipboard)).toBlockPoint()); if(Config.WaterDepth != 0){ - Vector it = clipboard.getMinimumPoint(); + Vector it = clipboard.getMinimumPoint().add(0, 0, 1); int depth = 0; - while(!clipboard.getBlock(it).isAir()){ + while(!clipboard.getBlock(it).isAir()) { depth++; - it = it.setY(it.getY()+1); + it = it.add(0, 1, 0); } v = v.add(0, Config.WaterDepth - depth, 0); } - EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); - ClipboardHolder ch = new ClipboardHolder(clipboard, w.getWorldData()); - ch.setTransform(aT); - Operations.completeBlindly(ch.createPaste(e, w.getWorldData()).to(v).build()); - e.flushQueue(); + pasteClipboard(Bukkit.getWorlds().get(0), clipboard, aT, v, false); } @Override - public void pasteChar(Clipboard character, int charOffset, int length, int x, int y, int z, AffineTransform aT) { - World w = new BukkitWorld(Bukkit.getWorlds().get(0)); - Vector offset = character.getRegion().getMinimumPoint().subtract(character.getOrigin()); - Vector v = Vector.ZERO.subtract(- charOffset + length / 2, 0, 0).subtract(offset); - v = aT.apply(v).toBlockPoint(); - v = v.add(x, y, z); + public void pasteChar(Clipboard character, Location pos, int xOffset, AffineTransform aT) { + Vector v = aT.apply(new Vector(xOffset, 0, 0).subtract(clipboardOffset(character))).toBlockPoint(); + pasteClipboard(pos.getWorld(), character, aT, v.add(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()), true); + } + private Vector clipboardOffset(Clipboard clipboard) { + return clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()); + } + + private void pasteClipboard(org.bukkit.World world, Clipboard clipboard, AffineTransform aT, Vector pos, boolean ignoreAir) { + World w = new BukkitWorld(world); EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); - ClipboardHolder ch = new ClipboardHolder(character, w.getWorldData()); + ClipboardHolder ch = new ClipboardHolder(clipboard, w.getWorldData()); ch.setTransform(aT); - Operations.completeBlindly(ch.createPaste(e, w.getWorldData()).to(v).build()); + Operations.completeBlindly(ch.createPaste(e, w.getWorldData()).to(pos).ignoreAirBlocks(ignoreAir).build()); e.flushQueue(); } @@ -149,19 +137,16 @@ public class WorldeditWrapper8 implements WorldeditWrapper.IWorldeditWrapper { } @Override - public void saveSchem(Schematic schem, Region region, int minY) { + public void saveSchem(Schematic schem, Region region, int minY) throws WorldEditException { World w = new BukkitWorld(Bukkit.getWorlds().get(0)); Vector min = new Vector(region.getMinX(), minY, region.getMinZ()); CuboidRegion cuboidRegion = new CuboidRegion(w, min, new Vector(region.getMaxX(), region.getMaxY(), region.getMaxZ())); BlockArrayClipboard clipboard = new BlockArrayClipboard(cuboidRegion); - EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); - ForwardExtentCopy forwardExtentCopy = new ForwardExtentCopy(editSession, cuboidRegion, clipboard, min); - try{ - Operations.complete(forwardExtentCopy); - }catch(WorldEditException e){ - throw new IllegalStateException(e); - } + ForwardExtentCopy forwardExtentCopy = new ForwardExtentCopy( + WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1), cuboidRegion, clipboard, min + ); + Operations.complete(forwardExtentCopy); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { @@ -169,7 +154,7 @@ public class WorldeditWrapper8 implements WorldeditWrapper.IWorldeditWrapper { writer.write(clipboard, w.getWorldData()); writer.close(); } catch (IOException e) { - throw new IllegalStateException(e); + throw new SecurityException(e); } schem.saveFromBytes(outputStream.toByteArray(), false); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index e578353..12c713d 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -145,11 +145,7 @@ public class FightSystem extends JavaPlugin { }else if(Config.mode == ArenaMode.CHECK){ Fight.getBlueTeam().setSchem(Schematic.getSchemFromDB(Config.CheckSchemID)); }else if(Config.mode == ArenaMode.PREPARE) { - if(Config.BlueRotate){ - Fight.getRedTeam().setSchem(Schematic.getSchemFromDB(Config.PrepareSchemID)); - }else{ - Fight.getBlueTeam().setSchem(Schematic.getSchemFromDB(Config.PrepareSchemID)); - } + Fight.getUnrotated().setSchem(Schematic.getSchemFromDB(Config.PrepareSchemID)); }else if(Config.mode == ArenaMode.REPLAY) { FightWorld.forceLoad(); FileSource.startReplay(); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java index 7ea0ee2..4033521 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java @@ -88,6 +88,10 @@ public class Fight { return blueTeam; } + public static FightTeam getUnrotated() { + return Config.BlueRotate ? Fight.getRedTeam() : Fight.getBlueTeam(); + } + public static void playSound(Sound sound, float volume, float pitch) { GlobalRecorder.getInstance().soundAtPlayer(sound.name(), volume, pitch); //volume: max. 100, pitch: max. 2 diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java index 474b9ef..7c81d40 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java @@ -32,15 +32,11 @@ import de.steamwar.fightsystem.utils.ColorConverter; import de.steamwar.fightsystem.utils.Region; import de.steamwar.fightsystem.utils.WorldeditWrapper; import de.steamwar.sql.Schematic; -import org.bukkit.Bukkit; -import org.bukkit.DyeColor; -import org.bukkit.Material; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.event.HandlerList; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.logging.Level; @@ -62,7 +58,7 @@ public class FightSchematic extends StateDependent { register(); } - public boolean hasSchematic(){ + public boolean hasSchematic() { return clipboard != null; } @@ -75,7 +71,7 @@ public class FightSchematic extends StateDependent { try { clipboard = schem.load(); } catch (IOException e) { - team.broadcast(FightSystem.PREFIX + "§cKonnte die Schematic nicht laden!"); + team.broadcast(FightSystem.PREFIX + "§cSchematic konnte nicht geladen werden!"); Bukkit.getLogger().log(Level.SEVERE, e, () -> "Couldn't load Schematic " + schem.getSchemName()); } } @@ -137,60 +133,6 @@ public class FightSchematic extends StateDependent { Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), team::teleportToSpawn, 40); } - private Clipboard loadTextSchem(String schemName) throws IOException { - return WorldeditWrapper.impl.loadChar(schemName); - } - - public void pasteTeamName(){ - List characters = new ArrayList<>(); - for(char c : team.getName().toCharArray()){ - try { - characters.add(loadTextSchem(c == '/' ? "slash" : String.valueOf(c))); - } catch (IOException e) { - Bukkit.getLogger().log(Level.WARNING, "Could not display character {} due to missing file!", c); - try { - characters.add(loadTextSchem("")); - }catch (IOException ex) { - throw new SecurityException("Could not load text", ex); - } - } - } - - //Calc character sizes - int[] lengthes = new int[characters.size()]; - for(int i = 0; i < lengthes.length; i++) - lengthes[i] = characters.get(i).getDimensions().getBlockX(); - - //Calc character offsets - int[] offsets = new int[lengthes.length]; - int previousOffset = 0; - for(int i = 0; i < offsets.length; i++){ - offsets[i] = previousOffset; - previousOffset += lengthes[i] + 1; // 1 is the distance between characters - } - - int length = lengthes.length == 0 ? 0 : lengthes[lengthes.length - 1] + offsets[offsets.length - 1]; - - int z = team.getSchemRegion().centerZ(); - AffineTransform aT = new AffineTransform(); - - if(rotate){ - aT = aT.rotateY(180); - z += team.getSchemRegion().getSizeZ() / 2; - }else{ - z -= team.getSchemRegion().getSizeZ() / 2; - } - - for(int i = 0; i < characters.size(); i++){ - try { - replaceTeamColor(characters.get(i)); - } catch (WorldEditException e) { - Bukkit.getLogger().log(Level.SEVERE, "Could not recolor team text", e); - } - WorldeditWrapper.impl.pasteChar(characters.get(i), offsets[i], length, team.getSchemRegion().centerX(), team.getExtendRegion().getMaxY(), z, aT); - } - } - @Override public void disable() { if(!Config.ReplaceObsidianBedrock) @@ -207,6 +149,45 @@ public class FightSchematic extends StateDependent { HandlerList.unregisterAll(freezer); } + public void pasteTeamName(){ + char[] chars = team.getName().toCharArray(); + Clipboard[] characters = new Clipboard[chars.length]; + + int length = 0; + int[] offsets = new int[chars.length]; + + for(int i = 0; i < chars.length; i++){ + Clipboard character; + try { + character = WorldeditWrapper.impl.loadChar(chars[i] == '/' ? "slash" : String.valueOf(chars[i])); + } catch (IOException e) { + Bukkit.getLogger().log(Level.WARNING, "Could not display character {} due to missing file!", chars[i]); + try { + character = WorldeditWrapper.impl.loadChar(""); + }catch (IOException ex) { + throw new SecurityException("Could not load text", ex); + } + } + + try { + replaceTeamColor(character); + } catch (WorldEditException e) { + Bukkit.getLogger().log(Level.SEVERE, "Could not recolor team text", e); + } + + characters[i] = character; + offsets[i] = length; + length += character.getDimensions().getBlockX() + 1; // 1 is the distance between characters + } + + length -= 1; + AffineTransform aT = new AffineTransform().rotateY(rotate ? 180 : 0); + Location base = new Location(Bukkit.getWorlds().get(0), team.getSchemRegion().centerX(), team.getExtendRegion().getMaxY(), team.getSchemRegion().centerZ() + (rotate ? 1 : -1) * team.getSchemRegion().getSizeZ() / 2); + for(int i = 0; i < characters.length; i++){ + WorldeditWrapper.impl.pasteChar(characters[i], base, offsets[i] - length/2, aT); + } + } + private void replaceSync(Material target, Material replacement){ World world = Bukkit.getWorlds().get(0); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java index 3bd0840..0f80fe0 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -305,7 +305,7 @@ public class FightTeam { private void testPasteAction(){ if(Config.test()) this.schematic.enable(); - else if(Fight.getOpposite(this).hasSchematic()){ + else if(Fight.getOpposite(this).schematic.hasSchematic()){ FightSystem.setPostSchemState(); } } @@ -319,10 +319,6 @@ public class FightTeam { broadcast(FightSystem.PREFIX + "§7Das §e" + Config.GameName + " " + schematic.getSchemName() + " §7wird für den Kampf verwendet!"); } - public boolean hasSchematic(){ - return schematic.hasSchematic(); - } - public void setReady(boolean ready) { Player l = leader.getPlayer(); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/PrepareSchem.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/PrepareSchem.java index e1a39ad..f20057f 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/PrepareSchem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/PrepareSchem.java @@ -19,6 +19,7 @@ package de.steamwar.fightsystem.listener; +import com.sk89q.worldedit.WorldEditException; import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; @@ -45,8 +46,8 @@ public class PrepareSchem implements Listener { public void disable() { super.disable(); World world = Bukkit.getWorlds().get(0); - Region region = Config.BlueRotate ? Fight.getRedTeam().getExtendRegion() : Fight.getBlueTeam().getExtendRegion(); - int minY = Config.BlueRotate ? Fight.getRedTeam().getSchemRegion().getMinY() : Fight.getBlueTeam().getSchemRegion().getMinY(); + Region region = Fight.getUnrotated().getExtendRegion(); + int minY = Fight.getUnrotated().getSchemRegion().getMinY(); Schematic schem; try{ @@ -69,7 +70,7 @@ public class PrepareSchem implements Listener { try{ WorldeditWrapper.impl.saveSchem(schem, region, minY); - }catch(IllegalStateException e){ + }catch(WorldEditException e){ FightSystem.shutdown(FightSystem.PREFIX + "§cDie Schematic konnte nicht gespeichert werden, Einsenden wird abgebrochen."); throw new SecurityException("Could not save schem", e); } @@ -86,11 +87,7 @@ public class PrepareSchem implements Listener { FightTeam team = Fight.getPlayerTeam(player); if (team == null) { - if(Config.BlueRotate){ - Fight.getRedTeam().addMember(player); - }else{ - Fight.getBlueTeam().addMember(player); - } + Fight.getUnrotated().addMember(player); } if(FightState.getFightState() == FightState.PRE_LEADER_SETUP) { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java index cc7ad07..4d1585a 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java @@ -25,6 +25,7 @@ import com.sk89q.worldedit.math.transform.AffineTransform; import de.steamwar.fightsystem.VersionDependent; import de.steamwar.sql.Schematic; import org.bukkit.DyeColor; +import org.bukkit.Location; import java.io.IOException; @@ -36,8 +37,8 @@ public class WorldeditWrapper { public interface IWorldeditWrapper { void replaceTeamColor(Clipboard clipboard, DyeColor c) throws WorldEditException; void pasteSchematic(Clipboard clipboard, Region region, boolean rotate); - void pasteChar(Clipboard character, int charOffset, int length, int x, int y, int z, AffineTransform aT); + void pasteChar(Clipboard character, Location pos, int xOffset, AffineTransform aT); Clipboard loadChar(String charName) throws IOException; - void saveSchem(Schematic schem, Region region, int minY); + void saveSchem(Schematic schem, Region region, int minY) throws WorldEditException; } } -- 2.39.2 From 453dea774e35e2a79609c605aa95f1293f8ea65e Mon Sep 17 00:00:00 2001 From: Lixfel Date: Wed, 1 Sep 2021 16:50:41 +0200 Subject: [PATCH 2/5] Unify WE offset calculation Signed-off-by: Lixfel --- .../fightsystem/utils/WorldeditWrapper14.java | 47 +++++-------------- .../fightsystem/utils/WorldeditWrapper8.java | 46 +++++------------- .../fightsystem/fight/FightSchematic.java | 16 +++++-- .../steamwar/fightsystem/record/Recorder.java | 32 +++++++------ .../fightsystem/utils/WorldeditWrapper.java | 5 +- 5 files changed, 59 insertions(+), 87 deletions(-) diff --git a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java index 6b2ae67..8f1c317 100644 --- a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java +++ b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java @@ -39,12 +39,12 @@ 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.BlockTypes; -import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.sql.Schematic; import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; +import org.bukkit.util.Vector; import java.io.ByteArrayOutputStream; import java.io.File; @@ -88,45 +88,24 @@ public class WorldeditWrapper14 implements WorldeditWrapper.IWorldeditWrapper { } @Override - public void pasteSchematic(Clipboard clipboard, Region region, boolean rotate) { - AffineTransform aT = new AffineTransform().rotateY(rotate ? 180 : 0); - BlockVector3 dimensions = clipboard.getDimensions(); - BlockVector3 v = BlockVector3.at(region.centerX(), region.getMinY(), region.centerZ()); - if(rotate){ - v = v.add(dimensions.getX()/2 + dimensions.getX()%2, 0, dimensions.getZ()/2 + dimensions.getZ()%2).subtract(1, 0, 1); - }else{ - v = v.subtract(dimensions.getX()/2, 0, dimensions.getZ()/2); + public int getWaterDepth(Clipboard clipboard) { + BlockVector3 it = clipboard.getMinimumPoint().add(0, 0, 1); + int depth = 0; + while(!clipboard.getBlock(it).getBlockType().getMaterial().isAir()){ + depth++; + it = it.add(0, 1, 0); } - v = v.subtract(aT.apply(clipboardOffset(clipboard).toVector3()).toBlockPoint()); - - if(Config.WaterDepth != 0){ - BlockVector3 it = clipboard.getMinimumPoint().add(0, 0, 1); - int depth = 0; - while(!clipboard.getBlock(it).getBlockType().getMaterial().isAir()){ - depth++; - it = it.add(0, 1, 0); - } - v = v.add(0, Config.WaterDepth - depth, 0); - } - - pasteClipboard(Bukkit.getWorlds().get(0), clipboard, aT, v, false); + return depth; } @Override - public void pasteChar(Clipboard character, Location pos, int xOffset, AffineTransform aT) { - BlockVector3 v = aT.apply(BlockVector3.at(xOffset, 0, 0).subtract(clipboardOffset(character)).toVector3()).toBlockPoint(); - pasteClipboard(pos.getWorld(), character, aT, v.add(BukkitAdapter.asBlockVector(pos)), true); - } - - private BlockVector3 clipboardOffset(Clipboard clipboard) { - return clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()); - } - - private void pasteClipboard(org.bukkit.World world, Clipboard clipboard, AffineTransform aT, BlockVector3 pos, boolean ignoreAir) { - EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(world), -1); + public void pasteClipboard(Clipboard clipboard, Location position, Vector offset, AffineTransform aT) { + EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(position.getWorld()), -1); ClipboardHolder ch = new ClipboardHolder(clipboard); ch.setTransform(aT); - Operations.completeBlindly(ch.createPaste(e).to(pos).ignoreAirBlocks(ignoreAir).build()); + Operations.completeBlindly(ch.createPaste(e).to(BukkitAdapter.asBlockVector(position).add( + aT.apply(BlockVector3.at(offset.getBlockX(), offset.getBlockY(), offset.getBlockZ()).add(clipboard.getOrigin()).subtract(clipboard.getMinimumPoint()).toVector3()).toBlockPoint() + )).build()); e.flushSession(); } diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java index f3c17e3..ad3ea1e 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java @@ -37,7 +37,6 @@ 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 de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.sql.Schematic; import org.bukkit.Bukkit; @@ -88,46 +87,25 @@ public class WorldeditWrapper8 implements WorldeditWrapper.IWorldeditWrapper { } @Override - public void pasteSchematic(Clipboard clipboard, Region region, boolean rotate) { - AffineTransform aT = new AffineTransform().rotateY(rotate ? 180 : 0); - Vector dimensions = clipboard.getDimensions(); - Vector v = new Vector(region.centerX(), region.getMinY(), region.centerZ()); - if(rotate){ - v = v.add(dimensions.getX()/2 + dimensions.getX()%2, 0, dimensions.getZ()/2 + dimensions.getZ()%2).subtract(1, 0, 1); - }else{ - v = v.subtract(dimensions.getX()/2 - dimensions.getX()%2, 0, dimensions.getZ()/2 - dimensions.getZ()%2); + public int getWaterDepth(Clipboard clipboard) { + Vector it = clipboard.getMinimumPoint().add(0, 0, 1); + int depth = 0; + while(!clipboard.getBlock(it).isAir()) { + depth++; + it = it.add(0, 1, 0); } - v = v.subtract(aT.apply(clipboardOffset(clipboard)).toBlockPoint()); - - if(Config.WaterDepth != 0){ - Vector it = clipboard.getMinimumPoint().add(0, 0, 1); - int depth = 0; - while(!clipboard.getBlock(it).isAir()) { - depth++; - it = it.add(0, 1, 0); - } - v = v.add(0, Config.WaterDepth - depth, 0); - } - - pasteClipboard(Bukkit.getWorlds().get(0), clipboard, aT, v, false); + return depth; } @Override - public void pasteChar(Clipboard character, Location pos, int xOffset, AffineTransform aT) { - Vector v = aT.apply(new Vector(xOffset, 0, 0).subtract(clipboardOffset(character))).toBlockPoint(); - pasteClipboard(pos.getWorld(), character, aT, v.add(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()), true); - } - - private Vector clipboardOffset(Clipboard clipboard) { - return clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()); - } - - private void pasteClipboard(org.bukkit.World world, Clipboard clipboard, AffineTransform aT, Vector pos, boolean ignoreAir) { - World w = new BukkitWorld(world); + public void pasteClipboard(Clipboard clipboard, Location position, org.bukkit.util.Vector offset, AffineTransform aT) { + World w = new BukkitWorld(position.getWorld()); EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); ClipboardHolder ch = new ClipboardHolder(clipboard, w.getWorldData()); ch.setTransform(aT); - Operations.completeBlindly(ch.createPaste(e, w.getWorldData()).to(pos).ignoreAirBlocks(ignoreAir).build()); + Operations.completeBlindly(ch.createPaste(e, w.getWorldData()).to(new Vector(position.getBlockX(), position.getBlockY(), position.getBlockZ()).add( + aT.apply(new Vector(offset.getBlockX(), offset.getBlockY(), offset.getBlockZ()).add(clipboard.getOrigin()).subtract(clipboard.getMinimumPoint())).toBlockPoint() + )).build()); e.flushQueue(); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java index 7c81d40..64cdf2e 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java @@ -35,6 +35,7 @@ import de.steamwar.sql.Schematic; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.event.HandlerList; +import org.bukkit.util.Vector; import java.io.IOException; import java.util.List; @@ -122,7 +123,16 @@ public class FightSchematic extends StateDependent { try { replaceTeamColor(clipboard); - WorldeditWrapper.impl.pasteSchematic(clipboard, region, rotate); + WorldeditWrapper.impl.pasteClipboard( + clipboard, + new Location(Bukkit.getWorlds().get(0), region.centerX(), region.getMinY(), region.centerZ()), + new Vector( + -clipboard.getDimensions().getBlockX()/2, + Config.WaterDepth != 0 ? Config.WaterDepth - WorldeditWrapper.impl.getWaterDepth(clipboard) : 0, + -clipboard.getDimensions().getBlockZ()/2 + ), + new AffineTransform().rotateY(rotate ? 180 : 0) + ); } catch (WorldEditException e) { FightSystem.broadcast("§cFehler beim Pasten der Schematic"); Bukkit.getScheduler().runTask(FightSystem.getPlugin(), FightSystem::setPreSchemState); @@ -182,9 +192,9 @@ public class FightSchematic extends StateDependent { length -= 1; AffineTransform aT = new AffineTransform().rotateY(rotate ? 180 : 0); - Location base = new Location(Bukkit.getWorlds().get(0), team.getSchemRegion().centerX(), team.getExtendRegion().getMaxY(), team.getSchemRegion().centerZ() + (rotate ? 1 : -1) * team.getSchemRegion().getSizeZ() / 2); + Location base = new Location(Bukkit.getWorlds().get(0), region.centerX(), team.getExtendRegion().getMaxY(), region.centerZ()); for(int i = 0; i < characters.length; i++){ - WorldeditWrapper.impl.pasteChar(characters[i], base, offsets[i] - length/2, aT); + WorldeditWrapper.impl.pasteClipboard(characters[i], base, new Vector(offsets[i] - length/2, 0, region.getSizeZ()/2), aT); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java index 4e6525a..c98e21d 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java @@ -38,10 +38,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.util.logging.Level; public interface Recorder { @@ -249,16 +246,23 @@ public interface Recorder { } default void schem(int embedId, int noEmbedId, int schemId){ - try { - if(schemId == 0) - throw new IOException(); - - write(embedId, schemId, Schematic.getSchemFromDB(schemId).schemData()); - } catch (IOException e) { - if(schemId != 0) - Bukkit.getLogger().log(Level.SEVERE, "Could not embed schematic", e); + if(schemId == 0) { write(noEmbedId, schemId); + return; } + + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + try{ + copy(Schematic.getSchemFromDB(schemId).schemData(), buffer); + }catch (EOFException e) { + Bukkit.getLogger().log(Level.INFO, "EOFException ignored"); + } catch (IOException e) { + Bukkit.getLogger().log(Level.SEVERE, "Could not embed schematic", e); + disable(); + return; + } + + write(embedId, schemId, buffer.toByteArray()); } default void scoreboardTitle(String title){ @@ -292,8 +296,8 @@ public interface Recorder { stream.writeDouble((Double)o); else if(o instanceof String) stream.writeUTF((String)o); - else if(o instanceof InputStream) - copy((InputStream) o, stream); + else if(o instanceof byte[]) + stream.write((byte[])o); else throw new SecurityException("Undefined write for: " + o.getClass().getName()); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java index 4d1585a..0edf2e9 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java @@ -26,6 +26,7 @@ import de.steamwar.fightsystem.VersionDependent; import de.steamwar.sql.Schematic; import org.bukkit.DyeColor; import org.bukkit.Location; +import org.bukkit.util.Vector; import java.io.IOException; @@ -36,8 +37,8 @@ public class WorldeditWrapper { public interface IWorldeditWrapper { void replaceTeamColor(Clipboard clipboard, DyeColor c) throws WorldEditException; - void pasteSchematic(Clipboard clipboard, Region region, boolean rotate); - void pasteChar(Clipboard character, Location pos, int xOffset, AffineTransform aT); + int getWaterDepth(Clipboard clipboard); + void pasteClipboard(Clipboard clipboard, Location position, Vector offset, AffineTransform aT); Clipboard loadChar(String charName) throws IOException; void saveSchem(Schematic schem, Region region, int minY) throws WorldEditException; } -- 2.39.2 From 5826f7e8b199e4eb3e55210f0eaa3e0a3d4b941e Mon Sep 17 00:00:00 2001 From: Lixfel Date: Wed, 1 Sep 2021 17:27:00 +0200 Subject: [PATCH 3/5] Fix dimensions Signed-off-by: Lixfel --- .../fightsystem/utils/WorldeditWrapper14.java | 6 +++ .../fightsystem/utils/WorldeditWrapper8.java | 6 +++ .../fightsystem/fight/FightSchematic.java | 46 +++++++++---------- .../fightsystem/utils/WorldeditWrapper.java | 1 + 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java index 8f1c317..bb5b450 100644 --- a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java +++ b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java @@ -109,6 +109,12 @@ public class WorldeditWrapper14 implements WorldeditWrapper.IWorldeditWrapper { e.flushSession(); } + @Override + public Vector getDimensions(Clipboard clipboard) { + BlockVector3 dims = clipboard.getDimensions(); + return new Vector(dims.getX(), dims.getY(), dims.getZ()); + } + @Override public Clipboard loadChar(String charName) throws IOException { return new SpongeSchematicReader(new NBTInputStream(new GZIPInputStream(new FileInputStream(new File(FightSystem.getPlugin().getDataFolder(), "text/" + charName + ".schem"))))).read(); diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java index ad3ea1e..0969655 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java @@ -109,6 +109,12 @@ public class WorldeditWrapper8 implements WorldeditWrapper.IWorldeditWrapper { e.flushQueue(); } + @Override + public org.bukkit.util.Vector getDimensions(Clipboard clipboard) { + Vector dims = clipboard.getDimensions(); + return new org.bukkit.util.Vector(dims.getBlockX(), dims.getBlockY(), dims.getBlockZ()); + } + @Override public Clipboard loadChar(String charName) throws IOException { return new SchematicReader(new NBTInputStream(new GZIPInputStream(new FileInputStream(new File(FightSystem.getPlugin().getDataFolder(), "text/" + charName + ".schematic"))))).read(new BukkitWorld(Bukkit.getWorlds().get(0)).getWorldData()); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java index 64cdf2e..c7f465c 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java @@ -114,30 +114,30 @@ public class FightSchematic extends StateDependent { Bukkit.getScheduler().runTask(FightSystem.getPlugin(), this::paste); } - private void replaceTeamColor(Clipboard clipboard) throws WorldEditException { - WorldeditWrapper.impl.replaceTeamColor(clipboard, ArenaMode.AntiPrepare.contains(Config.mode) ? ColorConverter.chat2dye(team.getColor()) : DyeColor.PINK); + private void replaceTeamColor(Clipboard clipboard) { + try { + WorldeditWrapper.impl.replaceTeamColor(clipboard, ArenaMode.AntiPrepare.contains(Config.mode) ? ColorConverter.chat2dye(team.getColor()) : DyeColor.PINK); + } catch (WorldEditException e) { + Bukkit.getLogger().log(Level.SEVERE, "Could not recolor schematic", e); + } } private void paste(){ FreezeWorld freezer = new FreezeWorld(); - try { - replaceTeamColor(clipboard); - WorldeditWrapper.impl.pasteClipboard( - clipboard, - new Location(Bukkit.getWorlds().get(0), region.centerX(), region.getMinY(), region.centerZ()), - new Vector( - -clipboard.getDimensions().getBlockX()/2, - Config.WaterDepth != 0 ? Config.WaterDepth - WorldeditWrapper.impl.getWaterDepth(clipboard) : 0, - -clipboard.getDimensions().getBlockZ()/2 - ), - new AffineTransform().rotateY(rotate ? 180 : 0) - ); - } catch (WorldEditException e) { - FightSystem.broadcast("§cFehler beim Pasten der Schematic"); - Bukkit.getScheduler().runTask(FightSystem.getPlugin(), FightSystem::setPreSchemState); - throw new SecurityException("Could not paste schematic", e); - } + replaceTeamColor(clipboard); + + Vector dims = WorldeditWrapper.impl.getDimensions(clipboard); + WorldeditWrapper.impl.pasteClipboard( + clipboard, + new Location(Bukkit.getWorlds().get(0), region.centerX(), region.getMinY(), region.centerZ()), + new Vector( + -dims.getBlockX()/2, + Config.WaterDepth != 0 ? Config.WaterDepth - WorldeditWrapper.impl.getWaterDepth(clipboard) : 0, + -dims.getBlockZ()/2 + ), + new AffineTransform().rotateY(rotate ? 180 : 0) + ); Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), freezer::disable, 3); Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), team::teleportToSpawn, 40); @@ -179,15 +179,11 @@ public class FightSchematic extends StateDependent { } } - try { - replaceTeamColor(character); - } catch (WorldEditException e) { - Bukkit.getLogger().log(Level.SEVERE, "Could not recolor team text", e); - } + replaceTeamColor(character); characters[i] = character; offsets[i] = length; - length += character.getDimensions().getBlockX() + 1; // 1 is the distance between characters + length += WorldeditWrapper.impl.getDimensions(character).getBlockX() + 1; // 1 is the distance between characters } length -= 1; diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java index 0edf2e9..d96df0a 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldeditWrapper.java @@ -39,6 +39,7 @@ public class WorldeditWrapper { void replaceTeamColor(Clipboard clipboard, DyeColor c) throws WorldEditException; int getWaterDepth(Clipboard clipboard); void pasteClipboard(Clipboard clipboard, Location position, Vector offset, AffineTransform aT); + Vector getDimensions(Clipboard clipboard); Clipboard loadChar(String charName) throws IOException; void saveSchem(Schematic schem, Region region, int minY) throws WorldEditException; } -- 2.39.2 From 0556b9de9a42aabf49fa08f3f470f994b7676a57 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 2 Sep 2021 11:23:10 +0200 Subject: [PATCH 4/5] Fix one off offsets with doubles + aligned pasting Signed-off-by: Lixfel --- .../fightsystem/utils/WorldeditWrapper14.java | 7 ++++--- .../fightsystem/utils/WorldeditWrapper8.java | 6 +++--- .../src/de/steamwar/fightsystem/Config.java | 13 +++++++------ .../steamwar/fightsystem/fight/FightSchematic.java | 4 ++-- .../src/de/steamwar/fightsystem/utils/Region.java | 12 ++++++++---- .../fightsystem/winconditions/Winconditions.java | 4 ++++ 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java index bb5b450..a91d4eb 100644 --- a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java +++ b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java @@ -33,6 +33,7 @@ import com.sk89q.worldedit.extent.clipboard.io.SpongeSchematicReader; import com.sk89q.worldedit.function.operation.ForwardExtentCopy; import com.sk89q.worldedit.function.operation.Operations; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.AffineTransform; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.session.ClipboardHolder; @@ -103,9 +104,9 @@ public class WorldeditWrapper14 implements WorldeditWrapper.IWorldeditWrapper { EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(position.getWorld()), -1); ClipboardHolder ch = new ClipboardHolder(clipboard); ch.setTransform(aT); - Operations.completeBlindly(ch.createPaste(e).to(BukkitAdapter.asBlockVector(position).add( - aT.apply(BlockVector3.at(offset.getBlockX(), offset.getBlockY(), offset.getBlockZ()).add(clipboard.getOrigin()).subtract(clipboard.getMinimumPoint()).toVector3()).toBlockPoint() - )).build()); + Operations.completeBlindly(ch.createPaste(e).to(BukkitAdapter.asVector(position).add( + aT.apply(Vector3.at(offset.getX(), offset.getY(), offset.getZ()).add(clipboard.getOrigin().toVector3()).subtract(clipboard.getMinimumPoint().toVector3())) + ).toBlockPoint()).build()); e.flushSession(); } diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java index 0969655..2264f2b 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java @@ -103,9 +103,9 @@ public class WorldeditWrapper8 implements WorldeditWrapper.IWorldeditWrapper { EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); ClipboardHolder ch = new ClipboardHolder(clipboard, w.getWorldData()); ch.setTransform(aT); - Operations.completeBlindly(ch.createPaste(e, w.getWorldData()).to(new Vector(position.getBlockX(), position.getBlockY(), position.getBlockZ()).add( - aT.apply(new Vector(offset.getBlockX(), offset.getBlockY(), offset.getBlockZ()).add(clipboard.getOrigin()).subtract(clipboard.getMinimumPoint())).toBlockPoint() - )).build()); + Operations.completeBlindly(ch.createPaste(e, w.getWorldData()).to(new Vector(position.getX(), position.getY(), position.getZ()).add( + aT.apply(new Vector(offset.getX(), offset.getY(), offset.getZ()).add(clipboard.getOrigin()).subtract(clipboard.getMinimumPoint())) + ).toBlockPoint()).build()); e.flushQueue(); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/Config.java b/FightSystem_Core/src/de/steamwar/fightsystem/Config.java index ac9b04d..8f09b06 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/Config.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/Config.java @@ -61,9 +61,9 @@ public class Config { public static final Location TeamRedSpawn; public static final Location SpecSpawn; - private static final int BlueToRedX; + public static final int BlueToRedX; private static final int BlueToRedY; - private static final int BlueToRedZ; + public static final int BlueToRedZ; public static final int PreperationArea; public static final int WaterDepth; @@ -132,14 +132,15 @@ public class Config { public static final int ReplayID; static{ - if(!new File(FightSystem.getPlugin().getDataFolder(), System.getProperty("config", "config.yml")).exists()) { + String configFile = System.getProperty("config", "config.yml"); + if(!new File(FightSystem.getPlugin().getDataFolder(), configFile).exists()) { FightSystem.getPlugin().saveDefaultConfig(); Bukkit.getLogger().log(Level.SEVERE, "Arenaconfig fehlt!"); Bukkit.shutdown(); } - FileConfiguration config = YamlConfiguration.loadConfiguration(new File(FightSystem.getPlugin().getDataFolder(), System.getProperty("config", "config.yml"))); + FileConfiguration config = YamlConfiguration.loadConfiguration(new File(FightSystem.getPlugin().getDataFolder(), configFile)); - File worldConfigFile = new File(Bukkit.getWorlds().get(0).getWorldFolder(), config.getString("Arenaconfig", "config.yml")); + File worldConfigFile = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "config.yml"); if(!worldConfigFile.exists()) { Bukkit.getLogger().log(Level.SEVERE, "Weltconfig fehlt!"); Bukkit.shutdown(); @@ -173,7 +174,7 @@ public class Config { GroundWalkable = config.getBoolean("Arena.GroundWalkable"); RanksEnabled = config.getBoolean("Schematic.RanksEnabled"); - SchematicType = de.steamwar.sql.SchematicType.fromDB(config.getString("Schematic.SchematicType")); + SchematicType = de.steamwar.sql.SchematicType.fromDB(Objects.requireNonNull(config.getString("Schematic.SchematicType"))); IgnorePublicOnly = config.getBoolean("Schematic.IgnorePublicOnly"); boolean rotate = config.getBoolean("Schematic.Rotate"); PasteAligned = config.getBoolean("Schematic.PasteAligned"); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java index c7f465c..4132169 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java @@ -132,9 +132,9 @@ public class FightSchematic extends StateDependent { clipboard, new Location(Bukkit.getWorlds().get(0), region.centerX(), region.getMinY(), region.centerZ()), new Vector( - -dims.getBlockX()/2, + -(Config.PasteAligned && Config.BlueToRedX != 0 ? region.getSizeX() : dims.getBlockX())/2.0, Config.WaterDepth != 0 ? Config.WaterDepth - WorldeditWrapper.impl.getWaterDepth(clipboard) : 0, - -dims.getBlockZ()/2 + -(Config.PasteAligned && Config.BlueToRedZ != 0 ? region.getSizeZ() : dims.getBlockZ())/2.0 ), new AffineTransform().rotateY(rotate ? 180 : 0) ); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/Region.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/Region.java index 809b530..ac6d9a3 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/Region.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/Region.java @@ -71,6 +71,10 @@ public class Region { return maxZ; } + public int getSizeX() { + return maxX - minX; + } + public int getSizeZ() { return maxZ - minZ; } @@ -120,12 +124,12 @@ public class Region { return (maxX - minX) * (maxY - minY) * (maxZ - minZ); } - public int centerX() { - return (maxX - minX) / 2 + minX; + public double centerX() { + return (maxX - minX) / 2.0 + minX; } - public int centerZ() { - return (maxZ - minZ) / 2 + minZ; + public double centerZ() { + return (maxZ - minZ) / 2.0 + minZ; } public boolean in2dRegion(Location location){ diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java index eb52f04..ed55771 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java @@ -23,13 +23,17 @@ public enum Winconditions { TIMEOUT, HEART_RATIO_TIMEOUT, PERCENT_TIMEOUT, + ALL_DEAD, CAPTAIN_DEAD, + PERCENT_SYSTEM, RELATIVE_PERCENT, POINTS, + TIME_TECH_KO, WATER_TECH_KO, PUMPKIN_TECH_KO, + HELLS_BELLS } -- 2.39.2 From fe19c1656dc0228eefa77bb32d9f217a93de2dd1 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Fri, 3 Sep 2021 17:30:18 +0200 Subject: [PATCH 5/5] TODO: Test if offsets vanished Signed-off-by: Lixfel --- .../src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java | 2 +- .../src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java index a91d4eb..5d3b1e3 100644 --- a/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java +++ b/FightSystem_14/src/de/steamwar/fightsystem/utils/WorldeditWrapper14.java @@ -106,7 +106,7 @@ public class WorldeditWrapper14 implements WorldeditWrapper.IWorldeditWrapper { ch.setTransform(aT); Operations.completeBlindly(ch.createPaste(e).to(BukkitAdapter.asVector(position).add( aT.apply(Vector3.at(offset.getX(), offset.getY(), offset.getZ()).add(clipboard.getOrigin().toVector3()).subtract(clipboard.getMinimumPoint().toVector3())) - ).toBlockPoint()).build()); + ).round().toBlockPoint()).build()); e.flushSession(); } diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java index 2264f2b..356d51a 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldeditWrapper8.java @@ -105,7 +105,7 @@ public class WorldeditWrapper8 implements WorldeditWrapper.IWorldeditWrapper { ch.setTransform(aT); Operations.completeBlindly(ch.createPaste(e, w.getWorldData()).to(new Vector(position.getX(), position.getY(), position.getZ()).add( aT.apply(new Vector(offset.getX(), offset.getY(), offset.getZ()).add(clipboard.getOrigin()).subtract(clipboard.getMinimumPoint())) - ).toBlockPoint()).build()); + ).round().toBlockPoint()).build()); e.flushQueue(); } -- 2.39.2