diff --git a/pom.xml b/pom.xml
index 8fbebce..bfb0bff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.modnmetl
virtualrealty
- 2.5.3
+ 2.5.4
jar
A plot creation and management plugin for Minecraft
@@ -184,7 +184,7 @@
de.tr7zw
item-nbt-api
- 2.11.3
+ 2.12.0
compile
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 bcc5e17..01217de 100644
--- a/src/main/java/com/modnmetl/virtualrealty/listener/player/PlayerActionListener.java
+++ b/src/main/java/com/modnmetl/virtualrealty/listener/player/PlayerActionListener.java
@@ -137,10 +137,11 @@ public void expiry() {
public void success() {
PlotItem plotItem = DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getKey();
ItemStack plotItemStack = DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getValue().getItemStack();
- int firstPlotItemStack = this.getSender().getInventory().first(plotItemStack);
- boolean foundItemStack = firstPlotItemStack != -1;
- if (foundItemStack) {
- this.getSender().getInventory().clear(firstPlotItemStack);
+ for (ItemStack content : this.getSender().getInventory().getContents()) {
+ if (content == null || content.getType() == Material.AIR) continue;
+ if (PlotItem.getPlotItemUuid(content).equals(PlotItem.getPlotItemUuid(plotItemStack))) {
+ this.getSender().getInventory().removeItem(content);
+ }
}
if (plot.isOwnershipExpired())
plot.setOwnedUntilDate(LocalDateTime.now().plusDays(plotItem.getAdditionalDays()));
@@ -155,8 +156,14 @@ public void success() {
@Override
public void failed() {
- this.getSender().getInventory().removeItem(DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getValue().getItemStack());
- this.getSender().getInventory().remove(DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getValue().getItemStack());
+ ItemStack plotItemStack = DraftListener.DRAFT_MAP.get(this.getSender())
+ .getValue().getValue().getItemStack();
+ for (ItemStack content : this.getSender().getInventory().getContents()) {
+ if (content == null || content.getType() == Material.AIR) continue;
+ if (PlotItem.getPlotItemUuid(content).equals(PlotItem.getPlotItemUuid(plotItemStack))) {
+ this.getSender().getInventory().removeItem(content);
+ }
+ }
this.getSender().getInventory().addItem(DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getKey().getItemStack());
DraftListener.DRAFT_MAP.get(this.getSender()).getKey().removeGrid();
DraftListener.DRAFT_MAP.remove(this.getSender());
@@ -180,7 +187,14 @@ public void expiry() {
return;
}
if (RegionUtil.isCollidingWithAnotherPlot(cuboid)) {
- player.getInventory().remove(DraftListener.DRAFT_MAP.get(player).getValue().getValue().getItemStack());
+ ItemStack plotItemStack = DraftListener.DRAFT_MAP.get(player)
+ .getValue().getValue().getItemStack();
+ for (ItemStack content : player.getInventory().getContents()) {
+ if (content == null || content.getType() == Material.AIR) continue;
+ if (PlotItem.getPlotItemUuid(content).equals(PlotItem.getPlotItemUuid(plotItemStack))) {
+ player.getInventory().removeItem(content);
+ }
+ }
player.getInventory().addItem(DraftListener.DRAFT_MAP.get(player).getValue().getKey().getItemStack());
DraftListener.DRAFT_MAP.get(player).getKey().removeGrid();
DraftListener.DRAFT_MAP.remove(player);
@@ -233,10 +247,11 @@ public void success() {
} else {
plot.setOwnedUntilDate(LocalDateTime.now().plusDays(plotItem.getAdditionalDays()));
}
- int firstPlotItemStack = this.getSender().getInventory().first(plotItemStack);
- boolean foundItemStack = firstPlotItemStack != -1;
- if (foundItemStack) {
- this.getSender().getInventory().clear(firstPlotItemStack);
+ for (ItemStack content : this.getSender().getInventory().getContents()) {
+ if (content == null || content.getType() == Material.AIR) continue;
+ if (PlotItem.getPlotItemUuid(content).equals(PlotItem.getPlotItemUuid(plotItemStack))) {
+ this.getSender().getInventory().removeItem(content);
+ }
}
long timeEnd = System.currentTimeMillis();
BaseComponent textComponent = new TextComponent(VirtualRealty.PREFIX + VirtualRealty.getMessages().creationPlotComponent1);
@@ -261,8 +276,14 @@ public void run() {
}
@Override
public void failed() {
- this.getSender().getInventory().removeItem(DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getValue().getItemStack());
- this.getSender().getInventory().remove(DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getValue().getItemStack());
+ ItemStack plotItemStack = DraftListener.DRAFT_MAP.get(this.getSender())
+ .getValue().getValue().getItemStack();
+ for (ItemStack content : this.getSender().getInventory().getContents()) {
+ if (content == null || content.getType() == Material.AIR) continue;
+ if (PlotItem.getPlotItemUuid(content).equals(PlotItem.getPlotItemUuid(plotItemStack))) {
+ this.getSender().getInventory().removeItem(content);
+ }
+ }
this.getSender().getInventory().addItem(DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getKey().getItemStack());
DraftListener.DRAFT_MAP.get(this.getSender()).getKey().removeGrid();
DraftListener.DRAFT_MAP.remove(this.getSender());
@@ -285,7 +306,16 @@ public void onPlotItemDraft(PlayerInteractEvent e) {
if (!(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
if (DraftListener.DRAFT_MAP.containsKey(player)) {
e.setCancelled(true);
- player.getInventory().remove(DraftListener.DRAFT_MAP.get(player).getValue().getValue().getItemStack());
+
+ ItemStack plotItemStack = DraftListener.DRAFT_MAP.get(player)
+ .getValue().getValue().getItemStack();
+ for (ItemStack content : player.getInventory().getContents()) {
+ if (content == null || content.getType() == Material.AIR) continue;
+ if (PlotItem.getPlotItemUuid(content).equals(PlotItem.getPlotItemUuid(plotItemStack))) {
+ player.getInventory().removeItem(content);
+ }
+ }
+
player.getInventory().addItem(DraftListener.DRAFT_MAP.get(player).getValue().getKey().getItemStack());
DraftListener.DRAFT_MAP.get(player).getKey().removeGrid();
DraftListener.DRAFT_MAP.remove(player);
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 51a4c07..7b5c6b9 100644
--- a/src/main/java/com/modnmetl/virtualrealty/model/plot/PlotItem.java
+++ b/src/main/java/com/modnmetl/virtualrealty/model/plot/PlotItem.java
@@ -125,6 +125,13 @@ public static PlotItem fromItemStack(ItemStack itemStack) {
);
}
+ public static UUID getPlotItemUuid(ItemStack itemStack) {
+ NBTItem nbtItem = new NBTItem(itemStack);
+ String string = nbtItem.getString(NBT_PREFIX + "stack_uuid");
+ if (string == null) return UUID.randomUUID();
+ return UUID.fromString(string);
+ }
+
public static PlotItem fromItemStack(ItemStack itemStack, VItem itemType) {
PlotItem plotItem = fromItemStack(itemStack);
return new PlotItem(itemType, plotItem.getPlotSize(), plotItem.getLength(), plotItem.getHeight(), plotItem.getWidth(), plotItem.floorData, plotItem.borderData, plotItem.isNatural(), plotItem.getAdditionalDays(), plotItem.getUuid());
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 d8daf09..9042bfe 100644
--- a/src/main/java/com/modnmetl/virtualrealty/util/data/SkullUtil.java
+++ b/src/main/java/com/modnmetl/virtualrealty/util/data/SkullUtil.java
@@ -8,9 +8,13 @@
import org.bukkit.inventory.meta.SkullMeta;
import java.lang.reflect.Field;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Objects;
+import java.util.Random;
import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
public class SkullUtil {
@@ -24,7 +28,8 @@ public static ItemStack getSkull(String url) {
if (url == null || url.isEmpty())
return skull;
SkullMeta skullMeta = (SkullMeta) skull.getItemMeta();
- GameProfile profile = new GameProfile(UUID.randomUUID(), null);
+
+ GameProfile profile = new GameProfile(UUID.randomUUID(), generateRandomUsername(16));
byte[] encodedData = Base64.getEncoder().encode(String.format("{textures:{SKIN:{url:\"%s\"}}}", "http://textures.minecraft.net/texture/" + url).getBytes());
profile.getProperties().put("textures", new Property("textures", new String(encodedData)));
Field profileField = null;
@@ -54,7 +59,7 @@ public static ItemStack getSkull(String url, UUID uuid) {
if (url == null || url.isEmpty())
return skull;
SkullMeta skullMeta = (SkullMeta) skull.getItemMeta();
- GameProfile profile = new GameProfile(uuid, null);
+ GameProfile profile = new GameProfile(uuid, generateRandomUsername(16));
byte[] encodedData = Base64.getEncoder().encode(String.format("{textures:{SKIN:{url:\"%s\"}}}", "http://textures.minecraft.net/texture/" + url).getBytes());
profile.getProperties().put("textures", new Property("textures", new String(encodedData)));
Field profileField = null;
@@ -73,4 +78,14 @@ public static ItemStack getSkull(String url, UUID uuid) {
return skull;
}
+ private static String generateRandomUsername(int length) {
+ // Random username for GameProfile
+ int leftLimit = 'A'; // letter 'a'
+ int rightLimit = 'Z'; // letter 'z'
+ return ThreadLocalRandom.current().ints(leftLimit, rightLimit + 1)
+ .limit(length)
+ .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
+ .toString();
+ }
+
}