diff --git a/pom.xml b/pom.xml index b6eac05..da958db 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.modnmetl virtualrealty - 2.6.0 + 2.8.0 jar A plot creation and management plugin for Minecraft @@ -14,6 +14,7 @@ 1.8 UTF-8 + com.modnmetl.virtualrealty.VirtualRealty @@ -76,6 +77,10 @@ + + plytki-repo + https://maven.pkg.github.com/plytki/base-api + spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -105,6 +110,10 @@ https://repo.codemc.org/repository/maven-public/ default + + Modrinth + https://api.modrinth.com/maven + @@ -184,7 +193,7 @@ de.tr7zw item-nbt-api - 2.12.1 + 2.13.1 compile @@ -193,6 +202,12 @@ 4.0.3 compile + + + + + + diff --git a/src/main/java/com/modnmetl/virtualrealty/VirtualRealty.java b/src/main/java/com/modnmetl/virtualrealty/VirtualRealty.java index 35a4369..378f35d 100644 --- a/src/main/java/com/modnmetl/virtualrealty/VirtualRealty.java +++ b/src/main/java/com/modnmetl/virtualrealty/VirtualRealty.java @@ -28,6 +28,7 @@ import com.modnmetl.virtualrealty.util.multiversion.VMaterial; import com.modnmetl.virtualrealty.util.UpdateChecker; import com.zaxxer.hikari.HikariDataSource; +import de.tr7zw.changeme.nbtapi.utils.MinecraftVersion; import lombok.Getter; import lombok.Setter; import org.apache.commons.io.FileUtils; diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/CommandManager.java b/src/main/java/com/modnmetl/virtualrealty/commands/CommandManager.java index 8b30a1c..388f81f 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/CommandManager.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/CommandManager.java @@ -412,7 +412,7 @@ public List onTabComplete(@NotNull CommandSender sender, @NotNull Comman case "LEAVE": { if (args.length == 2) { String trim = finalArgs[1].trim(); - PlotManager.getInstance().getMembershipPlots(player.getUniqueId()).forEach((integer, plot) -> { + PlotManager.getInstance().getAccessPlots(player.getUniqueId()).forEach((integer, plot) -> { if (trim.isEmpty()) { tabCompleter.add(String.valueOf(plot.getID())); } else if (String.valueOf(plot.getID()).toLowerCase().startsWith(trim.toLowerCase())) { diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/LeaveSubCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/LeaveSubCommand.java index a230d56..c2ead26 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/LeaveSubCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/LeaveSubCommand.java @@ -3,9 +3,12 @@ import com.modnmetl.virtualrealty.VirtualRealty; import com.modnmetl.virtualrealty.commands.SubCommand; import com.modnmetl.virtualrealty.exception.FailedCommandException; +import com.modnmetl.virtualrealty.manager.ConfirmationManager; import com.modnmetl.virtualrealty.manager.PlotManager; import com.modnmetl.virtualrealty.model.other.ChatMessage; import com.modnmetl.virtualrealty.model.other.CommandType; +import com.modnmetl.virtualrealty.model.other.Confirmation; +import com.modnmetl.virtualrealty.model.other.ConfirmationType; import com.modnmetl.virtualrealty.model.permission.ManagementPermission; import com.modnmetl.virtualrealty.model.plot.Plot; import com.modnmetl.virtualrealty.model.plot.PlotMember; @@ -60,11 +63,38 @@ public void exec(CommandSender sender, Command command, String label, String[] a } PlotMember plotMember = plot.getMember(player.getUniqueId()); if (plot.getOwnedBy().equals(player.getUniqueId())) { - ChatMessage.of(VirtualRealty.getMessages().cantLeaveOwnPlot).sendWithPrefix(sender); - return; + for (String s : VirtualRealty.getMessages().leaveConfirmation) { + player.sendMessage(VirtualRealty.PREFIX + s.replaceAll("%plot_id%", String.valueOf(plotID))); + } + Confirmation confirmation = new Confirmation(ConfirmationType.PLOT_OWNER_LEAVE, player, "YES") { + @Override + public void success() { + ChatMessage.of(VirtualRealty.getMessages().plotLeave.replaceAll("%plot_id%", String.valueOf(plotID))) + .sendWithPrefix(sender); + plot.removeAllMembers(); + plot.setAssignedBy(null); + plot.setOwnedBy(null); + plot.update(); + ConfirmationManager.removeConfirmations(this.getConfirmationType()); + } + @Override + public void failed() { + ChatMessage.of(VirtualRealty.getMessages().leaveConfirmationCancelled.replaceAll("%plot_id%", String.valueOf(plotID))) + .sendWithPrefix(sender); + ConfirmationManager.removeConfirmations(this.getConfirmationType()); + } + @Override + public void expiry() { + ChatMessage.of(VirtualRealty.getMessages().confirmationExpired.replaceAll("%plot_id%", String.valueOf(plotID))) + .sendWithPrefix(sender); + ConfirmationManager.removeConfirmations(this.getConfirmationType()); + } + }; + ConfirmationManager.addConfirmation(confirmation); + } else { + plot.removeMember(plotMember); + ChatMessage.of(VirtualRealty.getMessages().plotLeave.replaceAll("%plot_id%", String.valueOf(plot.getID()))).sendWithPrefix(sender); } - plot.removeMember(plotMember); - ChatMessage.of(VirtualRealty.getMessages().plotLeave.replaceAll("%plot_id%", String.valueOf(plot.getID()))).sendWithPrefix(sender); } } diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/VirtualRealtyCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/VirtualRealtyCommand.java index 8b6c94d..c7abee5 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/VirtualRealtyCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/VirtualRealtyCommand.java @@ -2,11 +2,13 @@ import com.modnmetl.virtualrealty.commands.CommandRegistry; import com.modnmetl.virtualrealty.commands.SubCommand; +import com.modnmetl.virtualrealty.manager.PlotManager; import com.modnmetl.virtualrealty.model.other.CommandType; import com.modnmetl.virtualrealty.exception.FailedCommandException; import com.modnmetl.virtualrealty.VirtualRealty; import com.modnmetl.virtualrealty.exception.InsufficientPermissionsException; import org.bukkit.command.*; +import org.bukkit.entity.Player; import org.bukkit.permissions.Permission; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/modnmetl/virtualrealty/configs/MessagesConfiguration.java b/src/main/java/com/modnmetl/virtualrealty/configs/MessagesConfiguration.java index 7b4beb5..98def07 100644 --- a/src/main/java/com/modnmetl/virtualrealty/configs/MessagesConfiguration.java +++ b/src/main/java/com/modnmetl/virtualrealty/configs/MessagesConfiguration.java @@ -89,7 +89,6 @@ public class MessagesConfiguration extends OkaeriConfig { public String notStandingOnPlot = "§cYou aren't standing on any plot!"; public String playerKick = "§aPlayer §7%player% §ahas been kicked out of your plot!"; public String plotLeave = "§aYou have left the plot with id %plot_id%!"; - public String cantLeaveOwnPlot = "§6You can't leave your own plot!"; public String playerAdd = "§aPlayer §7%player% §ahas been added to your plot!"; public String gamemodeSwitched = "§aYour gamemode has changed!"; public String gamemodeAlreadySelected = "§cThis gamemode is already selected!"; @@ -142,6 +141,11 @@ public class MessagesConfiguration extends OkaeriConfig { "§7You are about to remove §a%plot_id%§7, once done you cannot undo.", "§7Type §aYES §7to proceed." ); + public List leaveConfirmation = Arrays.asList( + "§7You are about to leave your owned plot §a%plot_id%§7.", + "§7Type §aYES §7to confirm." + ); + public String leaveConfirmationCancelled = "§cLeaving process cancelled!"; //Other public String confirmationExpired = "§cConfirmation not received, command cancelled."; diff --git a/src/main/java/com/modnmetl/virtualrealty/listener/player/PlayerActionListener.java b/src/main/java/com/modnmetl/virtualrealty/listener/player/PlayerActionListener.java index 01217de..a24ea09 100644 --- a/src/main/java/com/modnmetl/virtualrealty/listener/player/PlayerActionListener.java +++ b/src/main/java/com/modnmetl/virtualrealty/listener/player/PlayerActionListener.java @@ -17,7 +17,7 @@ import com.modnmetl.virtualrealty.model.region.GridStructure; import com.modnmetl.virtualrealty.util.RegionUtil; import com.modnmetl.virtualrealty.model.other.ChatMessage; -import de.tr7zw.changeme.nbtapi.NBTItem; +import de.tr7zw.changeme.nbtapi.NBT; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.HoverEvent; @@ -37,6 +37,7 @@ import java.time.LocalDateTime; import java.util.AbstractMap; +import java.util.Map; public class PlayerActionListener extends VirtualListener { @@ -217,7 +218,6 @@ public void success() { int height = plotItem.getHeight(); int width = plotItem.getWidth(); ItemStack plotItemStack = DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getValue().getItemStack(); - NBTItem item = new NBTItem(plotItemStack); gridStructure.removeGrid(); this.getSender().sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().notCollidingCreating); long timeStart = System.currentTimeMillis(); @@ -230,15 +230,27 @@ public void success() { } else { plot = PlotManager.getInstance().createPlot(location, plotSize, plotItem.isNatural()); } - AbstractMap.SimpleEntry floorData = new AbstractMap.SimpleEntry<>(item.getString("vrplot_floor_material"), item.getByte("vrplot_floor_data")); - AbstractMap.SimpleEntry borderData = new AbstractMap.SimpleEntry<>(item.getString("vrplot_border_material"), item.getByte("vrplot_border_data")); + String floorMaterial = NBT.get(plotItemStack, nbt -> { + return nbt.getString("vrplot_floor_material"); + }); + byte floorData = NBT.get(plotItemStack, nbt -> { + return nbt.getByte("vrplot_floor_data"); + }); + String borderMaterial = NBT.get(plotItemStack, nbt -> { + return nbt.getString("vrplot_border_material"); + }); + byte borderData = NBT.get(plotItemStack, nbt -> { + return nbt.getByte("vrplot_border_data"); + }); + AbstractMap.SimpleEntry floorDataEntry = new AbstractMap.SimpleEntry<>(floorMaterial, floorData); + AbstractMap.SimpleEntry borderDataEntry = new AbstractMap.SimpleEntry<>(borderMaterial, borderData); if (!plotItem.isNatural()) { if (VirtualRealty.legacyVersion) { - plot.setFloorMaterial(Material.valueOf(floorData.getKey()), floorData.getValue()); - plot.setBorderMaterial(Material.valueOf(borderData.getKey()), borderData.getValue()); + plot.setFloorMaterial(Material.valueOf(floorDataEntry.getKey()), floorDataEntry.getValue()); + plot.setBorderMaterial(Material.valueOf(borderDataEntry.getKey()), borderDataEntry.getValue()); } else { - plot.setFloorMaterial(Bukkit.createBlockData(floorData.getKey()).getMaterial(), floorData.getValue()); - plot.setBorderMaterial(Bukkit.createBlockData(borderData.getKey()).getMaterial(), borderData.getValue()); + plot.setFloorMaterial(Bukkit.createBlockData(floorDataEntry.getKey()).getMaterial(), floorDataEntry.getValue()); + plot.setBorderMaterial(Bukkit.createBlockData(borderDataEntry.getKey()).getMaterial(), borderDataEntry.getValue()); } } plot.setOwnedBy(this.getSender().getUniqueId()); @@ -325,10 +337,12 @@ public void onPlotItemDraft(PlayerInteractEvent e) { } PlayerInventory inv = player.getInventory(); ItemStack claimItem = VirtualRealty.legacyVersion ? player.getItemInHand() : inv.getItemInMainHand(); - NBTItem claimNbtItem; + + String item = NBT.get(claimItem, nbt -> { + return nbt.getString("vrplot_item"); + }); if (!(claimItem.getType() == (VirtualRealty.legacyVersion ? Material.valueOf("SKULL_ITEM") : Material.PLAYER_HEAD) - && - (claimNbtItem = new NBTItem(claimItem)).getString("vrplot_item") != null && claimNbtItem.getString("vrplot_item").equals("CLAIM"))) { + && item != null && item.equals("CLAIM"))) { return; } e.setCancelled(true); @@ -385,7 +399,10 @@ public void onPlotItemDraft(PlayerInteractEvent e) { )); return; } - PlotSize plotSize = PlotSize.valueOf(claimNbtItem.getString("vrplot_size")); + String size = NBT.get(claimItem, nbt -> { + return nbt.getString("vrplot_size"); + }); + PlotSize plotSize = PlotSize.valueOf(size); Cuboid cuboid = RegionUtil.getRegion(player.getLocation(), Direction.byYaw(player.getLocation().getYaw()), plotSize.getLength(), plotSize.getHeight(), plotSize.getWidth()); if (RegionUtil.isCollidingWithAnotherPlot(cuboid)) { player.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().claimModeCancelledCollision); diff --git a/src/main/java/com/modnmetl/virtualrealty/listener/stake/DraftListener.java b/src/main/java/com/modnmetl/virtualrealty/listener/stake/DraftListener.java index 7ade6fc..81cece6 100644 --- a/src/main/java/com/modnmetl/virtualrealty/listener/stake/DraftListener.java +++ b/src/main/java/com/modnmetl/virtualrealty/listener/stake/DraftListener.java @@ -4,7 +4,7 @@ import com.modnmetl.virtualrealty.listener.VirtualListener; import com.modnmetl.virtualrealty.model.plot.PlotItem; import com.modnmetl.virtualrealty.model.region.GridStructure; -import de.tr7zw.changeme.nbtapi.NBTItem; +import de.tr7zw.changeme.nbtapi.NBT; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -73,7 +73,10 @@ public void onPlayerDeath(PlayerDeathEvent e) { public void onBlockPlace(BlockPlaceEvent e) { Player player = e.getPlayer(); ItemStack itemInHand = VirtualRealty.legacyVersion ? player.getItemInHand() : player.getInventory().getItemInMainHand(); - if (itemInHand.getType() == (VirtualRealty.legacyVersion ? Material.valueOf("SKULL_ITEM") : Material.PLAYER_HEAD) && (new NBTItem(itemInHand)).hasKey("vrplot_item")) { + boolean hasItemKey = NBT.get(itemInHand, nbt -> { + return nbt.hasTag("vrplot_item"); + }); + if (itemInHand.getType() == (VirtualRealty.legacyVersion ? Material.valueOf("SKULL_ITEM") : Material.PLAYER_HEAD) && hasItemKey) { e.setCancelled(true); } } diff --git a/src/main/java/com/modnmetl/virtualrealty/manager/ConfirmationManager.java b/src/main/java/com/modnmetl/virtualrealty/manager/ConfirmationManager.java index eb17958..40bf9c2 100644 --- a/src/main/java/com/modnmetl/virtualrealty/manager/ConfirmationManager.java +++ b/src/main/java/com/modnmetl/virtualrealty/manager/ConfirmationManager.java @@ -25,6 +25,10 @@ public static void removeConfirmations(int plotID, ConfirmationType confirmation confirmations.removeIf(confirmation -> confirmation.getPlotID() == plotID && confirmation.getConfirmationType() == confirmationType); } + public static void removeConfirmations(ConfirmationType confirmationType) { + confirmations.removeIf(confirmation -> confirmation.getConfirmationType() == confirmationType); + } + public static void removeStakeConfirmations(ConfirmationType confirmationType, UUID sender) { confirmations.removeIf(confirmation -> confirmation.getConfirmationType() == confirmationType && confirmation.getSender().getUniqueId() == sender); } diff --git a/src/main/java/com/modnmetl/virtualrealty/manager/PlotManager.java b/src/main/java/com/modnmetl/virtualrealty/manager/PlotManager.java index c9a2d0a..871bfdb 100644 --- a/src/main/java/com/modnmetl/virtualrealty/manager/PlotManager.java +++ b/src/main/java/com/modnmetl/virtualrealty/manager/PlotManager.java @@ -3,14 +3,16 @@ import com.modnmetl.virtualrealty.model.plot.PlotSize; import com.modnmetl.virtualrealty.model.plot.PlotMember; import com.modnmetl.virtualrealty.VirtualRealty; +import com.modnmetl.virtualrealty.model.region.ChunkData; import com.modnmetl.virtualrealty.model.region.Cuboid; import com.modnmetl.virtualrealty.model.plot.Plot; import com.modnmetl.virtualrealty.model.math.BlockVector3; +import com.modnmetl.virtualrealty.model.region.ChunkPlotData; +import com.modnmetl.virtualrealty.model.region.WorldPlotData; import com.modnmetl.virtualrealty.sql.Database; import lombok.Data; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.World; import java.sql.Connection; import java.sql.PreparedStatement; @@ -26,18 +28,57 @@ public final class PlotManager { private final Set plots; private final List plotMembers; + private final Map worldPlotDataMap; public PlotManager(VirtualRealty plugin) { this.plugin = plugin; this.plots = new LinkedHashSet<>(); this.plotMembers = new ArrayList<>(); + this.worldPlotDataMap = new HashMap<>(); + } + + public static ChunkData getChunkCords(Location location) { + return new ChunkData(location.getBlockX() >> 4, location.getBlockZ() >> 4); + } + + public static long createChunkKey(int chunkX, int chunkZ) { + return chunkZ ^ ((long) chunkX << 32); + } + + public static List getChunksForPlot(Plot plot, boolean withBorder) { + List chunks = new ArrayList<>(); + + Cuboid cuboid = plot.getCuboid(); + Cuboid borderedCuboid = plot.getBorderedCuboid(); + + int minChunkX = (withBorder ? borderedCuboid.getMinimumPoint().getBlockX() : cuboid.getMinimumPoint().getBlockX()) >> 4; + int minChunkZ = (withBorder ? borderedCuboid.getMinimumPoint().getBlockZ() : cuboid.getMinimumPoint().getBlockZ()) >> 4;; + int maxChunkX = (withBorder ? borderedCuboid.getMaximumPoint().getBlockX() : cuboid.getMaximumPoint().getBlockX()) >> 4; + int maxChunkZ = (withBorder ? borderedCuboid.getMaximumPoint().getBlockZ() : cuboid.getMaximumPoint().getBlockZ()) >> 4; + + for (int x = minChunkX; x <= maxChunkX; x++) { + for (int z = minChunkZ; z <= maxChunkZ; z++) { + chunks.add(createChunkKey(x, z)); + } + } + + return chunks; } public void loadPlots() { try (Connection conn = Database.getInstance().getConnection(); PreparedStatement ps = conn.prepareStatement("SELECT * FROM `" + VirtualRealty.getPluginConfiguration().mysql.plotsTableName + "`"); ResultSet rs = ps.executeQuery()) { plots.clear(); - while (rs.next()) - plots.add(new Plot(rs)); + while (rs.next()) { + Plot plot = new Plot(rs); + plots.add(plot); + worldPlotDataMap.putIfAbsent(plot.getCreatedWorldRaw(), new WorldPlotData()); + WorldPlotData worldPlotData = worldPlotDataMap.get(plot.getCreatedWorldRaw()); + List chunksForPlot = getChunksForPlot(plot, true); + for (Long chunkKey : chunksForPlot) { + ChunkPlotData chunkPlotData = worldPlotData.getChunkPlotData(chunkKey); + chunkPlotData.addPlot(plot); + } + } } catch (Exception e) { e.printStackTrace(); } @@ -141,6 +182,13 @@ public Plot createArea(Location creationLocation, int length, int height, int wi private Plot createPlot(Location creationLocation, PlotSize plotSize, int length, int height, int width, Material floorMaterial, Material borderMaterial, boolean natural) { Plot plot = new Plot(creationLocation, floorMaterial, borderMaterial, plotSize, length, width, height, natural); plots.add(plot); + worldPlotDataMap.putIfAbsent(plot.getCreatedWorldRaw(), new WorldPlotData()); + WorldPlotData worldPlotData = worldPlotDataMap.get(plot.getCreatedWorldRaw()); + List chunksForPlot = getChunksForPlot(plot, true); + for (Long chunkKey : chunksForPlot) { + ChunkPlotData chunkPlotData = worldPlotData.getChunkPlotData(chunkKey); + chunkPlotData.addPlot(plot); + } long time = System.currentTimeMillis(); plot.insert(); VirtualRealty.debug("Plot database insertion time: " + (System.currentTimeMillis() - time) + " ms"); @@ -215,59 +263,39 @@ public void removePlotFromCollection(Plot plot) { public boolean isLocationInPlot(Location location, Plot plot) { BlockVector3 newVector = BlockVector3.at(location.getBlockX(), location.getBlockY(), location.getBlockZ()); Cuboid region = new Cuboid(plot.getBottomLeftCorner(), plot.getTopRightCorner(), location.getWorld()); - return region.isIn(newVector, location.getWorld()); + return region.isIn(newVector, location.getWorld().getName()); } public Plot getPlot(Location location) { - BlockVector3 newVector = BlockVector3.at(location.getBlockX(), location.getBlockY(), location.getBlockZ()); - for (Plot plot : plots) { - if (plot.isBorderLess()) { - return getBorderedPlot(location); - } else { - Cuboid region = new Cuboid(plot.getBottomLeftCorner(), plot.getTopRightCorner(), location.getWorld()); - if (region.isIn(newVector, plot.getCreatedWorld())) - return plot; - } - } - return null; + return getPlot(location, false); } public Plot getPlot(Location location, boolean withBorder) { - BlockVector3 newVector = BlockVector3.at(location.getBlockX(), location.getBlockY(), location.getBlockZ()); - for (Plot plot : plots) { + ChunkData chunkCords = getChunkCords(location); + String worldName = Objects.requireNonNull(location.getWorld()).getName(); + WorldPlotData worldPlotData = worldPlotDataMap.get(worldName); + if (worldPlotData == null) { + return null; + } + ChunkPlotData chunkPlotData = worldPlotData.getChunkPlotData(createChunkKey(chunkCords.getX(), chunkCords.getZ())); + for (Plot plot : chunkPlotData.getPlots()) { if (withBorder) { - return getBorderedPlot(location); + if (plot.getBorderedCuboid().isIn(location)) { + return plot; + } } else { - World world = location.getWorld(); - assert world != null; - Cuboid region = plot.getCuboid(); - if (!region.getWorld().getName().equals(world.getName())) - continue; - if (region.isIn(newVector, plot.getCreatedWorld())) + if (plot.getCuboid().isIn(location)) { return plot; + } } } return null; } - private Plot getBorderedPlot(Location location) { - BlockVector3 newVector = BlockVector3.at(location.getBlockX(), location.getBlockY(), location.getBlockZ()); - for (Plot plot : plots) { - World world = location.getWorld(); - assert world != null; - Cuboid borderedRegion = plot.getBorderedCuboid(); - if (!borderedRegion.getWorld().getName().equals(world.getName())) - continue; - if (borderedRegion.isIn(newVector, plot.getCreatedWorld())) - return plot; - } - return null; - } - public boolean isLocationInBorderedPlot(Location location, Plot plot) { BlockVector3 newVector = BlockVector3.at(location.getBlockX(), location.getBlockY(), location.getBlockZ()); Cuboid region = new Cuboid(plot.getBorderBottomLeftCorner(), plot.getBorderTopRightCorner(), location.getWorld()); - return region.isIn(newVector, plot.getCreatedWorld()); + return region.isIn(newVector, plot.getCreatedWorldRaw()); } public static PlotManager getInstance() { diff --git a/src/main/java/com/modnmetl/virtualrealty/model/material/DoorMaterial.java b/src/main/java/com/modnmetl/virtualrealty/model/material/DoorMaterial.java index 872d5a8..b3b8e23 100644 --- a/src/main/java/com/modnmetl/virtualrealty/model/material/DoorMaterial.java +++ b/src/main/java/com/modnmetl/virtualrealty/model/material/DoorMaterial.java @@ -12,6 +12,7 @@ public enum DoorMaterial { IRON_DOOR, JUNGLE_DOOR, OAK_DOOR, - SPRUCE_DOOR + SPRUCE_DOOR, + CHERRY_DOOR } \ No newline at end of file diff --git a/src/main/java/com/modnmetl/virtualrealty/model/material/InteractMaterial.java b/src/main/java/com/modnmetl/virtualrealty/model/material/InteractMaterial.java index 0fff730..e8e3d00 100644 --- a/src/main/java/com/modnmetl/virtualrealty/model/material/InteractMaterial.java +++ b/src/main/java/com/modnmetl/virtualrealty/model/material/InteractMaterial.java @@ -130,4 +130,10 @@ public enum InteractMaterial { WOOD_BUTTON, YELLOW_BED, + CHERRY_TRAPDOOR, + CHERRY_FENCE, + CHERRY_FENCE_GATE, + CHERRY_BOAT, + CHERRY_BUTTON, + } diff --git a/src/main/java/com/modnmetl/virtualrealty/model/material/SwitchMaterial.java b/src/main/java/com/modnmetl/virtualrealty/model/material/SwitchMaterial.java index be536b1..eafc606 100644 --- a/src/main/java/com/modnmetl/virtualrealty/model/material/SwitchMaterial.java +++ b/src/main/java/com/modnmetl/virtualrealty/model/material/SwitchMaterial.java @@ -15,6 +15,7 @@ public enum SwitchMaterial { WARPED_BUTTON, CRIMSON_BUTTON, POLISHED_BLACKSTONE_BUTTON, + CHERRY_BUTTON, TRIPWIRE, COMPARATOR, diff --git a/src/main/java/com/modnmetl/virtualrealty/model/other/ConfirmationType.java b/src/main/java/com/modnmetl/virtualrealty/model/other/ConfirmationType.java index a623dd2..795b423 100644 --- a/src/main/java/com/modnmetl/virtualrealty/model/other/ConfirmationType.java +++ b/src/main/java/com/modnmetl/virtualrealty/model/other/ConfirmationType.java @@ -5,6 +5,7 @@ public enum ConfirmationType { STAKE, CLAIM, EXTEND, - REMOVE + REMOVE, + PLOT_OWNER_LEAVE, } diff --git a/src/main/java/com/modnmetl/virtualrealty/model/plot/PlotItem.java b/src/main/java/com/modnmetl/virtualrealty/model/plot/PlotItem.java index 4d9b0b2..319389d 100644 --- a/src/main/java/com/modnmetl/virtualrealty/model/plot/PlotItem.java +++ b/src/main/java/com/modnmetl/virtualrealty/model/plot/PlotItem.java @@ -4,6 +4,7 @@ import com.modnmetl.virtualrealty.model.other.VItem; import com.modnmetl.virtualrealty.util.data.ItemBuilder; import com.modnmetl.virtualrealty.util.data.SkullUtil; +import de.tr7zw.changeme.nbtapi.NBT; import de.tr7zw.changeme.nbtapi.NBTItem; import lombok.AllArgsConstructor; import lombok.Data; @@ -72,21 +73,21 @@ public ItemStack getItemStack() { .addLoreLine(" §8┣ §fBorder: §7" + (border == Material.AIR ? "NONE" : border.name())) .addLoreLine(" §8┗ §fLease days: §7" + (additionalDays == 0 ? "No Expiry" : additionalDays)); ItemStack itemStack = itemBuilder.toItemStack(); - NBTItem nbtItem = new NBTItem(itemStack); - - nbtItem.setString(NBT_PREFIX + "item", itemType.name()); - nbtItem.setString(NBT_PREFIX + "size", plotSize.name()); - nbtItem.setInteger(NBT_PREFIX + "length", length); - nbtItem.setInteger(NBT_PREFIX + "height", height); - nbtItem.setInteger(NBT_PREFIX + "width", width); - nbtItem.setString(NBT_PREFIX + "floor_material", floorData.getKey()); - nbtItem.setByte(NBT_PREFIX + "floor_data", floorData.getValue()); - nbtItem.setString(NBT_PREFIX + "border_material", borderData.getKey()); - nbtItem.setByte(NBT_PREFIX + "border_data", borderData.getValue()); - nbtItem.setBoolean(NBT_PREFIX + "natural", natural); - nbtItem.setInteger(NBT_PREFIX + "additional_days", additionalDays); - nbtItem.setString(NBT_PREFIX + "stack_uuid", uuid == null ? UUID.randomUUID().toString() : uuid.toString()); - nbtItem.applyNBT(itemStack); + + NBT.modify(itemStack, nbt -> { + nbt.setString(NBT_PREFIX + "item", itemType.name()); + nbt.setString(NBT_PREFIX + "size", plotSize.name()); + nbt.setInteger(NBT_PREFIX + "length", length); + nbt.setInteger(NBT_PREFIX + "height", height); + nbt.setInteger(NBT_PREFIX + "width", width); + nbt.setString(NBT_PREFIX + "floor_material", floorData.getKey()); + nbt.setByte(NBT_PREFIX + "floor_data", floorData.getValue()); + nbt.setString(NBT_PREFIX + "border_material", borderData.getKey()); + nbt.setByte(NBT_PREFIX + "border_data", borderData.getValue()); + nbt.setBoolean(NBT_PREFIX + "natural", natural); + nbt.setInteger(NBT_PREFIX + "additional_days", additionalDays); + nbt.setString(NBT_PREFIX + "stack_uuid", uuid == null ? UUID.randomUUID().toString() : uuid.toString()); + }); return itemStack; } @@ -107,27 +108,62 @@ public BlockData getBorderData() { } public static PlotItem fromItemStack(ItemStack itemStack) { - NBTItem nbtItem = new NBTItem(itemStack); - Map.Entry floorData = new AbstractMap.SimpleEntry<>(nbtItem.getString("vrplot_floor_material"), nbtItem.getByte("vrplot_floor_data")); - Map.Entry borderData = new AbstractMap.SimpleEntry<>(nbtItem.getString("vrplot_border_material"), nbtItem.getByte("vrplot_border_data")); - PlotSize plotSize = PlotSize.valueOf(nbtItem.getString("vrplot_size")); + String floorMaterial = NBT.get(itemStack, nbt -> { + return nbt.getString("vrplot_floor_material"); + }); + byte floorData = NBT.get(itemStack, nbt -> { + return nbt.getByte("vrplot_floor_data"); + }); + Map.Entry floorDataEntry = new AbstractMap.SimpleEntry<>(floorMaterial, floorData); + String borderMaterial = NBT.get(itemStack, nbt -> { + return nbt.getString("vrplot_border_material"); + }); + byte borderData = NBT.get(itemStack, nbt -> { + return nbt.getByte("vrplot_border_data"); + }); + Map.Entry borderDataEntry = new AbstractMap.SimpleEntry<>(borderMaterial, borderData); + PlotSize plotSize = PlotSize.valueOf(NBT.get(itemStack, nbt -> { + return nbt.getString("vrplot_size"); + })); + String item = NBT.get(itemStack, nbt -> { + return nbt.getString(NBT_PREFIX + "item"); + }); + Integer length = NBT.get(itemStack, nbt -> { + return nbt.getInteger(NBT_PREFIX + "length"); + }); + Integer height = NBT.get(itemStack, nbt -> { + return nbt.getInteger(NBT_PREFIX + "height"); + }); + Integer width = NBT.get(itemStack, nbt -> { + return nbt.getInteger(NBT_PREFIX + "width"); + }); + boolean natural = NBT.get(itemStack, nbt -> { + return nbt.getBoolean(NBT_PREFIX + "natural"); + }); + Integer additionalDays = NBT.get(itemStack, nbt -> { + return nbt.getInteger(NBT_PREFIX + "additional_days"); + }); + String uuid = NBT.get(itemStack, nbt -> { + return nbt.getString(NBT_PREFIX + "stack_uuid"); + }); return new PlotItem( - VItem.valueOf(nbtItem.getString(NBT_PREFIX + "item")), + VItem.valueOf(item), plotSize, - nbtItem.getInteger(NBT_PREFIX + "length"), - nbtItem.getInteger(NBT_PREFIX + "height"), - nbtItem.getInteger(NBT_PREFIX + "width"), - floorData, - borderData, - nbtItem.getBoolean(NBT_PREFIX + "natural"), - nbtItem.getInteger(NBT_PREFIX + "additional_days"), - UUID.fromString(nbtItem.getString(NBT_PREFIX + "stack_uuid")) + length, + height, + width, + floorDataEntry, + borderDataEntry, + natural, + additionalDays, + UUID.fromString(uuid) ); } public static UUID getPlotItemUuid(ItemStack itemStack) { - NBTItem nbtItem = new NBTItem(itemStack); - String string = nbtItem.getString(NBT_PREFIX + "stack_uuid"); + String string = NBT.get(itemStack, nbt -> { + return nbt.getString(NBT_PREFIX + "stack_uuid"); + }); if (string == null || string.isEmpty()) return UUID.randomUUID(); return UUID.fromString(string); diff --git a/src/main/java/com/modnmetl/virtualrealty/model/region/ChunkData.java b/src/main/java/com/modnmetl/virtualrealty/model/region/ChunkData.java new file mode 100644 index 0000000..d5df32f --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/model/region/ChunkData.java @@ -0,0 +1,21 @@ +package com.modnmetl.virtualrealty.model.region; + +public class ChunkData { + + private final int x; + private final int z; + + public ChunkData(int x, int z) { + this.x = x; + this.z = z; + } + + public int getX() { + return x; + } + + public int getZ() { + return z; + } + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/model/region/ChunkPlotData.java b/src/main/java/com/modnmetl/virtualrealty/model/region/ChunkPlotData.java new file mode 100644 index 0000000..0640736 --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/model/region/ChunkPlotData.java @@ -0,0 +1,29 @@ +package com.modnmetl.virtualrealty.model.region; + +import com.modnmetl.virtualrealty.model.plot.Plot; + +import java.util.*; + +public class ChunkPlotData { + + private final Map plots = new HashMap<>(); + + public ChunkPlotData(Plot... plots) { + for (Plot plot : plots) { + this.plots.put(plot.getID(), plot); + } + } + + public void addPlot(Plot plot) { + this.plots.put(plot.getID(), plot); + } + + public Plot getPlot(int id) { + return plots.get(id); + } + + public Collection getPlots() { + return plots.values(); + } + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/model/region/Cuboid.java b/src/main/java/com/modnmetl/virtualrealty/model/region/Cuboid.java index 3f6895c..35f5956 100644 --- a/src/main/java/com/modnmetl/virtualrealty/model/region/Cuboid.java +++ b/src/main/java/com/modnmetl/virtualrealty/model/region/Cuboid.java @@ -2,6 +2,7 @@ import com.modnmetl.virtualrealty.model.math.BlockVector2; import com.modnmetl.virtualrealty.model.math.BlockVector3; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; @@ -16,7 +17,8 @@ public class Cuboid { private final int yMax; private final int zMin; private final int zMax; - private final World world; + private final String world; + private World bukkitWorld; // Lazy initialization private BlockVector3 centerVector; // Lazy initialization private List walls; // Lazy initialization @@ -27,7 +29,7 @@ public Cuboid(Location point1, Location point2) { this.yMax = Math.max(point1.getBlockY(), point2.getBlockY()); this.zMin = Math.min(point1.getBlockZ(), point2.getBlockZ()); this.zMax = Math.max(point1.getBlockZ(), point2.getBlockZ()); - this.world = point1.getWorld(); + this.world = point1.getWorld().getName(); } public Cuboid(BlockVector3 point1, BlockVector3 point2, World world) { @@ -37,7 +39,7 @@ public Cuboid(BlockVector3 point1, BlockVector3 point2, World world) { this.yMax = Math.max(point1.getBlockY(), point2.getBlockY()); this.zMin = Math.min(point1.getBlockZ(), point2.getBlockZ()); this.zMax = Math.max(point1.getBlockZ(), point2.getBlockZ()); - this.world = world; + this.world = world.getName(); } public List getWalls() { @@ -60,7 +62,7 @@ public List getBlocks() { for (int x = this.xMin; x <= this.xMax; ++x) { for (int y = this.yMin; y <= this.yMax; ++y) { for (int z = this.zMin; z <= this.zMax; ++z) { - blocks.add(this.world.getBlockAt(x, y, z)); + blocks.add(getWorld().getBlockAt(x, y, z)); } } } @@ -71,7 +73,7 @@ public List getFlatBlocks() { List blocks = new ArrayList<>(); for (int x = this.xMin; x <= this.xMax; ++x) { for (int z = this.zMin; z <= this.zMax; ++z) { - blocks.add(this.world.getBlockAt(x, 0, z)); + blocks.add(getWorld().getBlockAt(x, 0, z)); } } return blocks; @@ -87,7 +89,7 @@ public List getFlatRegion() { public Location getCenter() { - return new Location(this.world, (this.xMax - this.xMin) / 2 + this.xMin + 1, (this.yMax - this.yMin) / 2 + this.yMin, (this.zMax - this.zMin) / 2 + this.zMin + 1); + return new Location(getWorld(), (this.xMax - this.xMin) / 2 + this.xMin + 1, (this.yMax - this.yMin) / 2 + this.yMin, (this.zMax - this.zMin) / 2 + this.zMin + 1); } // Suggestion 3 - Lazy calculation and cached results @@ -123,15 +125,15 @@ public BlockVector3 getMaximumPoint() { } public Location getPoint1() { - return new Location(this.world, this.xMin, this.yMin, this.zMin); + return new Location(getWorld(), this.xMin, this.yMin, this.zMin); } public Location getPoint2() { - return new Location(this.world, this.xMax, this.yMax, this.zMax); + return new Location(getWorld(), this.xMax, this.yMax, this.zMax); } public boolean isIn(BlockVector3 vector3, String world) { - return world.equals(this.world.getName()) + return world.equals(this.world) && vector3.getBlockX() >= this.xMin && vector3.getBlockX() <= this.xMax && vector3.getBlockY() >= this.yMin && vector3.getBlockY() <= this.yMax && vector3.getBlockZ() >= this.zMin && vector3.getBlockZ() <= this.zMax; @@ -150,23 +152,23 @@ public int getZWidth() { } public boolean isIn(Location loc) { - return loc.getWorld() == this.world + return loc.getWorld().getName().equals(this.world) && loc.getBlockX() >= this.xMin && loc.getBlockX() <= this.xMax && loc.getBlockY() >= this.yMin && loc.getBlockY() <= this.yMax && loc.getBlockZ() >= this.zMin && loc.getBlockZ() <= this.zMax; } - public boolean isIn(BlockVector2 vector2, World world, int spacing) { - return world == this.world && vector2.getBlockX() >= this.xMin - spacing && vector2.getBlockX() <= this.xMax + spacing && + public boolean isIn(BlockVector2 vector2, String world, int spacing) { + return world.equals(this.world) && vector2.getBlockX() >= this.xMin - spacing && vector2.getBlockX() <= this.xMax + spacing && vector2.getBlockZ() >= this.zMin - spacing && vector2.getBlockZ() <= this.zMax + spacing; } - public boolean isIn(BlockVector2 vector2, World world) { + public boolean isIn(BlockVector2 vector2, String world) { return this.isIn(vector2, world, 0); } public boolean isColliding(Cuboid other) { - return this.world == other.world && + return this.world.equals(other.world) && this.xMax >= other.xMin && this.xMin <= other.xMax && this.yMax >= other.yMin && this.yMin <= other.yMax && this.zMax >= other.zMin && this.zMin <= other.zMax; @@ -184,17 +186,11 @@ public boolean isWithin2D(Cuboid other) { this.zMin >= other.zMin && this.zMax <= other.zMax; } - public boolean containsBlock(Block block) { - Location blockLocation = block.getLocation(); - if (block.getWorld() != world) return false; - for (BlockVector2 vector2 : getFlatRegion()) { - if (vector2.getBlockX() == blockLocation.getBlockX() && vector2.getBlockZ() == blockLocation.getBlockZ()) return true; - } - return false; - } - public World getWorld() { - return world; + if (this.bukkitWorld == null) { + this.bukkitWorld = Bukkit.getWorld(this.world); + } + return bukkitWorld; } } diff --git a/src/main/java/com/modnmetl/virtualrealty/model/region/IVirtualBlock.java b/src/main/java/com/modnmetl/virtualrealty/model/region/IVirtualBlock.java new file mode 100644 index 0000000..c0f827e --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/model/region/IVirtualBlock.java @@ -0,0 +1,23 @@ +package com.modnmetl.virtualrealty.model.region; + +public interface IVirtualBlock { + + int getX(); + void setX(int x); + + int getY(); + void setY(int y); + + int getZ(); + void setZ(int z); + + int getMaterial(); + void setMaterial(int material); + + byte getData(); + void setData(byte data); + + String getBlockData(); + void setBlockData(String blockData); + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/model/region/VirtualBlock.java b/src/main/java/com/modnmetl/virtualrealty/model/region/VirtualBlock.java index e976a3a..8171967 100644 --- a/src/main/java/com/modnmetl/virtualrealty/model/region/VirtualBlock.java +++ b/src/main/java/com/modnmetl/virtualrealty/model/region/VirtualBlock.java @@ -7,7 +7,9 @@ import java.io.*; @Data -public class VirtualBlock implements Serializable { +public class VirtualBlock implements Serializable, IVirtualBlock { + + private static final long serialVersionUID = -4262694990318416275L; private int x; private int y; @@ -37,5 +39,4 @@ public Block getBlock(World world) { return world.getBlockAt(x,y,z); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/modnmetl/virtualrealty/model/region/WorldPlotData.java b/src/main/java/com/modnmetl/virtualrealty/model/region/WorldPlotData.java new file mode 100644 index 0000000..327d06f --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/model/region/WorldPlotData.java @@ -0,0 +1,19 @@ +package com.modnmetl.virtualrealty.model.region; + +import java.util.HashMap; +import java.util.Map; + +public class WorldPlotData { + + private final Map chunkPlotDataMap; + + public WorldPlotData() { + this.chunkPlotDataMap = new HashMap<>(); + } + + public ChunkPlotData getChunkPlotData(long chunkKey) { + chunkPlotDataMap.putIfAbsent(chunkKey, new ChunkPlotData()); + return chunkPlotDataMap.get(chunkKey); + } + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/util/NBTUtil.java b/src/main/java/com/modnmetl/virtualrealty/util/NBTUtil.java deleted file mode 100644 index a363772..0000000 --- a/src/main/java/com/modnmetl/virtualrealty/util/NBTUtil.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.modnmetl.virtualrealty.util; - -import de.tr7zw.changeme.nbtapi.NBTItem; - -public class NBTUtil { - - public static Class nbtItemClass() { - return NBTItem.class; - } - -} diff --git a/src/main/java/com/modnmetl/virtualrealty/util/data/SchematicUtil.java b/src/main/java/com/modnmetl/virtualrealty/util/data/SchematicUtil.java index 8c92cf0..81fdc7f 100644 --- a/src/main/java/com/modnmetl/virtualrealty/util/data/SchematicUtil.java +++ b/src/main/java/com/modnmetl/virtualrealty/util/data/SchematicUtil.java @@ -3,6 +3,7 @@ import com.modnmetl.virtualrealty.VirtualRealty; import com.modnmetl.virtualrealty.manager.PlotManager; import com.modnmetl.virtualrealty.model.plot.Plot; +import com.modnmetl.virtualrealty.model.region.IVirtualBlock; import com.modnmetl.virtualrealty.model.region.VirtualBlock; import com.modnmetl.virtualrealty.model.region.VirtualLocation; import com.modnmetl.virtualrealty.util.multiversion.VMaterial; @@ -53,7 +54,7 @@ public static LinkedList getStructure(Block block, Block block2) { } public static void paste(int plotID) { - List blocks = load(plotID); + List blocks = load(plotID); if (blocks == null) return; Plot plot = PlotManager.getInstance().getPlot(plotID); if (plot == null) return; @@ -89,15 +90,15 @@ public static void paste(int plotID) { } VirtualRealty.debug("Pasted " + i + " air blocks in: " + (System.currentTimeMillis() - time) + " ms"); Bukkit.getScheduler().runTaskAsynchronously(VirtualRealty.getInstance(), () -> { - List> chunks = chunkArrayList(blocks, 15000); + List> chunks = chunkArrayList(blocks, 15000); Bukkit.getScheduler().scheduleSyncDelayedTask(VirtualRealty.getInstance(), () -> { for (int j = 0; j < chunks.size(); j++) { int finalJ = j; new BukkitRunnable() { @Override public void run() { - List virtualBlocks = chunks.get(finalJ); - for (VirtualBlock block : virtualBlocks) { + List virtualBlocks = chunks.get(finalJ); + for (IVirtualBlock block : virtualBlocks) { Location blockLocation = new Location(plot.getCreatedWorld(), block.getX(), block.getY(), block.getZ()); Block oldBlock = blockLocation.getBlock(); if (VirtualRealty.legacyVersion) { @@ -128,8 +129,8 @@ public void run() { }); } - private static ArrayList> chunkArrayList(List arrayToChunk, int chunkSize) { - ArrayList> chunkList = new ArrayList<>(); + private static ArrayList> chunkArrayList(List arrayToChunk, int chunkSize) { + ArrayList> chunkList = new ArrayList<>(); int guide = arrayToChunk.size(); int index = 0; int tale = chunkSize; @@ -166,28 +167,40 @@ public static void save(int plotID, Block block1, Block block2) { } @SneakyThrows - public static LinkedList load(int plotID) { + public static LinkedList load(int plotID) { long time = System.currentTimeMillis(); File region = new File(VirtualRealty.plotsSchemaFolder, REGION_PREFIX + plotID + REGION_SUFFIX); File legacyRegion = new File(VirtualRealty.plotsSchemaFolder, LEGACY_REGION_PREFIX + plotID + REGION_SUFFIX); - ByteArrayInputStream bais; - ObjectInputStream ois; - if (region.exists()) { - byte[] bytes = new DataCompressor().decompressData(region); - bais = new ByteArrayInputStream(bytes); - ois = new ObjectInputStream(bais); - VirtualRealty.debug("Loaded in: " + (System.currentTimeMillis() - time) + " ms"); - return (LinkedList) ois.readObject(); - } else if (legacyRegion.exists()) { - byte[] bytes = new DataCompressor().decompressData(legacyRegion); - bais = new ByteArrayInputStream(bytes); - ois = new ObjectInputStream(bais); - VirtualRealty.debug("Loaded in: " + (System.currentTimeMillis() - time) + " ms"); - return (LinkedList) ois.readObject(); + + if (region.exists() || legacyRegion.exists()) { + File fileToRead = region.exists() ? region : legacyRegion; + byte[] bytes = new DataCompressor().decompressData(fileToRead); + ByteArrayInputStream bais = new ByteArrayInputStream(bytes); + + try (ObjectInputStream ois = new ObjectInputStream(bais)) { + Object readObject = ois.readObject(); + LinkedList result = new LinkedList<>(); + + if (readObject instanceof LinkedList) { + LinkedList list = (LinkedList) readObject; + for (Object obj : list) { + if (obj instanceof com.modnmetl.virtualrealty.model.region.VirtualBlock) { + result.add((com.modnmetl.virtualrealty.model.region.VirtualBlock) obj); + } else if (obj instanceof com.modnmetl.virtualrealty.utils.data.VirtualBlock) { + result.add((com.modnmetl.virtualrealty.utils.data.VirtualBlock) obj); + } + } + } + VirtualRealty.debug("Loaded in: " + (System.currentTimeMillis() - time) + " ms"); + return result; + } catch (Exception e) { + e.printStackTrace(); + } } return null; } + public static boolean doesPlotFileExist(int plotID) { File region = new File(VirtualRealty.plotsSchemaFolder, REGION_PREFIX + plotID + REGION_SUFFIX); File legacyRegion = new File(VirtualRealty.plotsSchemaFolder, LEGACY_REGION_PREFIX + plotID + REGION_SUFFIX); diff --git a/src/main/java/com/modnmetl/virtualrealty/util/data/SkullUtil.java b/src/main/java/com/modnmetl/virtualrealty/util/data/SkullUtil.java index fa2959d..fab9259 100644 --- a/src/main/java/com/modnmetl/virtualrealty/util/data/SkullUtil.java +++ b/src/main/java/com/modnmetl/virtualrealty/util/data/SkullUtil.java @@ -3,6 +3,7 @@ import com.modnmetl.virtualrealty.VirtualRealty; import de.tr7zw.changeme.nbtapi.NBT; import de.tr7zw.changeme.nbtapi.iface.ReadWriteNBT; +import de.tr7zw.changeme.nbtapi.utils.MinecraftVersion; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -21,14 +22,28 @@ public static ItemStack getSkull(String texture, UUID uuid) { } else { item = new ItemStack(Material.PLAYER_HEAD); } - NBT.modify(item, nbt -> { - final ReadWriteNBT skullOwnerCompound = nbt.getOrCreateCompound("SkullOwner"); - skullOwnerCompound.setUUID("Id", uuid); - skullOwnerCompound.getOrCreateCompound("Properties") - .getCompoundList("textures") - .addCompound() - .setString("Value", textureValue); - }); + if (MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_20_R4)) { + NBT.modifyComponents(item, nbt -> { + ReadWriteNBT profileNbt = nbt.getOrCreateCompound("minecraft:profile"); + profileNbt.setUUID("id", uuid); + ReadWriteNBT propertiesNbt = profileNbt.getCompoundList("properties").addCompound(); + propertiesNbt.setString("name", "textures"); + propertiesNbt.setString("value", textureValue); + }); + System.out.println(">=1.20.5"); + } else { + NBT.modify(item, nbt -> { + final ReadWriteNBT skullOwnerCompound = nbt.getOrCreateCompound("SkullOwner"); + skullOwnerCompound.setUUID("Id", uuid); + skullOwnerCompound.getOrCreateCompound("Properties") + .getCompoundList("textures") + .addCompound() + .setString("Value", textureValue); + }); + System.out.println("<1.20.5"); + } +// System.out.println(item); + System.out.println(NBT.itemStackToNBT(item)); return item; } @@ -37,7 +52,7 @@ public static ItemStack getSkull(String url) { } private static String getBase64Value(String texture) { - String original = "{\"textures\":{\"SKIN\":{\"url\":\"http://textures.minecraft.net/texture/" + texture + "\"}}}"; + String original = "{\"textures\":{\"SKIN\":{\"url\":\"https://textures.minecraft.net/texture/" + texture + "\"}}}"; return Base64.getEncoder().encodeToString(original.getBytes(StandardCharsets.UTF_8)); } diff --git a/src/main/java/com/modnmetl/virtualrealty/utils/data/VirtualBlock.java b/src/main/java/com/modnmetl/virtualrealty/utils/data/VirtualBlock.java new file mode 100644 index 0000000..dc09f7f --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/utils/data/VirtualBlock.java @@ -0,0 +1,46 @@ +package com.modnmetl.virtualrealty.utils.data; + +import com.modnmetl.virtualrealty.model.region.IVirtualBlock; +import lombok.Data; +import org.bukkit.World; +import org.bukkit.block.Block; + +import java.io.*; + +// DO NOT TOUCH +@Data +@Deprecated +public class VirtualBlock implements Serializable, IVirtualBlock { + + private static final long serialVersionUID = -4262694990318416275L; + + private int x; + private int y; + private int z; + + private int material; + private byte data; + + private String blockData; + + public VirtualBlock(int x, int y, int z, int material, byte data) { + this.x = x; + this.y = y; + this.z = z; + this.material = material; + this.data = data; + } + + public VirtualBlock(int x, int y, int z, String blockData) { + this.x = x; + this.y = y; + this.z = z; + this.blockData = blockData; + } + + public Block getBlock(World world) { + return world.getBlockAt(x,y,z); + } + + +}