First steps towards 1.17 support

The plugin works, but the localization part has yet to be done, and
support for other plugins has to be updated to the latest versions.
This commit is contained in:
Eric 2021-07-24 23:33:54 +02:00
parent 331c912402
commit acd447c6ec
12 changed files with 393 additions and 179 deletions

32
pom.xml
View File

@ -91,13 +91,17 @@
<id>plotsquared-repo</id> <id>plotsquared-repo</id>
<url>https://plotsquared.com/mvn/</url> <url>https://plotsquared.com/mvn/</url>
</repository> </repository>
<repository>
<id>inventive-repo</id>
<url>https://repo.inventivetalent.org/content/groups/public/</url>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.16.4-R0.1-SNAPSHOT</version> <version>1.17.1-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -170,26 +174,38 @@
<systemPath>${project.basedir}/lib/PlotSquared-Bukkit-4.4.495.jar</systemPath> <systemPath>${project.basedir}/lib/PlotSquared-Bukkit-4.4.495.jar</systemPath>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
<!-- Shaded dependencies --> <!-- Shaded dependencies -->
<dependency> <dependency>
<groupId>org.codemc.worldguardwrapper</groupId> <groupId>org.codemc.worldguardwrapper</groupId>
<artifactId>worldguardwrapper</artifactId> <artifactId>worldguardwrapper</artifactId>
<version>1.1.6-SNAPSHOT</version> <version>1.2.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.bstats</groupId> <groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId> <artifactId>bstats-bukkit</artifactId>
<version>1.7</version> <version>2.2.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.zaxxer</groupId> <groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId> <artifactId>HikariCP</artifactId>
<version>3.3.1</version> <version>5.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId> <artifactId>slf4j-jdk14</artifactId>
<version>1.7.26</version> <version>2.0.0-alpha2</version>
</dependency>
<dependency>
<groupId>org.inventivetalent</groupId>
<artifactId>reflectionhelper</artifactId>
<version>1.18.4-SNAPSHOT</version>
</dependency> </dependency>
</dependencies> </dependencies>
@ -219,7 +235,7 @@
<createDependencyReducedPom>false</createDependencyReducedPom> <createDependencyReducedPom>false</createDependencyReducedPom>
<relocations> <relocations>
<relocation> <relocation>
<pattern>org.bstats.bukkit</pattern> <pattern>org.bstats</pattern>
<shadedPattern>de.epiceric.shopchest.dependencies.bstats</shadedPattern> <shadedPattern>de.epiceric.shopchest.dependencies.bstats</shadedPattern>
</relocation> </relocation>
<relocation> <relocation>
@ -234,6 +250,10 @@
<pattern>org.slf4j</pattern> <pattern>org.slf4j</pattern>
<shadedPattern>de.epiceric.shopchest.dependencies.slf4j</shadedPattern> <shadedPattern>de.epiceric.shopchest.dependencies.slf4j</shadedPattern>
</relocation> </relocation>
<relocation>
<pattern>org.inventivetalent.reflection</pattern>
<shadedPattern>de.epiceric.shopchest.dependencies.reflectionhelper</shadedPattern>
</relocation>
</relocations> </relocations>
</configuration> </configuration>
</plugin> </plugin>

View File

