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);
+ }
+
+
+}