diff --git a/build.gradle.kts b/build.gradle.kts index bdd41d4..74a5b74 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,6 +17,7 @@ allprojects { maven("https://repo.papermc.io/repository/maven-public/") maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") + maven("https://libraries.minecraft.net/") } tasks.compileJava { diff --git a/core/build.gradle.kts b/core/build.gradle.kts index b2734b9..8ff0640 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -5,6 +5,7 @@ plugins { dependencies { compileOnly("io.papermc.paper:paper-api:26.1.2.build.+") compileOnly("me.clip:placeholderapi:2.12.2") + compileOnly("com.mojang:authlib:1.5.25") } java { diff --git a/core/src/main/java/dev/geco/gholo/object/simple/SimpleItem.java b/core/src/main/java/dev/geco/gholo/object/simple/SimpleItem.java new file mode 100644 index 0000000..82f71ea --- /dev/null +++ b/core/src/main/java/dev/geco/gholo/object/simple/SimpleItem.java @@ -0,0 +1,103 @@ +package dev.geco.gholo.object.simple; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import dev.geco.gholo.GHoloMain; +import dev.geco.gholo.service.VersionService; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; +import org.bukkit.profile.PlayerProfile; +import org.bukkit.profile.PlayerTextures; + +import java.lang.reflect.Field; +import java.net.URL; +import java.util.Base64; +import java.util.UUID; + +/** + * skull:self -> shows the skull of the player who is viewing the hologram + * skull:eyJ0ZXh0dXJlcyI6... -> shows the skull with the given base64 texture + * player_skull:nrvkg -> shows the skull of the given player + * itemstack:diamond_sword -> shows the given item + */ +public class SimpleItem { + + private final static VersionService version = GHoloMain.getInstance().getVersionService(); + + @SuppressWarnings("deprecation") + public static ItemStack getItem(String content, Player player) { + ItemStack itemStack = null; + String[] contentSplit = content.split(":", 2); + if (contentSplit.length < 2) { + return null; + } + + String type = contentSplit[0]; + String value = contentSplit[1].trim(); + switch (type.toLowerCase()) { + case "itemstack" -> { + Material material = Material.getMaterial(value.toUpperCase()); + if (material != null) { + itemStack = new ItemStack(material); + } + } + case "skull" -> { + itemStack = new ItemStack(Material.PLAYER_HEAD); + SkullMeta skullMeta = (SkullMeta) itemStack.getItemMeta(); + if (value.equalsIgnoreCase("self")) { + skullMeta.setOwningPlayer(player); + } else { + if (version.isNewerOrVersion(1, 20, 1)) { + PlayerProfile profile = Bukkit.createPlayerProfile(UUID.randomUUID(), GHoloMain.NAME); + PlayerTextures textures = profile.getTextures(); + URL url; + try { + String decoded = new String(Base64.getDecoder().decode(value)); + String decodedFormatted = decoded.replaceAll("\\s", ""); + JsonObject jsonObject = new Gson().fromJson(decodedFormatted, JsonObject.class); + String urlText = jsonObject.get("textures").getAsJsonObject().get("SKIN").getAsJsonObject().get("url").getAsString(); + url = new URL(urlText); + } catch (Exception error) { + return null; + } + textures.setSkin(url); + profile.setTextures(textures); + skullMeta.setOwnerProfile(profile); + } else { + GameProfile profile = new GameProfile(UUID.randomUUID(), ""); + profile.getProperties().put("textures", new Property("textures", value)); + + try { + Field profileField = skullMeta.getClass().getDeclaredField("profile"); + profileField.setAccessible(true); + profileField.set(skullMeta, profile); + } catch (IllegalArgumentException | NoSuchFieldException | SecurityException | + IllegalAccessException error) { + return null; + } + } + } + itemStack.setItemMeta(skullMeta); + } + case "player_skull" -> { + itemStack = new ItemStack(Material.PLAYER_HEAD); + SkullMeta skullMeta = (SkullMeta) itemStack.getItemMeta(); + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(value); + if (offlinePlayer.hasPlayedBefore()) { + skullMeta.setOwningPlayer(offlinePlayer); + } else { + skullMeta.setOwner(value); + } + + itemStack.setItemMeta(skullMeta); + } + } + return itemStack; + } +} \ No newline at end of file diff --git a/mcv/v1_19_4/src/main/java/dev/geco/gholo/mcv/v1_19_4/object/holo/GHoloRowContent.java b/mcv/v1_19_4/src/main/java/dev/geco/gholo/mcv/v1_19_4/object/holo/GHoloRowContent.java index d02bd8f..ff22fd3 100644 --- a/mcv/v1_19_4/src/main/java/dev/geco/gholo/mcv/v1_19_4/object/holo/GHoloRowContent.java +++ b/mcv/v1_19_4/src/main/java/dev/geco/gholo/mcv/v1_19_4/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_19_4/src/main/java/dev/geco/gholo/mcv/v1_19_4/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_19_4/src/main/java/dev/geco/gholo/mcv/v1_19_4/object/holo/type/GHoloRowItemStackContent.java index f13c92d..2f1c43b 100644 --- a/mcv/v1_19_4/src/main/java/dev/geco/gholo/mcv/v1_19_4/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_19_4/src/main/java/dev/geco/gholo/mcv/v1_19_4/object/holo/type/GHoloRowItemStackContent.java @@ -7,21 +7,20 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -60,22 +59,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.getId()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - try { - Item itemData = BuiltInRegistries.ITEM.get(resourceLocation); - data.add(new SynchedEntityData.DataValue<>(holoItemData.getId(), holoItemData.getSerializer(), itemData.getDefaultInstance())); - } catch(Throwable ignored) { } + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.getId(), holoItemData.getSerializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -118,7 +114,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_20/src/main/java/dev/geco/gholo/mcv/v1_20/object/holo/GHoloRowContent.java b/mcv/v1_20/src/main/java/dev/geco/gholo/mcv/v1_20/object/holo/GHoloRowContent.java index 6486f8a..8750942 100644 --- a/mcv/v1_20/src/main/java/dev/geco/gholo/mcv/v1_20/object/holo/GHoloRowContent.java +++ b/mcv/v1_20/src/main/java/dev/geco/gholo/mcv/v1_20/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_20/src/main/java/dev/geco/gholo/mcv/v1_20/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_20/src/main/java/dev/geco/gholo/mcv/v1_20/object/holo/type/GHoloRowItemStackContent.java index 0e335f7..197929e 100644 --- a/mcv/v1_20/src/main/java/dev/geco/gholo/mcv/v1_20/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_20/src/main/java/dev/geco/gholo/mcv/v1_20/object/holo/type/GHoloRowItemStackContent.java @@ -7,21 +7,20 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -60,22 +59,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.getId()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - try { - Item itemData = BuiltInRegistries.ITEM.get(resourceLocation); - data.add(new SynchedEntityData.DataValue<>(holoItemData.getId(), holoItemData.getSerializer(), itemData.getDefaultInstance())); - } catch(Throwable ignored) { } + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.getId(), holoItemData.getSerializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -118,7 +114,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_20_2/src/main/java/dev/geco/gholo/mcv/v1_20_2/object/holo/GHoloRowContent.java b/mcv/v1_20_2/src/main/java/dev/geco/gholo/mcv/v1_20_2/object/holo/GHoloRowContent.java index 6be23a7..4523718 100644 --- a/mcv/v1_20_2/src/main/java/dev/geco/gholo/mcv/v1_20_2/object/holo/GHoloRowContent.java +++ b/mcv/v1_20_2/src/main/java/dev/geco/gholo/mcv/v1_20_2/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_20_2/src/main/java/dev/geco/gholo/mcv/v1_20_2/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_20_2/src/main/java/dev/geco/gholo/mcv/v1_20_2/object/holo/type/GHoloRowItemStackContent.java index 7070120..96642a7 100644 --- a/mcv/v1_20_2/src/main/java/dev/geco/gholo/mcv/v1_20_2/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_20_2/src/main/java/dev/geco/gholo/mcv/v1_20_2/object/holo/type/GHoloRowItemStackContent.java @@ -7,21 +7,20 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -60,22 +59,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.getId()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - try { - Item itemData = BuiltInRegistries.ITEM.get(resourceLocation); - data.add(new SynchedEntityData.DataValue<>(holoItemData.getId(), holoItemData.getSerializer(), itemData.getDefaultInstance())); - } catch(Throwable ignored) { } + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.getId(), holoItemData.getSerializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -118,7 +114,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_20_3/src/main/java/dev/geco/gholo/mcv/v1_20_3/object/holo/GHoloRowContent.java b/mcv/v1_20_3/src/main/java/dev/geco/gholo/mcv/v1_20_3/object/holo/GHoloRowContent.java index c0e2530..d7f5d26 100644 --- a/mcv/v1_20_3/src/main/java/dev/geco/gholo/mcv/v1_20_3/object/holo/GHoloRowContent.java +++ b/mcv/v1_20_3/src/main/java/dev/geco/gholo/mcv/v1_20_3/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_20_3/src/main/java/dev/geco/gholo/mcv/v1_20_3/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_20_3/src/main/java/dev/geco/gholo/mcv/v1_20_3/object/holo/type/GHoloRowItemStackContent.java index 14c378b..14ca815 100644 --- a/mcv/v1_20_3/src/main/java/dev/geco/gholo/mcv/v1_20_3/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_20_3/src/main/java/dev/geco/gholo/mcv/v1_20_3/object/holo/type/GHoloRowItemStackContent.java @@ -7,21 +7,20 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -60,22 +59,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.getId()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - try { - Item itemData = BuiltInRegistries.ITEM.get(resourceLocation); - data.add(new SynchedEntityData.DataValue<>(holoItemData.getId(), holoItemData.getSerializer(), itemData.getDefaultInstance())); - } catch(Throwable ignored) { } + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.getId(), holoItemData.getSerializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -118,7 +114,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_20_5/src/main/java/dev/geco/gholo/mcv/v1_20_5/object/holo/GHoloRowContent.java b/mcv/v1_20_5/src/main/java/dev/geco/gholo/mcv/v1_20_5/object/holo/GHoloRowContent.java index 83058ce..9309cd3 100644 --- a/mcv/v1_20_5/src/main/java/dev/geco/gholo/mcv/v1_20_5/object/holo/GHoloRowContent.java +++ b/mcv/v1_20_5/src/main/java/dev/geco/gholo/mcv/v1_20_5/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_20_5/src/main/java/dev/geco/gholo/mcv/v1_20_5/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_20_5/src/main/java/dev/geco/gholo/mcv/v1_20_5/object/holo/type/GHoloRowItemStackContent.java index fb3ee29..b535069 100644 --- a/mcv/v1_20_5/src/main/java/dev/geco/gholo/mcv/v1_20_5/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_20_5/src/main/java/dev/geco/gholo/mcv/v1_20_5/object/holo/type/GHoloRowItemStackContent.java @@ -7,21 +7,20 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -60,22 +59,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.id()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - try { - Item itemData = BuiltInRegistries.ITEM.get(resourceLocation); - data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), itemData.getDefaultInstance())); - } catch(Throwable ignored) { } + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -118,7 +114,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_21/src/main/java/dev/geco/gholo/mcv/v1_21/object/holo/GHoloRowContent.java b/mcv/v1_21/src/main/java/dev/geco/gholo/mcv/v1_21/object/holo/GHoloRowContent.java index bc6d207..7ed6459 100644 --- a/mcv/v1_21/src/main/java/dev/geco/gholo/mcv/v1_21/object/holo/GHoloRowContent.java +++ b/mcv/v1_21/src/main/java/dev/geco/gholo/mcv/v1_21/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_21/src/main/java/dev/geco/gholo/mcv/v1_21/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_21/src/main/java/dev/geco/gholo/mcv/v1_21/object/holo/type/GHoloRowItemStackContent.java index efa0250..244e668 100644 --- a/mcv/v1_21/src/main/java/dev/geco/gholo/mcv/v1_21/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_21/src/main/java/dev/geco/gholo/mcv/v1_21/object/holo/type/GHoloRowItemStackContent.java @@ -7,21 +7,20 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -60,22 +59,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.id()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - try { - Item itemData = BuiltInRegistries.ITEM.get(resourceLocation); - data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), itemData.getDefaultInstance())); - } catch(Throwable ignored) { } + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -118,7 +114,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_21_11/src/main/java/dev/geco/gholo/mcv/v1_21_11/object/holo/GHoloRowContent.java b/mcv/v1_21_11/src/main/java/dev/geco/gholo/mcv/v1_21_11/object/holo/GHoloRowContent.java index 420c7c1..fe8b368 100644 --- a/mcv/v1_21_11/src/main/java/dev/geco/gholo/mcv/v1_21_11/object/holo/GHoloRowContent.java +++ b/mcv/v1_21_11/src/main/java/dev/geco/gholo/mcv/v1_21_11/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_21_11/src/main/java/dev/geco/gholo/mcv/v1_21_11/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_21_11/src/main/java/dev/geco/gholo/mcv/v1_21_11/object/holo/type/GHoloRowItemStackContent.java index bad1771..cfd2480 100644 --- a/mcv/v1_21_11/src/main/java/dev/geco/gholo/mcv/v1_21_11/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_21_11/src/main/java/dev/geco/gholo/mcv/v1_21_11/object/holo/type/GHoloRowItemStackContent.java @@ -6,31 +6,28 @@ import dev.geco.gholo.object.holo.GHoloUpdateType; import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; +import dev.geco.gholo.object.simple.SimpleItem; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -64,20 +61,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.id()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - Identifier identifier = Identifier.tryParse(content.toLowerCase()); - if(identifier != null) { - Optional> itemData = BuiltInRegistries.ITEM.get(identifier); - if(itemData.isPresent()) data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), itemData.get().value().getDefaultInstance())); + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -120,7 +116,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_21_2/src/main/java/dev/geco/gholo/mcv/v1_21_2/object/holo/GHoloRowContent.java b/mcv/v1_21_2/src/main/java/dev/geco/gholo/mcv/v1_21_2/object/holo/GHoloRowContent.java index 0878d05..568f96d 100644 --- a/mcv/v1_21_2/src/main/java/dev/geco/gholo/mcv/v1_21_2/object/holo/GHoloRowContent.java +++ b/mcv/v1_21_2/src/main/java/dev/geco/gholo/mcv/v1_21_2/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_21_2/src/main/java/dev/geco/gholo/mcv/v1_21_2/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_21_2/src/main/java/dev/geco/gholo/mcv/v1_21_2/object/holo/type/GHoloRowItemStackContent.java index d6462ae..d9794d6 100644 --- a/mcv/v1_21_2/src/main/java/dev/geco/gholo/mcv/v1_21_2/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_21_2/src/main/java/dev/geco/gholo/mcv/v1_21_2/object/holo/type/GHoloRowItemStackContent.java @@ -7,30 +7,27 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -64,20 +61,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.id()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - Optional> itemData = BuiltInRegistries.ITEM.get(resourceLocation); - if(itemData.isPresent()) data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), itemData.get().value().getDefaultInstance())); + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -120,7 +116,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_21_4/src/main/java/dev/geco/gholo/mcv/v1_21_4/object/holo/GHoloRowContent.java b/mcv/v1_21_4/src/main/java/dev/geco/gholo/mcv/v1_21_4/object/holo/GHoloRowContent.java index 4b60fe8..d08b130 100644 --- a/mcv/v1_21_4/src/main/java/dev/geco/gholo/mcv/v1_21_4/object/holo/GHoloRowContent.java +++ b/mcv/v1_21_4/src/main/java/dev/geco/gholo/mcv/v1_21_4/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_21_4/src/main/java/dev/geco/gholo/mcv/v1_21_4/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_21_4/src/main/java/dev/geco/gholo/mcv/v1_21_4/object/holo/type/GHoloRowItemStackContent.java index d21f61f..85e1dcb 100644 --- a/mcv/v1_21_4/src/main/java/dev/geco/gholo/mcv/v1_21_4/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_21_4/src/main/java/dev/geco/gholo/mcv/v1_21_4/object/holo/type/GHoloRowItemStackContent.java @@ -7,30 +7,27 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -64,20 +61,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.id()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - Optional> itemData = BuiltInRegistries.ITEM.get(resourceLocation); - if(itemData.isPresent()) data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), itemData.get().value().getDefaultInstance())); + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -120,7 +116,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_21_5/src/main/java/dev/geco/gholo/mcv/v1_21_5/object/holo/GHoloRowContent.java b/mcv/v1_21_5/src/main/java/dev/geco/gholo/mcv/v1_21_5/object/holo/GHoloRowContent.java index c378b33..216259a 100644 --- a/mcv/v1_21_5/src/main/java/dev/geco/gholo/mcv/v1_21_5/object/holo/GHoloRowContent.java +++ b/mcv/v1_21_5/src/main/java/dev/geco/gholo/mcv/v1_21_5/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_21_5/src/main/java/dev/geco/gholo/mcv/v1_21_5/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_21_5/src/main/java/dev/geco/gholo/mcv/v1_21_5/object/holo/type/GHoloRowItemStackContent.java index 9dbcd7d..96daf89 100644 --- a/mcv/v1_21_5/src/main/java/dev/geco/gholo/mcv/v1_21_5/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_21_5/src/main/java/dev/geco/gholo/mcv/v1_21_5/object/holo/type/GHoloRowItemStackContent.java @@ -7,30 +7,27 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -64,20 +61,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.id()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - Optional> itemData = BuiltInRegistries.ITEM.get(resourceLocation); - if(itemData.isPresent()) data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), itemData.get().value().getDefaultInstance())); + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -120,7 +116,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_21_6/src/main/java/dev/geco/gholo/mcv/v1_21_6/object/holo/GHoloRowContent.java b/mcv/v1_21_6/src/main/java/dev/geco/gholo/mcv/v1_21_6/object/holo/GHoloRowContent.java index 209b894..e6fb632 100644 --- a/mcv/v1_21_6/src/main/java/dev/geco/gholo/mcv/v1_21_6/object/holo/GHoloRowContent.java +++ b/mcv/v1_21_6/src/main/java/dev/geco/gholo/mcv/v1_21_6/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_21_6/src/main/java/dev/geco/gholo/mcv/v1_21_6/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_21_6/src/main/java/dev/geco/gholo/mcv/v1_21_6/object/holo/type/GHoloRowItemStackContent.java index 0de796b..f785364 100644 --- a/mcv/v1_21_6/src/main/java/dev/geco/gholo/mcv/v1_21_6/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_21_6/src/main/java/dev/geco/gholo/mcv/v1_21_6/object/holo/type/GHoloRowItemStackContent.java @@ -7,30 +7,27 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -64,20 +61,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.id()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - Optional> itemData = BuiltInRegistries.ITEM.get(resourceLocation); - if(itemData.isPresent()) data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), itemData.get().value().getDefaultInstance())); + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -120,7 +116,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v1_21_9/src/main/java/dev/geco/gholo/mcv/v1_21_9/object/holo/GHoloRowContent.java b/mcv/v1_21_9/src/main/java/dev/geco/gholo/mcv/v1_21_9/object/holo/GHoloRowContent.java index 79a6afe..6302c3c 100644 --- a/mcv/v1_21_9/src/main/java/dev/geco/gholo/mcv/v1_21_9/object/holo/GHoloRowContent.java +++ b/mcv/v1_21_9/src/main/java/dev/geco/gholo/mcv/v1_21_9/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v1_21_9/src/main/java/dev/geco/gholo/mcv/v1_21_9/object/holo/type/GHoloRowItemStackContent.java b/mcv/v1_21_9/src/main/java/dev/geco/gholo/mcv/v1_21_9/object/holo/type/GHoloRowItemStackContent.java index 1b1daff..ab3097c 100644 --- a/mcv/v1_21_9/src/main/java/dev/geco/gholo/mcv/v1_21_9/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v1_21_9/src/main/java/dev/geco/gholo/mcv/v1_21_9/object/holo/type/GHoloRowItemStackContent.java @@ -7,30 +7,27 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -64,20 +61,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.id()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(content.toLowerCase()); - if(resourceLocation != null) { - Optional> itemData = BuiltInRegistries.ITEM.get(resourceLocation); - if(itemData.isPresent()) data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), itemData.get().value().getDefaultInstance())); + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -120,7 +116,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } } diff --git a/mcv/v26_1/src/main/java/dev/geco/gholo/mcv/v26_1/object/holo/GHoloRowContent.java b/mcv/v26_1/src/main/java/dev/geco/gholo/mcv/v26_1/object/holo/GHoloRowContent.java index 59fbfed..64b4f57 100644 --- a/mcv/v26_1/src/main/java/dev/geco/gholo/mcv/v26_1/object/holo/GHoloRowContent.java +++ b/mcv/v26_1/src/main/java/dev/geco/gholo/mcv/v26_1/object/holo/GHoloRowContent.java @@ -70,7 +70,7 @@ private void updateContent(String content, Player player) { if(itemContent == null) itemContent = new GHoloRowItemContent(holoRow, gHoloMain); yield itemContent; } - case "itemstack" -> { + case "itemstack", "skull", "player_skull" -> { if(itemStackContent == null) itemStackContent = new GHoloRowItemStackContent(holoRow, gHoloMain); yield itemStackContent; } @@ -82,9 +82,9 @@ private void updateContent(String content, Player player) { IGHoloRowContentType currentContentType = currentContentTypes.get(playerUuid); if(currentContentType != contentType) { if(currentContentType != null) currentContentType.unload(player); - contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], true); + contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], true); currentContentTypes.put(playerUuid, contentType); - } else contentType.load(player, contentType instanceof GHoloRowTextContent ? content : contentSplit[1], false); + } else contentType.load(player, contentType instanceof GHoloRowTextContent || contentType instanceof GHoloRowItemStackContent ? content : contentSplit[1], false); } @Override diff --git a/mcv/v26_1/src/main/java/dev/geco/gholo/mcv/v26_1/object/holo/type/GHoloRowItemStackContent.java b/mcv/v26_1/src/main/java/dev/geco/gholo/mcv/v26_1/object/holo/type/GHoloRowItemStackContent.java index 1a1a6c4..0154446 100644 --- a/mcv/v26_1/src/main/java/dev/geco/gholo/mcv/v26_1/object/holo/type/GHoloRowItemStackContent.java +++ b/mcv/v26_1/src/main/java/dev/geco/gholo/mcv/v26_1/object/holo/type/GHoloRowItemStackContent.java @@ -7,30 +7,27 @@ import dev.geco.gholo.object.holo.IGHoloRowContentType; import dev.geco.gholo.object.simple.SimpleLocation; import dev.geco.gholo.object.simple.SimpleVector; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.geco.gholo.object.simple.SimpleItem; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -64,20 +61,19 @@ public GHoloRowItemStackContent(GHoloRow holoRow, GHoloMain gHoloMain) { public void load(Player player, String content, boolean create) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); if(create) serverPlayer.connection.send(new ClientboundAddEntityPacket(getId(), uuid, getX(), getY(), getZ(), getXRot(), getYRot(), getType(), 0, getDeltaMovement(), getYRot())); - serverPlayer.connection.send(getDataPacket(content)); + serverPlayer.connection.send(getDataPacket(content, player)); } - private ClientboundSetEntityDataPacket getDataPacket(String content) { + private ClientboundSetEntityDataPacket getDataPacket(String content, Player player) { List> data = getEntityData().getNonDefaultValues(); if(data == null) data = new ArrayList<>(); else data.removeIf(dataValue -> dataValue.id() == holoItemData.id()); List> defaultResetData = getEntityData().packDirty(); if(defaultResetData != null) data.addAll(defaultResetData); if(content != null) { - Identifier identifier = Identifier.tryParse(content.toLowerCase()); - if(identifier != null) { - Optional> itemData = BuiltInRegistries.ITEM.get(identifier); - if(itemData.isPresent()) data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), itemData.get().value().getDefaultInstance())); + org.bukkit.inventory.ItemStack item = SimpleItem.getItem(content, player); + if(item != null) { + data.add(new SynchedEntityData.DataValue<>(holoItemData.id(), holoItemData.serializer(), CraftItemStack.asNMSCopy(item))); } } return new ClientboundSetEntityDataPacket(getId(), data); @@ -120,7 +116,7 @@ private void finishUpdate() { for(Player player : holoRow.getHolo().getRawLocation().getWorld().getPlayers()) { if(permission != null && !gHoloMain.getPermissionService().hasPermission(player, permission)) continue; ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - serverPlayer.connection.send(getDataPacket(null)); + serverPlayer.connection.send(getDataPacket(null, player)); } }