@ -20,6 +20,8 @@ import com.plotsquared.core.PlotSquared;
import com.wasteofplastic.askyblock.ASkyBlock; import com.wasteofplastic.askyblock.ASkyBlock;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bstats.charts.AdvancedPie;
import org.bstats.charts.SimplePie;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World; import org.bukkit.World;
@ -340,9 +342,9 @@ public class ShopChest extends JavaPlugin {
debug("Initializing Metrics..."); debug("Initializing Metrics...");
Metrics metrics = new Metrics(this, 1726); Metrics metrics = new Metrics(this, 1726);
metrics.addCustomChart(new Metrics.SimplePie("creative_setting", () -> Config.creativeSelectItem ? "Enabled" : "Disabled")); metrics.addCustomChart(new SimplePie("creative_setting", () -> Config.creativeSelectItem ? "Enabled" : "Disabled"));
metrics.addCustomChart(new Metrics.SimplePie("database_type", () -> Config.databaseType.toString())); metrics.addCustomChart(new SimplePie("database_type", () -> Config.databaseType.toString()));
metrics.addCustomChart(new Metrics.AdvancedPie("shop_type", () -> { metrics.addCustomChart(new AdvancedPie("shop_type", () -> {
int normal = 0; int normal = 0;
int admin = 0; int admin = 0;

View File

@ -1391,7 +1391,6 @@ public class LanguageUtils {
itemNames.add(new ItemName(Material.PURPUR_SLAB, langConfig.getString("block.minecraft.purpur_slab", "Purpur Slab"))); itemNames.add(new ItemName(Material.PURPUR_SLAB, langConfig.getString("block.minecraft.purpur_slab", "Purpur Slab")));
itemNames.add(new ItemName(Material.END_STONE_BRICKS, langConfig.getString("block.minecraft.end_stone_bricks", "End Stone Bricks"))); itemNames.add(new ItemName(Material.END_STONE_BRICKS, langConfig.getString("block.minecraft.end_stone_bricks", "End Stone Bricks")));
itemNames.add(new ItemName(Material.BEETROOTS, langConfig.getString("block.minecraft.beetroots", "Beetroots"))); itemNames.add(new ItemName(Material.BEETROOTS, langConfig.getString("block.minecraft.beetroots", "Beetroots")));
itemNames.add(new ItemName(Material.GRASS_PATH, langConfig.getString("block.minecraft.grass_path", "Grass Path")));
itemNames.add(new ItemName(Material.MAGMA_BLOCK, langConfig.getString("block.minecraft.magma_block", "Magma Block"))); itemNames.add(new ItemName(Material.MAGMA_BLOCK, langConfig.getString("block.minecraft.magma_block", "Magma Block")));
itemNames.add(new ItemName(Material.NETHER_WART_BLOCK, langConfig.getString("block.minecraft.nether_wart_block", "Nether Wart Block"))); itemNames.add(new ItemName(Material.NETHER_WART_BLOCK, langConfig.getString("block.minecraft.nether_wart_block", "Nether Wart Block")));
itemNames.add(new ItemName(Material.RED_NETHER_BRICKS, langConfig.getString("block.minecraft.red_nether_bricks", "Red Nether Bricks"))); itemNames.add(new ItemName(Material.RED_NETHER_BRICKS, langConfig.getString("block.minecraft.red_nether_bricks", "Red Nether Bricks")));
@ -2069,6 +2068,12 @@ public class LanguageUtils {
itemNames.add(new ItemName(Material.valueOf("ZOMBIE_PIGMAN_SPAWN_EGG"), langConfig.getString("item.minecraft.zombie_pigman_spawn_egg", "Zombie Pigman Spawn Egg"))); itemNames.add(new ItemName(Material.valueOf("ZOMBIE_PIGMAN_SPAWN_EGG"), langConfig.getString("item.minecraft.zombie_pigman_spawn_egg", "Zombie Pigman Spawn Egg")));
} }
if (Utils.getMajorVersion() >= 17) {
itemNames.add(new ItemName(Material.DIRT_PATH, langConfig.getString("block.minecraft.grass_path", "Grass Path")));
} else {
itemNames.add(new ItemName(Material.valueOf("GRASS_PATH"), langConfig.getString("block.minecraft.grass_path", "Grass Path")));
}
// Add Enchantment Names // Add Enchantment Names
enchantmentNames.add(new EnchantmentName(Enchantment.DAMAGE_ALL, langConfig.getString("enchantment.minecraft.sharpness", "Sharpness"))); enchantmentNames.add(new EnchantmentName(Enchantment.DAMAGE_ALL, langConfig.getString("enchantment.minecraft.sharpness", "Sharpness")));
enchantmentNames.add(new EnchantmentName(Enchantment.DAMAGE_UNDEAD, langConfig.getString("enchantment.minecraft.smite", "Smite"))); enchantmentNames.add(new EnchantmentName(Enchantment.DAMAGE_UNDEAD, langConfig.getString("enchantment.minecraft.smite", "Smite")));

View File

@ -36,6 +36,8 @@ import org.bukkit.scheduler.BukkitRunnable;
import org.codemc.worldguardwrapper.WorldGuardWrapper; import org.codemc.worldguardwrapper.WorldGuardWrapper;
import org.codemc.worldguardwrapper.flag.IWrappedFlag; import org.codemc.worldguardwrapper.flag.IWrappedFlag;
import org.codemc.worldguardwrapper.flag.WrappedState; import org.codemc.worldguardwrapper.flag.WrappedState;
import org.inventivetalent.reflection.resolver.minecraft.NMSClassResolver;
import org.inventivetalent.reflection.resolver.minecraft.OBCClassResolver;
import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.config.Config; import de.epiceric.shopchest.config.Config;
@ -664,9 +666,12 @@ public class ShopInteractListener implements Listener {
JsonBuilder.PartArray rootArray = new JsonBuilder.PartArray(); JsonBuilder.PartArray rootArray = new JsonBuilder.PartArray();
try { try {
Class<?> craftItemStackClass = Utils.getCraftClass("inventory.CraftItemStack"); OBCClassResolver obcClassResolver = new OBCClassResolver();
NMSClassResolver nmsClassResolver = new NMSClassResolver();
Class<?> craftItemStackClass = obcClassResolver.resolveSilent("inventory.CraftItemStack");
Object nmsStack = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, product.getItemStack()); Object nmsStack = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, product.getItemStack());
Class<?> nbtTagCompoundClass = Utils.getNMSClass("NBTTagCompound"); Class<?> nbtTagCompoundClass = nmsClassResolver.resolveSilent("nbt.NBTTagCompound");
Object nbtTagCompound = nbtTagCompoundClass.getConstructor().newInstance(); Object nbtTagCompound = nbtTagCompoundClass.getConstructor().newInstance();
nmsStack.getClass().getMethod("save", nbtTagCompoundClass).invoke(nmsStack, nbtTagCompound); nmsStack.getClass().getMethod("save", nbtTagCompoundClass).invoke(nmsStack, nbtTagCompound);
jsonItem = new JsonPrimitive(nbtTagCompound.toString()).toString(); jsonItem = new JsonPrimitive(nbtTagCompound.toString()).toString();

View File

@ -1,31 +1,33 @@
package de.epiceric.shopchest.nms; package de.epiceric.shopchest.nms;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.inventivetalent.reflection.resolver.minecraft.NMSClassResolver;
import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.utils.Utils; import de.epiceric.shopchest.utils.Utils;
public class ArmorStandWrapper { public class ArmorStandWrapper {
private final NMSClassResolver nmsClassResolver = new NMSClassResolver();
private final Class<?> packetPlayOutEntityDestroyClass = Utils.getNMSClass("PacketPlayOutEntityDestroy"); private final Class<?> packetDataSerializerClass = nmsClassResolver.resolveSilent("network.PacketDataSerializer");
private final Class<?> packetPlayOutEntityMetadataClass = Utils.getNMSClass("PacketPlayOutEntityMetadata"); private final Class<?> packetPlayOutEntityDestroyClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutEntityDestroy");
private final Class<?> packetPlayOutEntityTeleportClass = Utils.getNMSClass("PacketPlayOutEntityTeleport"); private final Class<?> packetPlayOutEntityMetadataClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutEntityMetadata");
private final Class<?> dataWatcherClass = Utils.getNMSClass("DataWatcher"); private final Class<?> packetPlayOutEntityTeleportClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutEntityTeleport");
private final Class<?> dataWatcherClass = nmsClassResolver.resolveSilent("network.syncher.DataWatcher");
private final UUID uuid = UUID.randomUUID(); private final UUID uuid = UUID.randomUUID();
private final int entityId; private final int entityId;
private ShopChest plugin; private ShopChest plugin;
private Object entity;
private Location location; private Location location;
private String customName; private String customName;
public ArmorStandWrapper(ShopChest plugin, Location location, String customName, boolean interactable) { public ArmorStandWrapper(ShopChest plugin, Location location, String customName) {
this.plugin = plugin; this.plugin = plugin;
this.location = location; this.location = location;
this.customName = customName; this.customName = customName;
@ -51,29 +53,60 @@ public class ArmorStandWrapper {
public void setLocation(Location location) { public void setLocation(Location location) {
this.location = location; this.location = location;
double y = location.getY() + (Utils.getServerVersion().equals("v1_8_R1") ? 0 : 1.975);
Object packet;
try { try {
Object packet = packetPlayOutEntityTeleportClass.getConstructor().newInstance(); if (Utils.getMajorVersion() >= 17) {
Field[] fields = packetPlayOutEntityTeleportClass.getDeclaredFields(); // Empty constructor does not exist anymore in 1.17+ so create packet via serializer
for (Field field : fields) { Class<?> byteBufClass = Class.forName("io.netty.buffer.ByteBuf");
field.setAccessible(true); Class<?> unpooledClass = Class.forName("io.netty.buffer.Unpooled");
} Object buffer = unpooledClass.getMethod("buffer").invoke(null);
Object serializer = packetDataSerializerClass.getConstructor(byteBufClass).newInstance(buffer);
boolean isPre9 = Utils.getMajorVersion() < 9; Method d = packetDataSerializerClass.getMethod("d", int.class);
fields[0].set(packet, entityId); Method writeDouble = packetDataSerializerClass.getMethod("writeDouble", double.class);
Method writeByte = packetDataSerializerClass.getMethod("writeByte", int.class);
Method writeBoolean = packetDataSerializerClass.getMethod("writeBoolean", boolean.class);
double y = location.getY() + (Utils.getServerVersion().equals("v1_8_R1") ? 0 : 1.975); d.invoke(serializer, getEntityId());
if (isPre9) { writeDouble.invoke(serializer, location.getX());
fields[1].set(packet, (int)(location.getX() * 32)); writeDouble.invoke(serializer, y);
fields[2].set(packet, (int)(y * 32)); writeDouble.invoke(serializer, location.getZ());
fields[3].set(packet, (int)(location.getZ() * 32)); writeByte.invoke(serializer, 0);
writeByte.invoke(serializer, 0);
writeBoolean.invoke(serializer, false);
packet = packetPlayOutEntityTeleportClass.getConstructor(packetDataSerializerClass).newInstance(serializer);
} else { } else {
fields[1].set(packet, location.getX()); packet = packetPlayOutEntityTeleportClass.getConstructor().newInstance();
fields[2].set(packet, y); Field[] fields = packetPlayOutEntityTeleportClass.getDeclaredFields();
fields[3].set(packet, location.getZ()); for (Field field : fields) {
field.setAccessible(true);
}
boolean isPre9 = Utils.getMajorVersion() < 9;
fields[0].set(packet, entityId);
if (isPre9) {
fields[1].set(packet, (int)(location.getX() * 32));
fields[2].set(packet, (int)(y * 32));
fields[3].set(packet, (int)(location.getZ() * 32));
} else {
fields[1].set(packet, location.getX());
fields[2].set(packet, y);
fields[3].set(packet, location.getZ());
}
fields[4].set(packet, (byte) 0);
fields[5].set(packet, (byte) 0);
fields[6].set(packet, true);
}
if (packet == null) {
plugin.getLogger().severe("Could not set hologram location");
plugin.debug("Could not set armor stand location: Packet is null");
return;
} }
fields[4].set(packet, (byte) 0);
fields[5].set(packet, (byte) 0);
fields[6].set(packet, true);
for (Player player : location.getWorld().getPlayers()) { for (Player player : location.getWorld().getPlayers()) {
Utils.sendPacket(plugin, packet, player); Utils.sendPacket(plugin, packet, player);
@ -123,8 +156,4 @@ public class ArmorStandWrapper {
public String getCustomName() { public String getCustomName() {
return customName; return customName;
} }
public Object getEntity() {
return entity;
}
} }

View File

@ -3,14 +3,15 @@ package de.epiceric.shopchest.nms;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.inventivetalent.reflection.resolver.minecraft.OBCClassResolver;
import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.utils.Utils;
// For versions below 1.9.4, since Bukkit's BookMeta // For versions below 1.9.4, since Bukkit's BookMeta
// didn't have generations in those versions // didn't have generations in those versions
public class CustomBookMeta { public class CustomBookMeta {
private static final OBCClassResolver obcClassResolver = new OBCClassResolver();
public enum Generation { public enum Generation {
ORIGINAL, ORIGINAL,
@ -21,7 +22,7 @@ public class CustomBookMeta {
public static Generation getGeneration(ItemStack book) { public static Generation getGeneration(ItemStack book) {
try { try {
Class<?> craftItemStackClass = Utils.getCraftClass("inventory.CraftItemStack"); Class<?> craftItemStackClass = obcClassResolver.resolveSilent("inventory.CraftItemStack");
if (craftItemStackClass == null) { if (craftItemStackClass == null) {
ShopChest.getInstance().debug("Failed to get NBTGeneration: Could not find CraftItemStack class"); ShopChest.getInstance().debug("Failed to get NBTGeneration: Could not find CraftItemStack class");
@ -61,7 +62,7 @@ public class CustomBookMeta {
public static void setGeneration(ItemStack book, Generation generation) { public static void setGeneration(ItemStack book, Generation generation) {
try { try {
Class<?> craftItemStackClass = Utils.getCraftClass("inventory.CraftItemStack"); Class<?> craftItemStackClass = obcClassResolver.resolveSilent("inventory.CraftItemStack");
if (craftItemStackClass == null) { if (craftItemStackClass == null) {
ShopChest.getInstance().debug("Failed to get NBTGeneration: Could not find CraftItemStack class"); ShopChest.getInstance().debug("Failed to get NBTGeneration: Could not find CraftItemStack class");

View File

@ -193,7 +193,7 @@ public class Hologram {
loc.subtract(0, line * 0.25, 0); loc.subtract(0, line * 0.25, 0);
} }
ArmorStandWrapper wrapper = new ArmorStandWrapper(plugin, loc, text, false); ArmorStandWrapper wrapper = new ArmorStandWrapper(plugin, loc, text);
wrappers.add(line, wrapper); wrappers.add(line, wrapper);
if (forceUpdateLine) { if (forceUpdateLine) {

View File

@ -12,6 +12,8 @@ import java.util.regex.Pattern;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.inventivetalent.reflection.resolver.FieldResolver;
import org.inventivetalent.reflection.resolver.minecraft.NMSClassResolver;
import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.utils.Utils; import de.epiceric.shopchest.utils.Utils;
@ -115,22 +117,17 @@ public class JsonBuilder {
private Part rootPart; private Part rootPart;
private ShopChest plugin; private ShopChest plugin;
private Class<?> iChatBaseComponentClass = Utils.getNMSClass("IChatBaseComponent"); private final NMSClassResolver nmsClassResolver = new NMSClassResolver();
private Class<?> packetPlayOutChatClass = Utils.getNMSClass("PacketPlayOutChat"); private Class<?> iChatBaseComponentClass = nmsClassResolver.resolveSilent("network.chat.IChatBaseComponent");
private Class<?> chatSerializerClass; private Class<?> packetPlayOutChatClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutChat");
private Class<?> chatSerializerClass = nmsClassResolver.resolveSilent("ChatSerializer", "network.chat.IChatBaseComponent$ChatSerializer");
private Class<?> chatMessageTypeClass; private Class<?> chatMessageTypeClass;
public JsonBuilder(ShopChest plugin) { public JsonBuilder(ShopChest plugin) {
this.plugin = plugin; this.plugin = plugin;
if (Utils.getServerVersion().equals("v1_8_R1")) {
chatSerializerClass = Utils.getNMSClass("ChatSerializer");
} else {
chatSerializerClass = Utils.getNMSClass("IChatBaseComponent$ChatSerializer");
}
if (Utils.getMajorVersion() >= 16) { if (Utils.getMajorVersion() >= 16) {
chatMessageTypeClass = Utils.getNMSClass("ChatMessageType"); chatMessageTypeClass = nmsClassResolver.resolveSilent("network.chat.ChatMessageType");
} }
Class<?>[] requiredClasses = new Class<?>[] { Class<?>[] requiredClasses = new Class<?>[] {
@ -241,7 +238,7 @@ public class JsonBuilder {
Object packetPlayOutChat = Utils.getMajorVersion() < 16 Object packetPlayOutChat = Utils.getMajorVersion() < 16
? packetPlayOutChatClass.getConstructor(iChatBaseComponentClass).newInstance(iChatBaseComponent) ? packetPlayOutChatClass.getConstructor(iChatBaseComponentClass).newInstance(iChatBaseComponent)
: packetPlayOutChatClass.getConstructor(iChatBaseComponentClass, chatMessageTypeClass, UUID.class) : packetPlayOutChatClass.getConstructor(iChatBaseComponentClass, chatMessageTypeClass, UUID.class)
.newInstance(iChatBaseComponent, chatMessageTypeClass.getField("CHAT").get(null), UUID.randomUUID()); .newInstance(iChatBaseComponent, (new FieldResolver(chatMessageTypeClass)).resolve("CHAT", "a").get(null), UUID.randomUUID());
Utils.sendPacket(plugin, packetPlayOutChat, p); Utils.sendPacket(plugin, packetPlayOutChat, p);
plugin.debug("Sent JSON: " + toString()); plugin.debug("Sent JSON: " + toString());

View File

@ -4,6 +4,7 @@ import java.lang.reflect.InvocationTargetException;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.inventivetalent.reflection.resolver.minecraft.OBCClassResolver;
import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.utils.Utils; import de.epiceric.shopchest.utils.Utils;
@ -12,7 +13,8 @@ public class SpawnEggMeta {
private static String getNBTEntityID(ShopChest plugin, ItemStack stack) { private static String getNBTEntityID(ShopChest plugin, ItemStack stack) {
try { try {
Class<?> craftItemStackClass = Utils.getCraftClass("inventory.CraftItemStack"); OBCClassResolver obcClassResolver = new OBCClassResolver();
Class<?> craftItemStackClass = obcClassResolver.resolveSilent("inventory.CraftItemStack");
if (craftItemStackClass == null) { if (craftItemStackClass == null) {
plugin.debug("Failed to get NBTEntityID: Could not find CraftItemStack class"); plugin.debug("Failed to get NBTEntityID: Could not find CraftItemStack class");

View File

@ -11,6 +11,8 @@ import org.bukkit.Location;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.inventivetalent.reflection.resolver.minecraft.NMSClassResolver;
import org.inventivetalent.reflection.resolver.minecraft.OBCClassResolver;
import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.utils.Utils; import de.epiceric.shopchest.utils.Utils;
@ -25,13 +27,15 @@ public class ShopItem {
private final UUID uuid = UUID.randomUUID(); private final UUID uuid = UUID.randomUUID();
private final int entityId; private final int entityId;
private final Class<?> packetPlayOutEntityDestroyClass = Utils.getNMSClass("PacketPlayOutEntityDestroy"); private final NMSClassResolver nmsClassResolver = new NMSClassResolver();
private final Class<?> packetPlayOutEntityVelocityClass = Utils.getNMSClass("PacketPlayOutEntityVelocity"); private final OBCClassResolver obcClassResolver = new OBCClassResolver();
private final Class<?> packetPlayOutEntityMetadataClass = Utils.getNMSClass("PacketPlayOutEntityMetadata"); private final Class<?> packetPlayOutEntityDestroyClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutEntityDestroy");
private final Class<?> dataWatcherClass = Utils.getNMSClass("DataWatcher"); private final Class<?> packetPlayOutEntityVelocityClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutEntityVelocity");
private final Class<?> vec3dClass = Utils.getNMSClass("Vec3D"); private final Class<?> packetPlayOutEntityMetadataClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutEntityMetadata");
private final Class<?> craftItemStackClass = Utils.getCraftClass("inventory.CraftItemStack"); private final Class<?> dataWatcherClass = nmsClassResolver.resolveSilent("network.syncher.DataWatcher");
private final Class<?> nmsItemStackClass = Utils.getNMSClass("ItemStack"); private final Class<?> vec3dClass = nmsClassResolver.resolveSilent("world.phys.Vec3D");
private final Class<?> craftItemStackClass = obcClassResolver.resolveSilent("inventory.CraftItemStack");
private final Class<?> nmsItemStackClass = nmsClassResolver.resolveSilent("world.item.ItemStack");
public ShopItem(ShopChest plugin, ItemStack itemStack, Location location) { public ShopItem(ShopChest plugin, ItemStack itemStack, Location location) {
this.plugin = plugin; this.plugin = plugin;
@ -39,11 +43,9 @@ public class ShopItem {
this.location = location; this.location = location;
this.entityId = Utils.getFreeEntityId(); this.entityId = Utils.getFreeEntityId();
Class<?> entityClass = Utils.getNMSClass("Entity");
Class<?>[] requiredClasses = new Class<?>[] { Class<?>[] requiredClasses = new Class<?>[] {
nmsItemStackClass, craftItemStackClass, packetPlayOutEntityMetadataClass, dataWatcherClass, nmsItemStackClass, craftItemStackClass, packetPlayOutEntityMetadataClass, dataWatcherClass,
packetPlayOutEntityDestroyClass, entityClass, packetPlayOutEntityVelocityClass, packetPlayOutEntityDestroyClass, packetPlayOutEntityVelocityClass,
}; };
for (Class<?> c : requiredClasses) { for (Class<?> c : requiredClasses) {

View File

@ -1,5 +1,6 @@
package de.epiceric.shopchest.utils; package de.epiceric.shopchest.utils;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -32,6 +33,11 @@ import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.BookMeta; import org.bukkit.inventory.meta.BookMeta;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import org.inventivetalent.reflection.minecraft.DataWatcher;
import org.inventivetalent.reflection.resolver.ClassResolver;
import org.inventivetalent.reflection.resolver.FieldResolver;
import org.inventivetalent.reflection.resolver.minecraft.NMSClassResolver;
import org.inventivetalent.reflection.resolver.minecraft.OBCClassResolver;
import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.config.Placeholder; import de.epiceric.shopchest.config.Placeholder;
@ -43,6 +49,15 @@ import de.epiceric.shopchest.nms.JsonBuilder;
import de.epiceric.shopchest.shop.Shop; import de.epiceric.shopchest.shop.Shop;
public class Utils { public class Utils {
static NMSClassResolver nmsClassResolver = new NMSClassResolver();
static Class<?> entityClass = nmsClassResolver.resolveSilent("world.entity.Entity");
static Class<?> entityArmorStandClass = nmsClassResolver.resolveSilent("world.entity.decoration.EntityArmorStand");
static Class<?> entityItemClass = nmsClassResolver.resolveSilent("world.entity.item.EntityItem");
static Class<?> dataWatcherClass = nmsClassResolver.resolveSilent("network.syncher.DataWatcher");
static Class<?> dataWatcherObjectClass = nmsClassResolver.resolveSilent("network.syncher.DataWatcherObject");
static Class<?> chatSerializerClass = nmsClassResolver.resolveSilent("ChatSerializer", "network.chat.IChatBaseComponent$ChatSerializer");
private Utils() {}
/** /**
* Check if two items are similar to each other * Check if two items are similar to each other
@ -335,30 +350,6 @@ public class Utils {
jb.sendJson(p); jb.sendJson(p);
} }
/**
* @param className Name of the class
* @return Class in {@code net.minecraft.server.[VERSION]} package with the specified name or {@code null} if the class was not found
*/
public static Class<?> getNMSClass(String className) {
try {
return Class.forName("net.minecraft.server." + getServerVersion() + "." + className);
} catch (ClassNotFoundException e) {
return null;
}
}
/**
* @param className Name of the class
* @return Class in {@code org.bukkit.craftbukkit.[VERSION]} package with the specified name or {@code null} if the class was not found
*/
public static Class<?> getCraftClass(String className) {
try {
return Class.forName("org.bukkit.craftbukkit." + getServerVersion() + "." + className);
} catch (ClassNotFoundException e) {
return null;
}
}
/** /**
* Create a NMS data watcher object to send via a {@code PacketPlayOutEntityMetadata} packet. * Create a NMS data watcher object to send via a {@code PacketPlayOutEntityMetadata} packet.
* Gravity will be disabled and the custom name will be displayed if available. * Gravity will be disabled and the custom name will be displayed if available.
@ -370,12 +361,6 @@ public class Utils {
int majorVersion = getMajorVersion(); int majorVersion = getMajorVersion();
try { try {
Class<?> entityClass = getNMSClass("Entity");
Class<?> entityArmorStandClass = getNMSClass("EntityArmorStand");
Class<?> entityItemClass = getNMSClass("EntityItem");
Class<?> dataWatcherClass = getNMSClass("DataWatcher");
Class<?> dataWatcherObjectClass = getNMSClass("DataWatcherObject");
byte entityFlags = nmsItemStack == null ? (byte) 0b100000 : 0; // invisible if armor stand byte entityFlags = nmsItemStack == null ? (byte) 0b100000 : 0; // invisible if armor stand
byte armorStandFlags = nmsItemStack == null ? (byte) 0b10000 : 0; // marker (since 1.8_R2) byte armorStandFlags = nmsItemStack == null ? (byte) 0b10000 : 0; // marker (since 1.8_R2)
@ -414,6 +399,8 @@ public class Utils {
dataWatcherObjectFieldNames = new String[] {"T", "AIR_TICKS", "ay", "ax", "az", "aA", "ITEM", "b"}; dataWatcherObjectFieldNames = new String[] {"T", "AIR_TICKS", "ay", "ax", "az", "aA", "ITEM", "b"};
} else if ("v1_16_R2".equals(version) || "v1_16_R3".equals(version)) { } else if ("v1_16_R2".equals(version) || "v1_16_R3".equals(version)) {
dataWatcherObjectFieldNames = new String[] {"S", "AIR_TICKS", "ar", "aq", "as", "at", "ITEM", "b"}; dataWatcherObjectFieldNames = new String[] {"S", "AIR_TICKS", "ar", "aq", "as", "at", "ITEM", "b"};
} else if ("v1_17_R1".equals(version)) {
dataWatcherObjectFieldNames = new String[] {"Z", "aI", "aK", "aJ", "aL", "aM", "c", "bG"};
} else { } else {
return null; return null;
} }
@ -452,7 +439,6 @@ public class Utils {
register.invoke(dataWatcher, fNoGravity.get(null), true); register.invoke(dataWatcher, fNoGravity.get(null), true);
if (majorVersion >= 13) { if (majorVersion >= 13) {
if (customName != null) { if (customName != null) {
Class<?> chatSerializerClass = Utils.getNMSClass("IChatBaseComponent$ChatSerializer");
Object iChatBaseComponent = chatSerializerClass.getMethod("a", String.class).invoke(null, JsonBuilder.parse(customName).toString()); Object iChatBaseComponent = chatSerializerClass.getMethod("a", String.class).invoke(null, JsonBuilder.parse(customName).toString());
register.invoke(dataWatcher, fCustomName.get(null), Optional.of(iChatBaseComponent)); register.invoke(dataWatcher, fCustomName.get(null), Optional.of(iChatBaseComponent));
} else { } else {
@ -477,8 +463,7 @@ public class Utils {
*/ */
public static int getFreeEntityId() { public static int getFreeEntityId() {
try { try {
Class<?> entityClass = getNMSClass("Entity"); Field entityCountField = new FieldResolver(entityClass).resolve("entityCount", "b");
Field entityCountField = entityClass.getDeclaredField("entityCount");
entityCountField.setAccessible(true); entityCountField.setAccessible(true);
if (entityCountField.getType() == int.class) { if (entityCountField.getType() == int.class) {
int id = entityCountField.getInt(null); int id = entityCountField.getInt(null);
@ -500,24 +485,45 @@ public class Utils {
*/ */
public static Object createPacketSpawnEntity(ShopChest plugin, int id, UUID uuid, Location loc, EntityType type) { public static Object createPacketSpawnEntity(ShopChest plugin, int id, UUID uuid, Location loc, EntityType type) {
try { try {
Class<?> packetClass = getNMSClass("PacketPlayOutSpawnEntity"); Class<?> packetPlayOutSpawnEntityClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutSpawnEntity");
Object packet = packetClass.getConstructor().newInstance(); Class<?> entityTypesClass = nmsClassResolver.resolveSilent("world.entity.EntityTypes");
Class<?> vec3dClass = nmsClassResolver.resolveSilent("world.phys.Vec3D");
boolean isPre9 = getMajorVersion() < 9; boolean isPre9 = getMajorVersion() < 9;
boolean isPre14 = getMajorVersion() < 14; boolean isPre14 = getMajorVersion() < 14;
double y = loc.getY();
if (type == EntityType.ARMOR_STAND && !getServerVersion().equals("v1_8_R1")) {
// Marker armor stand => lift by normal armor stand height
y += 1.975;
}
if (getMajorVersion() >= 17) {
// Empty packet constructor does not exist anymore in 1.17+
Constructor<?> c = packetPlayOutSpawnEntityClass.getConstructor(int.class, UUID.class, double.class, double.class, double.class,
float.class, float.class, entityTypesClass, int.class, vec3dClass);
Object vec3d = vec3dClass.getField("a").get(null);
Object entityType = entityTypesClass.getField(type == EntityType.ARMOR_STAND ? "c" : "Q").get(null);
return c.newInstance(id, uuid, loc.getX(), y, loc.getZ(), 0f, 0f, entityType, 0, vec3d);
}
Object packet = packetPlayOutSpawnEntityClass.getConstructor().newInstance();
Field[] fields = new Field[12]; Field[] fields = new Field[12];
fields[0] = packetClass.getDeclaredField("a"); // ID fields[0] = packetPlayOutSpawnEntityClass.getDeclaredField("a"); // ID
fields[1] = packetClass.getDeclaredField("b"); // UUID (Only 1.9+) fields[1] = packetPlayOutSpawnEntityClass.getDeclaredField("b"); // UUID (Only 1.9+)
fields[2] = packetClass.getDeclaredField(isPre9 ? "b" : "c"); // Loc X fields[2] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "b" : "c"); // Loc X
fields[3] = packetClass.getDeclaredField(isPre9 ? "c" : "d"); // Loc Y fields[3] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "c" : "d"); // Loc Y
fields[4] = packetClass.getDeclaredField(isPre9 ? "d" : "e"); // Loc Z fields[4] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "d" : "e"); // Loc Z
fields[5] = packetClass.getDeclaredField(isPre9 ? "e" : "f"); // Mot X fields[5] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "e" : "f"); // Mot X
fields[6] = packetClass.getDeclaredField(isPre9 ? "f" : "g"); // Mot Y fields[6] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "f" : "g"); // Mot Y
fields[7] = packetClass.getDeclaredField(isPre9 ? "g" : "h"); // Mot Z fields[7] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "g" : "h"); // Mot Z
fields[8] = packetClass.getDeclaredField(isPre9 ? "h" : "i"); // Pitch fields[8] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "h" : "i"); // Pitch
fields[9] = packetClass.getDeclaredField(isPre9 ? "i" : "j"); // Yaw fields[9] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "i" : "j"); // Yaw
fields[10] = packetClass.getDeclaredField(isPre9 ? "j" : "k"); // Type fields[10] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "j" : "k"); // Type
fields[11] = packetClass.getDeclaredField(isPre9 ? "k" : "l"); // Data fields[11] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "k" : "l"); // Data
for (Field field : fields) { for (Field field : fields) {
field.setAccessible(true); field.setAccessible(true);
@ -525,16 +531,9 @@ public class Utils {
Object entityType = null; Object entityType = null;
if (!isPre14) { if (!isPre14) {
Class<?> entityTypesClass = getNMSClass("EntityTypes");
entityType = entityTypesClass.getField(type == EntityType.ARMOR_STAND ? "ARMOR_STAND" : "ITEM").get(null); entityType = entityTypesClass.getField(type == EntityType.ARMOR_STAND ? "ARMOR_STAND" : "ITEM").get(null);
} }
double y = loc.getY();
if (type == EntityType.ARMOR_STAND && !getServerVersion().equals("v1_8_R1")) {
// Marker armor stand => lift by normal armor stand height
y += 1.975;
}
fields[0].set(packet, id); fields[0].set(packet, id);
if (!isPre9) fields[1].set(packet, uuid); if (!isPre9) fields[1].set(packet, uuid);
if (isPre9) { if (isPre9) {
@ -578,14 +577,15 @@ public class Utils {
return false; return false;
} }
Class<?> packetClass = getNMSClass("Packet"); Class<?> packetClass = nmsClassResolver.resolveSilent("network.protocol.Packet");
if (packetClass == null) { if (packetClass == null) {
plugin.debug("Failed to send packet: Could not find Packet class"); plugin.debug("Failed to send packet: Could not find Packet class");
return false; return false;
} }
Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player); Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player);
Object playerConnection = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer); Field fConnection = (new FieldResolver(nmsPlayer.getClass())).resolve("playerConnection", "b");
Object playerConnection = fConnection.get(nmsPlayer);
playerConnection.getClass().getMethod("sendPacket", packetClass).invoke(playerConnection, packet); playerConnection.getClass().getMethod("sendPacket", packetClass).invoke(playerConnection, packet);

View File

@ -20,6 +20,9 @@ ACACIA_WOOD
ACTIVATOR_RAIL ACTIVATOR_RAIL
AIR AIR
ALLIUM ALLIUM
AMETHYST_BLOCK
AMETHYST_CLUSTER
AMETHYST_SHARD
ANCIENT_DEBRIS ANCIENT_DEBRIS
ANDESITE ANDESITE
ANDESITE_SLAB ANDESITE_SLAB
@ -31,6 +34,10 @@ ARMOR_STAND
ARROW ARROW
ATTACHED_MELON_STEM ATTACHED_MELON_STEM
ATTACHED_PUMPKIN_STEM ATTACHED_PUMPKIN_STEM
AXOLOTL_BUCKET
AXOLOTL_SPAWN_EGG
AZALEA
AZALEA_LEAVES
AZURE_BLUET AZURE_BLUET
BAKED_POTATO BAKED_POTATO
BAMBOO BAMBOO
@ -41,15 +48,17 @@ BASALT
BAT_SPAWN_EGG BAT_SPAWN_EGG
BEACON BEACON
BEDROCK BEDROCK
BEE_NEST
BEE_SPAWN_EGG
BEEF BEEF
BEEHIVE BEEHIVE
BEETROOT BEETROOT
BEETROOTS
BEETROOT_SEEDS BEETROOT_SEEDS
BEETROOT_SOUP BEETROOT_SOUP
BEETROOTS BEE_NEST
BEE_SPAWN_EGG
BELL BELL
BIG_DRIPLEAF
BIG_DRIPLEAF_STEM
BIRCH_BOAT BIRCH_BOAT
BIRCH_BUTTON BIRCH_BUTTON
BIRCH_DOOR BIRCH_DOOR
@ -66,8 +75,14 @@ BIRCH_STAIRS
BIRCH_TRAPDOOR BIRCH_TRAPDOOR
BIRCH_WALL_SIGN BIRCH_WALL_SIGN
BIRCH_WOOD BIRCH_WOOD
BLACKSTONE
BLACKSTONE_SLAB
BLACKSTONE_STAIRS
BLACKSTONE_WALL
BLACK_BANNER BLACK_BANNER
BLACK_BED BLACK_BED
BLACK_CANDLE
BLACK_CANDLE_CAKE
BLACK_CARPET BLACK_CARPET
BLACK_CONCRETE BLACK_CONCRETE
BLACK_CONCRETE_POWDER BLACK_CONCRETE_POWDER
@ -79,16 +94,14 @@ BLACK_STAINED_GLASS_PANE
BLACK_TERRACOTTA BLACK_TERRACOTTA
BLACK_WALL_BANNER BLACK_WALL_BANNER
BLACK_WOOL BLACK_WOOL
BLACKSTONE
BLACKSTONE_SLAB
BLACKSTONE_STAIRS
BLACKSTONE_WALL
BLAST_FURNACE BLAST_FURNACE
BLAZE_POWDER BLAZE_POWDER
BLAZE_ROD BLAZE_ROD
BLAZE_SPAWN_EGG BLAZE_SPAWN_EGG
BLUE_BANNER BLUE_BANNER
BLUE_BED BLUE_BED
BLUE_CANDLE
BLUE_CANDLE_CAKE
BLUE_CARPET BLUE_CARPET
BLUE_CONCRETE BLUE_CONCRETE
BLUE_CONCRETE_POWDER BLUE_CONCRETE_POWDER
@ -116,12 +129,14 @@ BRAIN_CORAL_WALL_FAN
BREAD BREAD
BREWING_STAND BREWING_STAND
BRICK BRICK
BRICKS
BRICK_SLAB BRICK_SLAB
BRICK_STAIRS BRICK_STAIRS
BRICK_WALL BRICK_WALL
BRICKS
BROWN_BANNER BROWN_BANNER
BROWN_BED BROWN_BED
BROWN_CANDLE
BROWN_CANDLE_CAKE
BROWN_CARPET BROWN_CARPET
BROWN_CONCRETE BROWN_CONCRETE
BROWN_CONCRETE_POWDER BROWN_CONCRETE_POWDER
@ -141,30 +156,38 @@ BUBBLE_CORAL_BLOCK
BUBBLE_CORAL_FAN BUBBLE_CORAL_FAN
BUBBLE_CORAL_WALL_FAN BUBBLE_CORAL_WALL_FAN
BUCKET BUCKET
BUDDING_AMETHYST
BUNDLE
CACTUS CACTUS
CAKE CAKE
CALCITE
CAMPFIRE CAMPFIRE
CANDLE
CANDLE_CAKE
CARROT CARROT
CARROT_ON_A_STICK
CARROTS CARROTS
CARROT_ON_A_STICK
CARTOGRAPHY_TABLE CARTOGRAPHY_TABLE
CARVED_PUMPKIN CARVED_PUMPKIN
CAT_SPAWN_EGG CAT_SPAWN_EGG
CAULDRON CAULDRON
CAVE_AIR CAVE_AIR
CAVE_SPIDER_SPAWN_EGG CAVE_SPIDER_SPAWN_EGG
CAVE_VINES
CAVE_VINES_PLANT
CHAIN CHAIN
CHAIN_COMMAND_BLOCK
CHAINMAIL_BOOTS CHAINMAIL_BOOTS
CHAINMAIL_CHESTPLATE CHAINMAIL_CHESTPLATE
CHAINMAIL_HELMET CHAINMAIL_HELMET
CHAINMAIL_LEGGINGS CHAINMAIL_LEGGINGS
CHAIN_COMMAND_BLOCK
CHARCOAL CHARCOAL
CHEST CHEST
CHEST_MINECART CHEST_MINECART
CHICKEN CHICKEN
CHICKEN_SPAWN_EGG CHICKEN_SPAWN_EGG
CHIPPED_ANVIL CHIPPED_ANVIL
CHISELED_DEEPSLATE
CHISELED_NETHER_BRICKS CHISELED_NETHER_BRICKS
CHISELED_POLISHED_BLACKSTONE CHISELED_POLISHED_BLACKSTONE
CHISELED_QUARTZ_BLOCK CHISELED_QUARTZ_BLOCK
@ -181,6 +204,10 @@ COAL
COAL_BLOCK COAL_BLOCK
COAL_ORE COAL_ORE
COARSE_DIRT COARSE_DIRT
COBBLED_DEEPSLATE
COBBLED_DEEPSLATE_SLAB
COBBLED_DEEPSLATE_STAIRS
COBBLED_DEEPSLATE_WALL
COBBLESTONE COBBLESTONE
COBBLESTONE_SLAB COBBLESTONE_SLAB
COBBLESTONE_STAIRS COBBLESTONE_STAIRS
@ -205,8 +232,13 @@ COOKED_PORKCHOP
COOKED_RABBIT COOKED_RABBIT
COOKED_SALMON COOKED_SALMON
COOKIE COOKIE
COPPER_BLOCK
COPPER_INGOT
COPPER_ORE
CORNFLOWER CORNFLOWER
COW_SPAWN_EGG COW_SPAWN_EGG
CRACKED_DEEPSLATE_BRICKS
CRACKED_DEEPSLATE_TILES
CRACKED_NETHER_BRICKS CRACKED_NETHER_BRICKS
CRACKED_POLISHED_BLACKSTONE_BRICKS CRACKED_POLISHED_BLACKSTONE_BRICKS
CRACKED_STONE_BRICKS CRACKED_STONE_BRICKS
@ -233,12 +265,17 @@ CRIMSON_TRAPDOOR
CRIMSON_WALL_SIGN CRIMSON_WALL_SIGN
CROSSBOW CROSSBOW
CRYING_OBSIDIAN CRYING_OBSIDIAN
CUT_COPPER
CUT_COPPER_SLAB
CUT_COPPER_STAIRS
CUT_RED_SANDSTONE CUT_RED_SANDSTONE
CUT_RED_SANDSTONE_SLAB CUT_RED_SANDSTONE_SLAB
CUT_SANDSTONE CUT_SANDSTONE
CUT_SANDSTONE_SLAB CUT_SANDSTONE_SLAB
CYAN_BANNER CYAN_BANNER
CYAN_BED CYAN_BED
CYAN_CANDLE
CYAN_CANDLE_CAKE
CYAN_CARPET CYAN_CARPET
CYAN_CONCRETE CYAN_CONCRETE
CYAN_CONCRETE_POWDER CYAN_CONCRETE_POWDER
@ -294,6 +331,23 @@ DEAD_TUBE_CORAL_BLOCK
DEAD_TUBE_CORAL_FAN DEAD_TUBE_CORAL_FAN
DEAD_TUBE_CORAL_WALL_FAN DEAD_TUBE_CORAL_WALL_FAN
DEBUG_STICK DEBUG_STICK
DEEPSLATE
DEEPSLATE_BRICKS
DEEPSLATE_BRICK_SLAB
DEEPSLATE_BRICK_STAIRS
DEEPSLATE_BRICK_WALL
DEEPSLATE_COAL_ORE
DEEPSLATE_COPPER_ORE
DEEPSLATE_DIAMOND_ORE
DEEPSLATE_EMERALD_ORE
DEEPSLATE_GOLD_ORE
DEEPSLATE_IRON_ORE
DEEPSLATE_LAPIS_ORE
DEEPSLATE_REDSTONE_ORE
DEEPSLATE_TILES
DEEPSLATE_TILE_SLAB
DEEPSLATE_TILE_STAIRS
DEEPSLATE_TILE_WALL
DETECTOR_RAIL DETECTOR_RAIL
DIAMOND DIAMOND
DIAMOND_AXE DIAMOND_AXE
@ -313,6 +367,7 @@ DIORITE_SLAB
DIORITE_STAIRS DIORITE_STAIRS
DIORITE_WALL DIORITE_WALL
DIRT DIRT
DIRT_PATH
DISPENSER DISPENSER
DOLPHIN_SPAWN_EGG DOLPHIN_SPAWN_EGG
DONKEY_SPAWN_EGG DONKEY_SPAWN_EGG
@ -322,6 +377,7 @@ DRAGON_HEAD
DRAGON_WALL_HEAD DRAGON_WALL_HEAD
DRIED_KELP DRIED_KELP
DRIED_KELP_BLOCK DRIED_KELP_BLOCK
DRIPSTONE_BLOCK
DROPPER DROPPER
DROWNED_SPAWN_EGG DROWNED_SPAWN_EGG
EGG EGG
@ -333,40 +389,46 @@ EMERALD_ORE
ENCHANTED_BOOK ENCHANTED_BOOK
ENCHANTED_GOLDEN_APPLE ENCHANTED_GOLDEN_APPLE
ENCHANTING_TABLE ENCHANTING_TABLE
ENDERMAN_SPAWN_EGG
ENDERMITE_SPAWN_EGG
ENDER_CHEST
ENDER_EYE
ENDER_PEARL
END_CRYSTAL END_CRYSTAL
END_GATEWAY END_GATEWAY
END_PORTAL END_PORTAL
END_PORTAL_FRAME END_PORTAL_FRAME
END_ROD END_ROD
END_STONE END_STONE
END_STONE_BRICKS
END_STONE_BRICK_SLAB END_STONE_BRICK_SLAB
END_STONE_BRICK_STAIRS END_STONE_BRICK_STAIRS
END_STONE_BRICK_WALL END_STONE_BRICK_WALL
END_STONE_BRICKS
ENDER_CHEST
ENDER_EYE
ENDER_PEARL
ENDERMAN_SPAWN_EGG
ENDERMITE_SPAWN_EGG
EVOKER_SPAWN_EGG EVOKER_SPAWN_EGG
EXPERIENCE_BOTTLE EXPERIENCE_BOTTLE
EXPOSED_COPPER
EXPOSED_CUT_COPPER
EXPOSED_CUT_COPPER_SLAB
EXPOSED_CUT_COPPER_STAIRS
FARMLAND FARMLAND
FEATHER FEATHER
FERMENTED_SPIDER_EYE FERMENTED_SPIDER_EYE
FERN FERN
FILLED_MAP FILLED_MAP
FIRE FIRE
FIREWORK_ROCKET
FIREWORK_STAR
FIRE_CHARGE FIRE_CHARGE
FIRE_CORAL FIRE_CORAL
FIRE_CORAL_BLOCK FIRE_CORAL_BLOCK
FIRE_CORAL_FAN FIRE_CORAL_FAN
FIRE_CORAL_WALL_FAN FIRE_CORAL_WALL_FAN
FIREWORK_ROCKET
FIREWORK_STAR
FISHING_ROD FISHING_ROD
FLETCHING_TABLE FLETCHING_TABLE
FLINT FLINT
FLINT_AND_STEEL FLINT_AND_STEEL
FLOWERING_AZALEA
FLOWERING_AZALEA_LEAVES
FLOWER_BANNER_PATTERN FLOWER_BANNER_PATTERN
FLOWER_POT FLOWER_POT
FOX_SPAWN_EGG FOX_SPAWN_EGG
@ -383,10 +445,12 @@ GLISTERING_MELON_SLICE
GLOBE_BANNER_PATTERN GLOBE_BANNER_PATTERN
GLOWSTONE GLOWSTONE
GLOWSTONE_DUST GLOWSTONE_DUST
GOLD_BLOCK GLOW_BERRIES
GOLD_INGOT GLOW_INK_SAC
GOLD_NUGGET GLOW_ITEM_FRAME
GOLD_ORE GLOW_LICHEN
GLOW_SQUID_SPAWN_EGG
GOAT_SPAWN_EGG
GOLDEN_APPLE GOLDEN_APPLE
GOLDEN_AXE GOLDEN_AXE
GOLDEN_BOOTS GOLDEN_BOOTS
@ -399,16 +463,21 @@ GOLDEN_LEGGINGS
GOLDEN_PICKAXE GOLDEN_PICKAXE
GOLDEN_SHOVEL GOLDEN_SHOVEL
GOLDEN_SWORD GOLDEN_SWORD
GOLD_BLOCK
GOLD_INGOT
GOLD_NUGGET
GOLD_ORE
GRANITE GRANITE
GRANITE_SLAB GRANITE_SLAB
GRANITE_STAIRS GRANITE_STAIRS
GRANITE_WALL GRANITE_WALL
GRASS GRASS
GRASS_BLOCK GRASS_BLOCK
GRASS_PATH
GRAVEL GRAVEL
GRAY_BANNER GRAY_BANNER
GRAY_BED GRAY_BED
GRAY_CANDLE
GRAY_CANDLE_CAKE
GRAY_CARPET GRAY_CARPET
GRAY_CONCRETE GRAY_CONCRETE
GRAY_CONCRETE_POWDER GRAY_CONCRETE_POWDER
@ -422,6 +491,8 @@ GRAY_WALL_BANNER
GRAY_WOOL GRAY_WOOL
GREEN_BANNER GREEN_BANNER
GREEN_BED GREEN_BED
GREEN_CANDLE
GREEN_CANDLE_CAKE
GREEN_CARPET GREEN_CARPET
GREEN_CONCRETE GREEN_CONCRETE
GREEN_CONCRETE_POWDER GREEN_CONCRETE_POWDER
@ -436,14 +507,15 @@ GREEN_WOOL
GRINDSTONE GRINDSTONE
GUARDIAN_SPAWN_EGG GUARDIAN_SPAWN_EGG
GUNPOWDER GUNPOWDER
HANGING_ROOTS
HAY_BLOCK HAY_BLOCK
HEART_OF_THE_SEA HEART_OF_THE_SEA
HEAVY_WEIGHTED_PRESSURE_PLATE HEAVY_WEIGHTED_PRESSURE_PLATE
HOGLIN_SPAWN_EGG HOGLIN_SPAWN_EGG
HONEY_BLOCK
HONEY_BOTTLE
HONEYCOMB HONEYCOMB
HONEYCOMB_BLOCK HONEYCOMB_BLOCK
HONEY_BLOCK
HONEY_BOTTLE
HOPPER HOPPER
HOPPER_MINECART HOPPER_MINECART
HORN_CORAL HORN_CORAL
@ -456,6 +528,7 @@ ICE
INFESTED_CHISELED_STONE_BRICKS INFESTED_CHISELED_STONE_BRICKS
INFESTED_COBBLESTONE INFESTED_COBBLESTONE
INFESTED_CRACKED_STONE_BRICKS INFESTED_CRACKED_STONE_BRICKS
INFESTED_DEEPSLATE
INFESTED_MOSSY_STONE_BRICKS INFESTED_MOSSY_STONE_BRICKS
INFESTED_STONE INFESTED_STONE
INFESTED_STONE_BRICKS INFESTED_STONE_BRICKS
@ -505,9 +578,11 @@ LANTERN
LAPIS_BLOCK LAPIS_BLOCK
LAPIS_LAZULI LAPIS_LAZULI
LAPIS_ORE LAPIS_ORE
LARGE_AMETHYST_BUD
LARGE_FERN LARGE_FERN
LAVA LAVA
LAVA_BUCKET LAVA_BUCKET
LAVA_CAULDRON
LEAD LEAD
LEATHER LEATHER
LEATHER_BOOTS LEATHER_BOOTS
@ -517,8 +592,12 @@ LEATHER_HORSE_ARMOR
LEATHER_LEGGINGS LEATHER_LEGGINGS
LECTERN LECTERN
LEVER LEVER
LIGHT
LIGHTNING_ROD
LIGHT_BLUE_BANNER LIGHT_BLUE_BANNER
LIGHT_BLUE_BED LIGHT_BLUE_BED
LIGHT_BLUE_CANDLE
LIGHT_BLUE_CANDLE_CAKE
LIGHT_BLUE_CARPET LIGHT_BLUE_CARPET
LIGHT_BLUE_CONCRETE LIGHT_BLUE_CONCRETE
LIGHT_BLUE_CONCRETE_POWDER LIGHT_BLUE_CONCRETE_POWDER
@ -532,6 +611,8 @@ LIGHT_BLUE_WALL_BANNER
LIGHT_BLUE_WOOL LIGHT_BLUE_WOOL
LIGHT_GRAY_BANNER LIGHT_GRAY_BANNER
LIGHT_GRAY_BED LIGHT_GRAY_BED
LIGHT_GRAY_CANDLE
LIGHT_GRAY_CANDLE_CAKE
LIGHT_GRAY_CARPET LIGHT_GRAY_CARPET
LIGHT_GRAY_CONCRETE LIGHT_GRAY_CONCRETE
LIGHT_GRAY_CONCRETE_POWDER LIGHT_GRAY_CONCRETE_POWDER
@ -549,6 +630,8 @@ LILY_OF_THE_VALLEY
LILY_PAD LILY_PAD
LIME_BANNER LIME_BANNER
LIME_BED LIME_BED
LIME_CANDLE
LIME_CANDLE_CAKE
LIME_CARPET LIME_CARPET
LIME_CONCRETE LIME_CONCRETE
LIME_CONCRETE_POWDER LIME_CONCRETE_POWDER
@ -566,6 +649,8 @@ LODESTONE
LOOM LOOM
MAGENTA_BANNER MAGENTA_BANNER
MAGENTA_BED MAGENTA_BED
MAGENTA_CANDLE
MAGENTA_CANDLE_CAKE
MAGENTA_CARPET MAGENTA_CARPET
MAGENTA_CONCRETE MAGENTA_CONCRETE
MAGENTA_CONCRETE_POWDER MAGENTA_CONCRETE_POWDER
@ -581,6 +666,7 @@ MAGMA_BLOCK
MAGMA_CREAM MAGMA_CREAM
MAGMA_CUBE_SPAWN_EGG MAGMA_CUBE_SPAWN_EGG
MAP MAP
MEDIUM_AMETHYST_BUD
MELON MELON
MELON_SEEDS MELON_SEEDS
MELON_SLICE MELON_SLICE
@ -593,10 +679,12 @@ MOSSY_COBBLESTONE
MOSSY_COBBLESTONE_SLAB MOSSY_COBBLESTONE_SLAB
MOSSY_COBBLESTONE_STAIRS MOSSY_COBBLESTONE_STAIRS
MOSSY_COBBLESTONE_WALL MOSSY_COBBLESTONE_WALL
MOSSY_STONE_BRICKS
MOSSY_STONE_BRICK_SLAB MOSSY_STONE_BRICK_SLAB
MOSSY_STONE_BRICK_STAIRS MOSSY_STONE_BRICK_STAIRS
MOSSY_STONE_BRICK_WALL MOSSY_STONE_BRICK_WALL
MOSSY_STONE_BRICKS MOSS_BLOCK
MOSS_CARPET
MOVING_PISTON MOVING_PISTON
MULE_SPAWN_EGG MULE_SPAWN_EGG
MUSHROOM_STEM MUSHROOM_STEM
@ -618,19 +706,6 @@ MUTTON
MYCELIUM MYCELIUM
NAME_TAG NAME_TAG
NAUTILUS_SHELL NAUTILUS_SHELL
NETHER_BRICK
NETHER_BRICK_FENCE
NETHER_BRICK_SLAB
NETHER_BRICK_STAIRS
NETHER_BRICK_WALL
NETHER_BRICKS
NETHER_GOLD_ORE
NETHER_PORTAL
NETHER_QUARTZ_ORE
NETHER_SPROUTS
NETHER_STAR
NETHER_WART
NETHER_WART_BLOCK
NETHERITE_AXE NETHERITE_AXE
NETHERITE_BLOCK NETHERITE_BLOCK
NETHERITE_BOOTS NETHERITE_BOOTS
@ -644,6 +719,19 @@ NETHERITE_SCRAP
NETHERITE_SHOVEL NETHERITE_SHOVEL
NETHERITE_SWORD NETHERITE_SWORD
NETHERRACK NETHERRACK
NETHER_BRICK
NETHER_BRICKS
NETHER_BRICK_FENCE
NETHER_BRICK_SLAB
NETHER_BRICK_STAIRS
NETHER_BRICK_WALL
NETHER_GOLD_ORE
NETHER_PORTAL
NETHER_QUARTZ_ORE
NETHER_SPROUTS
NETHER_STAR
NETHER_WART
NETHER_WART_BLOCK
NOTE_BLOCK NOTE_BLOCK
OAK_BOAT OAK_BOAT
OAK_BUTTON OAK_BUTTON
@ -666,6 +754,8 @@ OBSIDIAN
OCELOT_SPAWN_EGG OCELOT_SPAWN_EGG
ORANGE_BANNER ORANGE_BANNER
ORANGE_BED ORANGE_BED
ORANGE_CANDLE
ORANGE_CANDLE_CAKE
ORANGE_CARPET ORANGE_CARPET
ORANGE_CONCRETE ORANGE_CONCRETE
ORANGE_CONCRETE_POWDER ORANGE_CONCRETE_POWDER
@ -679,6 +769,10 @@ ORANGE_TULIP
ORANGE_WALL_BANNER ORANGE_WALL_BANNER
ORANGE_WOOL ORANGE_WOOL
OXEYE_DAISY OXEYE_DAISY
OXIDIZED_COPPER
OXIDIZED_CUT_COPPER
OXIDIZED_CUT_COPPER_SLAB
OXIDIZED_CUT_COPPER_STAIRS
PACKED_ICE PACKED_ICE
PAINTING PAINTING
PANDA_SPAWN_EGG PANDA_SPAWN_EGG
@ -688,12 +782,15 @@ PEONY
PETRIFIED_OAK_SLAB PETRIFIED_OAK_SLAB
PHANTOM_MEMBRANE PHANTOM_MEMBRANE
PHANTOM_SPAWN_EGG PHANTOM_SPAWN_EGG
PIG_SPAWN_EGG
PIGLIN_BANNER_PATTERN PIGLIN_BANNER_PATTERN
PIGLIN_BRUTE_SPAWN_EGG
PIGLIN_SPAWN_EGG PIGLIN_SPAWN_EGG
PIG_SPAWN_EGG
PILLAGER_SPAWN_EGG PILLAGER_SPAWN_EGG
PINK_BANNER PINK_BANNER
PINK_BED PINK_BED
PINK_CANDLE
PINK_CANDLE_CAKE
PINK_CARPET PINK_CARPET
PINK_CONCRETE PINK_CONCRETE
PINK_CONCRETE_POWDER PINK_CONCRETE_POWDER
@ -711,6 +808,7 @@ PISTON_HEAD
PLAYER_HEAD PLAYER_HEAD
PLAYER_WALL_HEAD PLAYER_WALL_HEAD
PODZOL PODZOL
POINTED_DRIPSTONE
POISONOUS_POTATO POISONOUS_POTATO
POLAR_BEAR_SPAWN_EGG POLAR_BEAR_SPAWN_EGG
POLISHED_ANDESITE POLISHED_ANDESITE
@ -718,15 +816,19 @@ POLISHED_ANDESITE_SLAB
POLISHED_ANDESITE_STAIRS POLISHED_ANDESITE_STAIRS
POLISHED_BASALT POLISHED_BASALT
POLISHED_BLACKSTONE POLISHED_BLACKSTONE
POLISHED_BLACKSTONE_BRICKS
POLISHED_BLACKSTONE_BRICK_SLAB POLISHED_BLACKSTONE_BRICK_SLAB
POLISHED_BLACKSTONE_BRICK_STAIRS POLISHED_BLACKSTONE_BRICK_STAIRS
POLISHED_BLACKSTONE_BRICK_WALL POLISHED_BLACKSTONE_BRICK_WALL
POLISHED_BLACKSTONE_BRICKS
POLISHED_BLACKSTONE_BUTTON POLISHED_BLACKSTONE_BUTTON
POLISHED_BLACKSTONE_PRESSURE_PLATE POLISHED_BLACKSTONE_PRESSURE_PLATE
POLISHED_BLACKSTONE_SLAB POLISHED_BLACKSTONE_SLAB
POLISHED_BLACKSTONE_STAIRS POLISHED_BLACKSTONE_STAIRS
POLISHED_BLACKSTONE_WALL POLISHED_BLACKSTONE_WALL
POLISHED_DEEPSLATE
POLISHED_DEEPSLATE_SLAB
POLISHED_DEEPSLATE_STAIRS
POLISHED_DEEPSLATE_WALL
POLISHED_DIORITE POLISHED_DIORITE
POLISHED_DIORITE_SLAB POLISHED_DIORITE_SLAB
POLISHED_DIORITE_STAIRS POLISHED_DIORITE_STAIRS
@ -741,6 +843,7 @@ POTATOES
POTION POTION
POTTED_ACACIA_SAPLING POTTED_ACACIA_SAPLING
POTTED_ALLIUM POTTED_ALLIUM
POTTED_AZALEA_BUSH
POTTED_AZURE_BLUET POTTED_AZURE_BLUET
POTTED_BAMBOO POTTED_BAMBOO
POTTED_BIRCH_SAPLING POTTED_BIRCH_SAPLING
@ -754,6 +857,7 @@ POTTED_DANDELION
POTTED_DARK_OAK_SAPLING POTTED_DARK_OAK_SAPLING
POTTED_DEAD_BUSH POTTED_DEAD_BUSH
POTTED_FERN POTTED_FERN
POTTED_FLOWERING_AZALEA_BUSH
POTTED_JUNGLE_SAPLING POTTED_JUNGLE_SAPLING
POTTED_LILY_OF_THE_VALLEY POTTED_LILY_OF_THE_VALLEY
POTTED_OAK_SAPLING POTTED_OAK_SAPLING
@ -768,11 +872,14 @@ POTTED_WARPED_FUNGUS
POTTED_WARPED_ROOTS POTTED_WARPED_ROOTS
POTTED_WHITE_TULIP POTTED_WHITE_TULIP
POTTED_WITHER_ROSE POTTED_WITHER_ROSE
POWDER_SNOW
POWDER_SNOW_BUCKET
POWDER_SNOW_CAULDRON
POWERED_RAIL POWERED_RAIL
PRISMARINE PRISMARINE
PRISMARINE_BRICKS
PRISMARINE_BRICK_SLAB PRISMARINE_BRICK_SLAB
PRISMARINE_BRICK_STAIRS PRISMARINE_BRICK_STAIRS
PRISMARINE_BRICKS
PRISMARINE_CRYSTALS PRISMARINE_CRYSTALS
PRISMARINE_SHARD PRISMARINE_SHARD
PRISMARINE_SLAB PRISMARINE_SLAB
@ -787,6 +894,8 @@ PUMPKIN_SEEDS
PUMPKIN_STEM PUMPKIN_STEM
PURPLE_BANNER PURPLE_BANNER
PURPLE_BED PURPLE_BED
PURPLE_CANDLE
PURPLE_CANDLE_CAKE
PURPLE_CARPET PURPLE_CARPET
PURPLE_CONCRETE PURPLE_CONCRETE
PURPLE_CONCRETE_POWDER PURPLE_CONCRETE_POWDER
@ -815,8 +924,23 @@ RABBIT_SPAWN_EGG
RABBIT_STEW RABBIT_STEW
RAIL RAIL
RAVAGER_SPAWN_EGG RAVAGER_SPAWN_EGG
RAW_COPPER
RAW_COPPER_BLOCK
RAW_GOLD
RAW_GOLD_BLOCK
RAW_IRON
RAW_IRON_BLOCK
REDSTONE
REDSTONE_BLOCK
REDSTONE_LAMP
REDSTONE_ORE
REDSTONE_TORCH
REDSTONE_WALL_TORCH
REDSTONE_WIRE
RED_BANNER RED_BANNER
RED_BED RED_BED
RED_CANDLE
RED_CANDLE_CAKE
RED_CARPET RED_CARPET
RED_CONCRETE RED_CONCRETE
RED_CONCRETE_POWDER RED_CONCRETE_POWDER
@ -824,10 +948,10 @@ RED_DYE
RED_GLAZED_TERRACOTTA RED_GLAZED_TERRACOTTA
RED_MUSHROOM RED_MUSHROOM
RED_MUSHROOM_BLOCK RED_MUSHROOM_BLOCK
RED_NETHER_BRICKS
RED_NETHER_BRICK_SLAB RED_NETHER_BRICK_SLAB
RED_NETHER_BRICK_STAIRS RED_NETHER_BRICK_STAIRS
RED_NETHER_BRICK_WALL RED_NETHER_BRICK_WALL
RED_NETHER_BRICKS
RED_SAND RED_SAND
RED_SANDSTONE RED_SANDSTONE
RED_SANDSTONE_SLAB RED_SANDSTONE_SLAB
@ -840,16 +964,10 @@ RED_TERRACOTTA
RED_TULIP RED_TULIP
RED_WALL_BANNER RED_WALL_BANNER
RED_WOOL RED_WOOL
REDSTONE
REDSTONE_BLOCK
REDSTONE_LAMP
REDSTONE_ORE
REDSTONE_TORCH
REDSTONE_WALL_TORCH
REDSTONE_WIRE
REPEATER REPEATER
REPEATING_COMMAND_BLOCK REPEATING_COMMAND_BLOCK
RESPAWN_ANCHOR RESPAWN_ANCHOR
ROOTED_DIRT
ROSE_BUSH ROSE_BUSH
ROTTEN_FLESH ROTTEN_FLESH
SADDLE SADDLE
@ -862,10 +980,11 @@ SANDSTONE_SLAB
SANDSTONE_STAIRS SANDSTONE_STAIRS
SANDSTONE_WALL SANDSTONE_WALL
SCAFFOLDING SCAFFOLDING
SCULK_SENSOR
SCUTE SCUTE
SEAGRASS
SEA_LANTERN SEA_LANTERN
SEA_PICKLE SEA_PICKLE
SEAGRASS
SHEARS SHEARS
SHEEP_SPAWN_EGG SHEEP_SPAWN_EGG
SHIELD SHIELD
@ -882,8 +1001,11 @@ SKULL_BANNER_PATTERN
SLIME_BALL SLIME_BALL
SLIME_BLOCK SLIME_BLOCK
SLIME_SPAWN_EGG SLIME_SPAWN_EGG
SMALL_AMETHYST_BUD
SMALL_DRIPLEAF
SMITHING_TABLE SMITHING_TABLE
SMOKER SMOKER
SMOOTH_BASALT
SMOOTH_QUARTZ SMOOTH_QUARTZ
SMOOTH_QUARTZ_SLAB SMOOTH_QUARTZ_SLAB
SMOOTH_QUARTZ_STAIRS SMOOTH_QUARTZ_STAIRS
@ -896,8 +1018,8 @@ SMOOTH_SANDSTONE_STAIRS
SMOOTH_STONE SMOOTH_STONE
SMOOTH_STONE_SLAB SMOOTH_STONE_SLAB
SNOW SNOW
SNOW_BLOCK
SNOWBALL SNOWBALL
SNOW_BLOCK
SOUL_CAMPFIRE SOUL_CAMPFIRE
SOUL_FIRE SOUL_FIRE
SOUL_LANTERN SOUL_LANTERN
@ -911,6 +1033,7 @@ SPIDER_EYE
SPIDER_SPAWN_EGG SPIDER_SPAWN_EGG
SPLASH_POTION SPLASH_POTION
SPONGE SPONGE
SPORE_BLOSSOM
SPRUCE_BOAT SPRUCE_BOAT
SPRUCE_BUTTON SPRUCE_BUTTON
SPRUCE_DOOR SPRUCE_DOOR
@ -927,15 +1050,17 @@ SPRUCE_STAIRS
SPRUCE_TRAPDOOR SPRUCE_TRAPDOOR
SPRUCE_WALL_SIGN SPRUCE_WALL_SIGN
SPRUCE_WOOD SPRUCE_WOOD
SPYGLASS
SQUID_SPAWN_EGG SQUID_SPAWN_EGG
STICK STICK
STICKY_PISTON STICKY_PISTON
STONE STONE
STONECUTTER
STONE_AXE STONE_AXE
STONE_BRICKS
STONE_BRICK_SLAB STONE_BRICK_SLAB
STONE_BRICK_STAIRS STONE_BRICK_STAIRS
STONE_BRICK_WALL STONE_BRICK_WALL
STONE_BRICKS
STONE_BUTTON STONE_BUTTON
STONE_HOE STONE_HOE
STONE_PICKAXE STONE_PICKAXE
@ -944,7 +1069,6 @@ STONE_SHOVEL
STONE_SLAB STONE_SLAB
STONE_STAIRS STONE_STAIRS
STONE_SWORD STONE_SWORD
STONECUTTER
STRAY_SPAWN_EGG STRAY_SPAWN_EGG
STRIDER_SPAWN_EGG STRIDER_SPAWN_EGG
STRING STRING
@ -976,6 +1100,7 @@ TALL_GRASS
TALL_SEAGRASS TALL_SEAGRASS
TARGET TARGET
TERRACOTTA TERRACOTTA
TINTED_GLASS
TIPPED_ARROW TIPPED_ARROW
TNT TNT
TNT_MINECART TNT_MINECART
@ -993,6 +1118,7 @@ TUBE_CORAL
TUBE_CORAL_BLOCK TUBE_CORAL_BLOCK
TUBE_CORAL_FAN TUBE_CORAL_FAN
TUBE_CORAL_WALL_FAN TUBE_CORAL_WALL_FAN
TUFF
TURTLE_EGG TURTLE_EGG
TURTLE_HELMET TURTLE_HELMET
TURTLE_SPAWN_EGG TURTLE_SPAWN_EGG
@ -1025,6 +1151,27 @@ WARPED_WALL_SIGN
WARPED_WART_BLOCK WARPED_WART_BLOCK
WATER WATER
WATER_BUCKET WATER_BUCKET
WATER_CAULDRON
WAXED_COPPER_BLOCK
WAXED_CUT_COPPER
WAXED_CUT_COPPER_SLAB
WAXED_CUT_COPPER_STAIRS
WAXED_EXPOSED_COPPER
WAXED_EXPOSED_CUT_COPPER
WAXED_EXPOSED_CUT_COPPER_SLAB
WAXED_EXPOSED_CUT_COPPER_STAIRS
WAXED_OXIDIZED_COPPER
WAXED_OXIDIZED_CUT_COPPER
WAXED_OXIDIZED_CUT_COPPER_SLAB
WAXED_OXIDIZED_CUT_COPPER_STAIRS
WAXED_WEATHERED_COPPER
WAXED_WEATHERED_CUT_COPPER
WAXED_WEATHERED_CUT_COPPER_SLAB
WAXED_WEATHERED_CUT_COPPER_STAIRS
WEATHERED_COPPER
WEATHERED_CUT_COPPER
WEATHERED_CUT_COPPER_SLAB
WEATHERED_CUT_COPPER_STAIRS
WEEPING_VINES WEEPING_VINES
WEEPING_VINES_PLANT WEEPING_VINES_PLANT
WET_SPONGE WET_SPONGE
@ -1032,6 +1179,8 @@ WHEAT
WHEAT_SEEDS WHEAT_SEEDS
WHITE_BANNER WHITE_BANNER
WHITE_BED WHITE_BED
WHITE_CANDLE
WHITE_CANDLE_CAKE
WHITE_CARPET WHITE_CARPET
WHITE_CONCRETE WHITE_CONCRETE
WHITE_CONCRETE_POWDER WHITE_CONCRETE_POWDER
@ -1059,6 +1208,8 @@ WRITABLE_BOOK
WRITTEN_BOOK WRITTEN_BOOK
YELLOW_BANNER YELLOW_BANNER
YELLOW_BED YELLOW_BED
YELLOW_CANDLE
YELLOW_CANDLE_CAKE
YELLOW_CARPET YELLOW_CARPET
YELLOW_CONCRETE YELLOW_CONCRETE
YELLOW_CONCRETE_POWDER YELLOW_CONCRETE_POWDER