diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 45118e2..cc13dad 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -3,7 +3,7 @@ 4.0.0 network.palace Show - 1.6.0 + 1.6.1 ${project.artifactId} @@ -82,7 +82,7 @@ org.projectlombok lombok - 1.18.20 + 1.18.22 compile @@ -96,11 +96,17 @@ worldedit-bukkit 7.2.0-SNAPSHOT provided + + + bstats-bukkit + org.bstats + + io.netty netty-buffer - 4.1.51.Final + 4.1.75.Final compile @@ -112,7 +118,7 @@ com.craftmend.openaudiomc OpenAudioMc - 6.5.4 + 6.6.3 provided diff --git a/pom.xml b/pom.xml index 419677c..42b3aa4 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ network.palace Show - 1.6.0 + 1.6.1 enginehub-maven @@ -32,7 +32,7 @@ org.projectlombok lombok - 1.18.20 + 1.18.22 jar @@ -61,7 +61,7 @@ io.netty netty-buffer - 4.1.51.Final + 4.1.75.Final org.spigotmc @@ -77,7 +77,7 @@ org.bstats bstats-bukkit - 2.2.1 + 3.0.0 compile diff --git a/src/main/java/network/palace/show/ShowPlugin.java b/src/main/java/network/palace/show/ShowPlugin.java index 46e7012..f392fbc 100644 --- a/src/main/java/network/palace/show/ShowPlugin.java +++ b/src/main/java/network/palace/show/ShowPlugin.java @@ -19,6 +19,7 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.PluginLoadOrder; import org.bukkit.plugin.java.JavaPlugin; @@ -37,7 +38,7 @@ * Created by Marc on 12/6/16. * Updated to be Core free by Tom 07/10/2021 */ -@Plugin(name = "Show", version = "1.6.0") +@Plugin(name = "Show", version = "1.6.1") @Description(value = "Create Shows in Minecraft with easy to use files!") @LoadOrder(value = PluginLoadOrder.POSTWORLD) @Author(value = "Legobuilder0813") @@ -52,7 +53,7 @@ @Command(name = "show", desc = "Main show command", permission = "show.main", permissionMessage = "You do not have permission!", usage = "/show [list|start|stop]") @Command(name = "showdebug", desc = "Showdebug command", permission = "show.debug", permissionMessage = "You do not have permission!", usage = "/showdebug") @Command(name = "showgen", desc = "Showgen commands", permission = "show.showgen", permissionMessage = "You do not have permission!", usage = "/showgen") -public class ShowPlugin extends JavaPlugin { +public class ShowPlugin extends JavaPlugin implements Listener { @Getter private ArmorStandManager armorStandManager; @Getter private FountainManager fountainManager; @Getter private static ShowGenerator showGenerator; @@ -103,13 +104,14 @@ public void onEnable() { } - //has to be loaded after github token + // Has to be loaded after github token showGenerator = new ShowGenerator(); this.getServer().getPluginManager().registerEvents(fountainManager, this); this.getServer().getPluginManager().registerEvents(new PlayerInteract(), this); this.getServer().getPluginManager().registerEvents(new ChunkListener(), this); + this.getServer().getPluginManager().registerEvents(this, this); // Show Ticker taskid = Bukkit.getScheduler().runTaskTimer(this, () -> { @@ -128,7 +130,7 @@ public void onEnable() { new UpdateUtil(this, 94141).getVersion(v -> { if (!this.getDescription().getVersion().equalsIgnoreCase(v)) { - Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "[Show] A New update is available for Show! It is always recommended that you upgrade! Link: https://www.spigotmc.org/resources/show-make-huge-spectaculars-in-minecraft.94141/"); + Bukkit.getConsoleSender().sendMessage(ChatColor.AQUA + "[Show] " + ChatColor.RED + "A New update is available for Show! It is always recommended that you upgrade! Link: https://www.spigotmc.org/resources/show-make-huge-spectaculars-in-minecraft.94141/"); } }); diff --git a/src/main/java/network/palace/show/actions/BlockAction.java b/src/main/java/network/palace/show/actions/BlockAction.java index a62def0..722f9c7 100644 --- a/src/main/java/network/palace/show/actions/BlockAction.java +++ b/src/main/java/network/palace/show/actions/BlockAction.java @@ -2,8 +2,6 @@ import network.palace.show.Show; import network.palace.show.exceptions.ShowParseException; -import network.palace.show.handlers.BlockData; -import network.palace.show.utils.ShowUtil; import network.palace.show.utils.WorldUtil; import org.bukkit.Location; import org.bukkit.Material; diff --git a/src/main/java/network/palace/show/actions/FakeBlockAction.java b/src/main/java/network/palace/show/actions/FakeBlockAction.java index 107b027..ca87ff8 100644 --- a/src/main/java/network/palace/show/actions/FakeBlockAction.java +++ b/src/main/java/network/palace/show/actions/FakeBlockAction.java @@ -1,20 +1,15 @@ package network.palace.show.actions; -import com.comphenix.protocol.wrappers.BlockPosition; -import com.comphenix.protocol.wrappers.WrappedBlockData; import lombok.Getter; import lombok.Setter; -import network.palace.show.packets.server.block.WrapperPlayServerBlockChange; import network.palace.show.Show; import network.palace.show.exceptions.ShowParseException; -import network.palace.show.handlers.BlockData; -import network.palace.show.utils.MiscUtil; import network.palace.show.utils.ShowUtil; import network.palace.show.utils.WorldUtil; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; /** @@ -25,30 +20,27 @@ @SuppressWarnings("deprecation") public class FakeBlockAction extends ShowAction { private Location loc; - private Material mat; + private BlockData data; public FakeBlockAction(Show show, long time) { super(show, time); } - public FakeBlockAction(Show show, long time, Location loc, Material mat) { + public FakeBlockAction(Show show, long time, Location loc, BlockData data) { super(show, time); this.loc = loc; - this.mat = mat; + this.data = data; } @Override public void play(Player[] nearPlayers) { try { - WrapperPlayServerBlockChange p = new WrapperPlayServerBlockChange(); - p.setLocation(new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); - p.setBlockData(WrappedBlockData.createData(mat)); for (Player tp : nearPlayers) { - if (tp != null) MiscUtil.sendPacket(p, tp); + if (tp != null) tp.sendBlockChange(loc, data); } } catch (Exception e) { Bukkit.getLogger().severe("FakeBlockAction -" + ChatColor.RED + "Error sending FakeBlockAction for type (" + - mat.toString() + ") at location " + loc.getX() + "," + loc.getY() + "," + loc.getZ() + " at time " + + data.getMaterial() + ") at location " + loc.getX() + "," + loc.getY() + "," + loc.getZ() + " at time " + time + " for show " + show.getName()); e.printStackTrace(); } @@ -62,7 +54,7 @@ public ShowAction load(String line, String... args) throws ShowParseException { } try { this.loc = loc; - this.mat = Material.valueOf(args[2].toUpperCase()); + this.data = ShowUtil.getBlockData(line); } catch (IllegalArgumentException e) { throw new ShowParseException(e.getMessage()); } @@ -71,6 +63,6 @@ public ShowAction load(String line, String... args) throws ShowParseException { @Override protected ShowAction copy(Show show, long time) throws ShowParseException { - return new FakeBlockAction(show, time, loc, mat); + return new FakeBlockAction(show, time, loc, data); } } \ No newline at end of file diff --git a/src/main/java/network/palace/show/actions/FountainAction.java b/src/main/java/network/palace/show/actions/FountainAction.java index 80555b5..95db3bd 100644 --- a/src/main/java/network/palace/show/actions/FountainAction.java +++ b/src/main/java/network/palace/show/actions/FountainAction.java @@ -3,9 +3,7 @@ import network.palace.show.Show; import network.palace.show.ShowPlugin; import network.palace.show.exceptions.ShowParseException; -import network.palace.show.handlers.BlockData; import network.palace.show.handlers.Fountain; -import network.palace.show.utils.ShowUtil; import network.palace.show.utils.WorldUtil; import org.bukkit.Location; import org.bukkit.Material; diff --git a/src/main/java/network/palace/show/commands/showgen/GenerateCommand.java b/src/main/java/network/palace/show/commands/showgen/GenerateCommand.java index a429c00..29212dd 100644 --- a/src/main/java/network/palace/show/commands/showgen/GenerateCommand.java +++ b/src/main/java/network/palace/show/commands/showgen/GenerateCommand.java @@ -82,7 +82,7 @@ public void handle(CommandSender sender, String[] args) { bottom = !args[1].equalsIgnoreCase("top"); delayPerLayer = Double.parseDouble(args[2]); } else { - bottom = false; + bottom = true; delayPerLayer = 0; } @@ -109,18 +109,18 @@ public void handle(CommandSender sender, String[] args) { changeInTime = delayPerLayer; } + + // y is startingY, and is incremented by yChange every loop until y is equal to endingY. for (int y = startingY; compare(y, endingY, !bottom); y += yChange) { for (int x = 0; x < initialScene.getXLength(); x++) { for (int z = 0; z < initialScene.getZLength(); z++) { Block oldBlock = initialScene.getBlock(x, y, z); Block newBlock = finalScene.getBlock(x, y, z); - if (newBlock.getType().equals(oldBlock.getType()) && newBlock.getData() == oldBlock.getData()) { + if (newBlock.getType().equals(oldBlock.getType()) && newBlock.getBlockData().matches(oldBlock.getBlockData())) { continue; } - Material material = newBlock.getType(); - byte data = newBlock.getData(); FakeBlockAction act = new FakeBlockAction(null, (long) (localTime * 1000)); - act.setMat(material); + act.setData(newBlock.getBlockData()); act.setLoc(new Location(corner.getWorld(), corner.getBlockX() + x, corner.getBlockY() + y, corner.getBlockZ() + z)); actions.add(act); } @@ -128,6 +128,7 @@ public void handle(CommandSender sender, String[] args) { localTime += changeInTime; } + if (actions.isEmpty()) { player.sendMessage(ChatColor.RED + "There aren't any differences between the two selected regions!"); return; diff --git a/src/main/java/network/palace/show/enums/BlockDataType.java b/src/main/java/network/palace/show/enums/BlockDataType.java new file mode 100644 index 0000000..df6989b --- /dev/null +++ b/src/main/java/network/palace/show/enums/BlockDataType.java @@ -0,0 +1,10 @@ +package network.palace.show.enums; + +public enum BlockDataType { + STAIRS, + FENCE, + GLASS_PANE, + TRAPDOOR, + DOOR, + SLAB +} diff --git a/src/main/java/network/palace/show/generator/ShowGenerator.java b/src/main/java/network/palace/show/generator/ShowGenerator.java index 30fcf92..82be007 100644 --- a/src/main/java/network/palace/show/generator/ShowGenerator.java +++ b/src/main/java/network/palace/show/generator/ShowGenerator.java @@ -5,13 +5,17 @@ import com.google.gson.JsonObject; import network.palace.show.ShowPlugin; import network.palace.show.actions.FakeBlockAction; -import org.bukkit.Bukkit; +import org.apache.commons.lang.StringUtils; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.*; import org.json.JSONObject; import java.util.HashMap; import java.util.List; +import java.util.Objects; import java.util.UUID; public class ShowGenerator { @@ -54,11 +58,13 @@ public String postGist(List actions, String name) throws Except for (FakeBlockAction action : actions) { Location loc = action.getLoc(); double time = ((int) ((action.getTime() / 1000.0) * 10)) / 10.0; - Material mat = action.getMat(); + Material mat = action.getData().getMaterial(); int x = loc.getBlockX(); int y = loc.getBlockY(); int z = loc.getBlockZ(); - String actionString = time + "\u0009" + "FakeBlock" + "\u0009" + mat.toString() + "\u0009" + x + "," + y + "," + z; + String actionString = time + "\u0009" + "FakeBlock" + "\u0009" + mat + "\u0009" + x + "," + y + "," + z; + // If data, add to end + if (!Objects.equals(getBlockDataString(action.getData()), "")) actionString += "\u0009" + getBlockDataString(action.getData()); content.append(actionString).append("\n"); } @@ -68,8 +74,6 @@ public String postGist(List actions, String name) throws Except obj.add("files", files); - System.out.println("SENDING (" + actions.size() + "): " + obj.toString()); - Request req = webb.post("https://api.github.com/gists") .header("Accept", "application/vnd.github.v3+json") .header("Authorization", "token " + ACCESS_TOKEN) @@ -80,4 +84,73 @@ public String postGist(List actions, String name) throws Except return response.getString("html_url"); } + + /* + Whole Line: + 0 1 2 3 4 + TIME ACTION MATERIAL COORDS BLOCK_DATA + 3.0 FakeBlock AIR 14,5,1 STAIRS:DATA:DATA + . + . + Block Data: + 0 1 2 3 4 + STAIRS : HALF : FACING : SHAPE -> STAIRS:BOTTOM/TOP:NORTH/EAST/SOUTH/WEST:INNER_LEFT/... + FENCE : FACE -> FENCE:NORTH/EAST/SOUTH/WEST ex) FENCE:NORTH:SOUTH + GLASS_PANE : FACE -> GLASS_PANE:NORTH/EAST/SOUTH/WEST ex) GLASS_PANE:NORTH:SOUTH + TRAPDOOR : HALF : FACING : OPEN -> TRAPDOOR:BOTTOM/TOP:NORTH/EAST/SOUTH/WEST:TRUE/FALSE + DOOR : HALF : FACING : OPEN : HINGE -> DOOR:BOTTOM/TOP:NORTH/EAST/SOUTH/WEST:TRUE/FALSE:LEFT/RIGHT + SLAB : TYPE -> SLAB:TOP/BOTTOM/DOUBLE + */ + private String getBlockDataString(BlockData blockData) { + StringBuilder dataString = new StringBuilder(); + if (blockData instanceof Stairs) { + String half = ((Stairs) blockData).getHalf().toString(); + String facing = ((Stairs) blockData).getFacing().toString(); + String shape = ((Stairs) blockData).getShape().toString(); + dataString = new StringBuilder("STAIRS," + half.toUpperCase() + "," + facing.toUpperCase() + "," + shape.toUpperCase()); + + } else if (blockData instanceof Fence) { + if (((Fence) blockData).getFaces().isEmpty()) return ""; + dataString = new StringBuilder("FENCE,"); + + // True for included + for (BlockFace face : ((Fence) blockData).getFaces()) { + dataString.append(face.toString().toUpperCase()).append(":"); + } + + // Remove last character + dataString = new StringBuilder(StringUtils.chop(dataString.toString())); + + } else if (blockData instanceof GlassPane) { + if (((GlassPane) blockData).getFaces().isEmpty()) return ""; + dataString = new StringBuilder("GLASS_PANE,"); + + // True for included + for (BlockFace face : ((GlassPane) blockData).getFaces()) { + dataString.append(face.toString().toUpperCase()).append(":"); + } + + // Remove last character + dataString = new StringBuilder(StringUtils.chop(dataString.toString())); + + } else if (blockData instanceof TrapDoor) { + String half = ((TrapDoor) blockData).getHalf().toString(); + String facing = ((TrapDoor) blockData).getFacing().toString(); + String open = String.valueOf(((TrapDoor) blockData).isOpen()); + dataString = new StringBuilder("TRAPDOOR," + half.toUpperCase() + "," + facing.toUpperCase() + "," + open.toUpperCase()); + + } else if (blockData instanceof Door) { + String half = ((Door) blockData).getHalf().toString(); + String facing = ((Door) blockData).getFacing().toString(); + String open = String.valueOf(((Door) blockData).isOpen()); + String hinge = ((Door) blockData).getHinge().toString(); + dataString = new StringBuilder("DOOR," + half.toUpperCase() + "," + facing.toUpperCase() + "," + open.toUpperCase() + "," + hinge.toUpperCase()); + + } else if (blockData instanceof Slab) { + String type = ((Slab) blockData).getType().toString(); + dataString = new StringBuilder("SLAB," + type.toUpperCase()); + } + + return dataString.toString(); + } } diff --git a/src/main/java/network/palace/show/handlers/BlockData.java b/src/main/java/network/palace/show/handlers/BlockData.java deleted file mode 100644 index f9e184f..0000000 --- a/src/main/java/network/palace/show/handlers/BlockData.java +++ /dev/null @@ -1,15 +0,0 @@ -package network.palace.show.handlers; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author Marc - * @since 8/2/17 - */ -@AllArgsConstructor -@Getter -public class BlockData { - private int id; - private byte data; -} diff --git a/src/main/java/network/palace/show/utils/ShowUtil.java b/src/main/java/network/palace/show/utils/ShowUtil.java index 9ffda0c..8a72373 100644 --- a/src/main/java/network/palace/show/utils/ShowUtil.java +++ b/src/main/java/network/palace/show/utils/ShowUtil.java @@ -2,20 +2,21 @@ import network.palace.show.Show; import network.palace.show.ShowPlugin; +import network.palace.show.enums.BlockDataType; import network.palace.show.exceptions.ShowParseException; -import network.palace.show.handlers.BlockData; import network.palace.show.handlers.TitleType; import network.palace.show.sequence.ShowSequence; import org.bukkit.*; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Bisected; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.*; import org.bukkit.material.MaterialData; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.LinkedList; -import java.util.List; +import java.util.*; /** * @author Marc @@ -23,25 +24,90 @@ */ public class ShowUtil { + /* + Whole Line: + 0 1 2 3 4 + TIME ACTION MATERIAL COORDS BLOCK_DATA + 3.0 FakeBlock AIR 14,5,1 STAIRS:DATA:DATA + . + . + Block Data: + 0 1 2 3 4 + STAIRS : HALF : FACING : SHAPE -> STAIRS:BOTTOM/TOP:NORTH/EAST/SOUTH/WEST:INNER_LEFT/... + FENCE : FACE -> FENCE:NORTH/EAST/SOUTH/WEST ex) FENCE:NORTH:SOUTH + GLASS_PANE : FACE -> GLASS_PANE:NORTH/EAST/SOUTH/WEST ex) GLASS_PANE:NORTH:SOUTH + TRAPDOOR : HALF : FACING : OPEN -> TRAPDOOR:BOTTOM/TOP:NORTH/EAST/SOUTH/WEST:TRUE/FALSE + DOOR : HALF : FACING : OPEN : HINGE -> DOOR:BOTTOM/TOP:NORTH/EAST/SOUTH/WEST:TRUE/FALSE:LEFT/RIGHT + SLAB : TYPE -> SLAB:TOP/BOTTOM/DOUBLE + */ public static BlockData getBlockData(String s) throws ShowParseException { - String[] list; - if (s.contains(":")) { - list = s.split(":"); - } else { - list = null; - } try { - int id; - byte data; - if (list != null) { - id = Integer.parseInt(list[0]); - data = Byte.parseByte(list[1]); - } else { - id = Integer.parseInt(s); - data = (byte) 0; + String[] params = s.split("\u0009"); + BlockData blockData = Material.valueOf(params[2].toUpperCase()).createBlockData(); + + // Block data string params, or null if none + if (params.length >= 5) { + String[] dataParams = params[4].split(","); + BlockDataType type = BlockDataType.valueOf(dataParams[0].toUpperCase()); + + switch (type) { + case STAIRS: { + ((Stairs) blockData).setHalf(Bisected.Half.valueOf(dataParams[1].toUpperCase())); + ((Stairs) blockData).setFacing(BlockFace.valueOf(dataParams[2].toUpperCase())); + ((Stairs) blockData).setShape(Stairs.Shape.valueOf(dataParams[3].toUpperCase())); + break; + } + case FENCE: { + String[] faces = dataParams[1].split(":"); + + ((Fence) blockData).setFace(BlockFace.valueOf(faces[0].toUpperCase()), true); + if (faces.length >= 2) ((Fence) blockData).setFace(BlockFace.valueOf(faces[1].toUpperCase()), true); + if (faces.length >= 3) ((Fence) blockData).setFace(BlockFace.valueOf(faces[2].toUpperCase()), true); + if (faces.length >= 4) ((Fence) blockData).setFace(BlockFace.valueOf(faces[3].toUpperCase()), true); + break; + } + case GLASS_PANE: { + // Plain glass-pane uses the fence block-data not the glass-pane because spaghetti + if (blockData.getMaterial().equals(Material.GLASS_PANE)) { + String[] faces = dataParams[1].split(":"); + + ((Fence) blockData).setFace(BlockFace.valueOf(faces[0].toUpperCase()), true); + if (faces.length >= 2) ((Fence) blockData).setFace(BlockFace.valueOf(faces[1].toUpperCase()), true); + if (faces.length >= 3) ((Fence) blockData).setFace(BlockFace.valueOf(faces[2].toUpperCase()), true); + if (faces.length >= 4) ((Fence) blockData).setFace(BlockFace.valueOf(faces[3].toUpperCase()), true); + + } else { + String[] faces = dataParams[1].split(":"); + + ((GlassPane) blockData).setFace(BlockFace.valueOf(faces[0].toUpperCase()), true); + if (faces.length >= 2) ((GlassPane) blockData).setFace(BlockFace.valueOf(faces[1].toUpperCase()), true); + if (faces.length >= 3) ((GlassPane) blockData).setFace(BlockFace.valueOf(faces[2].toUpperCase()), true); + if (faces.length >= 4) ((GlassPane) blockData).setFace(BlockFace.valueOf(faces[3].toUpperCase()), true); + } + break; + } + case TRAPDOOR: { + ((TrapDoor) blockData).setHalf(Bisected.Half.valueOf(dataParams[1].toUpperCase())); + ((TrapDoor) blockData).setFacing(BlockFace.valueOf(dataParams[2].toUpperCase())); + ((TrapDoor) blockData).setOpen(Boolean.parseBoolean(dataParams[3].toUpperCase())); + break; + } + case DOOR: { + ((Door) blockData).setHalf(Bisected.Half.valueOf(dataParams[1].toUpperCase())); + ((Door) blockData).setFacing(BlockFace.valueOf(dataParams[2].toUpperCase())); + ((Door) blockData).setOpen(Boolean.parseBoolean(dataParams[3].toUpperCase())); + ((Door) blockData).setHinge(Door.Hinge.valueOf(dataParams[4].toUpperCase())); + break; + } case SLAB: { + ((Slab) blockData).setType(Slab.Type.valueOf(dataParams[1].toUpperCase())); + break; + } + } } - return new BlockData(id, data); - } catch (Exception ignored) { + + return blockData; + } catch (Exception e) { + e.printStackTrace(); throw new ShowParseException("Invalid Block ID or Block data"); } }